Merge branch 'new_text' into tizen
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / atlas-manager / atlas-manager-impl.h
1 #ifndef __DALI_TOOLKIT_ATLAS_MANAGER_IMPL_H__
2 #define __DALI_TOOLKIT_ATLAS_MANAGER_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/vector-wrapper.h>
23 #include <dali/public-api/object/base-object.h>
24
25 // INTERNAL INCLUDES
26 #include <dali-toolkit/internal/atlas-manager/atlas-manager.h>
27
28 namespace Dali
29 {
30
31 namespace Toolkit
32 {
33
34 class AtlasManager;
35
36 } // namespace Toolkit
37
38 namespace Toolkit
39 {
40
41 namespace Internal
42 {
43
44 typedef Dali::Vector< Toolkit::AtlasManager::AtlasSlot > slotContainer;
45
46 class AtlasManager;
47 typedef IntrusivePtr<AtlasManager> AtlasManagerPtr;
48
49 class AtlasManager : public Dali::BaseObject
50 {
51 public:
52
53   typedef uint32_t SizeType;
54   typedef SizeType AtlasId;
55   typedef SizeType ImageId;
56
57   /**
58    * @brief Internal storage of atlas attributes and image upload results
59    */
60   struct AtlasDescriptor
61   {
62     Dali::Atlas mAtlas;                                                 // atlas image
63     SizeType mWidth;                                                    // width of atlas
64     SizeType mHeight;                                                   // height of atlas
65     SizeType mBlockWidth;                                               // width of a block in atlas
66     SizeType mBlockHeight;                                              // height of a block in atlas
67     Pixel::Format mPixelFormat;                                         // pixel format used by atlas
68     BufferImage mHorizontalStrip;                                       // Image used to pad upload
69     BufferImage mVerticalStrip;                                         // Image used to pad upload
70     BufferImage mFilledPixelImage;                                      // Image used by atlas for operations such as underline
71     PixelBuffer* mStripBuffer;                                          // Blank image buffer used to pad upload
72     Material mMaterial;                                                 // material used for atlas texture
73     SizeType mNextFreeBlock;                                            // next free block will be placed here ( actually +1 )
74     Dali::Vector< SizeType > mFreeBlocksList;                           // unless there are any previously freed blocks
75   };
76
77   struct AtlasSlotDescriptor
78   {
79     SizeType mCount;                                                    // Reference count for this slot
80     SizeType mImageWidth;                                               // Width of image stored
81     SizeType mImageHeight;                                              // Height of image stored
82     AtlasId mAtlasId;                                                   // Image is stored in this Atlas
83     Dali::Vector< SizeType > mBlocksList;                               // List of blocks within atlas used for image
84   };
85
86   AtlasManager();
87
88   /**
89    * Create a new AtlasManager
90    */
91   static AtlasManagerPtr New();
92
93   virtual ~AtlasManager();
94
95   /**
96    * @copydoc: Toolkit::AtlasManager::CreateAtlas
97    */
98   AtlasId CreateAtlas( SizeType width,
99                        SizeType height,
100                        SizeType blockWidth,
101                        SizeType blockHeight,
102                        Pixel::Format pixelformat );
103
104   /**
105    * @copydoc Toolkit::AtlasManager::SetAddPolicy
106    */
107   void SetAddPolicy( Toolkit::AtlasManager::AddFailPolicy policy );
108
109   /**
110    * @copydoc Toolkit::AtlasManager::Add
111    */
112   void Add( const BufferImage& image,
113             Toolkit::AtlasManager::AtlasSlot& slot,
114             Toolkit::AtlasManager::AtlasId atlas );
115
116   /**
117    * @copydoc Toolkit::AtlasManager::GenerateMeshData
118    */
119   void GenerateMeshData( ImageId id,
120                          const Vector2& position,
121                          MeshData& mesh );
122
123   /**
124    * @copydoc Toolkit::AtlasManager::StitchMesh
125    */
126   void StitchMesh( MeshData& first,
127                    const MeshData& second,
128                    bool optimize );
129
130   /**
131    * @copydoc Toolkit::AtlasManager::StitchMesh
132    */
133   void StitchMesh( const MeshData& first,
134                    const MeshData& second,
135                    MeshData& out, bool optimize );
136
137   /**
138    * @copydoc Toolkit::AtlasManager::Remove
139    */
140   bool Remove( ImageId id );
141
142   /**
143    * @copydoc Toolkit::AtlasManager::GetAtlasContainer
144    */
145   Dali::Atlas GetAtlasContainer( AtlasId atlas ) const;
146
147   /**
148    * @copydoc Toolkit::AtlasManager::GetAtlas
149    */
150   AtlasId GetAtlas( ImageId id ) const;
151
152   /**
153    * @copydoc Toolkit::AtlasManager::SetNewAtlasSize
154    */
155   void SetNewAtlasSize( const Vector2& size,
156                         const Vector2& blockSize );
157
158   /**
159    * @copydoc Toolkit::AtlasManager::GetAtlasSize
160    */
161   Vector2 GetAtlasSize( AtlasId atlas );
162
163   /**
164    * @copydoc Toolkit::AtlasManager::GetBlockSize
165    */
166   Vector2 GetBlockSize( AtlasId atlas );
167
168   /**
169    * @copydoc Toolkit::AtlasManager::GetFreeBlocks
170    */
171   SizeType GetFreeBlocks( AtlasId atlas ) const;
172
173   /*
174    * @copydoc Toolkit::AtlasManager::GetAtlasCount
175    */
176   SizeType GetAtlasCount() const;
177
178   /**
179    * @copydoc Toolkit::AtlasManager::GetPixelFormat
180    */
181   Pixel::Format GetPixelFormat( AtlasId atlas );
182
183   /**
184    * @copydoc Toolkit::AtlasManager::GetMetrics
185    */
186   void GetMetrics( Toolkit::AtlasManager::Metrics& metrics );
187
188 private:
189
190   std::vector< AtlasDescriptor > mAtlasList;        // List of atlases created
191   std::vector< AtlasSlotDescriptor > mImageList;  // List of bitmaps store in atlases
192
193   SizeType CheckAtlas( SizeType atlas,
194                        SizeType width,
195                        SizeType height,
196                        Pixel::Format pixelFormat,
197                        SizeType& blockArea,
198                        SizeType& totalBlocks );
199
200   void CreateMesh( SizeType atlas,
201                    SizeType imageWidth,
202                    SizeType imageHeight,
203                    const Vector2& position,
204                    SizeType widthInBlocks,
205                    SizeType heightInBlocks,
206                    Dali::MeshData& meshData,
207                    AtlasSlotDescriptor& desc );
208
209   void OptimizeVertices( const MeshData::VertexContainer& in,
210                          MeshData::FaceIndices& faces,
211                          MeshData::VertexContainer& out );
212
213   void UploadImage( const BufferImage& image,
214                     const AtlasSlotDescriptor& desc );
215
216   void PrintMeshData( const MeshData& meshData );
217
218   Vector2 mNewAtlasSize;
219   Vector2 mNewBlockSize;
220   Toolkit::AtlasManager::AddFailPolicy mAddFailPolicy;
221   uint32_t mFilledPixel;
222 };
223
224 } // namespace Internal
225
226 inline const Internal::AtlasManager& GetImplementation(const Toolkit::AtlasManager& manager)
227 {
228   DALI_ASSERT_ALWAYS( manager && "AtlasManager handle is empty" );
229
230   const BaseObject& handle = manager.GetBaseObject();
231
232   return static_cast<const Internal::AtlasManager&>(handle);
233 }
234
235 inline Internal::AtlasManager& GetImplementation(Toolkit::AtlasManager& manager)
236 {
237   DALI_ASSERT_ALWAYS( manager && "AtlasManager handle is empty" );
238
239   BaseObject& handle = manager.GetBaseObject();
240
241   return static_cast<Internal::AtlasManager&>(handle);
242 }
243
244 } // namespace Toolkit
245
246 } // namespace Dali
247
248
249  #endif // __DALI_TOOLKIT_ATLAS_MANAGER_IMPL_H__