// Copyright (c) 2016-2019 Kiwano - Nomango // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #include #include namespace kiwano { StrokeStylePtr StrokeStyle::Create(CapStyle cap, LineJoinStyle line_join, DashStyle dash, float dash_offset) { StrokeStylePtr ptr = new (std::nothrow) StrokeStyle; if (ptr) { ptr->SetCapStyle(cap); ptr->SetLineJoinStyle(line_join); ptr->SetDashStyle(dash); ptr->SetDashOffset(dash_offset); } return ptr; } StrokeStylePtr StrokeStyle::Create(CapStyle cap, LineJoinStyle line_join, const float* dash_array, size_t dash_size, float dash_offset) { StrokeStylePtr ptr = new (std::nothrow) StrokeStyle; if (ptr) { ptr->SetCapStyle(cap); ptr->SetLineJoinStyle(line_join); ptr->SetDashStyle(dash_array, dash_size); ptr->SetDashOffset(dash_offset); } return ptr; } StrokeStyle::StrokeStyle() : cap_(CapStyle::Flat) , line_join_(LineJoinStyle::Miter) , dash_offset_(0.0f) { } void StrokeStyle::SetDashStyle(DashStyle dash_style) { switch (dash_style) { case DashStyle::Solid: { dash_array_.clear(); break; } case DashStyle::Dash: { dash_array_ = { 2, 2 }; break; } case DashStyle::Dot: { dash_array_ = { 0, 2 }; break; } case DashStyle::DashDot: { dash_array_ = { 2, 2, 0, 2 }; break; } case DashStyle::DashDotDot: { dash_array_ = { 2, 2, 0, 2, 0, 2 }; break; } default: break; } } void StrokeStyle::SetDashStyle(const Vector& dash_array) { dash_array_ = dash_array; style_.reset(); } void StrokeStyle::SetDashStyle(const float* dash_array, size_t dash_size) { if (dash_size == 0) dash_array_.clear(); else dash_array_.assign(dash_array, dash_array + dash_size); style_.reset(); } #if KGE_RENDER_ENGINE == KGE_RENDER_ENGINE_DIRECTX ComPtr StrokeStyle::GetStrokeStyle() const { StrokeStyle& self = const_cast(*this); if (dash_array_.empty()) Renderer::GetInstance().CreateStrokeStyle(self, cap_, line_join_, nullptr, 0, dash_offset_); else Renderer::GetInstance().CreateStrokeStyle(self, cap_, line_join_, &dash_array_[0], dash_array_.size(), dash_offset_); return style_; } #endif } // namespace kiwano