Changed RendererAttachment to use blend flag from RenderDataProvider rather than...
[platform/core/uifw/dali-core.git] / dali / internal / update / node-attachments / scene-graph-image-attachment.h
1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_IMAGE_ATTACHMENT_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_IMAGE_ATTACHMENT_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/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/event/common/event-thread-services.h>
26 #include <dali/internal/update/node-attachments/scene-graph-renderable-attachment.h>
27 #include <dali/internal/update/resources/bitmap-metadata.h>
28
29 namespace Dali
30 {
31
32 namespace Internal
33 {
34
35 // value types used by messages
36 template <> struct ParameterType< Dali::ImageActor::Style >
37 : public BasicType< Dali::ImageActor::Style > {};
38
39 namespace SceneGraph
40 {
41 class ImageRenderer;
42 class Shader;
43 class RenderQueue;
44
45 /**
46  * An attachment for rendering images in various ways.
47  */
48 class ImageAttachment : public RenderableAttachment
49 {
50 public:
51
52   typedef Dali::ImageActor::Style     Style;
53   typedef Dali::ImageActor::PixelArea PixelArea;
54
55   /**
56    * Create a new ImageAttachment.
57    * @param [in] textureId The resource ID of a texture.
58    * @return The newly allocated ImageAttachment.
59    */
60   static ImageAttachment* New( unsigned int textureId );
61
62   /**
63    * Virtual destructor
64    */
65   virtual ~ImageAttachment();
66
67   /**
68    * @copydoc RenderableAttachment::GetRenderer().
69    */
70   virtual Renderer& GetRenderer();
71
72   /**
73    * @copydoc RenderableAttachment::GetRenderer().
74    */
75   virtual const Renderer& GetRenderer() const;
76
77   /**
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.
81    */
82   void SetTextureId( BufferIndex updateBufferIndex, unsigned int textureId );
83
84   /**
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.
88    */
89   void SetPixelArea( BufferIndex updateBufferIndex, const PixelArea& pixelArea );
90
91   /**
92    * Query whether a pixel area has been set.
93    * @return True if a pixel area has been set.
94    */
95   bool IsPixelAreaSet() const
96   {
97     return mIsPixelAreaSet;
98   }
99
100   /**
101    * Remove any pixel areas specified with SetPixelArea; the entire image will be displayed.
102    * @pre image must be initialized.
103    */
104   void ClearPixelArea();
105
106   /**
107    * Set how the attachment is rendered; the default is STYLE_QUAD.
108    * @param [in] style The new style.
109    */
110   void SetStyle( Style style );
111
112   /**
113    * Retrieve how the attachment is rendered.
114    * @return The style.
115    */
116   Style GetStyle()
117   {
118     return mStyle;
119   }
120
121   /**
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.
126    */
127   void SetBorder( BufferIndex updateBufferIndex, const Vector4& border, bool inPixels );
128
129   /**
130    * Set the blending options. This should only be called from the update-thread.
131    * @param[in] updateBufferIndex The current update buffer index.
132    * @param[in] options A bitmask of blending options.
133    */
134   void SetBlendingOptions( BufferIndex updateBufferIndex, unsigned int options );
135
136   /**
137    * Set the blend-color. This should only be called from the update-thread.
138    * @param[in] updateBufferIndex The current update buffer index.
139    * @param[in] color The new blend-color.
140    */
141   void SetBlendColor( BufferIndex updateBufferIndex, const Vector4& color );
142
143   /**
144    * Set the face-culling mode.
145    * @param[in] updateBufferIndex The current update buffer index.
146    * @param[in] mode The face-culling mode.
147    */
148   void SetCullFace( BufferIndex updateBufferIndex, CullFaceMode mode );
149
150   /**
151    * Set the sampler used to render the texture for this renderable.
152    * @param[in] updateBufferIndex The current update buffer index.
153    * @param[in] samplerBitfield The image sampler packed options to set.
154    */
155   void SetSampler( BufferIndex updateBufferIndex, unsigned int samplerBitfield );
156
157   /**
158    * Apply a shader on the renderable
159    * @param[in] updateBufferIndex The current update buffer index.
160    * @param[in] shader to apply.
161    */
162   void ApplyShader( BufferIndex updateBufferIndex, Shader* shader );
163
164   /**
165    * Remove the shader from the renderable
166    * @param[in] updateBufferIndex The current update buffer index.
167    */
168   void RemoveShader( BufferIndex updateBufferIndex );
169
170   /**
171    * Called to notify that the shader might have been changed
172    * The implementation should recalculate geometry and scale based on the
173    * hints from the new shader
174    * @param[in] updateBufferIndex The current update buffer index.
175    * @return Return true if the geometry changed.
176    */
177   virtual void ShaderChanged( BufferIndex updateBufferIndex );
178
179   /**
180    * @copydoc RenderableAttachment::SizeChanged()
181    */
182   virtual void SizeChanged( BufferIndex updateBufferIndex );
183
184   /**
185    * @copydoc RenderableAttachment::DoPrepareRender()
186    */
187   virtual void DoPrepareRender( BufferIndex updateBufferIndex );
188
189   /**
190    * @copydoc RenderableAttachment::IsFullyOpaque()
191    */
192   virtual bool IsFullyOpaque( BufferIndex updateBufferIndex );
193
194 protected:
195
196   /**
197    * Protected constructor
198    */
199   ImageAttachment( unsigned int textureId );
200
201 private:
202   /**
203    * Sends the shader to the renderer
204    * @param updateBufferIndex for the message buffer
205    */
206   void SendShaderChangeMessage( BufferIndex updateBufferIndex );
207
208   /**
209    * @copydoc RenderableAttachment::Initialize2().
210    */
211   virtual void Initialize2( BufferIndex updateBufferIndex );
212
213   /**
214    * @copydoc RenderableAttachment::OnDestroy2().
215    */
216   virtual void OnDestroy2();
217
218   /**
219    * @copydoc NodeAttachment::ConnectedToSceneGraph()
220    */
221   virtual void ConnectedToSceneGraph();
222
223   /**
224    * @copydoc NodeAttachment::DisconnectedFromSceneGraph()
225    */
226   virtual void DisconnectedFromSceneGraph();
227
228   /**
229    * @copydoc RenderableAttachment::DoPrepareResources()
230    */
231   virtual bool DoPrepareResources( BufferIndex updateBufferIndex, ResourceManager& resourceManager );
232
233   // Helper to check whether a geometry hint was set
234   bool PreviousHintEnabled( Dali::ShaderEffect::GeometryHints hint ) const
235   {
236     return mPreviousRefreshHints & hint;
237   }
238
239   // Undefined
240   ImageAttachment(const ImageAttachment&);
241
242   // Undefined
243   ImageAttachment& operator=(const ImageAttachment& rhs);
244
245 private: // Data
246
247   ImageRenderer* mImageRenderer; ///< Raw-pointers to renderer that is owned by RenderManager
248   unsigned int mTextureId;        ///< The resource ID for a texture
249
250   // bitfields to fit in single byte
251   bool mRefreshMeshData      : 1; ///< Whether the vertex/index buffers needs regenerating
252   bool mIsPixelAreaSet       : 1; ///< Whether pixel area is set, cached for image actor to be able to ask for it
253   int  mPreviousRefreshHints : 4; ///< The shader geometry hints, when the vertex buffer was last refreshed, 4 bits is enough as there's 4 flags
254   Style mStyle               : 2; ///< rendering style, 2 bits is enough as only 2 values in the enum
255   CullFaceMode mCullFaceMode : 3; ///< Cullface mode, 3 bits is enough for 4 values
256   bool mUseBlend             : 1; ///< True if the attachment & renderer should be considered opaque for sorting and blending.
257
258   BitmapMetadata  mBitmapMetadata;///< The bitmap metadata
259   Vector2 mGeometrySize;          ///< The size of the currently used geometry
260
261 };
262
263 // Messages for ImageAttachment
264
265 inline void SetTextureIdMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, unsigned int id )
266 {
267   typedef MessageDoubleBuffered1< ImageAttachment, unsigned int > LocalType;
268
269   // Reserve some memory inside the message queue
270   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
271
272   // Construct message in the message queue memory; note that delete should not be called on the return value
273   new (slot) LocalType( &attachment, &ImageAttachment::SetTextureId, id );
274 }
275
276 inline void SetPixelAreaMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, const Dali::ImageActor::PixelArea& area )
277 {
278   typedef MessageDoubleBuffered1< ImageAttachment, Dali::ImageActor::PixelArea > LocalType;
279
280   // Reserve some memory inside the message queue
281   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
282
283   // Construct message in the message queue memory; note that delete should not be called on the return value
284   new (slot) LocalType( &attachment, &ImageAttachment::SetPixelArea, area );
285 }
286
287 inline void ClearPixelAreaMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment )
288 {
289   typedef Message< ImageAttachment > LocalType;
290
291   // Reserve some memory inside the message queue
292   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
293
294   // Construct message in the message queue memory; note that delete should not be called on the return value
295   new (slot) LocalType( &attachment, &ImageAttachment::ClearPixelArea );
296 }
297
298 inline void SetStyleMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, Dali::ImageActor::Style style )
299 {
300   typedef MessageValue1< ImageAttachment, Dali::ImageActor::Style > LocalType;
301
302   // Reserve some memory inside the message queue
303   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
304
305   // Construct message in the message queue memory; note that delete should not be called on the return value
306   new (slot) LocalType( &attachment, &ImageAttachment::SetStyle, style );
307 }
308
309 inline void SetNinePatchBorderMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, const Vector4& border, bool inPixels )
310 {
311   typedef MessageDoubleBuffered2< ImageAttachment, Vector4, bool > LocalType;
312
313   // Reserve some memory inside the message queue
314   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
315
316   // Construct message in the message queue memory; note that delete should not be called on the return value
317   new (slot) LocalType( &attachment, &ImageAttachment::SetBorder, border, inPixels );
318 }
319
320 inline void SetSortModifierMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, float modifier )
321 {
322   typedef MessageValue1< ImageAttachment, float > LocalType;
323
324   // Reserve some memory inside the message queue
325   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
326
327   // Construct message in the message queue memory; note that delete should not be called on the return value
328   new (slot) LocalType( &attachment, &ImageAttachment::SetSortModifier, modifier );
329 }
330
331 inline void SetCullFaceMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, CullFaceMode mode )
332 {
333   typedef MessageDoubleBuffered1< ImageAttachment, CullFaceMode > LocalType;
334
335   // Reserve some memory inside the message queue
336   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
337
338   // Construct message in the message queue memory; note that delete should not be called on the return value
339   new (slot) LocalType( &attachment, &ImageAttachment::SetCullFace, mode );
340 }
341
342 inline void SetBlendingOptionsMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, unsigned int options )
343 {
344   typedef MessageDoubleBuffered1< ImageAttachment, unsigned int > LocalType;
345
346   // Reserve some memory inside the message queue
347   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
348
349   new (slot) LocalType( &attachment, &ImageAttachment::SetBlendingOptions, options );
350 }
351
352 inline void SetBlendColorMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, const Vector4& color )
353 {
354   typedef MessageDoubleBuffered1< ImageAttachment, Vector4 > LocalType;
355
356   // Reserve some memory inside the message queue
357   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
358
359   new (slot) LocalType( &attachment, &ImageAttachment::SetBlendColor, color );
360 }
361
362 inline void SetSamplerMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, unsigned int samplerBitfield )
363 {
364   typedef MessageDoubleBuffered1< ImageAttachment, unsigned int > LocalType;
365
366   // Reserve some memory inside the message queue
367   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
368
369   // Construct message in the message queue memory; note that delete should not be called on the return value
370   new (slot) LocalType( &attachment, &ImageAttachment::SetSampler, samplerBitfield );
371 }
372
373 inline void ApplyShaderMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment, const Shader& constShader )
374 {
375   // Update thread can edit the object
376   Shader& shader = const_cast< Shader& >( constShader );
377
378   typedef MessageDoubleBuffered1< ImageAttachment, Shader* > LocalType;
379
380   // Reserve some memory inside the message queue
381   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
382
383   // Construct message in the message queue memory; note that delete should not be called on the return value
384   new (slot) LocalType( &attachment, &ImageAttachment::ApplyShader, &shader );
385 }
386
387 inline void RemoveShaderMessage( EventThreadServices& eventThreadServices, const ImageAttachment& attachment )
388 {
389   typedef MessageDoubleBuffered0< ImageAttachment > LocalType;
390
391   // Reserve some memory inside the message queue
392   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
393
394   // Construct message in the message queue memory; note that delete should not be called on the return value
395   new (slot) LocalType( &attachment, &ImageAttachment::RemoveShader );
396 }
397
398 } // namespace SceneGraph
399
400 } // namespace Internal
401
402 } // namespace Dali
403
404 #endif // __DALI_INTERNAL_SCENE_GRAPH_IMAGE_ATTACHMENT_H__