Changeset 162732 in webkit
- Timestamp:
- Jan 24, 2014 3:35:07 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r162731 r162732 1 2014-01-24 Zalan Bujtas <zalan@apple.com> 2 3 Subpixel rendering: Make PaintInfo layout unit aware. 4 https://bugs.webkit.org/show_bug.cgi?id=127562 5 6 Reviewed by Simon Fraser. 7 8 Replace PaintInfo's IntRect with LayoutRect to be able to render to 9 subpixel positions. 10 11 No functional changes. 12 13 * platform/graphics/LayoutRect.h: 14 * rendering/PaintInfo.h: 15 (WebCore::PaintInfo::PaintInfo): 16 (WebCore::PaintInfo::applyTransform): 17 * rendering/RenderBlock.cpp: 18 (WebCore::RenderBlock::paint): 19 * rendering/RenderBoxModelObject.cpp: 20 (WebCore::RenderBoxModelObject::paintFillLayerExtended): 21 * rendering/RenderLayer.cpp: 22 (WebCore::cornerRect): 23 (WebCore::RenderLayer::scrollCornerRect): 24 (WebCore::resizerCornerRect): 25 (WebCore::RenderLayer::scrollCornerAndResizerRect): 26 (WebCore::RenderLayer::horizontalScrollbarStart): 27 (WebCore::RenderLayer::drawPlatformResizerImage): 28 (WebCore::RenderLayer::paintResizer): 29 (WebCore::RenderLayer::hitTestOverflowControls): 30 * rendering/RenderLayer.h: 31 * rendering/RenderLayerBacking.cpp: 32 (WebCore::RenderLayerBacking::paintContents): 33 * rendering/RenderListBox.cpp: 34 (WebCore::RenderListBox::paintScrollbar): 35 * rendering/RenderWidget.cpp: 36 (WebCore::RenderWidget::paintContents): 37 * rendering/mathml/RenderMathMLOperator.cpp: 38 (WebCore::RenderMathMLOperator::fillWithExtensionGlyph): 39 * rendering/svg/SVGRenderingContext.h: 40 1 41 2014-01-24 Simon Fraser <simon.fraser@apple.com> 2 42 -
trunk/Source/WebCore/platform/LayoutUnit.h
r159159 r162732 119 119 #endif 120 120 121 static LayoutUnit fromPixel(int value) 122 { 123 return LayoutUnit(value); 124 } 125 121 126 static LayoutUnit fromFloatCeil(float value) 122 127 { -
trunk/Source/WebCore/platform/graphics/LayoutRect.h
r154858 r162732 40 40 namespace WebCore { 41 41 42 class FloatRect;43 44 42 class LayoutRect { 45 43 public: -
trunk/Source/WebCore/rendering/PaintInfo.h
r161381 r162732 54 54 */ 55 55 struct PaintInfo { 56 PaintInfo(GraphicsContext* newContext, const IntRect& newRect, PaintPhase newPhase, PaintBehavior newPaintBehavior,56 PaintInfo(GraphicsContext* newContext, const LayoutRect& newRect, PaintPhase newPhase, PaintBehavior newPaintBehavior, 57 57 RenderObject* newSubtreePaintRoot = nullptr, RenderRegion* region = nullptr, ListHashSet<RenderInline*>* newOutlineObjects = nullptr, 58 58 OverlapTestRequestMap* overlapTestRequests = nullptr, const RenderLayerModelObject* newPaintContainer = nullptr) … … 99 99 context->concatCTM(localToAncestorTransform); 100 100 101 if (rect .isInfinite())101 if (rect == LayoutRect::infiniteRect()) 102 102 return; 103 103 104 rect = localToAncestorTransform.inverse().mapRect(rect); 104 FloatRect tranformedRect(localToAncestorTransform.inverse().mapRect(rect)); 105 rect.setLocation(LayoutPoint(tranformedRect.location())); 106 rect.setSize(LayoutSize(tranformedRect.size())); 105 107 } 106 108 #endif 107 109 108 110 GraphicsContext* context; 109 IntRect rect;111 LayoutRect rect; 110 112 PaintPhase phase; 111 113 PaintBehavior paintBehavior; -
trunk/Source/WebCore/rendering/RenderBlock.cpp
r162726 r162732 2188 2188 // sit above the background/border. 2189 2189 if (hasOverflowClip() && style().visibility() == VISIBLE && (phase == PaintPhaseBlockBackground || phase == PaintPhaseChildBlockBackground) && paintInfo.shouldPaintWithinRoot(*this) && !paintInfo.paintRootBackgroundOnly()) 2190 layer()->paintOverflowControls(paintInfo.context, roundedIntPoint(adjustedPaintOffset), p aintInfo.rect);2190 layer()->paintOverflowControls(paintInfo.context, roundedIntPoint(adjustedPaintOffset), pixelSnappedIntRect(paintInfo.rect)); 2191 2191 } 2192 2192 -
trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp
r162480 r162732 721 721 // to actually render, so we should intersect the dirty rect with the border box of the background. 722 722 maskRect = pixelSnappedIntRect(rect); 723 maskRect.intersect(p aintInfo.rect);723 maskRect.intersect(pixelSnappedIntRect(paintInfo.rect)); 724 724 725 725 // Now create the mask. … … 774 774 if (boxShadowShouldBeAppliedToBackground || !shouldPaintBackgroundImage || !bgLayer->hasOpaqueImage(this) || !bgLayer->hasRepeatXY()) { 775 775 if (!boxShadowShouldBeAppliedToBackground) 776 backgroundRect.intersect(p aintInfo.rect);776 backgroundRect.intersect(pixelSnappedIntRect(paintInfo.rect)); 777 777 778 778 // If we have an alpha and we are painting the root element, go ahead and blend with the base background color. … … 806 806 BackgroundImageGeometry geometry; 807 807 calculateBackgroundImageGeometry(paintInfo.paintContainer, bgLayer, scrolledPaintRect, geometry, backgroundObject); 808 geometry.clip(p aintInfo.rect);808 geometry.clip(pixelSnappedIntRect(paintInfo.rect)); 809 809 if (!geometry.destRect().isEmpty()) { 810 810 CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer->composite() : op; -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r162663 r162732 2727 2727 } 2728 2728 2729 static IntRect cornerRect(const RenderLayer* layer, const IntRect& bounds)2729 static LayoutRect cornerRect(const RenderLayer* layer, const LayoutRect& bounds) 2730 2730 { 2731 2731 int horizontalThickness; … … 2746 2746 verticalThickness = layer->horizontalScrollbar()->height(); 2747 2747 } 2748 return IntRect(cornerStart(layer, bounds.x(), bounds.maxX(), horizontalThickness),2748 return LayoutRect(cornerStart(layer, bounds.x(), bounds.maxX(), horizontalThickness), 2749 2749 bounds.maxY() - verticalThickness - layer->renderer().style().borderBottomWidth(), 2750 2750 horizontalThickness, verticalThickness); … … 2761 2761 bool hasResizer = renderer().style().resize() != RESIZE_NONE; 2762 2762 if ((hasHorizontalBar && hasVerticalBar) || (hasResizer && (hasHorizontalBar || hasVerticalBar))) 2763 return cornerRect(this, renderBox()->pixelSnappedBorderBoxRect());2763 return pixelSnappedIntRect(cornerRect(this, renderBox()->borderBoxRect())); 2764 2764 return IntRect(); 2765 2765 } 2766 2766 2767 static IntRect resizerCornerRect(const RenderLayer* layer, const IntRect& bounds)2767 static LayoutRect resizerCornerRect(const RenderLayer* layer, const LayoutRect& bounds) 2768 2768 { 2769 2769 ASSERT(layer->renderer().isBox()); 2770 2770 if (layer->renderer().style().resize() == RESIZE_NONE) 2771 return IntRect();2771 return LayoutRect(); 2772 2772 return cornerRect(layer, bounds); 2773 2773 } 2774 2774 2775 IntRect RenderLayer::scrollCornerAndResizerRect() const2775 LayoutRect RenderLayer::scrollCornerAndResizerRect() const 2776 2776 { 2777 2777 RenderBox* box = renderBox(); 2778 2778 if (!box) 2779 2779 return IntRect(); 2780 IntRect scrollCornerAndResizer = scrollCornerRect();2780 LayoutRect scrollCornerAndResizer = scrollCornerRect(); 2781 2781 if (scrollCornerAndResizer.isEmpty()) 2782 scrollCornerAndResizer = resizerCornerRect(this, box-> pixelSnappedBorderBoxRect());2782 scrollCornerAndResizer = resizerCornerRect(this, box->borderBoxRect()); 2783 2783 return scrollCornerAndResizer; 2784 2784 } … … 2901 2901 int x = minX + box->borderLeft(); 2902 2902 if (renderer().style().shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) 2903 x += m_vBar ? m_vBar->width() : r esizerCornerRect(this, box->pixelSnappedBorderBoxRect()).width();2903 x += m_vBar ? m_vBar->width() : roundToInt(resizerCornerRect(this, box->borderBoxRect()).width()); 2904 2904 return x; 2905 2905 } … … 3484 3484 } 3485 3485 3486 void RenderLayer::drawPlatformResizerImage(GraphicsContext* context, IntRectresizerCornerRect)3486 void RenderLayer::drawPlatformResizerImage(GraphicsContext* context, const LayoutRect& resizerCornerRect) 3487 3487 { 3488 3488 float deviceScaleFactor = WebCore::deviceScaleFactor(&renderer().frame()); … … 3509 3509 return; 3510 3510 } 3511 IntRect imageRect(resizerCornerRect.maxXMaxYCorner() - cornerResizerSize, cornerResizerSize);3512 context->drawImage(resizeCornerImage.get(), renderer().style().colorSpace(), imageRect);3513 } 3514 3515 void RenderLayer::paintResizer(GraphicsContext* context, const IntPoint& paintOffset, const IntRect& damageRect)3511 LayoutRect imageRect(resizerCornerRect.maxXMaxYCorner() - cornerResizerSize, cornerResizerSize); 3512 context->drawImage(resizeCornerImage.get(), renderer().style().colorSpace(), pixelSnappedIntRect(imageRect)); 3513 } 3514 3515 void RenderLayer::paintResizer(GraphicsContext* context, const LayoutPoint& paintOffset, const LayoutRect& damageRect) 3516 3516 { 3517 3517 if (renderer().style().resize() == RESIZE_NONE) … … 3521 3521 ASSERT(box); 3522 3522 3523 IntRect absRect = resizerCornerRect(this, box->pixelSnappedBorderBoxRect());3523 LayoutRect absRect = resizerCornerRect(this, box->borderBoxRect()); 3524 3524 absRect.moveBy(paintOffset); 3525 3525 if (!absRect.intersects(damageRect)) … … 3543 3543 GraphicsContextStateSaver stateSaver(*context); 3544 3544 context->clip(absRect); 3545 IntRect largerCorner = absRect;3546 largerCorner.setSize( IntSize(largerCorner.width() + 1, largerCorner.height() + 1));3545 LayoutRect largerCorner = absRect; 3546 largerCorner.setSize(LayoutSize(largerCorner.width() + LayoutUnit::fromPixel(1), largerCorner.height() + LayoutUnit::fromPixel(1))); 3547 3547 context->setStrokeColor(Color(makeRGB(217, 217, 217)), ColorSpaceDeviceRGB); 3548 3548 context->setStrokeThickness(1.0f); 3549 3549 context->setFillColor(Color::transparent, ColorSpaceDeviceRGB); 3550 context->drawRect( largerCorner);3550 context->drawRect(pixelSnappedIntRect(largerCorner)); 3551 3551 } 3552 3552 } … … 3576 3576 IntRect resizeControlRect; 3577 3577 if (renderer().style().resize() != RESIZE_NONE) { 3578 resizeControlRect = resizerCornerRect(this, box->pixelSnappedBorderBoxRect());3578 resizeControlRect = pixelSnappedIntRect(resizerCornerRect(this, box->borderBoxRect())); 3579 3579 if (resizeControlRect.contains(localPoint)) 3580 3580 return true; -
trunk/Source/WebCore/rendering/RenderLayer.h
r162663 r162732 460 460 void paintOverflowControls(GraphicsContext*, const IntPoint&, const IntRect& damageRect, bool paintingOverlayControls = false); 461 461 void paintScrollCorner(GraphicsContext*, const IntPoint&, const IntRect& damageRect); 462 void paintResizer(GraphicsContext*, const IntPoint&, const IntRect& damageRect);462 void paintResizer(GraphicsContext*, const LayoutPoint&, const LayoutRect& damageRect); 463 463 464 464 void updateScrollInfoAfterLayout(); … … 1079 1079 1080 1080 // Rectangle encompassing the scroll corner and resizer rect. 1081 IntRect scrollCornerAndResizerRect() const;1081 LayoutRect scrollCornerAndResizerRect() const; 1082 1082 1083 1083 // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea. … … 1131 1131 void updateResizerStyle(); 1132 1132 1133 void drawPlatformResizerImage(GraphicsContext*, IntRectresizerCornerRect);1133 void drawPlatformResizerImage(GraphicsContext*, const LayoutRect& resizerCornerRect); 1134 1134 1135 1135 void updatePagination(); -
trunk/Source/WebCore/rendering/RenderLayerBacking.cpp
r162679 r162732 2254 2254 paintScrollbar(m_owningLayer.verticalScrollbar(), context, clip); 2255 2255 } else if (graphicsLayer == layerForScrollCorner()) { 2256 const IntRect& scrollCornerAndResizer = m_owningLayer.scrollCornerAndResizerRect();2256 const LayoutRect& scrollCornerAndResizer = m_owningLayer.scrollCornerAndResizerRect(); 2257 2257 context.save(); 2258 2258 context.translate(-scrollCornerAndResizer.x(), -scrollCornerAndResizer.y()); 2259 IntRect transformedClip = clip;2259 LayoutRect transformedClip = clip; 2260 2260 transformedClip.moveBy(scrollCornerAndResizer.location()); 2261 m_owningLayer.paintScrollCorner(&context, IntPoint(), transformedClip);2261 m_owningLayer.paintScrollCorner(&context, IntPoint(), pixelSnappedIntRect(transformedClip)); 2262 2262 m_owningLayer.paintResizer(&context, IntPoint(), transformedClip); 2263 2263 context.restore(); -
trunk/Source/WebCore/rendering/RenderListBox.cpp
r162663 r162732 351 351 height() - (borderTop() + borderBottom())); 352 352 m_vBar->setFrameRect(scrollRect); 353 m_vBar->paint(paintInfo.context, p aintInfo.rect);353 m_vBar->paint(paintInfo.context, pixelSnappedIntRect(paintInfo.rect)); 354 354 } 355 355 } -
trunk/Source/WebCore/rendering/RenderWidget.cpp
r160236 r162732 228 228 IntPoint paintLocation(roundToInt(adjustedPaintOffset.x() + borderLeft() + paddingLeft()), 229 229 roundToInt(adjustedPaintOffset.y() + borderTop() + paddingTop())); 230 IntRect paintRect = paintInfo.rect;231 232 IntSize widgetPaintOffset = paintLocation - widgetLocation;230 LayoutRect paintRect = paintInfo.rect; 231 232 LayoutSize widgetPaintOffset = paintLocation - widgetLocation; 233 233 // When painting widgets into compositing layers, tx and ty are relative to the enclosing compositing layer, 234 234 // not the root. In this case, shift the CTM and adjust the paintRect to be root-relative to fix plug-in drawing. … … 237 237 paintRect.move(-widgetPaintOffset); 238 238 } 239 m_widget->paint(paintInfo.context, p aintRect);239 m_widget->paint(paintInfo.context, pixelSnappedIntRect(paintRect)); 240 240 241 241 if (!widgetPaintOffset.isZero()) -
trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp
r161501 r162732 330 330 // Clipping the extender region here allows us to draw the bottom extender glyph into the 331 331 // regions of the bottom glyph without worrying about overdraw (hairy pixels) and simplifies later clipping. 332 IntRect clipBounds = info.rect;332 LayoutRect clipBounds = info.rect; 333 333 clipBounds.shiftYEdgeTo(from.y()); 334 334 clipBounds.shiftMaxYEdgeTo(to.y()); -
trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h
r159791 r162732 116 116 PaintInfo* m_paintInfo; 117 117 GraphicsContext* m_savedContext; 118 IntRect m_savedPaintRect;118 LayoutRect m_savedPaintRect; 119 119 #if ENABLE(FILTERS) 120 120 RenderSVGResourceFilter* m_filter;
Note: See TracChangeset
for help on using the changeset viewer.