Changeset 269753 in webkit
- Timestamp:
- Nov 12, 2020 2:31:04 PM (3 years ago)
- Location:
- trunk/Source
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r269750 r269753 1 2020-11-12 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] GraphicsContext::drawPattern() should take a NativeImage argument 4 https://bugs.webkit.org/show_bug.cgi?id=218865 5 6 Reviewed by Simon Fraser. 7 8 When recording the DisplayList item DrawPattern, the renderingResourceIdentifier 9 of the NativeImage will be recorded. When replaying it back, the 10 renderingResourceIdentifier will be resolved to a NativeImage and the 11 item will be applied the same way we for DrawNativeImage. 12 13 DrawPattern will be inline DisplayList item and should not need encoding 14 or decoding when sending it to the GPU. 15 16 * platform/graphics/GraphicsContext.cpp: 17 (WebCore::GraphicsContext::drawPattern): 18 * platform/graphics/GraphicsContext.h: 19 (WebCore::GraphicsContext::drawPattern): 20 (WebCore::GraphicsContext::drawPlatformImage): Deleted. 21 * platform/graphics/GraphicsContextImpl.h: 22 * platform/graphics/Image.cpp: 23 (WebCore::Image::drawPattern): 24 * platform/graphics/cairo/GraphicsContextCairo.cpp: 25 (WebCore::GraphicsContext::drawPlatformPattern): 26 (WebCore::GraphicsContext::drawPattern): Deleted. 27 * platform/graphics/cairo/GraphicsContextImplCairo.cpp: 28 (WebCore::GraphicsContextImplCairo::drawPattern): 29 * platform/graphics/cairo/GraphicsContextImplCairo.h: 30 * platform/graphics/cg/GraphicsContextCG.cpp: 31 (WebCore::GraphicsContext::drawPlatformPattern): 32 (WebCore::GraphicsContext::drawPattern): Deleted. 33 * platform/graphics/displaylists/DisplayListItemBuffer.cpp: 34 (WebCore::DisplayList::ItemHandle::destroy): 35 (WebCore::DisplayList::ItemHandle::copyTo const): 36 * platform/graphics/displaylists/DisplayListItemType.cpp: 37 (WebCore::DisplayList::isDrawingItem): 38 (WebCore::DisplayList::isInlineItem): 39 * platform/graphics/displaylists/DisplayListItems.cpp: 40 (WebCore::DisplayList::DrawPattern::DrawPattern): 41 (WebCore::DisplayList::DrawPattern::apply const): 42 (WebCore::DisplayList::operator<<): 43 * platform/graphics/displaylists/DisplayListItems.h: 44 (WebCore::DisplayList::DrawPattern::DrawPattern): 45 (WebCore::DisplayList::DrawPattern::imageIdentifier const): 46 (WebCore::DisplayList::DrawPattern::imageSize const): 47 (WebCore::DisplayList::DrawPattern::tileRect const): 48 (WebCore::DisplayList::DrawPattern::patternTransform const): 49 (WebCore::DisplayList::DrawPattern::image const): Deleted. 50 (WebCore::DisplayList::DrawPattern::encode const): Deleted. 51 (WebCore::DisplayList::DrawPattern::decode): Deleted. 52 * platform/graphics/displaylists/DisplayListRecorder.cpp: 53 (WebCore::DisplayList::Recorder::drawPattern): 54 * platform/graphics/displaylists/DisplayListRecorder.h: 55 * platform/graphics/displaylists/DisplayListReplayer.cpp: 56 (WebCore::DisplayList::applyImageBufferItem): 57 (WebCore::DisplayList::applyNativeImageItem): 58 (WebCore::DisplayList::Replayer::applyItem): 59 * platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp: 60 (Nicosia::CairoOperationRecorder::drawPattern): 61 * platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.h: 62 * platform/graphics/win/GraphicsContextDirect2D.cpp: 63 (WebCore::GraphicsContext::drawPlatformPattern): 64 (WebCore::GraphicsContext::drawPattern): Deleted. 65 * platform/graphics/win/GraphicsContextImplDirect2D.cpp: 66 (WebCore::GraphicsContextImplDirect2D::drawPattern): 67 * platform/graphics/win/GraphicsContextImplDirect2D.h: 68 1 69 2020-11-12 Chris Dumez <cdumez@apple.com> 2 70 -
trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp
r269724 r269753 843 843 } 844 844 845 void GraphicsContext::drawPattern(NativeImage& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 846 { 847 if (paintingDisabled() || !patternTransform.isInvertible()) 848 return; 849 850 if (m_impl) { 851 m_impl->drawPattern(image, imageSize, destRect, tileRect, patternTransform, phase, spacing, options); 852 return; 853 } 854 855 drawPlatformPattern(image.platformImage(), imageSize, destRect, tileRect, patternTransform, phase, spacing, options); 856 } 857 845 858 void GraphicsContext::clipRoundedRect(const FloatRoundedRect& rect) 846 859 { -
trunk/Source/WebCore/platform/graphics/GraphicsContext.h
r269664 r269753 393 393 void drawImageBuffer(ImageBuffer&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { }); 394 394 395 void drawPattern(Image&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { });396 397 395 WEBCORE_EXPORT void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatPoint& destination, const ImagePaintingOptions& = { }); 398 396 void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const ImagePaintingOptions& = { }); 399 397 void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { }); 398 399 void drawPattern(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { }); 400 400 401 401 WEBCORE_EXPORT void setImageInterpolationQuality(InterpolationQuality); … … 651 651 void platformFillRoundedRect(const FloatRoundedRect&, const Color&); 652 652 653 void drawPlatformImage(const PlatformImagePtr&, const FloatSize& selfSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& = { }); 653 void drawPlatformImage(const PlatformImagePtr&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&); 654 void drawPlatformPattern(const PlatformImagePtr&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions&); 654 655 655 656 FloatRect computeLineBoundsAndAntialiasingModeForText(const FloatRect&, bool printing, Color&); -
trunk/Source/WebCore/platform/graphics/GraphicsContextImpl.h
r269716 r269753 71 71 72 72 virtual void drawImageBuffer(ImageBuffer&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&) = 0; 73 virtual void drawNativeImage(NativeImage&, const FloatSize& selfSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) = 0;74 virtual void drawPattern( Image&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions&) = 0;73 virtual void drawNativeImage(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) = 0; 74 virtual void drawPattern(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions&) = 0; 75 75 76 76 virtual void drawRect(const FloatRect&, float borderThickness) = 0; -
trunk/Source/WebCore/platform/graphics/Image.cpp
r252965 r269753 140 140 void Image::drawPattern(GraphicsContext& ctxt, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 141 141 { 142 if (!nativeImageForCurrentFrame(&ctxt)) 142 auto tileImage = preTransformedNativeImageForCurrentFrame(options.orientation() == ImageOrientation::FromImage); 143 if (!tileImage) 143 144 return; 144 145 145 ctxt.drawPattern(*t his, destRect, tileRect, patternTransform, phase, spacing, options);146 ctxt.drawPattern(*tileImage, size(), destRect, tileRect, patternTransform, phase, spacing, options); 146 147 147 148 if (imageObserver()) -
trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp
r269724 r269753 656 656 } 657 657 658 void GraphicsContext::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 659 { 660 if (paintingDisabled()) 661 return; 662 663 if (m_impl) { 664 m_impl->drawPattern(image, destRect, tileRect, patternTransform, phase, spacing, options); 665 return; 666 } 667 668 ASSERT(hasPlatformContext()); 669 if (auto nativeImage = image.nativeImageForCurrentFrame()) 670 Cairo::drawPattern(*platformContext(), nativeImage->platformImage().get(), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options); 658 void GraphicsContext::drawPlatformPattern(const PlatformImagePtr& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 659 { 660 if (paintingDisabled() || !patternTransform.isInvertible()) 661 return; 662 663 ASSERT(hasPlatformContext()); 664 Cairo::drawPattern(*platformContext(), image.get(), IntSize(imageSize), destRect, tileRect, patternTransform, phase, options); 671 665 } 672 666 -
trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextImplCairo.cpp
r269716 r269753 277 277 } 278 278 279 void GraphicsContextImplCairo::drawPattern( Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize&, const ImagePaintingOptions& options)280 { 281 if (auto nativeImage = image.nativeImageForCurrentFrame())282 Cairo::drawPattern(m_platformContext, nativeImage->platformImage().get(), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options);279 void GraphicsContextImplCairo::drawPattern(NativeImage& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 280 { 281 UNUSED_PARAM(spacing); 282 Cairo::drawPattern(m_platformContext, image.platformImage().get(), IntSize(imageSize), destRect, tileRect, patternTransform, phase, options); 283 283 } 284 284 -
trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextImplCairo.h
r269716 r269753 74 74 void drawImageBuffer(ImageBuffer&, const FloatRect&, const FloatRect&, const ImagePaintingOptions&) override; 75 75 void drawNativeImage(NativeImage&, const FloatSize&, const FloatRect&, const FloatRect&, const ImagePaintingOptions&) override; 76 void drawPattern( Image&, const FloatRect&, const FloatRect&, const AffineTransform&, const FloatPoint&, const FloatSize&, const ImagePaintingOptions&) override;76 void drawPattern(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions&) override; 77 77 78 78 void drawRect(const FloatRect&, float) override; -
trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp
r269724 r269753 416 416 } 417 417 418 void GraphicsContext::drawP attern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)418 void GraphicsContext::drawPlatformPattern(const PlatformImagePtr& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 419 419 { 420 420 if (paintingDisabled() || !patternTransform.isInvertible()) 421 421 return; 422 423 if (m_impl) {424 m_impl->drawPattern(image, destRect, tileRect, patternTransform, phase, spacing, options);425 return;426 }427 422 428 423 CGContextRef context = platformContext(); … … 443 438 float adjustedY = destRect.height() - (phase.y() - destRect.y() + tileRect.y() * narrowPrecisionToFloat(patternTransform.d()) + scaledTileHeight); 444 439 445 auto tileImage = image.preTransformedNativeImageForCurrentFrame(options.orientation() == ImageOrientation::FromImage); 446 447 float h = CGImageGetHeight(tileImage->platformImage().get()); 440 float h = CGImageGetHeight(image.get()); 448 441 449 442 RetainPtr<CGImageRef> subImage; 450 FloatSize imageSize = image.size();451 443 if (tileRect.size() == imageSize) 452 subImage = tileImage->platformImage();444 subImage = image; 453 445 else { 454 446 // Copying a sub-image out of a partially-decoded image stops the decoding of the original image. It should never happen 455 447 // because sub-images are only used for border-image, which only renders when the image is fully decoded. 456 ASSERT(h == image .height());457 subImage = adoptCF(CGImageCreateWithImageInRect( tileImage->platformImage().get(), tileRect));448 ASSERT(h == imageSize.height()); 449 subImage = adoptCF(CGImageCreateWithImageInRect(image.get(), tileRect)); 458 450 } 459 451 … … 461 453 // fall back to the less efficient CGPattern-based mechanism. 462 454 float scaledTileWidth = tileRect.width() * narrowPrecisionToFloat(patternTransform.a()); 463 float w = CGImageGetWidth( tileImage->platformImage().get());464 if (w == image .size().width() && h == image.size().height() && !spacing.width() && !spacing.height()) {455 float w = CGImageGetWidth(image.get()); 456 if (w == imageSize.width() && h == imageSize.height() && !spacing.width() && !spacing.height()) { 465 457 // FIXME: CG seems to snap the images to integral sizes. When we care (e.g. with border-image-repeat: round), 466 458 // we should tile all but the last, and stetch the last image to fit. … … 471 463 matrix = CGAffineTransformConcat(matrix, CGContextGetCTM(context)); 472 464 // The top of a partially-decoded image is drawn at the bottom of the tile. Map it to the top. 473 matrix = CGAffineTransformTranslate(matrix, 0, image .size().height() - h);465 matrix = CGAffineTransformTranslate(matrix, 0, imageSize.height() - h); 474 466 #if PLATFORM(IOS_FAMILY) 475 467 matrix = CGAffineTransformScale(matrix, 1, -1); -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItemBuffer.cpp
r269724 r269753 323 323 return; 324 324 } 325 case ItemType::DrawPattern: {326 get<DrawPattern>().~DrawPattern();327 return;328 }329 325 case ItemType::FillCompositedRect: { 330 326 get<FillCompositedRect>().~FillCompositedRect(); … … 423 419 case ItemType::DrawNativeImage: { 424 420 static_assert(std::is_trivially_destructible<DrawNativeImage>::value); 421 return; 422 } 423 case ItemType::DrawPattern: { 424 static_assert(std::is_trivially_destructible<DrawPattern>::value); 425 425 return; 426 426 } … … 578 578 return; 579 579 } 580 case ItemType::DrawPattern: { 581 new (itemOffset) DrawPattern(get<DrawPattern>()); 582 return; 583 } 580 584 case ItemType::DrawPath: { 581 585 new (itemOffset) DrawPath(get<DrawPath>()); 582 return;583 }584 case ItemType::DrawPattern: {585 new (itemOffset) DrawPattern(get<DrawPattern>());586 586 return; 587 587 } -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItemType.cpp
r269724 r269753 209 209 case ItemType::DrawLinesForText: 210 210 case ItemType::DrawNativeImage: 211 case ItemType::DrawPattern: 211 212 case ItemType::DrawPath: 212 case ItemType::DrawPattern:213 213 case ItemType::DrawRect: 214 214 case ItemType::EndTransparencyLayer: … … 255 255 case ItemType::DrawLinesForText: 256 256 case ItemType::DrawPath: 257 case ItemType::DrawPattern:258 257 case ItemType::FillCompositedRect: 259 258 case ItemType::FillPath: … … 283 282 case ItemType::DrawImageBuffer: 284 283 case ItemType::DrawNativeImage: 284 case ItemType::DrawPattern: 285 285 case ItemType::DrawLine: 286 286 case ItemType::DrawRect: -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp
r269724 r269753 459 459 } 460 460 461 DrawPattern::DrawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 462 : m_image(image) 461 DrawPattern::DrawPattern(RenderingResourceIdentifier imageIdentifier, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 462 : m_imageIdentifier(imageIdentifier) 463 , m_imageSize(imageSize) 464 , m_destination(destRect) 465 , m_tileRect(tileRect) 463 466 , m_patternTransform(patternTransform) 464 , m_tileRect(tileRect)465 , m_destination(destRect)466 467 , m_phase(phase) 467 468 , m_spacing(spacing) … … 470 471 } 471 472 472 void DrawPattern::apply(GraphicsContext& context) const 473 { 474 context.drawPattern(m_image.get(), m_destination, m_tileRect, m_patternTransform, m_phase, m_spacing, m_options); 473 NO_RETURN_DUE_TO_ASSERT void DrawPattern::apply(GraphicsContext&) const 474 { 475 ASSERT_NOT_REACHED(); 476 } 477 478 void DrawPattern::apply(GraphicsContext& context, NativeImage& image) const 479 { 480 context.drawPattern(image, m_imageSize, m_destination, m_tileRect, m_patternTransform, m_phase, m_spacing, m_options); 475 481 } 476 482 477 483 static TextStream& operator<<(TextStream& ts, const DrawPattern& item) 478 484 { 479 ts.dumpProperty("image ", item.image());485 ts.dumpProperty("image-identifier", item.imageIdentifier()); 480 486 ts.dumpProperty("pattern-transform", item.patternTransform()); 481 487 ts.dumpProperty("tile-rect", item.tileRect()); -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h
r269724 r269753 1080 1080 public: 1081 1081 static constexpr ItemType itemType = ItemType::DrawPattern; 1082 static constexpr bool isInlineItem = false; 1083 static constexpr bool isDrawingItem = true; 1084 1085 WEBCORE_EXPORT DrawPattern(Image&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { }); 1086 1087 const Image& image() const { return m_image.get(); } 1082 static constexpr bool isInlineItem = true; 1083 static constexpr bool isDrawingItem = true; 1084 1085 WEBCORE_EXPORT DrawPattern(RenderingResourceIdentifier, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { }); 1086 1087 RenderingResourceIdentifier imageIdentifier() const { return m_imageIdentifier; } 1088 FloatSize imageSize() const { return m_imageSize; } 1089 FloatRect destRect() const { return m_destination; } 1090 FloatRect tileRect() const { return m_tileRect; } 1088 1091 const AffineTransform& patternTransform() const { return m_patternTransform; } 1089 FloatRect tileRect() const { return m_tileRect; }1090 FloatRect destRect() const { return m_destination; }1091 1092 FloatPoint phase() const { return m_phase; } 1092 1093 FloatSize spacing() const { return m_spacing; } 1093 1094 1094 void apply(GraphicsContext&) const; 1095 NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const; 1096 void apply(GraphicsContext&, NativeImage&) const; 1095 1097 1096 1098 Optional<FloatRect> globalBounds() const { return WTF::nullopt; } 1097 1099 Optional<FloatRect> localBounds(const GraphicsContext&) const { return m_destination; } 1098 1100 1099 template<class Encoder> void encode(Encoder&) const; 1100 template<class Decoder> static Optional<DrawPattern> decode(Decoder&);1101 1102 private: 1103 mutable Ref<Image> m_image; // FIXME: Drawing images can cause their animations to progress. This shouldn't have to be mutable.1101 private: 1102 RenderingResourceIdentifier m_imageIdentifier; 1103 FloatSize m_imageSize; 1104 FloatRect m_destination; 1105 FloatRect m_tileRect; 1104 1106 AffineTransform m_patternTransform; 1105 FloatRect m_tileRect;1106 FloatRect m_destination;1107 1107 FloatPoint m_phase; 1108 1108 FloatSize m_spacing; 1109 1109 ImagePaintingOptions m_options; 1110 1110 }; 1111 1112 template<class Encoder>1113 void DrawPattern::encode(Encoder& encoder) const1114 {1115 ImageHandle imageHandle;1116 imageHandle.image = m_image.ptr();1117 encoder << imageHandle;1118 encoder << m_patternTransform;1119 encoder << m_tileRect;1120 encoder << m_destination;1121 encoder << m_phase;1122 encoder << m_spacing;1123 encoder << m_options;1124 }1125 1126 template<class Decoder>1127 Optional<DrawPattern> DrawPattern::decode(Decoder& decoder)1128 {1129 Optional<ImageHandle> imageHandle;1130 decoder >> imageHandle;1131 if (!imageHandle)1132 return WTF::nullopt;1133 1134 Optional<AffineTransform> patternTransform;1135 decoder >> patternTransform;1136 if (!patternTransform)1137 return WTF::nullopt;1138 1139 Optional<FloatRect> tileRect;1140 decoder >> tileRect;1141 if (!tileRect)1142 return WTF::nullopt;1143 1144 Optional<FloatRect> destination;1145 decoder >> destination;1146 if (!destination)1147 return WTF::nullopt;1148 1149 Optional<FloatPoint> phase;1150 decoder >> phase;1151 if (!phase)1152 return WTF::nullopt;1153 1154 Optional<FloatSize> spacing;1155 decoder >> spacing;1156 if (!spacing)1157 return WTF::nullopt;1158 1159 Optional<ImagePaintingOptions> options;1160 decoder >> options;1161 if (!options)1162 return WTF::nullopt;1163 1164 return {{ *imageHandle->image, *destination, *tileRect, *patternTransform, *phase, *spacing, *options }};1165 }1166 1111 1167 1112 class BeginTransparencyLayer { -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp
r269724 r269753 183 183 } 184 184 185 void Recorder::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 186 { 187 append<DrawPattern>(image, destRect, tileRect, patternTransform, phase, spacing, options); 185 void Recorder::drawPattern(NativeImage& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 186 { 187 if (m_delegate) 188 m_delegate->cacheNativeImage(image); 189 m_displayList.cacheNativeImage(image); 190 append<DrawPattern>(image.renderingResourceIdentifier(), imageSize, destRect, tileRect, patternTransform, phase, spacing, options); 188 191 } 189 192 -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h
r269716 r269753 104 104 105 105 void drawImageBuffer(WebCore::ImageBuffer&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&) override; 106 void drawNativeImage(NativeImage&, const FloatSize& selfSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) override;107 void drawPattern( Image&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions&) override;106 void drawNativeImage(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) override; 107 void drawPattern(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions&) override; 108 108 109 109 void drawRect(const FloatRect&, float borderThickness) override; -
trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp
r269724 r269753 46 46 Replayer::~Replayer() = default; 47 47 48 template<class T> 49 inline static bool applyImageBufferItem(GraphicsContext& context, const ImageBufferHashMap& imageBuffers, ItemHandle item) 50 { 51 if (!item.is<T>()) 52 return false; 53 auto& imageBufferItem = item.get<T>(); 54 if (auto* imageBuffer = imageBuffers.get(imageBufferItem.imageBufferIdentifier())) 55 imageBufferItem.apply(context, *imageBuffer); 56 return true; 57 } 58 59 template<class T> 60 inline static bool applyNativeImageItem(GraphicsContext& context, const NativeImageHashMap& nativeImages, ItemHandle item) 61 { 62 if (!item.is<T>()) 63 return false; 64 auto& nativeImageItem = item.get<T>(); 65 if (auto* image = nativeImages.get(nativeImageItem.imageIdentifier())) 66 nativeImageItem.apply(context, *image); 67 return true; 68 } 69 48 70 void Replayer::applyItem(ItemHandle item) 49 71 { … … 51 73 return; 52 74 53 if (item.is<ClipToImageBuffer>()) { 54 auto& clipItem = item.get<ClipToImageBuffer>(); 55 if (auto* imageBuffer = m_imageBuffers.get(clipItem.imageBufferIdentifier())) 56 clipItem.apply(m_context, *imageBuffer); 75 if (applyImageBufferItem<DrawImageBuffer>(m_context, m_imageBuffers, item)) 57 76 return; 58 } 77 if (applyImageBufferItem<ClipToImageBuffer>(m_context, m_imageBuffers, item)) 78 return; 59 79 60 if (item.is<DrawImageBuffer>()) { 61 auto& drawItem = item.get<DrawImageBuffer>(); 62 if (auto* imageBuffer = m_imageBuffers.get(drawItem.imageBufferIdentifier())) 63 drawItem.apply(m_context, *imageBuffer); 80 if (applyNativeImageItem<DrawNativeImage>(m_context, m_nativeImages, item)) 64 81 return; 65 } 66 67 if (item.is<DrawNativeImage>()) { 68 auto& drawItem = item.get<DrawNativeImage>(); 69 if (auto* image = m_nativeImages.get(drawItem.imageIdentifier())) 70 drawItem.apply(m_context, *image); 82 if (applyNativeImageItem<DrawPattern>(m_context, m_nativeImages, item)) 71 83 return; 72 }73 84 74 85 item.apply(m_context); -
trunk/Source/WebCore/platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp
r269716 r269753 561 561 } 562 562 563 void CairoOperationRecorder::drawPattern( Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)563 void CairoOperationRecorder::drawPattern(NativeImage& nativeImage, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 564 564 { 565 565 struct DrawPattern final : PaintingOperation, OperationData<RefPtr<cairo_surface_t>, IntSize, FloatRect, FloatRect, AffineTransform, FloatPoint, ImagePaintingOptions> { … … 578 578 579 579 UNUSED_PARAM(spacing); 580 if (auto nativeImage = image.nativeImageForCurrentFrame()) 581 append(createCommand<DrawPattern>(nativeImage->platformImage(), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options)); 580 append(createCommand<DrawPattern>(nativeImage.platformImage(), IntSize(imageSize), destRect, tileRect, patternTransform, phase, options)); 582 581 } 583 582 -
trunk/Source/WebCore/platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.h
r269716 r269753 67 67 void drawImageBuffer(WebCore::ImageBuffer&, const WebCore::FloatRect& destination, const WebCore::FloatRect& source, const WebCore::ImagePaintingOptions&) override; 68 68 void drawNativeImage(WebCore::NativeImage&, const WebCore::FloatSize&, const WebCore::FloatRect&, const WebCore::FloatRect&, const WebCore::ImagePaintingOptions&) override; 69 void drawPattern(WebCore:: Image&, const WebCore::FloatRect&, const WebCore::FloatRect&, const WebCore::AffineTransform&, const WebCore::FloatPoint&, const WebCore::FloatSize&, const WebCore::ImagePaintingOptions&) override;69 void drawPattern(WebCore::NativeImage&, const WebCore::FloatSize&, const WebCore::FloatRect&, const WebCore::FloatRect&, const WebCore::AffineTransform&, const WebCore::FloatPoint&, const WebCore::FloatSize&, const WebCore::ImagePaintingOptions&) override; 70 70 71 71 void drawRect(const WebCore::FloatRect&, float) override; -
trunk/Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp
r269724 r269753 417 417 } 418 418 419 void GraphicsContext::drawP attern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)419 void GraphicsContext::drawPlatformPattern(const PlatformImagePtr& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options) 420 420 { 421 421 if (paintingDisabled() || !patternTransform.isInvertible()) 422 422 return; 423 423 424 if (m_impl) { 425 m_impl->drawPattern(image, destRect, tileRect, patternTransform, phase, spacing, options); 426 return; 427 } 428 429 ASSERT(hasPlatformContext()); 430 if (auto tileImage = image.nativeImageForCurrentFrame(this)) 431 Direct2D::drawPattern(*platformContext(), WTFMove(tileImage), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options.compositeOperator(), options.blendMode()); 424 ASSERT(hasPlatformContext()); 425 auto tileImage = image; 426 Direct2D::drawPattern(*platformContext(), WTFMove(tileImage), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options.compositeOperator(), options.blendMode()); 432 427 } 433 428 -
trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.cpp
r269716 r269753 275 275 } 276 276 277 void GraphicsContextImplDirect2D::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize&, const ImagePaintingOptions& options) 278 { 279 auto* context = &graphicsContext(); 280 if (auto surface = image.nativeImageForCurrentFrame(context)) 281 Direct2D::drawPattern(m_platformContext, WTFMove(surface), IntSize(image.size()), destRect, tileRect, patternTransform, phase, options.compositeOperator(), options.blendMode()); 277 void GraphicsContextImplDirect2D::drawPattern((NativeImage& image, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize&, const ImagePaintingOptions& options) 278 { 279 if (auto surface = image.platformImage()) 280 Direct2D::drawPattern(m_platformContext, WTFMove(surface), IntSize(imageSize), destRect, tileRect, patternTransform, phase, options.compositeOperator(), options.blendMode()); 282 281 } 283 282 -
trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.h
r269716 r269753 70 70 71 71 bool drawImageBuffer(ImageBuffer&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&) override; 72 bool drawNativeImage(NativeImage&, const FloatSize& selfSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) override;73 void drawPattern( Image&, const FloatRect&, const FloatRect&, const AffineTransform&, const FloatPoint&, const FloatSize&, const ImagePaintingOptions&) override;72 bool drawNativeImage(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) override; 73 void drawPattern((NativeImage&, const FloatSize& imageSize, const FloatRect&, const FloatRect&, const AffineTransform&, const FloatPoint&, const FloatSize&, const ImagePaintingOptions&) override; 74 74 75 75 void drawRect(const FloatRect&, float) override; -
trunk/Source/WebKit/ChangeLog
r269751 r269753 1 2020-11-12 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] GraphicsContext::drawPattern() should take a NativeImage argument 4 https://bugs.webkit.org/show_bug.cgi?id=218865 5 6 Reviewed by Simon Fraser. 7 8 * GPUProcess/graphics/RemoteRenderingBackend.cpp: 9 (WebKit::RemoteRenderingBackend::decodeItem): 10 * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: 11 1 12 2020-11-12 Per Arne Vollan <pvollan@apple.com> 2 13 -
trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
r269724 r269753 265 265 case DisplayList::ItemType::DrawPath: 266 266 return decodeAndCreate<DisplayList::DrawPath>(data, length, handleLocation); 267 case DisplayList::ItemType::DrawPattern:268 return decodeAndCreate<DisplayList::DrawPattern>(data, length, handleLocation);269 267 case DisplayList::ItemType::FillCompositedRect: 270 268 return decodeAndCreate<DisplayList::FillCompositedRect>(data, length, handleLocation); … … 303 301 case DisplayList::ItemType::DrawImageBuffer: 304 302 case DisplayList::ItemType::DrawNativeImage: 303 case DisplayList::ItemType::DrawPattern: 305 304 case DisplayList::ItemType::DrawLine: 306 305 case DisplayList::ItemType::DrawRect: -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h
r269724 r269753 219 219 case WebCore::DisplayList::ItemType::DrawPath: 220 220 return IPC::Encoder::encodeSingleObject<WebCore::DisplayList::DrawPath>(item.get<WebCore::DisplayList::DrawPath>()); 221 case WebCore::DisplayList::ItemType::DrawPattern:222 return IPC::Encoder::encodeSingleObject<WebCore::DisplayList::DrawPattern>(item.get<WebCore::DisplayList::DrawPattern>());223 221 case WebCore::DisplayList::ItemType::FillCompositedRect: 224 222 return IPC::Encoder::encodeSingleObject<WebCore::DisplayList::FillCompositedRect>(item.get<WebCore::DisplayList::FillCompositedRect>()); … … 257 255 case WebCore::DisplayList::ItemType::DrawImageBuffer: 258 256 case WebCore::DisplayList::ItemType::DrawNativeImage: 257 case WebCore::DisplayList::ItemType::DrawPattern: 259 258 case WebCore::DisplayList::ItemType::DrawLine: 260 259 case WebCore::DisplayList::ItemType::DrawRect:
Note: See TracChangeset
for help on using the changeset viewer.