1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_IMAGE_ATTACHMENT_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_IMAGE_ATTACHMENT_H__
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <dali/public-api/actors/image-actor.h>
23 #include <dali/public-api/math/rect.h>
24 #include <dali/public-api/shader-effects/shader-effect.h>
25 #include <dali/internal/common/event-to-update.h>
26 #include <dali/internal/update/node-attachments/scene-graph-renderable-attachment.h>
27 #include <dali/internal/update/resources/bitmap-metadata.h>
35 // value types used by messages
36 template <> struct ParameterType< Dali::ImageActor::Style >
37 : public BasicType< Dali::ImageActor::Style > {};
46 * An attachment for rendering images in various ways.
48 class ImageAttachment : public RenderableAttachment
52 typedef Dali::ImageActor::Style Style;
53 typedef Dali::ImageActor::PixelArea PixelArea;
56 * Create a new ImageAttachment.
57 * @param [in] textureId The resource ID of a texture.
58 * @return The newly allocated ImageAttachment.
60 static ImageAttachment* New( unsigned int textureId );
65 virtual ~ImageAttachment();
68 * @copydoc RenderableAttachment::GetRenderer().
70 virtual Renderer& GetRenderer();
73 * @copydoc RenderableAttachment::GetRenderer().
75 virtual const Renderer& GetRenderer() const;
78 * Set the ID used to retrieve a texture from ResourceManager.
79 * @param[in] updateBufferIndex The current update buffer index.
80 * @param[in] textureId The texture ID.
82 void SetTextureId( BufferIndex updateBufferIndex, unsigned int textureId );
85 * Set the area of the texture to display.
86 * @param[in] updateBufferIndex The current update buffer index.
87 * @param [in] pixelArea The area to display, in pixels relative to the top-left (0,0) of the image.
89 void SetPixelArea( BufferIndex updateBufferIndex, const PixelArea& pixelArea );
92 * Query whether a pixel area has been set.
93 * @return True if a pixel area has been set.
95 bool IsPixelAreaSet() const
97 return mIsPixelAreaSet;
101 * Remove any pixel areas specified with SetPixelArea; the entire image will be displayed.
102 * @pre image must be initialized.
104 void ClearPixelArea();
107 * Set how the attachment is rendered; the default is STYLE_QUAD.
108 * @param [in] style The new style.
110 void SetStyle( Style style );
113 * Retrieve how the attachment is rendered.
122 * Set the border; this is applied with STYLE_NINE_PATCH.
123 * @param [in] updateBufferIndex to use.
124 * @param [in] border The new border setting.
125 * @param [in] inPixels if the border is in pixels.
127 void SetBorder( BufferIndex updateBufferIndex, const Vector4& border, bool inPixels );
130 * @copydoc RenderableAttachment::ShaderChanged()
132 virtual void ShaderChanged( BufferIndex updateBufferIndex );
135 * @copydoc RenderableAttachment::SizeChanged()
137 virtual void SizeChanged( BufferIndex updateBufferIndex );
140 * @copydoc RenderableAttachment::DoPrepareRender()
142 virtual void DoPrepareRender( BufferIndex updateBufferIndex );
145 * @copydoc RenderableAttachment::IsFullyOpaque()
147 virtual bool IsFullyOpaque( BufferIndex updateBufferIndex );
152 * Protected constructor
154 ImageAttachment( unsigned int textureId );
159 * @copydoc RenderableAttachment::ConnectToSceneGraph2().
161 virtual void ConnectToSceneGraph2( BufferIndex updateBufferIndex );
164 * @copydoc RenderableAttachment::OnDestroy2().
166 virtual void OnDestroy2();
169 * @copydoc RenderableAttachment::DoPrepareResources()
171 virtual bool DoPrepareResources( BufferIndex updateBufferIndex, ResourceManager& resourceManager );
173 // Helper to check whether a geometry hint was set
174 bool PreviousHintEnabled( Dali::ShaderEffect::GeometryHints hint ) const
176 return mPreviousRefreshHints & hint;
180 ImageAttachment(const ImageAttachment&);
183 ImageAttachment& operator=(const ImageAttachment& rhs);
187 ImageRenderer* mImageRenderer; ///< Raw-pointers to renderer that is owned by RenderManager
188 unsigned int mTextureId; ///< The resource ID for a texture
190 // bitfields to fit in single byte
191 bool mRefreshMeshData : 1; ///< Whether the vertex/index buffers needs regenerating
192 bool mIsPixelAreaSet : 1; ///< Whether pixel area is set, cached for image actor to be able to ask for it
193 int mPreviousRefreshHints : 4; ///< The shader geometry hints, when the vertex buffer was last refreshed, 4 bits is enough as there's 4 flags
194 Style mStyle : 2; ///< rendering style, 2 bits is enough as only 2 values in the enum
196 BitmapMetadata mBitmapMetadata;///< The bitmap metadata
197 Vector2 mGeometrySize; ///< The size of the currently used geometry
201 // Messages for ImageAttachment
203 inline void SetTextureIdMessage( EventToUpdate& eventToUpdate, const ImageAttachment& attachment, unsigned int id )
205 typedef MessageDoubleBuffered1< ImageAttachment, unsigned int > LocalType;
207 // Reserve some memory inside the message queue
208 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
210 // Construct message in the message queue memory; note that delete should not be called on the return value
211 new (slot) LocalType( &attachment, &ImageAttachment::SetTextureId, id );
214 inline void SetPixelAreaMessage( EventToUpdate& eventToUpdate, const ImageAttachment& attachment, const Dali::ImageActor::PixelArea& area )
216 typedef MessageDoubleBuffered1< ImageAttachment, Dali::ImageActor::PixelArea > LocalType;
218 // Reserve some memory inside the message queue
219 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
221 // Construct message in the message queue memory; note that delete should not be called on the return value
222 new (slot) LocalType( &attachment, &ImageAttachment::SetPixelArea, area );
225 inline void ClearPixelAreaMessage( EventToUpdate& eventToUpdate, const ImageAttachment& attachment )
227 typedef Message< ImageAttachment > LocalType;
229 // Reserve some memory inside the message queue
230 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
232 // Construct message in the message queue memory; note that delete should not be called on the return value
233 new (slot) LocalType( &attachment, &ImageAttachment::ClearPixelArea );
236 inline void SetStyleMessage( EventToUpdate& eventToUpdate, const ImageAttachment& attachment, Dali::ImageActor::Style style )
238 typedef MessageValue1< ImageAttachment, Dali::ImageActor::Style > LocalType;
240 // Reserve some memory inside the message queue
241 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
243 // Construct message in the message queue memory; note that delete should not be called on the return value
244 new (slot) LocalType( &attachment, &ImageAttachment::SetStyle, style );
247 inline void SetNinePatchBorderMessage( EventToUpdate& eventToUpdate, const ImageAttachment& attachment, const Vector4& border, bool inPixels )
249 typedef MessageDoubleBuffered2< ImageAttachment, Vector4, bool > LocalType;
251 // Reserve some memory inside the message queue
252 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
254 // Construct message in the message queue memory; note that delete should not be called on the return value
255 new (slot) LocalType( &attachment, &ImageAttachment::SetBorder, border, inPixels );
258 } // namespace SceneGraph
260 } // namespace Internal
264 #endif // __DALI_INTERNAL_SCENE_GRAPH_IMAGE_ATTACHMENT_H__