2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali-toolkit/devel-api/controls/canvas-view/canvas-view.h>
20 #include <dali/devel-api/adaptor-framework/canvas-renderer-shape.h>
25 * @brief This demonstrates how to display and control vector primitives using CanvasView.
27 * - It displays various types of shapes. Rectangle, circle, path, etc.
28 * - Each shape can be set to fill color, stroke color, width, etc
29 * and can change the transfomation(rotate, scale, translate)
31 class CanvasViewController : public ConnectionTracker
36 * @param[in] application A reference to the Application class
38 CanvasViewController(Application& application)
39 : mApplication(application),
46 // Connect to the Application's Init signal
47 mApplication.InitSignal().Connect(this, &CanvasViewController::Create);
50 ~CanvasViewController() = default;
52 void Create(Application& application)
54 // The Init signal is received once (only) during the Application lifetime
55 Window window = application.GetWindow();
56 Vector2 windowSize = window.GetSize();
57 window.KeyEventSignal().Connect(this, &CanvasViewController::OnKeyEvent);
59 Toolkit::CanvasView mCanvasView = Toolkit::CanvasView::New(windowSize);
60 mCanvasView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
61 mCanvasView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
62 mCanvasView.SetProperty(Actor::Property::SIZE, windowSize);
64 Dali::CanvasRenderer::Shape canvasBackground = Dali::CanvasRenderer::Shape::New();
65 canvasBackground.AddRect(Rect<float>(0.0f, 0.0f, windowSize.width, windowSize.height), Vector2::ZERO);
66 canvasBackground.SetFillColor(Vector4(1.0f, 1.0f, 1.0f, 1.0f));
67 mCanvasView.AddDrawable(canvasBackground);
69 Dali::CanvasRenderer::Shape shape1 = Dali::CanvasRenderer::Shape::New();
70 shape1.AddRect(Rect<float>(-50.0f, -50.0f, 100.0f, 100.0f), Vector2::ZERO);
71 shape1.SetFillColor(Vector4(0.0f, 0.5f, 0.0f, 0.5f));
72 shape1.SetStrokeColor(Vector4(0.5f, 0.0f, 0.0f, 0.5f));
73 shape1.SetStrokeWidth(10.0f);
75 shape1.Rotate(Degree(45.0f));
76 shape1.Translate(Vector2(100.0f, 100.0f));
78 mCanvasView.AddDrawable(shape1);
80 mRoundedRect = Dali::CanvasRenderer::Shape::New();
81 mRoundedRect.AddRect(Rect<float>(10.0f, 350.0f, 200.0f, 140.0f), Vector2(40.0f, 40.0f));
82 mRoundedRect.SetFillColor(Vector4(0.0f, 0.0f, 1.0f, 1.0f));
83 mRoundedRect.SetOpacity(0.5f);
84 mRoundedRect.SetStrokeColor(Vector4(1.0f, 1.0f, 0.0f, 1.0f));
85 mRoundedRect.SetStrokeWidth(10.0f);
86 mRoundedRect.SetStrokeJoin(Dali::CanvasRenderer::Shape::StrokeJoin::MITER);
87 Dali::Vector<float> dashPattern;
88 dashPattern.PushBack(15.0f);
89 dashPattern.PushBack(30.0f);
90 mRoundedRect.SetStrokeDash(dashPattern);
91 mCanvasView.AddDrawable(mRoundedRect);
93 Dali::CanvasRenderer::Shape shape2 = Dali::CanvasRenderer::Shape::New();
94 shape2.AddMoveTo(Vector2(535.0f, 135.0f));
95 shape2.AddLineTo(Vector2(660.0f, 455.0f));
96 shape2.AddLineTo(Vector2(355.0f, 250.0f));
97 shape2.AddLineTo(Vector2(715.0f, 250.0f));
98 shape2.AddLineTo(Vector2(410.0f, 455.0f));
100 shape2.SetFillRule(Dali::CanvasRenderer::Shape::FillRule::EVEN_ODD);
101 shape2.SetFillColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
102 shape2.SetOpacity(0.5f);
103 shape2.SetStrokeColor(Vector4(1.0f, 0.0f, 1.0f, 1.0f));
104 shape2.SetStrokeWidth(20.0f);
105 shape2.SetStrokeJoin(Dali::CanvasRenderer::Shape::StrokeJoin::ROUND);
106 shape2.Transform(Matrix3(0.6f, 0.0f, 20.0f, 0.0f, 0.6f, -50.0f, 0.0f, 0.0f, 1.0f));
107 mCanvasView.AddDrawable(shape2);
109 mArc = Dali::CanvasRenderer::Shape::New();
110 mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f, 0.0f, true);
111 mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f, 0.0f, true);
112 mArc.SetOpacity(0.5f);
113 mArc.SetStrokeColor(Vector4(0.0f, 1.0f, 0.0f, 1.0f));
114 mArc.SetStrokeWidth(10.0f);
115 mArc.SetStrokeCap(Dali::CanvasRenderer::Shape::StrokeCap::ROUND);
116 mCanvasView.AddDrawable(mArc);
118 mStar = Dali::CanvasRenderer::Shape::New();
119 mStar.AddMoveTo(Vector2(-1.0f, -165.0f));
120 mStar.AddLineTo(Vector2(53.0f, -56.0f));
121 mStar.AddLineTo(Vector2(174.0f, -39.0f));
122 mStar.AddLineTo(Vector2(87.0f, 45.0f));
123 mStar.AddLineTo(Vector2(107.0f, 166.0f));
124 mStar.AddLineTo(Vector2(-1.0f, 110.0f));
125 mStar.AddLineTo(Vector2(-103.0f, 166.0f));
126 mStar.AddLineTo(Vector2(-88.0f, 46.0f));
127 mStar.AddLineTo(Vector2(-174.0f, -38.0f));
128 mStar.AddLineTo(Vector2(-54.0f, -56.0f));
132 mStar.SetFillColor(Vector4(0.0f, 1.0f, 1.0f, 1.0f));
133 mStar.SetStrokeColor(Vector4(0.5f, 1.0f, 0.5f, 1.0f));
134 mStar.SetStrokeWidth(30.0f);
135 mStar.SetStrokeCap(Dali::CanvasRenderer::Shape::StrokeCap::ROUND);
137 mStar.Translate(Vector2(350.0f, 450.0f));
138 mStar.SetOpacity(0.5f);
140 mCanvasView.AddDrawable(mStar);
142 mTimer = Timer::New(1000.0f / 32.0f);
143 mTimer.TickSignal().Connect(this, &CanvasViewController::tick);
146 window.Add(mCanvasView);
150 * @brief Called when set time.
152 * Change transformation every call to make it look like vector animation.
156 mRoundedRect.ResetPath();
157 mRoundedRect.AddRect(Rect<float>(10.0f, 350.0f, 200.0f, 140.0f), Vector2(float(mCount % 80), float(mCount % 80)));
160 mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f, float(mCount % 180), true);
161 mArc.AddArc(Vector2(100.0f, 650.0f), 80.0f, 10.0f + float(mCount % 180), float(mCount % 180) / 2.0f, true);
163 mStar.Rotate(Degree(mCount * 2.0f));
164 mStar.Scale(float(mCount % 100) * 0.01f + 0.6f);
170 * @brief Called when any key event is received.
172 * Will use this to quit the application if Back or the Escape key is received
173 * @param[in] event The key event information
175 void OnKeyEvent(const KeyEvent& event)
177 if(event.GetState() == KeyEvent::DOWN)
179 if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
187 Application& mApplication;
188 Dali::CanvasRenderer::Shape mRoundedRect;
189 Dali::CanvasRenderer::Shape mArc;
190 Dali::CanvasRenderer::Shape mStar;
195 int DALI_EXPORT_API main(int argc, char** argv)
197 Application application = Application::New(&argc, &argv);
198 CanvasViewController test(application);
199 application.MainLoop();