WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Final patch
canvas_mask_patch.txt (text/plain), 6.70 KB, created by
Simon Fraser (smfr)
on 2008-07-09 17:27:48 PDT
(
hide
)
Description:
Final patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2008-07-09 17:27:48 PDT
Size:
6.70 KB
patch
obsolete
>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..8c579a3 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 d8be64d..2404844 100644 >--- a/WebCore/rendering/RenderObject.cpp >+++ b/WebCore/rendering/RenderObject.cpp >@@ -3094,7 +3094,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:
hyatt
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 19954
:
22166
|
22167
|
22191
|
22193
|
22199