1 #ifndef DALI_INTERNAL_NEW_TEXTURE_H
2 #define DALI_INTERNAL_NEW_TEXTURE_H
5 * Copyright (c) 2022 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/internal/event/common/event-thread-services.h>
23 #include <dali/internal/event/images/pixel-data-impl.h>
24 #include <dali/public-api/common/dali-common.h> // DALI_ASSERT_ALWAYS
25 #include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
26 #include <dali/public-api/images/image-operations.h> // Dali::ImageDimensions
27 #include <dali/public-api/images/pixel.h>
28 #include <dali/public-api/object/base-object.h>
29 #include <dali/public-api/rendering/texture.h> // Dali::Internal::Render::Texture
41 using TexturePtr = IntrusivePtr<Texture>;
43 class Texture : public BaseObject
47 * @brief Structure used to pass parameters to the Upload method
51 uint32_t dataXOffset; ///< Specifies a pixeldata offset in the x direction within the pixeldata buffer.
52 uint32_t dataYOffset; ///< Specifies a pixeldata offset in the y direction within the pixeldata buffer.
53 uint16_t dataWidth; ///< Specifies the width of the pixeldata subimage.
54 uint16_t dataHeight; ///< Specifies the height of the pixeldata subimage.
55 uint16_t layer; ///< Specifies the layer of a cube map or array texture
56 uint16_t mipmap; ///< Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
57 uint16_t xOffset; ///< Specifies a texel offset in the x direction within the texture array.
58 uint16_t yOffset; ///< Specifies a texel offset in the y direction within the texture array.
59 uint16_t width; ///< Specifies the width of the texture subimage
60 uint16_t height; ///< Specifies the height of the texture subimage.
64 * @brief Create a new Texture.
66 * @param[in] type The type of the texture
67 * @param[in] format The format of the pixel data
68 * @param[in] width The width of the texture
69 * @param[in] height The height of the texture
70 * @return A smart-pointer to the newly allocated Texture.
72 static TexturePtr New(TextureType::Type type, Pixel::Format format, uint32_t width, uint32_t height);
75 * @brief Creates a new Texture from a native image
76 * @param[in] nativeImageInterface The native image
77 * @return A smart-pointer to the newly allocated Texture.
79 static TexturePtr New(NativeImageInterface& nativeImageInterface);
82 * @brief Get the texture render object
84 * @return the texture render object
86 Render::Texture* GetRenderObject() const;
89 * @copydoc Dali::Texture::Upload()
91 bool Upload(PixelDataPtr pixelData);
94 * @copydoc Dali::Texture::Upload()
96 bool Upload(PixelDataPtr pixelData,
105 * @copydoc Dali::Texture::UploadSubPixelData()
107 bool UploadSubPixelData(PixelDataPtr pixelData,
108 uint32_t dataXOffset,
109 uint32_t dataYOffset,
111 uint32_t dataHeight);
114 * @copydoc Dali::Texture::UploadSubPixelData()
116 bool UploadSubPixelData(PixelDataPtr pixelData,
117 uint32_t dataXOffset,
118 uint32_t dataYOffset,
129 * @copydoc Dali::Texture::GenerateMipmaps()
131 void GenerateMipmaps();
134 * @copydoc Dali::Texture::GetWidth()
136 uint32_t GetWidth() const;
139 * @copydoc Dali::Texture::GetHeight()
141 uint32_t GetHeight() const;
144 * @copydoc Dali::Texture::GetPixelFormat()
146 Pixel::Format GetPixelFormat() const;
149 * @brief Determine if the texture is a native image
151 * @return true if the texture has been initialized with a native image
153 bool IsNative() const;
156 * @brief Apply any native texture code to the given fragment shader
158 * @param[in,out] shader The fragment shader
159 * @return true if the shader has been modified.
161 bool ApplyNativeFragmentShader(std::string& shader);
163 private: // implementation
166 * @param[in] type The type of the texture
167 * @param[in] format The format of the pixel data
168 * @param[in] size The size of the texture
170 Texture(TextureType::Type type, Pixel::Format format, ImageDimensions size);
173 * Constructor from native image
174 * @param[in] nativeImageInterface The native image
176 Texture(NativeImageInterfacePtr nativeImageInterface);
179 * Second stage initialization of the Texture
185 * A reference counted object may only be deleted by calling Unreference()
189 private: // unimplemented methods
190 Texture(const Texture&);
191 Texture& operator=(const Texture&);
194 Internal::EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
195 Internal::Render::Texture* mRenderObject; ///<The Render::Texture associated to this texture
197 NativeImageInterfacePtr mNativeImage; ///< Pointer to native image
198 ImageDimensions mSize; ///< Size of the texture
199 Dali::TextureType::Type mType; ///< Texture type (cached)
200 Pixel::Format mFormat; ///< Pixel format
203 } // namespace Internal
205 // Helpers for public-api forwarding methods
206 inline Internal::Texture& GetImplementation(Dali::Texture& handle)
208 DALI_ASSERT_ALWAYS(handle && "Texture handle is empty");
210 BaseObject& object = handle.GetBaseObject();
212 return static_cast<Internal::Texture&>(object);
215 inline const Internal::Texture& GetImplementation(const Dali::Texture& handle)
217 DALI_ASSERT_ALWAYS(handle && "Texture handle is empty");
219 const BaseObject& object = handle.GetBaseObject();
221 return static_cast<const Internal::Texture&>(object);
226 #endif // DALI_INTERNAL_TEXTURE_H