2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/imaging/windows/native-image-source-impl-win.h>
22 #include <dali/integration-api/debug.h>
25 #include <dali/internal/graphics/common/egl-image-extensions.h>
26 #include <dali/internal/graphics/gles/egl-graphics.h>
27 #include <dali/internal/adaptor/common/adaptor-impl.h>
28 #include <dali/internal/window-system/windows/platform-implement-win.h>
29 #include <dali/devel-api/adaptor-framework/bitmap-saver.h>
30 #include <dali/integration-api/render-surface.h>
40 using Dali::Integration::PixelBuffer;
42 NativeImageSourceWin* NativeImageSourceWin::New(unsigned int width, unsigned int height, Dali::NativeImageSource::ColorDepth depth, Any nativeImageSource )
44 NativeImageSourceWin* image = new NativeImageSourceWin( width, height, depth, nativeImageSource );
45 DALI_ASSERT_DEBUG( image && "NativeImageSource allocation failed." );
47 // 2nd phase construction
48 if(image) //< Defensive in case we ever compile without exceptions.
56 NativeImageSourceWin::NativeImageSourceWin( unsigned int width, unsigned int height, Dali::NativeImageSource::ColorDepth depth, Any nativeImageSource )
61 mBlendingRequired( false ),
64 mEglImageExtensions( NULL )
66 DALI_ASSERT_ALWAYS( Adaptor::IsAvailable() );
68 GraphicsInterface* graphics = &( Adaptor::GetImplementation( Adaptor::Get() ).GetGraphicsInterface() );
69 auto eglGraphics = static_cast<EglGraphics *>(graphics);
71 mEglImageExtensions = eglGraphics->GetImageExtensions();
73 DALI_ASSERT_DEBUG( mEglImageExtensions );
76 mPixmap = GetPixmapFromAny(nativeImageSource);
79 void NativeImageSourceWin::Initialize()
81 // if pixmap has been created outside of Windows Image we can return
84 // we don't own the pixmap
87 // find out the pixmap width / height and color depth
92 // get the pixel depth
93 int depth = GetPixelDepth(mColorDepth);
95 // set whether blending is required according to pixel format based on the depth
96 /* default pixel format is RGB888
97 If depth = 8, Pixel::A8;
98 If depth = 16, Pixel::RGB565;
99 If depth = 32, Pixel::RGBA8888 */
100 mBlendingRequired = ( depth == 32 || depth == 8 );
103 NativeImageSourceWin::~NativeImageSourceWin()
107 Any NativeImageSourceWin::GetNativeImageSource() const
112 bool NativeImageSourceWin::GetPixels(std::vector<uint8_t>& pixbuf, unsigned& width, unsigned& height, Pixel::Format& pixelFormat) const
114 DALI_ASSERT_DEBUG(sizeof(unsigned) == 4);
115 bool success = false;
122 bool NativeImageSourceWin::EncodeToFile(const std::string& filename) const
124 std::vector< uint8_t > pixbuf;
125 uint32_t width(0), height(0);
126 Pixel::Format pixelFormat;
128 if(GetPixels(pixbuf, width, height, pixelFormat))
130 return Dali::EncodeToFile(&pixbuf[0], filename, pixelFormat, width, height);
135 void NativeImageSourceWin::SetSource( Any source )
137 mPixmap = GetPixmapFromAny( source );
141 // we don't own the pixmap
144 // find out the pixmap width / height and color depth
149 bool NativeImageSourceWin::IsColorDepthSupported( Dali::NativeImageSource::ColorDepth colorDepth )
154 bool NativeImageSourceWin::GlExtensionCreate()
156 // if the image existed previously delete it.
157 if (mEglImageKHR != NULL)
159 GlExtensionDestroy();
162 // casting from an unsigned int to a void *, which should then be cast back
163 // to an unsigned int in the driver.
164 EGLClientBuffer eglBuffer = reinterpret_cast< EGLClientBuffer > (mPixmap);
166 mEglImageKHR = mEglImageExtensions->CreateImageKHR( eglBuffer );
168 return mEglImageKHR != NULL;
171 void NativeImageSourceWin::GlExtensionDestroy()
173 mEglImageExtensions->DestroyImageKHR(mEglImageKHR);
178 unsigned int NativeImageSourceWin::TargetTexture()
180 mEglImageExtensions->TargetTextureKHR(mEglImageKHR);
185 void NativeImageSourceWin::PrepareTexture()
189 int NativeImageSourceWin::GetPixelDepth(Dali::NativeImageSource::ColorDepth depth) const
193 case Dali::NativeImageSource::COLOR_DEPTH_DEFAULT:
197 case Dali::NativeImageSource::COLOR_DEPTH_8:
201 case Dali::NativeImageSource::COLOR_DEPTH_16:
205 case Dali::NativeImageSource::COLOR_DEPTH_24:
209 case Dali::NativeImageSource::COLOR_DEPTH_32:
215 DALI_ASSERT_DEBUG(0 && "unknown color enum");
221 unsigned int NativeImageSourceWin::GetPixmapFromAny(Any pixmap) const
228 // see if it is of type Windows pixmap
229 if (pixmap.GetType() == typeid ( unsigned int ))
231 // get the Windows pixmap type
232 unsigned int xpixmap = AnyCast<unsigned int>(pixmap);
234 // cast it to a Windows pixmap type
235 return static_cast<unsigned int>(xpixmap);
239 return AnyCast<unsigned int>(pixmap);
243 void NativeImageSourceWin::GetPixmapDetails()
247 } // namespace Adaptor
249 } // namespace internal