LLVM/Emscripten fixes
[platform/core/uifw/dali-core.git] / dali / internal / event / images / nine-patch-image-impl.h
1 #ifndef __DALI_INTERNAL_NINE_PATCH_IMAGE_H__
2 #define __DALI_INTERNAL_NINE_PATCH_IMAGE_H__
3
4 /*
5  * Copyright (c) 2014 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 // INTERNAL INCLUDES
22 #include <dali/public-api/images/nine-patch-image.h>
23 #include <dali/internal/event/images/bitmap-image-impl.h>
24
25 namespace Dali
26 {
27
28 namespace Internal
29 {
30
31 class NinePatchImage;
32 typedef IntrusivePtr<NinePatchImage> NinePatchImagePtr;
33
34 class ResourceClient;
35 class ResourceManager;
36
37 namespace SceneGraph
38 {
39 class UpdateManager;
40 }
41
42 /**
43  * NinePatchImage represents an image resource that can be added to actors etc.
44  * It's image data has a border which determines stretch and fill areas
45  * Its pixel buffer data is loaded synchronously from file.
46  */
47 class NinePatchImage : public Image
48 {
49 public:
50
51   /**
52    * Create a new NinePatchImage.
53    * Also a pixel buffer for image data is allocated.
54    * Dali has ownership of the buffer.
55    * @param [in] filename    File to load synchronously into buffer
56    * @param [in] attributes  Image attributes of the file
57    * @param [in] loadPol     controls time of loading a resource from the filesystem (default: load when Image is created).
58    * @param [in] releasePol  optionally relase memory when image is not visible on screen (default: keep image data until Image object is alive).
59    */
60   static NinePatchImagePtr New( const std::string& filename,
61                                 const ImageAttributes& attributes,
62                                 LoadPolicy    loadPol    = ImageLoadPolicyDefault,
63                                 ReleasePolicy releasePol = ImageReleasePolicyDefault );
64
65   /**
66    * Create a new NinePatchImage
67    * For better performance and portability use power of two dimensions.
68    * The maximum size of the image is limited by GL_MAX_TEXTURE_SIZE.
69    * @param [in] filename    File to load synchronously into buffer
70    * @param [in] attributes  Image attributes of the file
71    * @param [in] loadPol     controls time of loading a resource from the filesystem (default: load when Image is created).
72    * @param [in] releasePol  optionally relase memory when image is not visible on screen (default: keep image data until Image object is alive).
73    */
74   NinePatchImage( const std::string& filename,
75                   const ImageAttributes& attributes,
76                   LoadPolicy    loadPol    = ImageLoadPolicyDefault,
77                   ReleasePolicy releasePol = ImageReleasePolicyDefault );
78
79   /**
80    * Convert Image object to a 9 patch image object if possible.
81    * @param[in] image The image to convert
82    * @return A pointer to the 9 patch image object, or NULL
83    * if the conversion is not possible.
84    */
85   static NinePatchImage* GetNinePatchImage( Image* image);
86
87
88 protected:
89   /**
90    * A reference counted object may only be deleted by calling Unreference()
91    */
92   virtual ~NinePatchImage();
93
94 public:
95   /**
96    * Get the stretch borders
97    * @return The border in pixels from the left, top, right, and bottom of the image respectively.
98    */
99   Vector4 GetStretchBorders();
100
101   /**
102    * Get the child rectangle
103    * @return the position and size of the child rectangle
104    */
105   Rect<int> GetChildRectangle();
106
107   /**
108    * @brief Create a cropped image from the bitmap with the 1 pixel border cropped off.
109    * This does not change the internal bitmap.
110    *
111    * @return the cropped bitmap.
112    */
113   BitmapImagePtr CreateCroppedBitmapImage();
114
115
116 protected: // From Resource
117   /**
118    * @copydoc Dali::Internal::Image::Connect
119    */
120   virtual void Connect();
121
122   /**
123    * @copydoc Dali::Internal::Image::Disconnect
124    */
125   virtual void Disconnect();
126
127 private:
128   /**
129    * Read the borders of the bitmap and determine the child area
130    * and stretch borders
131    */
132   void ParseBorders();
133
134 private:
135   ResourceClient*               mResourceClient;
136   Integration::BitmapPtr        mBitmap;
137   Vector4                       mStretchBorders;
138   Rect<int>                     mChildRectangle;
139   bool                          mParsedBorder;
140 };
141
142 } // namespace Internal
143
144 /**
145  * Helper methods for public API.
146  */
147 inline Internal::NinePatchImage& GetImplementation(Dali::NinePatchImage& handle)
148 {
149   DALI_ASSERT_ALWAYS( handle && "NinePatchImage handle is empty" );
150
151   BaseObject& image = handle.GetBaseObject();
152
153   return static_cast<Internal::NinePatchImage&>(image);
154 }
155
156 inline const Internal::NinePatchImage& GetImplementation(const Dali::NinePatchImage& handle)
157 {
158   DALI_ASSERT_ALWAYS( handle && "NinePatchImage handle is empty" );
159
160   const BaseObject& image = handle.GetBaseObject();
161
162   return static_cast<const Internal::NinePatchImage&>(image);
163 }
164
165 } // namespace Dali
166
167 #endif // __DALI_INTERNAL_NINE_PATCH_IMAGE_H__