Merge "Added UIThreadLoader to GLIB framework" into devel/master
[platform/core/uifw/dali-adaptor.git] / dali / internal / imaging / ubuntu-x11 / native-image-source-impl-x.h
1 #ifndef DALI_INTERNAL_NATIVE_IMAGE_SOURCE_H
2 #define DALI_INTERNAL_NATIVE_IMAGE_SOURCE_H
3
4 /*
5  * Copyright (c) 2023 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/internal/system/linux/dali-ecore-x.h>
23 #include <memory>
24
25 // INTERNAL INCLUDES
26 #include <dali/internal/imaging/common/native-image-source-impl.h>
27 #include <dali/public-api/adaptor-framework/native-image-source.h>
28
29 namespace Dali
30 {
31 namespace Internal
32 {
33 namespace Adaptor
34 {
35 class EglGraphics;
36 class EglImageExtensions;
37
38 /**
39  * Dali internal NativeImageSource.
40  */
41 class NativeImageSourceX : public Internal::Adaptor::NativeImageSource
42 {
43 public:
44   /**
45    * Create a new NativeImageSource internally.
46    * Depending on hardware the width and height may have to be a power of two.
47    * @param[in] width The width of the image.
48    * @param[in] height The height of the image.
49    * @param[in] depth color depth of the image.
50    * @param[in] nativeImageSource contains either: pixmap of type X11 Pixmap , a Ecore_X_Pixmap or is empty
51    * @return A smart-pointer to a newly allocated image.
52    */
53   static NativeImageSourceX* New(uint32_t                            width,
54                                  uint32_t                            height,
55                                  Dali::NativeImageSource::ColorDepth depth,
56                                  Any                                 nativeImageSource);
57   /**
58    * @copydoc Dali::NativeImageSource::GetNativeImageSource()
59    */
60   Any GetNativeImageSource() const override;
61
62   /**
63    * @copydoc Dali::NativeImageSource::GetPixels()
64    */
65   bool GetPixels(std::vector<uint8_t>& pixbuf, uint32_t& width, uint32_t& height, Pixel::Format& pixelFormat) const override;
66
67   /**
68    * @copydoc Dali::NativeImageSource::SetSource( Any source )
69    */
70   void SetSource(Any source) override;
71
72   /**
73    * @copydoc Dali::NativeImageSource::IsColorDepthSupported( ColorDepth colorDepth )
74    */
75   bool IsColorDepthSupported(Dali::NativeImageSource::ColorDepth colorDepth) override;
76
77   /**
78    * destructor
79    */
80   ~NativeImageSourceX() override;
81
82   /**
83    * @copydoc Dali::NativeImageSource::CreateResource()
84    */
85   bool CreateResource() override;
86
87   /**
88    * @copydoc Dali::NativeImageSource::DestroyResource()
89    */
90   void DestroyResource() override;
91
92   /**
93    * @copydoc Dali::NativeImageSource::TargetTexture()
94    */
95   uint32_t TargetTexture() override;
96
97   /**
98    * @copydoc Dali::NativeImageSource::PrepareTexture()
99    */
100   void PrepareTexture() override;
101
102   /**
103    * @copydoc Dali::NativeImageSource::GetWidth()
104    */
105   uint32_t GetWidth() const override
106   {
107     return mWidth;
108   }
109
110   /**
111    * @copydoc Dali::NativeImageSource::GetHeight()
112    */
113   uint32_t GetHeight() const override
114   {
115     return mHeight;
116   }
117
118   /**
119    * @copydoc Dali::NativeImageSource::RequiresBlending()
120    */
121   bool RequiresBlending() const override
122   {
123     return mBlendingRequired;
124   }
125
126   /**
127    * @copydoc Dali::NativeImageSource::GetTextureTarget()
128    */
129   int GetTextureTarget() const override;
130
131   /**
132    * @copydoc Dali::NativeImageSource::ApplyNativeFragmentShader()
133    */
134   bool ApplyNativeFragmentShader(std::string& shader) override;
135
136   /**
137    * @copydoc Dali::NativeImageSource::GetCustomSamplerTypename()
138    */
139   const char* GetCustomSamplerTypename() const override;
140
141   /**
142    * @copydoc Dali::NativeImageSource::GetNativeImageHandle()
143    */
144   Any GetNativeImageHandle() const override;
145
146   /**
147    * @copydoc Dali::NativeImageSource::SourceChanged()
148    */
149   bool SourceChanged() const override;
150
151   /**
152    * @copydoc Dali::NativeImageInterface::GetUpdatedArea()
153    */
154   Rect<uint32_t> GetUpdatedArea() override
155   {
156     return Rect<uint32_t>{0, 0, mWidth, mHeight};
157   }
158
159   /**
160    * @copydoc Dali::NativeImageInterface::GetExtension()
161    */
162   NativeImageInterface::Extension* GetNativeImageInterfaceExtension() override
163   {
164     return nullptr;
165   }
166
167   /**
168    * @copydoc Dali::Internal::Adaptor::NativeImageSource::AcquireBuffer()
169    */
170   uint8_t* AcquireBuffer(uint32_t& width, uint32_t& height, uint32_t& stride) override;
171
172   /**
173    * @copydoc Dali::Internal::Adaptor::NativeImageSource::ReleaseBuffer()
174    */
175   bool ReleaseBuffer(const Rect<uint32_t>& updatedArea) override;
176
177   /**
178    * @copydoc Dali::NativeImageSource::SetResourceDestructionCallback()
179    */
180   void SetResourceDestructionCallback(EventThreadCallback* callback) override;
181
182   /**
183    * @copydoc Dali::DevelNativeImageSource::EnableBackBuffer()
184    */
185   void EnableBackBuffer(bool enable) override;
186
187 private:
188   /**
189    * Private constructor; @see NativeImageSource::New()
190    * @param[in] width The width of the image.
191    * @param[in] height The height of the image.
192    * @param[in] colour depth of the image.
193    * @param[in] nativeImageSource contains either: pixmap of type X11 Pixmap , a Ecore_X_Pixmap or is empty
194    */
195   NativeImageSourceX(uint32_t                            width,
196                      uint32_t                            height,
197                      Dali::NativeImageSource::ColorDepth depth,
198                      Any                                 nativeImageSource);
199
200   /**
201    * 2nd phase construction.
202    */
203   void Initialize();
204
205   /**
206    * Uses X11 to get the default depth.
207    * @param depth the PixelImage depth enum
208    * @return default x11 pixel depth
209    */
210   int GetPixelDepth(Dali::NativeImageSource::ColorDepth depth) const;
211
212   /**
213    * Gets the pixmap from the Any parameter
214    * @param pixmap contains either: pixmap of type X11 Pixmap , a Ecore_X_Pixmap or is empty
215    * @return pixmap x11 pixmap
216    */
217   Ecore_X_Pixmap GetPixmapFromAny(Any pixmap) const;
218
219   /**
220    * Given an existing pixmap, the function uses X to find out
221    * the width, heigth and depth of that pixmap.
222    */
223   void GetPixmapDetails();
224
225 private:
226   uint32_t                             mWidth;                       ///< image width
227   uint32_t                             mHeight;                      ///< image heights
228   bool                                 mOwnPixmap;                   ///< Whether we created pixmap or not
229   Ecore_X_Pixmap                       mPixmap;                      ///< From Xlib
230   bool                                 mBlendingRequired;            ///< Whether blending is required
231   Dali::NativeImageSource::ColorDepth  mColorDepth;                  ///< color depth of image
232   void*                                mEglImageKHR;                 ///< From EGL extension
233   EglGraphics*                         mEglGraphics;                 ///< EGL Graphics
234   EglImageExtensions*                  mEglImageExtensions;          ///< The EGL Image Extensions
235   std::unique_ptr<EventThreadCallback> mResourceDestructionCallback; ///< The Resource Destruction Callback
236 };
237
238 } // namespace Adaptor
239
240 } // namespace Internal
241
242 } // namespace Dali
243
244 #endif // DALI_INTERNAL_NATIVE_IMAGE_SOURCE_H