Merge "Stop Overriding Actor::Add() & Actor::Remove()" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / visual-model-impl.h
1 #ifndef __DALI_TOOLKIT_TEXT_VISUAL_MODEL_IMPL_H__
2 #define __DALI_TOOLKIT_TEXT_VISUAL_MODEL_IMPL_H__
3
4 /*
5  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/common/dali-vector.h>
23 #include <dali/public-api/common/intrusive-ptr.h>
24 #include <dali/public-api/math/vector2.h>
25 #include <dali/public-api/math/vector4.h>
26 #include <dali/public-api/object/ref-object.h>
27
28 // INTERNAL INCLUDES
29 #include <dali-toolkit/internal/text/line-run.h>
30 #include <dali-toolkit/internal/text/color-run.h>
31
32 namespace Dali
33 {
34
35 namespace Toolkit
36 {
37
38 namespace Text
39 {
40
41 class VisualModel;
42 typedef IntrusivePtr<VisualModel> VisualModelPtr;
43
44 /**
45  * @brief A visual text model contains layout specific information.
46  *
47  * This includes:
48  * - A series of glyphs in visual order i.e. after the bidirectional reordering.
49  * - The position of each glyph within a 2D bounding box.
50  */
51 class VisualModel : public RefObject
52 {
53 public:
54
55   /**
56    * @brief Create a new instance of a VisualModel.
57    *
58    * @return A pointer to a new VisualModel.
59    */
60   static VisualModelPtr New();
61
62   // Glyph interface.
63
64   /**
65    * @brief Creates the character to glyph conversion table.
66    *
67    * @pre The glyphs per character table needs to be created first.
68    *
69    * @param[in] startIndex The character from where the conversion table is created.
70    * @param[in] numberOfCharacters The number of characters.
71    */
72   void CreateCharacterToGlyphTable( CharacterIndex startIndex,
73                                     Length numberOfCharacters );
74
75   /**
76    * @brief Creates an array containing the number of glyphs per character.
77    *
78    * @param[in] startIndex The character from where the table is created.
79    * @param[in] numberOfCharacters The number of characters.
80    */
81   void CreateGlyphsPerCharacterTable( CharacterIndex startIndex,
82                                       Length numberOfCharacters );
83
84   /**
85    * @brief Retrieves glyphs in the given buffer.
86    *
87    * The size of the @p glyphs buffer needs to be big enough to copy the @p numberOfGlyphs.
88    * @param[out] glyphs Pointer to a buffer where the glyphs are copied.
89    * @param[in] glyphIndex Index to the first glyph.
90    * @param[in] numberOfGlyphs Number of glyphs to be copied.
91    */
92   void GetGlyphs( GlyphInfo* glyphs,
93                   GlyphIndex glyphIndex,
94                   Length numberOfGlyphs ) const;
95
96   // Position interface
97
98   /**
99    * @brief Retrieves the glyph positions.
100    *
101    * @pre The size of the @p positions buffer needs to be big enough to copy the @p numberOfGlyphs positions.
102    * @param[out] glyphPositions Pointer to a buffer where the glyph positions are copied.
103    * @param[in] glyphIndex Index to the first glyph position.
104    * @param[in] numberOfGlyphs The number of positions to be copied.
105    */
106   void GetGlyphPositions( Vector2* glyphPositions,
107                           GlyphIndex glyphIndex,
108                           Length numberOfGlyphs ) const;
109
110   // Line interface.
111
112   /**
113    * @brief Retrieves the number of lines and the index to the first line where the given range of glyphs is laid out.
114    *
115    * @param[in] glyphIndex Index to the first glyph.
116    * @param[in] numberOfGlyphs The number of glyph.
117    * @param[out] firstLine Index to the line containing the glyph index.
118    * @param[out] numberOfLines The number of lines.
119    */
120   void GetNumberOfLines( GlyphIndex glyphIndex,
121                          Length numberOfGlyphs,
122                          LineIndex& firstLine,
123                          Length& numberOfLines ) const;
124
125   /**
126    * @brief Retrieves the lines where the given range of glyphs is laid out.
127    *
128    * The size of the @p lines buffer needs to be big enough to copy the @p numberOfLines.
129    *
130    * @param[out] lines Pointer to a buffer where the lines are copied.
131    * @param[in] glyphIndex Index to the first glyphs of the range.
132    * @param[in] numberOfGlyphs Number of glyphs in the range.
133    */
134   void GetLinesOfGlyphRange( LineRun* lines,
135                              GlyphIndex glyphIndex,
136                              Length numberOfGlyphs ) const;
137
138   /**
139    * @brief Retrieves the line index where the character is laid-out.
140    *
141    * @param[in] characterIndex The character's index.
142    *
143    * @return The line index.
144    */
145   LineIndex GetLineOfCharacter( CharacterIndex characterIndex );
146
147   // Underline runs
148
149   /**
150    * @brief Retrieves the underline runs.
151    *
152    * @param[out] underlineRuns Pointer to a buffer where the underline runs are copied.
153    * @param[in] index Index of the first underline run to be copied.
154    * @param[in] numberOfRuns Number of underline runs to be copied.
155    */
156   void GetUnderlineRuns( GlyphRun* underlineRuns,
157                          UnderlineRunIndex index,
158                          Length numberOfRuns ) const;
159
160   // Size interface
161
162   /**
163    * @brief Sets the natural size.
164    *
165    * @param[in] size The text's natural size.
166    */
167   void SetNaturalSize( const Vector2& size  );
168
169   /**
170    * @brief Retrieves the natural size.
171    *
172    * @return The text's natural size.
173    */
174   const Vector2& GetNaturalSize() const;
175
176   /**
177    * @brief Sets the text's layout size.
178    *
179    * @param[in] size The text's size.
180    */
181   void SetLayoutSize( const Vector2& size );
182
183   /**
184    * @brief Retrieves the text's layout size.
185    *
186    * @return The text's size.
187    */
188   const Vector2& GetLayoutSize() const;
189
190   /**
191    * @brief Set the text's color
192    *
193    * @param[in] textColor The text's color
194    */
195   void SetTextColor( const Vector4& textColor );
196
197   /**
198    * @brief Retrieve the text's color
199    *
200    * @return The text's color
201    */
202   const Vector4& GetTextColor() const;
203
204   /**
205    * @brief Sets the text's shadow offset.
206    *
207    * @param[in] shadowOffset The shadow offset, 0,0 indicates no shadow.
208    */
209   void SetShadowOffset( const Vector2& shadowOffset );
210
211   /**
212    * @brief Retrieves the text's shadow offset.
213    *
214    * @return The text's shadow offset, 0,0 indicates no shadow.
215    */
216   const Vector2& GetShadowOffset() const;
217
218   /**
219    * @brief Sets the text's shadow color.
220    *
221    * @param[in] shadowColor The shadow color.
222    */
223   void SetShadowColor( const Vector4& shadowColor );
224
225   /**
226    * @brief Retrieves the text's shadow color.
227    *
228    * @return The text's shadow color.
229    */
230   const Vector4& GetShadowColor() const;
231
232   /**
233    * @brief Sets the text's underline color.
234    *
235    * @param[in] color The text's underline color.
236    */
237   void SetUnderlineColor( const Vector4& color );
238
239   /**
240    * @brief Retrieves the text's underline color.
241    *
242    * @return The text's underline color.
243    */
244   const Vector4& GetUnderlineColor() const;
245
246   /**
247    * @brief Sets the text underline flag.
248    *
249    * @param[in] enabled true if underlined.
250    */
251   void SetUnderlineEnabled( bool enabled );
252
253   /**
254    * @brief Returns whether the text is underlined or not.
255    *
256    * @return underline state.
257    */
258   bool IsUnderlineEnabled() const;
259
260   /**
261    * @brief Clear the caches.
262    */
263   void ClearCaches();
264
265   /**
266    * @brief Set the override used for underline height, 0 indicates height will be come from font metrics
267    *
268    * @param[in] height The height in pixels of the underline
269    */
270   void SetUnderlineHeight( float height );
271
272   /**
273    * @brief Retrieves the underline height override
274    *
275    * @return Returns the override height for an underline, 0 indicates that font metrics will determine the height
276    */
277   float GetUnderlineHeight() const;
278
279 protected:
280
281   /**
282    * @brief A reference counted object may only be deleted by calling Unreference().
283    */
284   virtual ~VisualModel();
285
286 private:
287
288   /**
289    * @brief Private constructor.
290    */
291   VisualModel();
292
293   // Undefined
294   VisualModel( const VisualModel& handle );
295
296   // Undefined
297   VisualModel& operator=( const VisualModel& handle );
298
299 public:
300
301   Vector<GlyphInfo>      mGlyphs;               ///< For each glyph, the font's id, glyph's index within the font and glyph's metrics.
302   Vector<CharacterIndex> mGlyphsToCharacters;   ///< For each glyph, the index of the first character.
303   Vector<GlyphIndex>     mCharactersToGlyph;    ///< For each character, the index of the first glyph.
304   Vector<Length>         mCharactersPerGlyph;   ///< For each glyph, the number of characters that form the glyph.
305   Vector<Length>         mGlyphsPerCharacter;   ///< For each character, the number of glyphs that are shaped.
306   Vector<Vector2>        mGlyphPositions;       ///< For each glyph, the position.
307   Vector<LineRun>        mLines;                ///< The laid out lines.
308   Vector<GlyphRun>       mUnderlineRuns;        ///< Runs of glyphs that are underlined.
309   Vector<ColorGlyphRun>  mColorRuns;            ///< Runs of glyphs with the same color.
310
311   Vector2                mControlSize;           ///< The size of the UI control the decorator is adding it's decorations to.
312   Vector4                mTextColor;            ///< The text color
313   Vector4                mShadowColor;          ///< Color of drop shadow
314   Vector4                mUnderlineColor;       ///< Color of underline
315   Vector2                mShadowOffset;         ///< Offset for drop shadow, 0 indicates no shadow
316   float                  mUnderlineHeight;      ///< Fixed height for underline to override font metrics.
317
318 private:
319
320   Size                   mNaturalSize;        ///< Size of the text with no line wrapping.
321   Size                   mLayoutSize;         ///< Size of the laid-out text considering the layout properties set.
322
323   // Caches to increase performance in some consecutive operations.
324   LineIndex mCachedLineIndex; ///< Used to increase performance in consecutive calls to GetLineOfGlyph() or GetLineOfCharacter() with consecutive glyphs or characters.
325
326 public:
327
328   bool                   mUnderlineEnabled:1;   ///< Underline enabled flag
329   bool                   mUnderlineColorSet:1;  ///< Has the underline color been explicitly set?
330
331 };
332
333 } // namespace Text
334
335 } // namespace Toolkit
336
337 } // namespace Dali
338
339 #endif // __DALI_TOOLKIT_TEXT_VISUAL_MODEL_IMPL_H__