Changeset 114315 in webkit


Ignore:
Timestamp:
Apr 16, 2012 4:24:15 PM (12 years ago)
Author:
leviw@chromium.org
Message:

Make borderBoxRect sub-pixel precise and add a pixel snapped version
https://bugs.webkit.org/show_bug.cgi?id=84063

Reviewed by Eric Seidel.

In an effort to prevent misuse, we previously decided to have borderBoxRect return a
pixel-snapped IntRect. This is because borderBoxRect returns a rect that's positioned
at (0,0), and therefore won't snap to the same size as the element it's covering.

There are a couple uses of borderBoxRect that don't pixel snap the values and require
sub-pixel precision. This patch adds a pixelSnappedBorderBoxRect that makes the snapping
explicit, and moves uses that would otherwise pixel snap the rect to this version to
avoid producing a rect of the incorrect size. For details about pixel snapping with
LayoutUnits, please see https://trac.webkit.org/wiki/LayoutUnit

No new tests. No change in behavior.

  • html/shadow/TextControlInnerElements.cpp:

(WebCore::SpinButtonElement::defaultEventHandler):

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::addVisualOverflowFromTheme):

  • rendering/RenderBox.h:

(WebCore::RenderBox::borderBoxRect):
(WebCore::RenderBox::pixelSnappedBorderBoxRect):
(WebCore::RenderBox::borderBoundingBox):
(WebCore::RenderBox::hasVisualOverflow):

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::scrollCornerRect):
(WebCore::RenderLayer::scrollCornerAndResizerRect):
(WebCore::RenderLayer::horizontalScrollbarStart):
(WebCore::RenderLayer::positionOverflowControls):
(WebCore::RenderLayer::paintResizer):
(WebCore::RenderLayer::hitTestOverflowControls):

  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
(WebCore::RenderLayerBacking::startAnimation):
(WebCore::RenderLayerBacking::startTransition):

  • rendering/RenderTable.cpp:

(WebCore::RenderTable::addOverflowFromChildren):

  • rendering/RenderThemeMac.mm:

(WebCore::RenderThemeMac::paintSearchFieldCancelButton):
(WebCore::RenderThemeMac::paintSearchFieldResultsDecoration):
(WebCore::RenderThemeMac::paintSearchFieldResultsButton):

  • rendering/svg/RenderSVGRoot.cpp:

(WebCore::RenderSVGRoot::paintReplaced):
(WebCore::RenderSVGRoot::computeFloatRectForRepaint):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r114311 r114315  
     12012-04-16  Levi Weintraub  <leviw@chromium.org>
     2
     3        Make borderBoxRect sub-pixel precise and add a pixel snapped version
     4        https://bugs.webkit.org/show_bug.cgi?id=84063
     5
     6        Reviewed by Eric Seidel.
     7
     8        In an effort to prevent misuse, we previously decided to have borderBoxRect return a
     9        pixel-snapped IntRect. This is because borderBoxRect returns a rect that's positioned
     10        at (0,0), and therefore won't snap to the same size as the element it's covering.
     11
     12        There are a couple uses of borderBoxRect that don't pixel snap the values and require
     13        sub-pixel precision. This patch adds a pixelSnappedBorderBoxRect that makes the snapping
     14        explicit, and moves uses that would otherwise pixel snap the rect to this version to
     15        avoid producing a rect of the incorrect size. For details about pixel snapping with
     16        LayoutUnits, please see https://trac.webkit.org/wiki/LayoutUnit
     17
     18        No new tests. No change in behavior.
     19
     20        * html/shadow/TextControlInnerElements.cpp:
     21        (WebCore::SpinButtonElement::defaultEventHandler):
     22        * rendering/RenderBlock.cpp:
     23        (WebCore::RenderBlock::addVisualOverflowFromTheme):
     24        * rendering/RenderBox.h:
     25        (WebCore::RenderBox::borderBoxRect):
     26        (WebCore::RenderBox::pixelSnappedBorderBoxRect):
     27        (WebCore::RenderBox::borderBoundingBox):
     28        (WebCore::RenderBox::hasVisualOverflow):
     29        * rendering/RenderLayer.cpp:
     30        (WebCore::RenderLayer::scrollCornerRect):
     31        (WebCore::RenderLayer::scrollCornerAndResizerRect):
     32        (WebCore::RenderLayer::horizontalScrollbarStart):
     33        (WebCore::RenderLayer::positionOverflowControls):
     34        (WebCore::RenderLayer::paintResizer):
     35        (WebCore::RenderLayer::hitTestOverflowControls):
     36        * rendering/RenderLayerBacking.cpp:
     37        (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
     38        (WebCore::RenderLayerBacking::startAnimation):
     39        (WebCore::RenderLayerBacking::startTransition):
     40        * rendering/RenderTable.cpp:
     41        (WebCore::RenderTable::addOverflowFromChildren):
     42        * rendering/RenderThemeMac.mm:
     43        (WebCore::RenderThemeMac::paintSearchFieldCancelButton):
     44        (WebCore::RenderThemeMac::paintSearchFieldResultsDecoration):
     45        (WebCore::RenderThemeMac::paintSearchFieldResultsButton):
     46        * rendering/svg/RenderSVGRoot.cpp:
     47        (WebCore::RenderSVGRoot::paintReplaced):
     48        (WebCore::RenderSVGRoot::computeFloatRectForRepaint):
     49
    1502012-04-16  Anders Carlsson  <andersca@apple.com>
    251
  • trunk/Source/WebCore/html/shadow/TextControlInnerElements.cpp

    r113990 r114315  
    286286    IntPoint local = roundedIntPoint(box->absoluteToLocal(mouseEvent->absoluteLocation(), false, true));
    287287    if (mouseEvent->type() == eventNames().mousedownEvent && mouseEvent->button() == LeftButton) {
    288         if (box->borderBoxRect().contains(local)) {
     288        if (box->pixelSnappedBorderBoxRect().contains(local)) {
    289289            // The following functions of HTMLInputElement may run JavaScript
    290290            // code which detaches this shadow node. We need to take a reference
     
    305305        stopRepeatingTimer();
    306306    else if (event->type() == eventNames().mousemoveEvent) {
    307         if (box->borderBoxRect().contains(local)) {
     307        if (box->pixelSnappedBorderBoxRect().contains(local)) {
    308308            if (!m_capturing) {
    309309                if (Frame* frame = document()->frame()) {
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r114249 r114315  
    16671667        return;
    16681668
    1669     IntRect inflatedRect = borderBoxRect();
     1669    IntRect inflatedRect = pixelSnappedBorderBoxRect();
    16701670    theme()->adjustRepaintRect(this, inflatedRect);
    16711671    addVisualOverflow(inflatedRect);
  • trunk/Source/WebCore/rendering/RenderBox.h

    r113885 r114315  
    134134    void setFrameRect(const LayoutRect& rect) { m_frameRect = rect; }
    135135
    136     IntRect borderBoxRect() const { return IntRect(IntPoint(), IntSize(m_frameRect.pixelSnappedWidth(), m_frameRect.pixelSnappedHeight())); }
    137     virtual IntRect borderBoundingBox() const { return borderBoxRect(); }
     136    LayoutRect borderBoxRect() const { return LayoutRect(LayoutPoint(), size()); }
     137    IntRect pixelSnappedBorderBoxRect() const { return IntRect(IntPoint(), m_frameRect.pixelSnappedSize()); }
     138    virtual IntRect borderBoundingBox() const { return pixelSnappedBorderBoxRect(); }
    138139
    139140    // The content area of the box (excludes padding - and intrinsic padding for table cells, etc... - and border).
     
    455456
    456457    RenderOverflow* hasRenderOverflow() const { return m_overflow.get(); }   
    457     bool hasVisualOverflow() const { return m_overflow && !borderBoxRect().contains(pixelSnappedIntRect(m_overflow->visualOverflowRect())); }
     458    bool hasVisualOverflow() const { return m_overflow && !borderBoxRect().contains(m_overflow->visualOverflowRect()); }
    458459
    459460    virtual bool needsPreferredWidthsRecalculation() const;
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r114302 r114315  
    19951995    bool hasResizer = renderer()->style()->resize() != RESIZE_NONE;
    19961996    if ((hasHorizontalBar && hasVerticalBar) || (hasResizer && (hasHorizontalBar || hasVerticalBar)))
    1997         return cornerRect(this, renderBox()->borderBoxRect());
     1997        return cornerRect(this, renderBox()->pixelSnappedBorderBoxRect());
    19981998    return IntRect();
    19991999}
     
    20142014    IntRect scrollCornerAndResizer = scrollCornerRect();
    20152015    if (scrollCornerAndResizer.isEmpty())
    2016         scrollCornerAndResizer = resizerCornerRect(this, pixelSnappedIntRect(box->borderBoxRect()));
     2016        scrollCornerAndResizer = resizerCornerRect(this, box->pixelSnappedBorderBoxRect());
    20172017    return scrollCornerAndResizer;
    20182018}
     
    21162116    int x = minX + box->borderLeft();
    21172117    if (renderer()->style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
    2118         x += m_vBar ? m_vBar->width() : resizerCornerRect(this, box->borderBoxRect()).width();
     2118        x += m_vBar ? m_vBar->width() : resizerCornerRect(this, box->pixelSnappedBorderBoxRect()).width();
    21192119    return x;
    21202120}
     
    23192319        return;
    23202320
    2321     const IntRect borderBox = box->borderBoxRect();
     2321    const IntRect borderBox = box->pixelSnappedBorderBoxRect();
    23222322    const IntRect& scrollCorner = scrollCornerRect();
    23232323    IntRect absBounds(borderBox.location() + offsetFromLayer, borderBox.size());
     
    26582658    ASSERT(box);
    26592659
    2660     IntRect absRect = resizerCornerRect(this, box->borderBoxRect());
     2660    IntRect absRect = resizerCornerRect(this, box->pixelSnappedBorderBoxRect());
    26612661    absRect.moveBy(paintOffset);
    26622662    if (!absRect.intersects(damageRect))
     
    27132713    IntRect resizeControlRect;
    27142714    if (renderer()->style()->resize() != RESIZE_NONE) {
    2715         resizeControlRect = resizerCornerRect(this, box->borderBoxRect());
     2715        resizeControlRect = resizerCornerRect(this, box->pixelSnappedBorderBoxRect());
    27162716        if (resizeControlRect.contains(localPoint))
    27172717            return true;
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r114283 r114315  
    504504   
    505505    if (m_owningLayer->hasTransform()) {
    506         const IntRect borderBox = toRenderBox(renderer())->borderBoxRect();
     506        const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBoxRect();
    507507
    508508        // Get layout bounds in the coords of compAncestor to match relativeCompositingBounds.
     
    12971297#endif
    12981298   
    1299     if (hasTransform && m_graphicsLayer->addAnimation(transformVector, toRenderBox(renderer())->borderBoxRect().size(), anim, keyframes.animationName(), timeOffset)) {
     1299    if (hasTransform && m_graphicsLayer->addAnimation(transformVector, toRenderBox(renderer())->pixelSnappedBorderBoxRect().size(), anim, keyframes.animationName(), timeOffset)) {
    13001300        didAnimateTransform = true;
    13011301        compositor()->didStartAcceleratedAnimation(CSSPropertyWebkitTransform);
     
    13621362            transformVector.insert(new TransformAnimationValue(0, &fromStyle->transform()));
    13631363            transformVector.insert(new TransformAnimationValue(1, &toStyle->transform()));
    1364             if (m_graphicsLayer->addAnimation(transformVector, toRenderBox(renderer())->borderBoxRect().size(), transformAnim, GraphicsLayer::animationNameForTransition(AnimatedPropertyWebkitTransform), timeOffset)) {
     1364            if (m_graphicsLayer->addAnimation(transformVector, toRenderBox(renderer())->pixelSnappedBorderBoxRect().size(), transformAnim, GraphicsLayer::animationNameForTransition(AnimatedPropertyWebkitTransform), timeOffset)) {
    13651365                // To ensure that the correct transform is visible when the animation ends, also set the final transform.
    13661366                updateLayerTransform(toStyle);
  • trunk/Source/WebCore/rendering/RenderTable.cpp

    r113885 r114315  
    510510        int topBorderOverflow = borderTop() - outerBorderTop();
    511511        IntRect borderOverflowRect(leftBorderOverflow, topBorderOverflow, rightBorderOverflow - leftBorderOverflow, bottomBorderOverflow - topBorderOverflow);
    512         if (borderOverflowRect != borderBoxRect()) {
     512        if (borderOverflowRect != pixelSnappedBorderBoxRect()) {
    513513            addLayoutOverflow(borderOverflowRect);
    514514            addVisualOverflow(borderOverflowRect);
  • trunk/Source/WebCore/rendering/RenderThemeMac.mm

    r113532 r114315  
    15351535    float zoomLevel = o->style()->effectiveZoom();
    15361536
    1537     FloatRect localBounds = [search cancelButtonRectForBounds:NSRect(input->renderBox()->borderBoxRect())];
     1537    FloatRect localBounds = [search cancelButtonRectForBounds:NSRect(input->renderBox()->pixelSnappedBorderBoxRect())];
    15381538
    15391539#if ENABLE(INPUT_SPEECH)
     
    16201620    updateActiveState([search searchButtonCell], o);
    16211621
    1622     FloatRect localBounds = [search searchButtonRectForBounds:NSRect(input->renderBox()->borderBoxRect())];
     1622    FloatRect localBounds = [search searchButtonRectForBounds:NSRect(input->renderBox()->pixelSnappedBorderBoxRect())];
    16231623    localBounds = convertToPaintingRect(input->renderer(), o, localBounds, r);
    16241624
     
    16561656    float zoomLevel = o->style()->effectiveZoom();
    16571657
    1658     FloatRect localBounds = [search searchButtonRectForBounds:NSRect(input->renderBox()->borderBoxRect())];
     1658    FloatRect localBounds = [search searchButtonRectForBounds:NSRect(input->renderBox()->pixelSnappedBorderBoxRect())];
    16591659    localBounds = convertToPaintingRect(input->renderer(), o, localBounds, r);
    16601660   
  • trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp

    r112301 r114315  
    257257{
    258258    // An empty viewport disables rendering.
    259     if (borderBoxRect().isEmpty())
     259    if (pixelSnappedBorderBoxRect().isEmpty())
    260260        return;
    261261
     
    369369
    370370    // Apply initial viewport clip - not affected by overflow settings   
    371     repaintRect.intersect(borderBoxRect());
     371    repaintRect.intersect(pixelSnappedBorderBoxRect());
    372372
    373373    const SVGRenderStyle* svgStyle = style()->svgStyle();
Note: See TracChangeset for help on using the changeset viewer.