Title: [136942] trunk/Source/WebCore
Revision
136942
Author
[email protected]
Date
2012-12-07 02:50:02 -0800 (Fri, 07 Dec 2012)

Log Message

[EFL] [AC] Implement ImageExtractor::extractImage in GraphicsContext3DEfl.
https://bugs.webkit.org/show_bug.cgi?id=104271.

Patch by Kondapally Kalyan <[email protected]> on 2012-12-07
Reviewed by Kenneth Rohde Christiansen.

This patch implements ImageExtractor::extractImage in GraphicsContext3DEfl.

Covered by existing tests.

* platform/graphics/efl/GraphicsContext3DEfl.cpp:
(WebCore::GraphicsContext3D::ImageExtractor::~ImageExtractor):
(WebCore::GraphicsContext3D::ImageExtractor::extractImage):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (136941 => 136942)


--- trunk/Source/WebCore/ChangeLog	2012-12-07 10:47:51 UTC (rev 136941)
+++ trunk/Source/WebCore/ChangeLog	2012-12-07 10:50:02 UTC (rev 136942)
@@ -1,3 +1,18 @@
+2012-12-07  Kondapally Kalyan  <[email protected]>
+
+        [EFL] [AC] Implement ImageExtractor::extractImage in GraphicsContext3DEfl.
+        https://bugs.webkit.org/show_bug.cgi?id=104271.
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        This patch implements ImageExtractor::extractImage in GraphicsContext3DEfl.
+
+        Covered by existing tests.
+
+        * platform/graphics/efl/GraphicsContext3DEfl.cpp:
+        (WebCore::GraphicsContext3D::ImageExtractor::~ImageExtractor):
+        (WebCore::GraphicsContext3D::ImageExtractor::extractImage):
+
 2012-12-06  Carlos Garcia Campos  <[email protected]>
 
         Use always the order iterator from data member in RenderFlexibleBox

Modified: trunk/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp (136941 => 136942)


--- trunk/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp	2012-12-07 10:47:51 UTC (rev 136941)
+++ trunk/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp	2012-12-07 10:50:02 UTC (rev 136942)
@@ -24,7 +24,8 @@
 #if USE(3D_GRAPHICS) || USE(ACCELERATED_COMPOSITING)
 
 #include "GraphicsContext3DPrivate.h"
-#include "ImageData.h"
+#include "Image.h"
+#include "ImageSource.h"
 #include "NotImplemented.h"
 #include "OpenGLShims.h"
 #include "PlatformContextCairo.h"
@@ -243,12 +244,69 @@
 
 GraphicsContext3D::ImageExtractor::~ImageExtractor()
 {
+    delete m_decoder;
 }
 
-bool GraphicsContext3D::ImageExtractor::extractImage(bool /*premultiplyAlpha*/, bool /*ignoreGammaAndColorProfile*/)
+bool GraphicsContext3D::ImageExtractor::extractImage(bool premultiplyAlpha, bool ignoreGammaAndColorProfile)
 {
-    notImplemented();
-    return false;
+    // This implementation is taken from GraphicsContext3DCairo.
+
+    if (!m_image)
+        return false;
+
+    // We need this to stay in scope because the native image is just a shallow copy of the data.
+    m_decoder = new ImageSource(premultiplyAlpha ? ImageSource::AlphaPremultiplied : ImageSource::AlphaNotPremultiplied, ignoreGammaAndColorProfile ? ImageSource::GammaAndColorProfileIgnored : ImageSource::GammaAndColorProfileApplied);
+
+    if (!m_decoder)
+        return false;
+
+    ImageSource& decoder = *m_decoder;
+    m_alphaOp = AlphaDoNothing;
+
+    if (m_image->data()) {
+        decoder.setData(m_image->data(), true);
+
+        if (!decoder.frameCount() || !decoder.frameIsCompleteAtIndex(0))
+            return false;
+
+        OwnPtr<NativeImageCairo> nativeImage = adoptPtr(decoder.createFrameAtIndex(0));
+        m_imageSurface = nativeImage->surface();
+    } else {
+        NativeImageCairo* nativeImage = m_image->nativeImageForCurrentFrame();
+        m_imageSurface = (nativeImage) ? nativeImage->surface() : 0;
+
+        if (!premultiplyAlpha)
+            m_alphaOp = AlphaDoUnmultiply;
+    }
+
+    if (!m_imageSurface)
+        return false;
+
+    m_imageWidth = cairo_image_surface_get_width(m_imageSurface.get());
+    m_imageHeight = cairo_image_surface_get_height(m_imageSurface.get());
+
+    if (!m_imageWidth || !m_imageHeight)
+        return false;
+
+    if (cairo_image_surface_get_format(m_imageSurface.get()) != CAIRO_FORMAT_ARGB32)
+        return false;
+
+    uint srcUnpackAlignment = 1;
+    size_t bytesPerRow = cairo_image_surface_get_stride(m_imageSurface.get());
+    size_t bitsPerPixel = 32;
+    unsigned padding = bytesPerRow - bitsPerPixel / 8 * m_imageWidth;
+
+    if (padding) {
+        srcUnpackAlignment = padding + 1;
+        while (bytesPerRow % srcUnpackAlignment)
+            ++srcUnpackAlignment;
+    }
+
+    m_imagePixelData = cairo_image_surface_get_data(m_imageSurface.get());
+    m_imageSourceFormat = SourceFormatBGRA8;
+    m_imageSourceUnpackAlignment = srcUnpackAlignment;
+
+    return true;
 }
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to