[dali_1.0.27] Merge branch 'tizen'
[platform/core/uifw/dali-core.git] / dali / internal / common / text-parameters.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/common/text-parameters.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/text/text-style.h>
23
24 namespace Dali
25 {
26
27 namespace Internal
28 {
29
30 TextParameters::TextParameters()
31 : mFlags( 0 )
32 {
33 }
34
35 TextParameters::~TextParameters()
36 {
37   // destroy all containers.
38   if ( mFlags & OUTLINE_EXISTS )
39   {
40     OutlineAttributes* attrPtr = reinterpret_cast<OutlineAttributes*>( *( mParameters.Begin() + ( mFlags & TEXT_PARAMETER_MASK ) ) );
41     delete attrPtr;
42   }
43   if ( mFlags & GLOW_EXISTS )
44   {
45     GlowAttributes* attrPtr = reinterpret_cast<GlowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
46     delete attrPtr;
47   }
48   if ( mFlags & DROP_SHADOW_EXISTS )
49   {
50     DropShadowAttributes* attrPtr = reinterpret_cast<DropShadowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
51     delete attrPtr;
52   }
53   if ( mFlags & GRADIENT_EXISTS )
54   {
55     GradientAttributes* attrPtr = reinterpret_cast<GradientAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
56     delete attrPtr;
57   }
58 }
59
60 void TextParameters::SetOutline( bool enable, const Vector4& color, const Vector2& thickness )
61 {
62   if ( mFlags & OUTLINE_EXISTS )
63   {
64     OutlineAttributes* attrPtr = reinterpret_cast<OutlineAttributes*>( *( mParameters.Begin() + ( mFlags & TEXT_PARAMETER_MASK ) ) );
65     attrPtr->mOutlineColor = color;
66     attrPtr->mOutlineThickness = thickness;
67   }
68   else
69   {
70     OutlineAttributes* attr = new OutlineAttributes();
71     attr->mOutlineColor = color;
72     attr->mOutlineThickness = thickness;
73     mFlags |= ( ( mFlags & ~OUTLINE_INDEX ) | ( mParameters.Size() & TEXT_PARAMETER_MASK ) | OUTLINE_EXISTS );
74     mParameters.PushBack( reinterpret_cast<char*>( attr ) );
75   }
76
77   if( enable )
78   {
79     mFlags |= OUTLINE_ENABLED;
80   }
81   else
82   {
83     mFlags &= ~OUTLINE_ENABLED;
84   }
85 }
86
87 void TextParameters::SetGlow( bool enable, const Vector4& color, float intensity )
88 {
89   if ( mFlags & GLOW_EXISTS )
90   {
91     GlowAttributes* attrPtr = reinterpret_cast<GlowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
92     attrPtr->mGlowColor = color;
93     attrPtr->mGlowIntensity = intensity;
94   }
95   else
96   {
97     GlowAttributes* attr = new GlowAttributes();
98     attr->mGlowColor = color;
99     attr->mGlowIntensity = intensity;
100     mFlags |= ( ( mFlags & ~GLOW_INDEX ) | ( ( mParameters.Size() & TEXT_PARAMETER_MASK ) << GLOW_INDEX_SHIFT ) | GLOW_EXISTS );
101     mParameters.PushBack( reinterpret_cast<char*>( attr ) );
102   }
103
104   if( enable )
105   {
106     mFlags |= GLOW_ENABLED;
107   }
108   else
109   {
110     mFlags &= ~GLOW_ENABLED;
111   }
112 }
113
114 void TextParameters::SetShadow( bool enable, const Vector4& color, const Vector2& offset, float size )
115 {
116   if ( mFlags & DROP_SHADOW_EXISTS )
117   {
118     DropShadowAttributes* attrPtr = reinterpret_cast<DropShadowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
119     attrPtr->mDropShadowColor = color;
120     attrPtr->mDropShadowOffset = offset;
121     attrPtr->mDropShadowSize = size;
122   }
123   else
124   {
125     DropShadowAttributes* attr = new DropShadowAttributes();
126     attr->mDropShadowColor = color;
127     attr->mDropShadowOffset = offset;
128     attr->mDropShadowSize = size;
129     mFlags |= ( ( mFlags & ~DROP_SHADOW_INDEX ) | ( ( mParameters.Size() & TEXT_PARAMETER_MASK ) << DROP_SHADOW_INDEX_SHIFT ) | DROP_SHADOW_EXISTS );
130     mParameters.PushBack( reinterpret_cast<char*>( attr ) );
131   }
132
133   if( enable )
134   {
135     mFlags |= DROP_SHADOW_ENABLED;
136   }
137   else
138   {
139     mFlags &= ~DROP_SHADOW_ENABLED;
140   }
141 }
142
143 void TextParameters::SetGradient( const Vector4& color, const Vector2& start, const Vector2& end )
144 {
145   if ( mFlags & GRADIENT_EXISTS )
146   {
147     GradientAttributes* attrPtr = reinterpret_cast<GradientAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
148     attrPtr->mGradientColor = color;
149     attrPtr->mGradientStartPoint = start;
150     attrPtr->mGradientEndPoint = end;
151   }
152   else
153   {
154     GradientAttributes* attr = new GradientAttributes();
155     attr->mGradientColor = color;
156     attr->mGradientStartPoint = start;
157     attr->mGradientEndPoint = end;
158     mFlags |= ( ( mFlags & ~GRADIENT_INDEX ) | ( ( mParameters.Size() & TEXT_PARAMETER_MASK ) << GRADIENT_INDEX_SHIFT ) | GRADIENT_EXISTS );
159     mParameters.PushBack( reinterpret_cast<char*>( attr ) );
160   }
161
162   if ( end != start )
163   {
164     mFlags |= GRADIENT_ENABLED;
165   }
166   else
167   {
168     mFlags &=~GRADIENT_ENABLED;
169   }
170 }
171
172 const Vector4& TextParameters::GetOutlineColor() const
173 {
174   if ( mFlags & OUTLINE_ENABLED )
175   {
176     const OutlineAttributes* attrPtr = reinterpret_cast<OutlineAttributes*>( *( mParameters.Begin() + ( mFlags & TEXT_PARAMETER_MASK ) ) );
177     return attrPtr->mOutlineColor;
178   }
179   else
180   {
181     return TextStyle::DEFAULT_OUTLINE_COLOR;
182   }
183 }
184
185 const Vector2& TextParameters::GetOutlineThickness() const
186 {
187   if ( mFlags & OUTLINE_EXISTS )
188   {
189     const OutlineAttributes* attrPtr = reinterpret_cast<OutlineAttributes*>( *( mParameters.Begin() + ( mFlags & TEXT_PARAMETER_MASK ) ) );
190     return attrPtr->mOutlineThickness;
191   }
192   else
193   {
194     return TextStyle::DEFAULT_OUTLINE_THICKNESS;
195   }
196 }
197
198 const Vector4& TextParameters::GetGlowColor() const
199 {
200   if ( mFlags & GLOW_EXISTS )
201   {
202     const GlowAttributes* attrPtr = reinterpret_cast<GlowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
203     return attrPtr->mGlowColor;
204   }
205   else
206   {
207     return TextStyle::DEFAULT_GLOW_COLOR;
208   }
209 }
210
211 float TextParameters::GetGlowIntensity() const
212 {
213   if ( mFlags & GLOW_EXISTS )
214   {
215     const GlowAttributes* attrPtr = reinterpret_cast<GlowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
216     return attrPtr->mGlowIntensity;
217   }
218   else
219   {
220     return TextStyle::DEFAULT_GLOW_INTENSITY;
221   }
222 }
223
224 const Vector4& TextParameters::GetDropShadowColor() const
225 {
226   if ( mFlags & DROP_SHADOW_EXISTS )
227   {
228     const DropShadowAttributes* attrPtr = reinterpret_cast<DropShadowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
229     return attrPtr->mDropShadowColor;
230   }
231   else
232   {
233     return TextStyle::DEFAULT_SHADOW_COLOR;
234   }
235 }
236
237 const Vector2& TextParameters::GetDropShadowOffset() const
238 {
239   if ( mFlags & DROP_SHADOW_EXISTS )
240   {
241
242     const DropShadowAttributes* attrPtr = reinterpret_cast<DropShadowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
243     return attrPtr->mDropShadowOffset;
244   }
245   else
246   {
247     return TextStyle::DEFAULT_SHADOW_OFFSET;
248   }
249 }
250
251 float TextParameters::GetDropShadowSize() const
252 {
253   if ( mFlags & DROP_SHADOW_EXISTS )
254   {
255     const DropShadowAttributes* attrPtr = reinterpret_cast<DropShadowAttributes*>( *( mParameters.Begin() + ( ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
256     return attrPtr->mDropShadowSize;
257   }
258   else
259   {
260     return TextStyle::DEFAULT_SHADOW_SIZE;
261   }
262 }
263
264 const Vector4& TextParameters::GetGradientColor() const
265 {
266   if ( mFlags & GRADIENT_EXISTS )
267   {
268     const GradientAttributes* attrPtr = reinterpret_cast<GradientAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
269     return attrPtr->mGradientColor;
270   }
271   else
272   {
273     return TextStyle::DEFAULT_GRADIENT_COLOR;
274   }
275 }
276
277 const Vector2& TextParameters::GetGradientStartPoint() const
278 {
279   if ( mFlags & GRADIENT_EXISTS )
280   {
281     const GradientAttributes* attrPtr = reinterpret_cast<GradientAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
282     return attrPtr->mGradientStartPoint;
283   }
284   else
285   {
286     return TextStyle::DEFAULT_GRADIENT_START_POINT;
287   }
288 }
289
290 const Vector2& TextParameters::GetGradientEndPoint() const
291 {
292   if ( mFlags & GRADIENT_EXISTS )
293   {
294     const GradientAttributes* attrPtr = reinterpret_cast<GradientAttributes*>( *( mParameters.Begin() + ( ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ) ) );
295     return attrPtr->mGradientEndPoint;
296   }
297   else
298   {
299     return TextStyle::DEFAULT_GRADIENT_END_POINT;
300   }
301 }
302
303 } // namespace Internal
304
305 } // namespace Dali