WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch with testcase and changelog.
mask_redraw_patch.txt (text/plain), 10.34 KB, created by
Simon Fraser (smfr)
on 2008-07-10 10:48:16 PDT
(
hide
)
Description:
Patch with testcase and changelog.
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2008-07-10 10:48:16 PDT
Size:
10.34 KB
patch
obsolete
>diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog >index eefd8ea..7be13ac 100644 >--- a/WebCore/ChangeLog >+++ b/WebCore/ChangeLog >@@ -1,3 +1,27 @@ >+2008-07-10 Simon Fraser <simon.fraser@apple.com> >+ >+ When a mask image changes, ensure that elements >+ that use that mask image are repainted correctly. >+ >+ <https://bugs.webkit.org/show_bug.cgi?id=19954> >+ >+ Reviewed by Dave Hyatt >+ >+ * manual-tests/canvas-mask-redraw.html >+ Manual testcase >+ * rendering/RenderBox.cpp: >+ (WebCore::RenderBox::imageChanged): >+ (WebCore::RenderBox::repaintLayerRectsForImage): >+ * rendering/RenderBox.h: >+ Loop through background layers and mask layers, and >+ if this image is used in a layer, compute a repaint >+ rect and repaint. >+ * rendering/RenderImage.cpp: >+ (WebCore::RenderImage::imageChanged): >+ If this image has a mask, call the base class method. >+ * rendering/RenderObject.cpp: >+ Remove a bogus 'return'. >+ > 2008-07-09 Alex Mathews <possessedpenguinbob@gmail.com> > > Reviewed by Oliver Hunt. >diff --git a/WebCore/manual-tests/canvas-mask-redraw.html b/WebCore/manual-tests/canvas-mask-redraw.html >new file mode 100644 >index 0000000..f166b3a >--- /dev/null >+++ b/WebCore/manual-tests/canvas-mask-redraw.html >@@ -0,0 +1,65 @@ >+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >+ "http://www.w3.org/TR/html4/loose.dtd"> >+ >+<html lang="en"> >+<head> >+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> >+ <title>Canvas Mask</title> >+ <style type="text/css" media="screen"> >+ #canvas1 { >+ height: 300px; >+ width: 400px; >+ border: 1px solid black; >+ } >+ >+ .masked { >+/* -webkit-transform: rotate(10deg);*/ >+ -webkit-mask: -webkit-canvas(canvas1); >+ } >+ </style> >+ <script type="text/javascript" charset="utf-8"> >+ >+ var gPageWidth = 320; >+ var gPageHeight = 200; >+ >+ function drawPageShadow(shadowWidth) >+ { >+ var ctx = document.getCSSCanvasContext('2d', 'canvas1', gPageWidth, gPageHeight); >+ ctx.clearRect (0, 0, gPageWidth, gPageHeight); >+ >+ var gradient = ctx.createLinearGradient(0, 0, shadowWidth, 0); >+ gradient.addColorStop(0, 'rgba(0,0,0,1)'); >+ gradient.addColorStop(1, 'rgba(0,0,0,0)'); >+ ctx.fillStyle = gradient; >+ ctx.fillRect (0, 0, shadowWidth, gPageHeight); >+ } >+ >+ function redrawCanvas(event) >+ { >+ drawPageShadow(event.pageX); >+ } >+ >+ function onPageLoad() >+ { >+ drawPageShadow(640); >+ } >+ >+ window.addEventListener('load', onPageLoad, false); >+ >+ </script> >+</head> >+<body> >+ >+ <p>Hovering over the image or text should cause the element to be redrawn with a new mask</p> >+ <a href="https://bugs.webkit.org/show_bug.cgi?id=19954">https://bugs.webkit.org/show_bug.cgi?id=19954</a> >+ <h2>Image with mask</h2> >+ <img src="http://www.google.com/intl/en_ALL/images/logo.gif" width="320" height="200" alt="Clown Fish" class="masked" >+ onmousemove="redrawCanvas(event)"> >+ >+ <h2>Div with mask</h2> >+ <div class="masked" style="width: 640px" onmousemove="redrawCanvas(event)"> >+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. >+ </div> >+ >+</body> >+</html> >diff --git a/WebCore/rendering/RenderBox.cpp b/WebCore/rendering/RenderBox.cpp >index 8540727..0c973e4 100644 >--- a/WebCore/rendering/RenderBox.cpp >+++ b/WebCore/rendering/RenderBox.cpp >@@ -538,52 +538,66 @@ IntSize RenderBox::calculateBackgroundSize(const FillLayer* bgLayer, int scaledW > > void RenderBox::imageChanged(WrappedImagePtr image) > { >- if (isInlineFlow() || style()->borderImage().image() && style()->borderImage().image()->data() == image || >+ if (isInlineFlow() || >+ style()->borderImage().image() && style()->borderImage().image()->data() == image || > style()->maskBoxImage().image() && style()->maskBoxImage().image()->data() == image) { > repaint(); > return; > } > >- bool didFullRepaint = false; >- IntRect absoluteRect; >- RenderBox* backgroundRenderer; >- >- if (isRoot() || (isBody() && document()->isHTMLDocument() && !document()->documentElement()->renderer()->style()->hasBackground())) { >- // Our background propagates to the root. >- backgroundRenderer = view(); >+ bool didFullRepaint = repaintLayerRectsForImage(image, style()->backgroundLayers(), true); >+ if (!didFullRepaint) { >+ repaintLayerRectsForImage(image, style()->maskLayers(), false); >+ } >+} > >- int rw; >- int rh; >+bool RenderBox::repaintLayerRectsForImage(WrappedImagePtr image, const FillLayer* layers, bool drawingBackground) >+{ >+ IntRect absoluteRect; >+ RenderBox* layerRenderer = 0; > >- if (FrameView* frameView = static_cast<RenderView*>(backgroundRenderer)->frameView()) { >- rw = frameView->contentsWidth(); >- rh = frameView->contentsHeight(); >- } else { >- rw = backgroundRenderer->width(); >- rh = backgroundRenderer->height(); >- } >- absoluteRect = IntRect(-backgroundRenderer->marginLeft(), >- -backgroundRenderer->marginTop(), >- max(backgroundRenderer->width() + backgroundRenderer->marginLeft() + backgroundRenderer->marginRight() + backgroundRenderer->borderLeft() + backgroundRenderer->borderRight(), rw), >- max(backgroundRenderer->height() + backgroundRenderer->marginTop() + backgroundRenderer->marginBottom() + backgroundRenderer->borderTop() + backgroundRenderer->borderBottom(), rh)); >- } else { >- backgroundRenderer = this; >- absoluteRect = borderBox(); >- } >+ for (const FillLayer* curLayer = layers; curLayer; curLayer = curLayer->next()) { >+ if (curLayer->image() && image == curLayer->image()->data()) { >+ >+ // Now that we know this image is being used, compute the renderer and the rect >+ // if we haven't already >+ if (!layerRenderer) { >+ bool drawingRootBackground = drawingBackground && (isRoot() || (isBody() && document()->isHTMLDocument() && !document()->documentElement()->renderer()->style()->hasBackground())); >+ if (drawingRootBackground) { >+ layerRenderer = view(); >+ >+ int rw; >+ int rh; >+ >+ if (FrameView* frameView = static_cast<RenderView*>(layerRenderer)->frameView()) { >+ rw = frameView->contentsWidth(); >+ rh = frameView->contentsHeight(); >+ } else { >+ rw = layerRenderer->width(); >+ rh = layerRenderer->height(); >+ } >+ absoluteRect = IntRect(-layerRenderer->marginLeft(), >+ -layerRenderer->marginTop(), >+ max(layerRenderer->width() + layerRenderer->marginLeft() + layerRenderer->marginRight() + layerRenderer->borderLeft() + layerRenderer->borderRight(), rw), >+ max(layerRenderer->height() + layerRenderer->marginTop() + layerRenderer->marginBottom() + layerRenderer->borderTop() + layerRenderer->borderBottom(), rh)); >+ } else { >+ layerRenderer = this; >+ absoluteRect = borderBox(); >+ } > >- backgroundRenderer->computeAbsoluteRepaintRect(absoluteRect); >+ layerRenderer->computeAbsoluteRepaintRect(absoluteRect); >+ } > >- for (const FillLayer* bgLayer = style()->backgroundLayers(); bgLayer && !didFullRepaint; bgLayer = bgLayer->next()) { >- if (bgLayer->image() && image == bgLayer->image()->data()) { > IntRect repaintRect; > IntPoint phase; > IntSize tileSize; >- backgroundRenderer->calculateBackgroundImageGeometry(bgLayer, absoluteRect.x(), absoluteRect.y(), absoluteRect.width(), absoluteRect.height(), repaintRect, phase, tileSize); >+ layerRenderer->calculateBackgroundImageGeometry(curLayer, absoluteRect.x(), absoluteRect.y(), absoluteRect.width(), absoluteRect.height(), repaintRect, phase, tileSize); > view()->repaintViewRectangle(repaintRect); > if (repaintRect == absoluteRect) >- didFullRepaint = true; >+ return true; > } > } >+ return false; > } > > void RenderBox::calculateBackgroundImageGeometry(const FillLayer* bgLayer, int tx, int ty, int w, int h, IntRect& destRect, IntPoint& phase, IntSize& tileSize) >diff --git a/WebCore/rendering/RenderBox.h b/WebCore/rendering/RenderBox.h >index 8b04987..cd7e823 100644 >--- a/WebCore/rendering/RenderBox.h >+++ b/WebCore/rendering/RenderBox.h >@@ -183,6 +183,8 @@ protected: > > private: > void paintRootBoxDecorations(PaintInfo&, int tx, int ty); >+ // Returns true if we did a full repaint >+ bool repaintLayerRectsForImage(WrappedImagePtr image, const FillLayer* layers, bool drawingBackground); > > void calculateBackgroundImageGeometry(const FillLayer*, int tx, int ty, int w, int h, IntRect& destRect, IntPoint& phase, IntSize& tileSize); > >diff --git a/WebCore/rendering/RenderImage.cpp b/WebCore/rendering/RenderImage.cpp >index abb31fc..7e2c7fc 100644 >--- a/WebCore/rendering/RenderImage.cpp >+++ b/WebCore/rendering/RenderImage.cpp >@@ -249,7 +249,7 @@ void RenderImage::imageChanged(WrappedImagePtr newImage) > if (documentBeingDestroyed()) > return; > >- if (hasBoxDecorations()) >+ if (hasBoxDecorations() || hasMask()) > RenderReplaced::imageChanged(newImage); > > if (newImage != imagePtr() || !newImage) >diff --git a/WebCore/rendering/RenderObject.cpp b/WebCore/rendering/RenderObject.cpp >index edbc740..46bc83f 100644 >--- a/WebCore/rendering/RenderObject.cpp >+++ b/WebCore/rendering/RenderObject.cpp >@@ -3100,7 +3100,7 @@ AnimationController* RenderObject::animation() const > > void RenderObject::imageChanged(CachedImage* image) > { >- return imageChanged(static_cast<WrappedImagePtr>(image)); >+ imageChanged(static_cast<WrappedImagePtr>(image)); > } > > IntRect RenderObject::reflectionBox() const
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
simon.fraser
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 19954
:
22166
|
22167
|
22191
|
22193
| 22199