Changeset 65729 in webkit


Ignore:
Timestamp:
Aug 20, 2010 2:13:49 AM (14 years ago)
Author:
Nikolas Zimmermann
Message:

2010-08-20 Nikolas Zimmermann <nzimmermann@rim.com>

Reviewed by Dirk Schulze.

Clippers are rasterized, when applied to scaled target object
https://bugs.webkit.org/show_bug.cgi?id=44325

Use SVGImageBufferTools logic for RenderSVGResourceClipper, just like RenderSVGResourceMasker/Gradient,
to avoid pixelation, when the clipper is applied to a scaled target object, or when the document is scaled.

Test: svg/clip-path/clip-path-pixelation.svg

  • rendering/RenderSVGResourceClipper.cpp: (WebCore::RenderSVGResourceClipper::applyClippingToContext): (WebCore::RenderSVGResourceClipper::createClipData):
  • rendering/RenderSVGResourceClipper.h:

2010-08-20 Nikolas Zimmermann <nzimmermann@rim.com>

Reviewed by Dirk Schulze.

Clippers are rasterized, when applied to scaled target object
https://bugs.webkit.org/show_bug.cgi?id=44325

  • platform/mac/svg/clip-path/clip-path-pixelation-expected.checksum: Added.
  • platform/mac/svg/clip-path/clip-path-pixelation-expected.png: Added.
  • platform/mac/svg/clip-path/clip-path-pixelation-expected.txt: Added.
  • svg/clip-path/clip-path-pixelation.svg: Added.
Location:
trunk
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r65725 r65729  
     12010-08-20  Nikolas Zimmermann  <nzimmermann@rim.com>
     2
     3        Reviewed by Dirk Schulze.
     4
     5        Clippers are rasterized, when applied to scaled target object
     6        https://bugs.webkit.org/show_bug.cgi?id=44325
     7
     8        * platform/mac/svg/clip-path/clip-path-pixelation-expected.checksum: Added.
     9        * platform/mac/svg/clip-path/clip-path-pixelation-expected.png: Added.
     10        * platform/mac/svg/clip-path/clip-path-pixelation-expected.txt: Added.
     11        * svg/clip-path/clip-path-pixelation.svg: Added.
     12
    1132010-08-19  Kent Tamura  <tkent@chromium.org>
    214
  • trunk/WebCore/ChangeLog

    r65728 r65729  
     12010-08-20  Nikolas Zimmermann  <nzimmermann@rim.com>
     2
     3        Reviewed by Dirk Schulze.
     4
     5        Clippers are rasterized, when applied to scaled target object
     6        https://bugs.webkit.org/show_bug.cgi?id=44325
     7
     8        Use SVGImageBufferTools logic for RenderSVGResourceClipper, just like RenderSVGResourceMasker/Gradient,
     9        to avoid pixelation, when the clipper is applied to a scaled target object, or when the document is scaled.
     10
     11        Test: svg/clip-path/clip-path-pixelation.svg
     12
     13        * rendering/RenderSVGResourceClipper.cpp:
     14        (WebCore::RenderSVGResourceClipper::applyClippingToContext):
     15        (WebCore::RenderSVGResourceClipper::createClipData):
     16        * rendering/RenderSVGResourceClipper.h:
     17
    1182010-08-20  Andreas Kling  <andreas.kling@nokia.com>
    219
  • trunk/WebCore/rendering/RenderSVGResourceClipper.cpp

    r65449 r65729  
    3838#include "SVGClipPathElement.h"
    3939#include "SVGElement.h"
     40#include "SVGImageBufferTools.h"
    4041#include "SVGRenderSupport.h"
    4142#include "SVGResources.h"
     
    164165        m_clipper.set(object, new ClipperData);
    165166
     167    bool shouldCreateClipData = false;
    166168    ClipperData* clipperData = m_clipper.get(object);
    167169    if (!clipperData->clipMaskImage) {
    168170        if (pathOnlyClipping(context, objectBoundingBox))
    169171            return true;
    170         createClipData(clipperData, objectBoundingBox, repaintRect);
    171     }
     172        shouldCreateClipData = true;
     173    }
     174
     175    AffineTransform absoluteTransform = SVGImageBufferTools::transformationToOutermostSVGCoordinateSystem(object);
     176    FloatRect clampedAbsoluteTargetRect = SVGImageBufferTools::clampedAbsoluteTargetRectForRenderer(object, absoluteTransform, repaintRect);
     177
     178    if (shouldCreateClipData)
     179        createClipData(clipperData, objectBoundingBox, repaintRect, clampedAbsoluteTargetRect, absoluteTransform);
    172180
    173181    if (!clipperData->clipMaskImage)
    174182        return false;
    175183
    176     context->clipToImageBuffer(clipperData->clipMaskImage.get(), repaintRect);
     184    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, clampedAbsoluteTargetRect, clipperData->clipMaskImage.get());
    177185    return true;
    178186}
    179187
    180 bool RenderSVGResourceClipper::createClipData(ClipperData* clipperData, const FloatRect& objectBoundingBox, const FloatRect& repaintRect)
    181 {
    182     IntRect clipMaskRect = enclosingIntRect(repaintRect);
    183     clipperData->clipMaskImage = ImageBuffer::create(clipMaskRect.size());
    184     if (!clipperData->clipMaskImage)
     188bool RenderSVGResourceClipper::createClipData(ClipperData* clipperData,
     189                                              const FloatRect& objectBoundingBox,
     190                                              const FloatRect& repaintRect,
     191                                              const FloatRect& clampedAbsoluteTargetRect,
     192                                              const AffineTransform& absoluteTransform)
     193{
     194    if (!SVGImageBufferTools::createImageBuffer(clampedAbsoluteTargetRect, clipperData->clipMaskImage, DeviceRGB))
    185195        return false;
    186196
     
    189199
    190200    maskContext->save();
    191     maskContext->translate(-repaintRect.x(), -repaintRect.y());
     201    maskContext->translate(-clampedAbsoluteTargetRect.x(), -clampedAbsoluteTargetRect.y());
     202    maskContext->concatCTM(absoluteTransform);
    192203
    193204    // clipPath can also be clipped by another clipPath.
  • trunk/WebCore/rendering/RenderSVGResourceClipper.h

    r65310 r65729  
    6666    bool applyClippingToContext(RenderObject*, const FloatRect&, const FloatRect&, GraphicsContext*);
    6767    bool pathOnlyClipping(GraphicsContext*, const FloatRect&);
    68     bool createClipData(ClipperData*, const FloatRect&, const FloatRect&);
     68    bool createClipData(ClipperData*, const FloatRect& objectBoundingBox, const FloatRect& repaintRect, const FloatRect& clampedAbsoluteTargetRect, const AffineTransform& absoluteTransform);
     69
    6970    void calculateClipContentRepaintRect();
    7071
Note: See TracChangeset for help on using the changeset viewer.