Title: [118947] trunk/Source/WebCore
Revision
118947
Author
[email protected]
Date
2012-05-30 11:48:52 -0700 (Wed, 30 May 2012)

Log Message

[Qt] Support IMAGE_DECODER_DOWN_SAMPLING flag.
https://bugs.webkit.org/show_bug.cgi?id=87840

Based on patches by Qi Zhang and Jussi Lehto.
Patch by Allan Sandfeld Jensen <[email protected]> on 2012-05-30
Reviewed by Kenneth Rohde Christiansen.

* platform/graphics/Image.cpp:
(WebCore::Image::adjustSourceRectForDownSampling):
* platform/graphics/Image.h:
(Image):
* platform/graphics/openvg/ImageOpenVG.cpp:
(WebCore::BitmapImage::draw):
* platform/graphics/qt/ImageQt.cpp:
(WebCore::Image::drawPattern):
(WebCore::BitmapImage::draw):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (118946 => 118947)


--- trunk/Source/WebCore/ChangeLog	2012-05-30 18:44:24 UTC (rev 118946)
+++ trunk/Source/WebCore/ChangeLog	2012-05-30 18:48:52 UTC (rev 118947)
@@ -1,3 +1,21 @@
+2012-05-30  Allan Sandfeld Jensen  <[email protected]>
+
+        [Qt] Support IMAGE_DECODER_DOWN_SAMPLING flag.
+        https://bugs.webkit.org/show_bug.cgi?id=87840
+
+        Based on patches by Qi Zhang and Jussi Lehto.
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * platform/graphics/Image.cpp:
+        (WebCore::Image::adjustSourceRectForDownSampling):
+        * platform/graphics/Image.h:
+        (Image):
+        * platform/graphics/openvg/ImageOpenVG.cpp:
+        (WebCore::BitmapImage::draw):
+        * platform/graphics/qt/ImageQt.cpp:
+        (WebCore::Image::drawPattern):
+        (WebCore::BitmapImage::draw):
+
 2012-05-30  Shinya Kawanaka  <[email protected]>
 
         comparePositions in htmlediting should consider nested Shadow DOM.

Modified: trunk/Source/WebCore/platform/graphics/Image.cpp (118946 => 118947)


--- trunk/Source/WebCore/platform/graphics/Image.cpp	2012-05-30 18:44:24 UTC (rev 118946)
+++ trunk/Source/WebCore/platform/graphics/Image.cpp	2012-05-30 18:48:52 UTC (rev 118947)
@@ -167,6 +167,23 @@
     startAnimation();
 }
 
+#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
+FloatRect Image::adjustSourceRectForDownSampling(const FloatRect& srcRect, const IntSize& scaledSize) const
+{
+    const IntSize unscaledSize = size();
+    if (unscaledSize == scaledSize)
+        return srcRect;
+
+    // Image has been down-sampled.
+    float xscale = static_cast<float>(scaledSize.width()) / unscaledSize.width();
+    float yscale = static_cast<float>(scaledSize.height()) / unscaledSize.height();
+    FloatRect scaledSrcRect = srcRect;
+    scaledSrcRect.scale(xscale, yscale);
+
+    return scaledSrcRect;
+}
+#endif
+
 void Image::computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio)
 {
     intrinsicRatio = size();

Modified: trunk/Source/WebCore/platform/graphics/Image.h (118946 => 118947)


--- trunk/Source/WebCore/platform/graphics/Image.h	2012-05-30 18:44:24 UTC (rev 118946)
+++ trunk/Source/WebCore/platform/graphics/Image.h	2012-05-30 18:48:52 UTC (rev 118947)
@@ -163,6 +163,10 @@
     virtual void drawPattern(GraphicsContext*, const FloatRect& srcRect, const AffineTransform& patternTransform,
                              const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator, const FloatRect& destRect);
 
+#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
+    FloatRect adjustSourceRectForDownSampling(const FloatRect& srcRect, const IntSize& scaledSize) const;
+#endif
+
 #if !ASSERT_DISABLED
     virtual bool notSolidColor() { return true; }
 #endif

Modified: trunk/Source/WebCore/platform/graphics/openvg/ImageOpenVG.cpp (118946 => 118947)


--- trunk/Source/WebCore/platform/graphics/openvg/ImageOpenVG.cpp	2012-05-30 18:44:24 UTC (rev 118946)
+++ trunk/Source/WebCore/platform/graphics/openvg/ImageOpenVG.cpp	2012-05-30 18:48:52 UTC (rev 118947)
@@ -105,24 +105,6 @@
 {
 }
 
-#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
-static void adjustSourceRectForDownSampling(FloatRect& srcRect, const IntSize& origSize, const IntSize& scaledSize)
-{
-    // We assume down-sampling zoom rates in X direction and in Y direction are same.
-    if (origSize.width() == scaledSize.width())
-        return;
-
-    // Image has been down sampled.
-    double rate = static_cast<double>(scaledSize.width()) / origSize.width();
-    double temp = srcRect.right() * rate;
-    srcRect.setX(srcRect.x() * rate);
-    srcRect.setWidth(temp - srcRect.x());
-    temp = srcRect.bottom() * rate;
-    srcRect.setY(srcRect.y() * rate);
-    srcRect.setHeight(temp - srcRect.y());
-}
-#endif
-
 void BitmapImage::draw(GraphicsContext* context, const FloatRect& dst, const FloatRect& src, ColorSpace styleColorSpace, CompositeOperator op)
 {
     if (dst.isEmpty() || src.isEmpty())
@@ -147,9 +129,10 @@
     else
         context->setCompositeOperation(op);
 
-    FloatRect srcRectLocal(src);
 #if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
-    adjustSourceRectForDownSampling(srcRectLocal, size(), image->size());
+    FloatRect srcRectLocal = adjustSourceRectForDownSampling(src, image->size());
+#else
+    FloatRect srcRectLocal(src);
 #endif
 
     context->platformContext()->activePainter()->drawImage(image, dst, srcRectLocal);

Modified: trunk/Source/WebCore/platform/graphics/qt/ImageQt.cpp (118946 => 118947)


--- trunk/Source/WebCore/platform/graphics/qt/ImageQt.cpp	2012-05-30 18:44:24 UTC (rev 118946)
+++ trunk/Source/WebCore/platform/graphics/qt/ImageQt.cpp	2012-05-30 18:48:52 UTC (rev 118947)
@@ -132,9 +132,15 @@
     if (!framePixmap) // If it's too early we won't have an image yet.
         return;
 
+#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
+    FloatRect tileRectAdjusted = adjustSourceRectForDownSampling(tileRect, framePixmap->size());
+#else
+    FloatRect tileRectAdjusted = tileRect;
+#endif
+
     // Qt interprets 0 width/height as full width/height so just short circuit.
     QRectF dr = QRectF(destRect).normalized();
-    QRect tr = QRectF(tileRect).toRect().normalized();
+    QRect tr = QRectF(tileRectAdjusted).toRect().normalized();
     if (!dr.width() || !dr.height() || !tr.width() || !tr.height())
         return;
 
@@ -239,6 +245,10 @@
         return;
     }
 
+#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
+    normalizedSrc = adjustSourceRectForDownSampling(normalizedSrc, image->size());
+#endif
+
     CompositeOperator previousOperator = ctxt->compositeOperation();
     ctxt->setCompositeOperation(!image->hasAlpha() && op == CompositeSourceOver ? CompositeCopy : op);
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to