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);