Changeset 269753 in webkit


Ignore:
Timestamp:
Nov 12, 2020 2:31:04 PM (3 years ago)
Author:
Said Abou-Hallawa
Message:

[GPU Process] GraphicsContext::drawPattern() should take a NativeImage argument
https://bugs.webkit.org/show_bug.cgi?id=218865

Reviewed by Simon Fraser.

Source/WebCore:

When recording the DisplayList item DrawPattern, the renderingResourceIdentifier
of the NativeImage will be recorded. When replaying it back, the
renderingResourceIdentifier will be resolved to a NativeImage and the
item will be applied the same way we for DrawNativeImage.

DrawPattern will be inline DisplayList item and should not need encoding
or decoding when sending it to the GPU.

  • platform/graphics/GraphicsContext.cpp:

(WebCore::GraphicsContext::drawPattern):

  • platform/graphics/GraphicsContext.h:

(WebCore::GraphicsContext::drawPattern):
(WebCore::GraphicsContext::drawPlatformImage): Deleted.

  • platform/graphics/GraphicsContextImpl.h:
  • platform/graphics/Image.cpp:

(WebCore::Image::drawPattern):

  • platform/graphics/cairo/GraphicsContextCairo.cpp:

(WebCore::GraphicsContext::drawPlatformPattern):
(WebCore::GraphicsContext::drawPattern): Deleted.

  • platform/graphics/cairo/GraphicsContextImplCairo.cpp:

(WebCore::GraphicsContextImplCairo::drawPattern):

  • platform/graphics/cairo/GraphicsContextImplCairo.h:
  • platform/graphics/cg/GraphicsContextCG.cpp:

(WebCore::GraphicsContext::drawPlatformPattern):
(WebCore::GraphicsContext::drawPattern): Deleted.

  • platform/graphics/displaylists/DisplayListItemBuffer.cpp:

(WebCore::DisplayList::ItemHandle::destroy):
(WebCore::DisplayList::ItemHandle::copyTo const):

  • platform/graphics/displaylists/DisplayListItemType.cpp:

(WebCore::DisplayList::isDrawingItem):
(WebCore::DisplayList::isInlineItem):

  • platform/graphics/displaylists/DisplayListItems.cpp:

(WebCore::DisplayList::DrawPattern::DrawPattern):
(WebCore::DisplayList::DrawPattern::apply const):
(WebCore::DisplayList::operator<<):

  • platform/graphics/displaylists/DisplayListItems.h:

(WebCore::DisplayList::DrawPattern::DrawPattern):
(WebCore::DisplayList::DrawPattern::imageIdentifier const):
(WebCore::DisplayList::DrawPattern::imageSize const):
(WebCore::DisplayList::DrawPattern::tileRect const):
(WebCore::DisplayList::DrawPattern::patternTransform const):
(WebCore::DisplayList::DrawPattern::image const): Deleted.
(WebCore::DisplayList::DrawPattern::encode const): Deleted.
(WebCore::DisplayList::DrawPattern::decode): Deleted.

  • platform/graphics/displaylists/DisplayListRecorder.cpp:

(WebCore::DisplayList::Recorder::drawPattern):

  • platform/graphics/displaylists/DisplayListRecorder.h:
  • platform/graphics/displaylists/DisplayListReplayer.cpp:

(WebCore::DisplayList::applyImageBufferItem):
(WebCore::DisplayList::applyNativeImageItem):
(WebCore::DisplayList::Replayer::applyItem):

  • platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp:

(Nicosia::CairoOperationRecorder::drawPattern):

  • platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.h:
  • platform/graphics/win/GraphicsContextDirect2D.cpp:

(WebCore::GraphicsContext::drawPlatformPattern):
(WebCore::GraphicsContext::drawPattern): Deleted.

  • platform/graphics/win/GraphicsContextImplDirect2D.cpp:

(WebCore::GraphicsContextImplDirect2D::drawPattern):

  • platform/graphics/win/GraphicsContextImplDirect2D.h:

Source/WebKit:

  • GPUProcess/graphics/RemoteRenderingBackend.cpp:

(WebKit::RemoteRenderingBackend::decodeItem):

  • WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
Location:
trunk/Source
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r269750 r269753  
     12020-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
    1692020-11-12  Chris Dumez  <cdumez@apple.com>
    270
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp

    r269724 r269753  
    843843}
    844844
     845void 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
    845858void GraphicsContext::clipRoundedRect(const FloatRoundedRect& rect)
    846859{
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.h

    r269664 r269753  
    393393    void drawImageBuffer(ImageBuffer&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { });
    394394
    395     void drawPattern(Image&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { });
    396 
    397395    WEBCORE_EXPORT void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatPoint& destination, const ImagePaintingOptions& = { });
    398396    void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const ImagePaintingOptions& = { });
    399397    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& = { });
    400400
    401401    WEBCORE_EXPORT void setImageInterpolationQuality(InterpolationQuality);
     
    651651    void platformFillRoundedRect(const FloatRoundedRect&, const Color&);
    652652
    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&);
    654655
    655656    FloatRect computeLineBoundsAndAntialiasingModeForText(const FloatRect&, bool printing, Color&);
  • trunk/Source/WebCore/platform/graphics/GraphicsContextImpl.h

    r269716 r269753  
    7171
    7272    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;
    7575
    7676    virtual void drawRect(const FloatRect&, float borderThickness) = 0;
  • trunk/Source/WebCore/platform/graphics/Image.cpp

    r252965 r269753  
    140140void Image::drawPattern(GraphicsContext& ctxt, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform,  const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
    141141{
    142     if (!nativeImageForCurrentFrame(&ctxt))
     142    auto tileImage = preTransformedNativeImageForCurrentFrame(options.orientation() == ImageOrientation::FromImage);
     143    if (!tileImage)
    143144        return;
    144145
    145     ctxt.drawPattern(*this, destRect, tileRect, patternTransform, phase, spacing, options);
     146    ctxt.drawPattern(*tileImage, size(), destRect, tileRect, patternTransform, phase, spacing, options);
    146147
    147148    if (imageObserver())
  • trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp

    r269724 r269753  
    656656}
    657657
    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);
     658void 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);
    671665}
    672666
  • trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextImplCairo.cpp

    r269716 r269753  
    277277}
    278278
    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);
     279void 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);
    283283}
    284284
  • trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextImplCairo.h

    r269716 r269753  
    7474    void drawImageBuffer(ImageBuffer&, const FloatRect&, const FloatRect&, const ImagePaintingOptions&) override;
    7575    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;
    7777
    7878    void drawRect(const FloatRect&, float) override;
  • trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp

    r269724 r269753  
    416416}
    417417
    418 void GraphicsContext::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
     418void 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)
    419419{
    420420    if (paintingDisabled() || !patternTransform.isInvertible())
    421421        return;
    422 
    423     if (m_impl) {
    424         m_impl->drawPattern(image, destRect, tileRect, patternTransform, phase, spacing, options);
    425         return;
    426     }
    427422
    428423    CGContextRef context = platformContext();
     
    443438    float adjustedY = destRect.height() - (phase.y() - destRect.y() + tileRect.y() * narrowPrecisionToFloat(patternTransform.d()) + scaledTileHeight);
    444439
    445     auto tileImage = image.preTransformedNativeImageForCurrentFrame(options.orientation() == ImageOrientation::FromImage);
    446 
    447     float h = CGImageGetHeight(tileImage->platformImage().get());
     440    float h = CGImageGetHeight(image.get());
    448441
    449442    RetainPtr<CGImageRef> subImage;
    450     FloatSize imageSize = image.size();
    451443    if (tileRect.size() == imageSize)
    452         subImage = tileImage->platformImage();
     444        subImage = image;
    453445    else {
    454446        // Copying a sub-image out of a partially-decoded image stops the decoding of the original image. It should never happen
    455447        // 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));
    458450    }
    459451
     
    461453    // fall back to the less efficient CGPattern-based mechanism.
    462454    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()) {
    465457        // FIXME: CG seems to snap the images to integral sizes. When we care (e.g. with border-image-repeat: round),
    466458        // we should tile all but the last, and stetch the last image to fit.
     
    471463        matrix = CGAffineTransformConcat(matrix, CGContextGetCTM(context));
    472464        // 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);
    474466#if PLATFORM(IOS_FAMILY)
    475467        matrix = CGAffineTransformScale(matrix, 1, -1);
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItemBuffer.cpp

    r269724 r269753  
    323323        return;
    324324    }
    325     case ItemType::DrawPattern: {
    326         get<DrawPattern>().~DrawPattern();
    327         return;
    328     }
    329325    case ItemType::FillCompositedRect: {
    330326        get<FillCompositedRect>().~FillCompositedRect();
     
    423419    case ItemType::DrawNativeImage: {
    424420        static_assert(std::is_trivially_destructible<DrawNativeImage>::value);
     421        return;
     422    }
     423    case ItemType::DrawPattern: {
     424        static_assert(std::is_trivially_destructible<DrawPattern>::value);
    425425        return;
    426426    }
     
    578578        return;
    579579    }
     580    case ItemType::DrawPattern: {
     581        new (itemOffset) DrawPattern(get<DrawPattern>());
     582        return;
     583    }
    580584    case ItemType::DrawPath: {
    581585        new (itemOffset) DrawPath(get<DrawPath>());
    582         return;
    583     }
    584     case ItemType::DrawPattern: {
    585         new (itemOffset) DrawPattern(get<DrawPattern>());
    586586        return;
    587587    }
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItemType.cpp

    r269724 r269753  
    209209    case ItemType::DrawLinesForText:
    210210    case ItemType::DrawNativeImage:
     211    case ItemType::DrawPattern:
    211212    case ItemType::DrawPath:
    212     case ItemType::DrawPattern:
    213213    case ItemType::DrawRect:
    214214    case ItemType::EndTransparencyLayer:
     
    255255    case ItemType::DrawLinesForText:
    256256    case ItemType::DrawPath:
    257     case ItemType::DrawPattern:
    258257    case ItemType::FillCompositedRect:
    259258    case ItemType::FillPath:
     
    283282    case ItemType::DrawImageBuffer:
    284283    case ItemType::DrawNativeImage:
     284    case ItemType::DrawPattern:
    285285    case ItemType::DrawLine:
    286286    case ItemType::DrawRect:
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp

    r269724 r269753  
    459459}
    460460
    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)
     461DrawPattern::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)
    463466    , m_patternTransform(patternTransform)
    464     , m_tileRect(tileRect)
    465     , m_destination(destRect)
    466467    , m_phase(phase)
    467468    , m_spacing(spacing)
     
    470471}
    471472
    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);
     473NO_RETURN_DUE_TO_ASSERT void DrawPattern::apply(GraphicsContext&) const
     474{
     475    ASSERT_NOT_REACHED();
     476}
     477
     478void 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);
    475481}
    476482
    477483static TextStream& operator<<(TextStream& ts, const DrawPattern& item)
    478484{
    479     ts.dumpProperty("image", item.image());
     485    ts.dumpProperty("image-identifier", item.imageIdentifier());
    480486    ts.dumpProperty("pattern-transform", item.patternTransform());
    481487    ts.dumpProperty("tile-rect", item.tileRect());
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h

    r269724 r269753  
    10801080public:
    10811081    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; }
    10881091    const AffineTransform& patternTransform() const { return m_patternTransform; }
    1089     FloatRect tileRect() const { return m_tileRect; }
    1090     FloatRect destRect() const { return m_destination; }
    10911092    FloatPoint phase() const { return m_phase; }
    10921093    FloatSize spacing() const { return m_spacing; }
    10931094
    1094     void apply(GraphicsContext&) const;
     1095    NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
     1096    void apply(GraphicsContext&, NativeImage&) const;
    10951097
    10961098    Optional<FloatRect> globalBounds() const { return WTF::nullopt; }
    10971099    Optional<FloatRect> localBounds(const GraphicsContext&) const { return m_destination; }
    10981100
    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.
     1101private:
     1102    RenderingResourceIdentifier m_imageIdentifier;
     1103    FloatSize m_imageSize;
     1104    FloatRect m_destination;
     1105    FloatRect m_tileRect;
    11041106    AffineTransform m_patternTransform;
    1105     FloatRect m_tileRect;
    1106     FloatRect m_destination;
    11071107    FloatPoint m_phase;
    11081108    FloatSize m_spacing;
    11091109    ImagePaintingOptions m_options;
    11101110};
    1111 
    1112 template<class Encoder>
    1113 void DrawPattern::encode(Encoder& encoder) const
    1114 {
    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 }
    11661111
    11671112class BeginTransparencyLayer {
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp

    r269724 r269753  
    183183}
    184184
    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);
     185void 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);
    188191}
    189192
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h

    r269716 r269753  
    104104
    105105    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;
    108108
    109109    void drawRect(const FloatRect&, float borderThickness) override;
  • trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp

    r269724 r269753  
    4646Replayer::~Replayer() = default;
    4747
     48template<class T>
     49inline 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
     59template<class T>
     60inline 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
    4870void Replayer::applyItem(ItemHandle item)
    4971{
     
    5173        return;
    5274
    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))
    5776        return;
    58     }
     77    if (applyImageBufferItem<ClipToImageBuffer>(m_context, m_imageBuffers, item))
     78        return;
    5979
    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))
    6481        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))
    7183        return;
    72     }
    7384
    7485    item.apply(m_context);
  • trunk/Source/WebCore/platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp

    r269716 r269753  
    561561}
    562562
    563 void CairoOperationRecorder::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
     563void 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)
    564564{
    565565    struct DrawPattern final : PaintingOperation, OperationData<RefPtr<cairo_surface_t>, IntSize, FloatRect, FloatRect, AffineTransform, FloatPoint, ImagePaintingOptions> {
     
    578578
    579579    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));
    582581}
    583582
  • trunk/Source/WebCore/platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.h

    r269716 r269753  
    6767    void drawImageBuffer(WebCore::ImageBuffer&, const WebCore::FloatRect& destination, const WebCore::FloatRect& source, const WebCore::ImagePaintingOptions&) override;
    6868    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;
    7070
    7171    void drawRect(const WebCore::FloatRect&, float) override;
  • trunk/Source/WebCore/platform/graphics/win/GraphicsContextDirect2D.cpp

    r269724 r269753  
    417417}
    418418
    419 void GraphicsContext::drawPattern(Image& image, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
     419void 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)
    420420{
    421421    if (paintingDisabled() || !patternTransform.isInvertible())
    422422        return;
    423423
    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());
    432427}
    433428
  • trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.cpp

    r269716 r269753  
    275275}
    276276
    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());
     277void 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());
    282281}
    283282
  • trunk/Source/WebCore/platform/graphics/win/GraphicsContextImplDirect2D.h

    r269716 r269753  
    7070
    7171    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;
    7474
    7575    void drawRect(const FloatRect&, float) override;
  • trunk/Source/WebKit/ChangeLog

    r269751 r269753  
     12020-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
    1122020-11-12  Per Arne Vollan  <pvollan@apple.com>
    213
  • trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp

    r269724 r269753  
    265265    case DisplayList::ItemType::DrawPath:
    266266        return decodeAndCreate<DisplayList::DrawPath>(data, length, handleLocation);
    267     case DisplayList::ItemType::DrawPattern:
    268         return decodeAndCreate<DisplayList::DrawPattern>(data, length, handleLocation);
    269267    case DisplayList::ItemType::FillCompositedRect:
    270268        return decodeAndCreate<DisplayList::FillCompositedRect>(data, length, handleLocation);
     
    303301    case DisplayList::ItemType::DrawImageBuffer:
    304302    case DisplayList::ItemType::DrawNativeImage:
     303    case DisplayList::ItemType::DrawPattern:
    305304    case DisplayList::ItemType::DrawLine:
    306305    case DisplayList::ItemType::DrawRect:
  • trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h

    r269724 r269753  
    219219        case WebCore::DisplayList::ItemType::DrawPath:
    220220            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>());
    223221        case WebCore::DisplayList::ItemType::FillCompositedRect:
    224222            return IPC::Encoder::encodeSingleObject<WebCore::DisplayList::FillCompositedRect>(item.get<WebCore::DisplayList::FillCompositedRect>());
     
    257255        case WebCore::DisplayList::ItemType::DrawImageBuffer:
    258256        case WebCore::DisplayList::ItemType::DrawNativeImage:
     257        case WebCore::DisplayList::ItemType::DrawPattern:
    259258        case WebCore::DisplayList::ItemType::DrawLine:
    260259        case WebCore::DisplayList::ItemType::DrawRect:
Note: See TracChangeset for help on using the changeset viewer.