Changeset 245293 in webkit
- Timestamp:
- May 14, 2019, 11:28:11 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/scrolling/ios/event-region-scale-transform-shared-expected.txt (modified) (1 diff)
-
LayoutTests/fast/scrolling/ios/event-region-translate-transform-shared-expected.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/graphics/transforms/AffineTransform.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/transforms/AffineTransform.h (modified) (2 diffs)
-
Source/WebCore/rendering/EventRegion.cpp (modified) (1 diff)
-
Source/WebCore/rendering/EventRegion.h (modified) (2 diffs)
-
Source/WebCore/rendering/InlineTextBox.cpp (modified) (1 diff)
-
Source/WebCore/rendering/PaintInfo.h (modified) (2 diffs)
-
Source/WebCore/rendering/RenderBlock.cpp (modified) (1 diff)
-
Source/WebCore/rendering/RenderLayer.cpp (modified) (3 diffs)
-
Source/WebCore/rendering/RenderLayer.h (modified) (2 diffs)
-
Source/WebCore/rendering/RenderLayerBacking.cpp (modified) (1 diff)
-
Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r245292 r245293 1 2019-05-14 Antti Koivisto <antti@apple.com> 2 3 Event region computation should respect transforms 4 https://bugs.webkit.org/show_bug.cgi?id=197836 5 <rdar://problem/50762971> 6 7 Reviewed by Darin Adler. 8 9 * fast/scrolling/ios/event-region-scale-transform-shared-expected.txt: 10 * fast/scrolling/ios/event-region-translate-transform-shared-expected.txt: 11 1 12 2019-05-14 Said Abou-Hallawa <sabouhallawa@apple.com> 2 13 -
trunk/LayoutTests/fast/scrolling/ios/event-region-scale-transform-shared-expected.txt
r245242 r245293 20 20 (drawsContent 1) 21 21 (event region 22 (rect (0,0) width=200 height=200) 23 (rect (200,200) width=100 height=100) 22 (rect (0,0) width=12 height=12) 23 (rect (51,51) width=100 height=100) 24 (rect (151,151) width=50 height=50) 24 25 ) 25 26 ) -
trunk/LayoutTests/fast/scrolling/ios/event-region-translate-transform-shared-expected.txt
r245242 r245293 20 20 (drawsContent 1) 21 21 (event region 22 (rect (0,0) width=200 height=200) 23 (rect (200,200) width=100 height=100) 22 (rect (0,0) width=12 height=12) 23 (rect (151,151) width=200 height=200) 24 (rect (351,351) width=100 height=100) 24 25 ) 25 26 ) -
trunk/Source/WebCore/ChangeLog
r245289 r245293 1 2019-05-14 Antti Koivisto <antti@apple.com> 2 3 Event region computation should respect transforms 4 https://bugs.webkit.org/show_bug.cgi?id=197836 5 <rdar://problem/50762971> 6 7 Reviewed by Darin Adler. 8 9 * platform/graphics/transforms/AffineTransform.cpp: 10 (WebCore::AffineTransform::mapRegion const): 11 12 Add support for transforming regions. Non-rectlinear results use enclosing rects. 13 14 * platform/graphics/transforms/AffineTransform.h: 15 * rendering/EventRegion.cpp: 16 (WebCore::EventRegionContext::EventRegionContext): 17 (WebCore::EventRegionContext::pushTransform): 18 (WebCore::EventRegionContext::popTransform): 19 (WebCore::EventRegionContext::unite): 20 (WebCore::EventRegionContext::contains const): 21 22 Add a context object that holds the current transform. 23 24 * rendering/EventRegion.h: 25 (WebCore::EventRegion::makeContext): 26 * rendering/InlineTextBox.cpp: 27 (WebCore::InlineTextBox::paint): 28 * rendering/PaintInfo.h: 29 30 Replace the region object with the context. 31 32 * rendering/RenderBlock.cpp: 33 (WebCore::RenderBlock::paintObject): 34 * rendering/RenderLayer.cpp: 35 (WebCore::RenderLayer::paintLayerByApplyingTransform): 36 37 Apply transforms to regions if needed. 38 39 (WebCore::RenderLayer::collectEventRegionForFragments): 40 * rendering/RenderLayer.h: 41 * rendering/RenderLayerBacking.cpp: 42 (WebCore::RenderLayerBacking::updateEventRegion): 43 * rendering/SimpleLineLayoutFunctions.cpp: 44 (WebCore::SimpleLineLayout::paintFlow): 45 1 46 2019-05-14 Youenn Fablet <youenn@apple.com> 2 47 -
trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp
r242776 r245293 32 32 #include "FloatRect.h" 33 33 #include "IntRect.h" 34 #include "Region.h" 34 35 #include "TransformationMatrix.h" 35 36 #include <wtf/MathExtras.h> … … 333 334 result.setP4(mapPoint(q.p4())); 334 335 return result; 336 } 337 338 Region AffineTransform::mapRegion(const Region& region) const 339 { 340 if (isIdentityOrTranslation()) { 341 Region mappedRegion(region); 342 mappedRegion.translate(roundedIntSize(FloatSize(narrowPrecisionToFloat(m_transform[4]), narrowPrecisionToFloat(m_transform[5])))); 343 return mappedRegion; 344 } 345 346 Region mappedRegion; 347 for (auto& rect : region.rects()) 348 mappedRegion.unite(mapRect(rect)); 349 350 return mappedRegion; 335 351 } 336 352 -
trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h
r242776 r245293 54 54 class IntSize; 55 55 class IntRect; 56 class Region; 56 57 class TransformationMatrix; 57 58 … … 89 90 WEBCORE_EXPORT FloatRect mapRect(const FloatRect&) const; 90 91 WEBCORE_EXPORT FloatQuad mapQuad(const FloatQuad&) const; 92 93 WEBCORE_EXPORT Region mapRegion(const Region&) const; 91 94 92 95 WEBCORE_EXPORT bool isIdentity() const; -
trunk/Source/WebCore/rendering/EventRegion.cpp
r244037 r245293 31 31 namespace WebCore { 32 32 33 EventRegionContext::EventRegionContext(EventRegion& eventRegion) 34 : m_eventRegion(eventRegion) 35 { 36 } 37 38 void EventRegionContext::pushTransform(const AffineTransform& transform) 39 { 40 if (m_transformStack.isEmpty()) 41 m_transformStack.append(transform); 42 else 43 m_transformStack.append(m_transformStack.last() * transform); 44 } 45 46 void EventRegionContext::popTransform() 47 { 48 m_transformStack.removeLast(); 49 } 50 51 void EventRegionContext::unite(const Region& region, const RenderStyle& style) 52 { 53 if (m_transformStack.isEmpty()) 54 m_eventRegion.unite(region, style); 55 else 56 m_eventRegion.unite(m_transformStack.last().mapRegion(region), style); 57 } 58 59 bool EventRegionContext::contains(const IntRect& rect) const 60 { 61 if (m_transformStack.isEmpty()) 62 return m_eventRegion.contains(rect); 63 64 return m_eventRegion.contains(m_transformStack.last().mapRect(rect)); 65 } 66 33 67 EventRegion::EventRegion() = default; 34 68 -
trunk/Source/WebCore/rendering/EventRegion.h
r243962 r245293 26 26 #pragma once 27 27 28 #include "AffineTransform.h" 28 29 #include "Region.h" 29 30 #include "TouchAction.h" … … 33 34 namespace WebCore { 34 35 36 class EventRegion; 35 37 class RenderStyle; 38 39 class EventRegionContext { 40 public: 41 explicit EventRegionContext(EventRegion&); 42 43 void pushTransform(const AffineTransform&); 44 void popTransform(); 45 46 void unite(const Region&, const RenderStyle&); 47 bool contains(const IntRect&) const; 48 49 private: 50 EventRegion& m_eventRegion; 51 Vector<AffineTransform> m_transformStack; 52 }; 36 53 37 54 class EventRegion { 38 55 public: 39 56 WEBCORE_EXPORT EventRegion(); 57 58 EventRegionContext makeContext() { return EventRegionContext(*this); } 40 59 41 60 bool isEmpty() const { return m_region.isEmpty(); } -
trunk/Source/WebCore/rendering/InlineTextBox.cpp
r243962 r245293 506 506 if (paintInfo.phase == PaintPhase::EventRegion) { 507 507 if (visibleToHitTesting()) 508 paintInfo.eventRegion ->unite(enclosingIntRect(boxRect), renderer().style());508 paintInfo.eventRegionContext->unite(enclosingIntRect(boxRect), renderer().style()); 509 509 return; 510 510 } -
trunk/Source/WebCore/rendering/PaintInfo.h
r243962 r245293 38 38 namespace WebCore { 39 39 40 class EventRegion ;40 class EventRegionContext; 41 41 class OverlapTestRequestClient; 42 42 class RenderInline; … … 131 131 bool requireSecurityOriginAccessForWidgets { false }; 132 132 const RenderLayer* m_enclosingSelfPaintingLayer { nullptr }; 133 EventRegion* eventRegion { nullptr }; // For PaintPhase::EventRegion. 133 EventRegionContext* eventRegionContext { nullptr }; // For PaintPhase::EventRegion. 134 134 135 private: 135 136 GraphicsContext* m_context; -
trunk/Source/WebCore/rendering/RenderBlock.cpp
r243962 r245293 1247 1247 if (visibleToHitTesting()) { 1248 1248 auto borderRegion = approximateAsRegion(style().getRoundedBorderFor(borderRect)); 1249 paintInfo.eventRegion ->unite(borderRegion, style());1249 paintInfo.eventRegionContext->unite(borderRegion, style()); 1250 1250 } 1251 1251 1252 1252 // No need to check descendants if we don't have overflow and the area is already covered. 1253 bool needsTraverseDescendants = hasVisualOverflow() || !paintInfo.eventRegion ->contains(enclosingIntRect(borderRect));1253 bool needsTraverseDescendants = hasVisualOverflow() || !paintInfo.eventRegionContext->contains(enclosingIntRect(borderRect)); 1254 1254 #if PLATFORM(IOS_FAMILY) && ENABLE(POINTER_EVENTS) 1255 1255 needsTraverseDescendants = needsTraverseDescendants || document().touchActionElements(); -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r245219 r245293 4601 4601 transform.translateRight(devicePixelSnappedOffsetForThisLayer.width(), devicePixelSnappedOffsetForThisLayer.height()); 4602 4602 // Apply the transform. 4603 AffineTransform oldTransfrom = context.getCTM(); 4604 context.concatCTM(transform.toAffineTransform()); 4603 auto oldTransform = context.getCTM(); 4604 auto affineTransform = transform.toAffineTransform(); 4605 context.concatCTM(affineTransform); 4606 4607 if (paintingInfo.eventRegionContext) 4608 paintingInfo.eventRegionContext->pushTransform(affineTransform); 4605 4609 4606 4610 // Now do a paint with the root layer shifted to be us. … … 4611 4615 transformedPaintingInfo.subpixelOffset = adjustedSubpixelOffset; 4612 4616 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags); 4613 context.setCTM(oldTransfrom); 4617 4618 if (paintingInfo.eventRegionContext) 4619 paintingInfo.eventRegionContext->popTransform(); 4620 4621 context.setCTM(oldTransform); 4614 4622 } 4615 4623 … … 4999 5007 void RenderLayer::collectEventRegionForFragments(const LayerFragments& layerFragments, GraphicsContext& context, const LayerPaintingInfo& localPaintingInfo) 5000 5008 { 5001 ASSERT(localPaintingInfo.eventRegion );5009 ASSERT(localPaintingInfo.eventRegionContext); 5002 5010 5003 5011 for (const auto& fragment : layerFragments) { 5004 5012 PaintInfo paintInfo(context, fragment.foregroundRect.rect(), PaintPhase::EventRegion, { }); 5005 paintInfo.eventRegion = localPaintingInfo.eventRegion;5013 paintInfo.eventRegionContext = localPaintingInfo.eventRegionContext; 5006 5014 renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subpixelOffset)); 5007 5015 } -
trunk/Source/WebCore/rendering/RenderLayer.h
r245219 r245293 64 64 class ClipRects; 65 65 class ClipRectsCache; 66 class EventRegion ;66 class EventRegionContext; 67 67 class HitTestRequest; 68 68 class HitTestResult; … … 942 942 bool requireSecurityOriginAccessForWidgets; 943 943 bool clipToDirtyRect { true }; 944 EventRegion * eventRegion{ nullptr };944 EventRegionContext* eventRegionContext { nullptr }; 945 945 }; 946 946 -
trunk/Source/WebCore/rendering/RenderLayerBacking.cpp
r245242 r245293 1485 1485 1486 1486 EventRegion eventRegion; 1487 paintingInfo.eventRegion = &eventRegion; 1487 auto eventRegionContext = eventRegion.makeContext(); 1488 paintingInfo.eventRegionContext = &eventRegionContext; 1488 1489 1489 1490 auto paintFlags = RenderLayer::paintLayerPaintingCompositingAllPhasesFlags() | RenderLayer::PaintLayerCollectingEventRegion; -
trunk/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp
r243962 r245293 85 85 for (auto run : layout.runResolver().rangeForRect(paintRect)) { 86 86 FloatRect visualOverflowRect = computeOverflow(flow, run.rect()); 87 paintInfo.eventRegion ->unite(enclosingIntRect(visualOverflowRect), flow.style());87 paintInfo.eventRegionContext->unite(enclosingIntRect(visualOverflowRect), flow.style()); 88 88 } 89 89 return;
Note:
See TracChangeset
for help on using the changeset viewer.