Skip to content
Permalink
Browse files
[GPU Process] Pattern should hold SourceImage which can be converted …
…to a NativeImage only when needed

https://bugs.webkit.org/show_bug.cgi?id=232411
<rdar://problem/84998738>

Reviewed by Darin Adler.

Source/WebCore:

Make Pattern hold a SourceImage and add getters to retrieve a NativeImage
and an ImageBuffer. In these getters the SourceImage will either return
the current image source or get one from the other if needed.

* html/canvas/CanvasPattern.cpp:
(WebCore::CanvasPattern::create):
(WebCore::CanvasPattern::CanvasPattern):
* html/canvas/CanvasPattern.h:
* html/canvas/CanvasRenderingContext2DBase.cpp:
(WebCore::CanvasRenderingContext2DBase::createPattern):
* inspector/InspectorCanvas.cpp:
(WebCore::InspectorCanvas::buildArrayForCanvasPattern):

* platform/graphics/NativeImage.h:
Make NativeImage a thread-safe RefCounted and make its destruction happen
on the main thread. This is similar to what we do for ImageBuffer. And
the reason for this is the message handler in the GPUProcess may create
NativeImages on the main thread as the SourceImages for the Patterns of
the SetState item. These NativeImages will be deleted in the replaying
thread after applying the SetState item.

* platform/graphics/Pattern.cpp:
(WebCore::Pattern::create):
(WebCore::Pattern::Pattern):

* platform/graphics/Pattern.h:
(WebCore::Pattern::encode const):
(WebCore::Pattern::decode):
Add encoding and decoding mehods for Pattern which will be called from
SetState::encode() and SetState::decode().

* platform/graphics/SourceImage.cpp:
(WebCore::SourceImage::nativeImage const):
(WebCore::SourceImage::imageBuffer const):
(WebCore::SourceImage::size const):
(WebCore::SourceImage::nativeImage): Deleted.
(WebCore::SourceImage::imageBuffer): Deleted.
* platform/graphics/SourceImage.h:
Make SourceImage keep the image source it was created with. Get a temporary
image source if it is different from what is stored in m_imageVariant.

* platform/graphics/cairo/PatternCairo.cpp:
(WebCore::Pattern::createPlatformPattern const):
* platform/graphics/cg/PatternCG.cpp:
(WebCore::Pattern::createPlatformPattern const):
* platform/graphics/displaylists/DisplayListItems.cpp:
(WebCore::DisplayList::SetState::SetState):
(WebCore::DisplayList::SetState::apply):
* platform/graphics/displaylists/DisplayListItems.h:
(WebCore::DisplayList::SetState::stateChange):
(WebCore::DisplayList::SetState::encode const):
(WebCore::DisplayList::SetState::decode):
(WebCore::DisplayList::SetState::strokePatternParameters const): Deleted.
(WebCore::DisplayList::SetState::fillPatternParameters const): Deleted.
(WebCore::DisplayList::SetState::strokePatternImageIdentifier const): Deleted.
(WebCore::DisplayList::SetState::fillPatternImageIdentifier const): Deleted.
Simplify SetState by deleting the PatternData members. Replace these members
by the strokePattern and fillPattern since these patterns can be encoded
and decoded.

* platform/graphics/displaylists/DisplayListReplayer.cpp:
(WebCore::DisplayList::applySetStateItem):
* platform/graphics/displaylists/DisplayListResourceHeap.h:
Add the helper LocalResourceHeap::getSourceImage() to be used by
applySetStateItem().

* platform/graphics/filters/software/FETileSoftwareApplier.cpp:
(WebCore::FETileSoftwareApplier::apply const):
* rendering/RenderLayerBacking.cpp:
(WebCore::patternForDescription):
* rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::buildPattern):

Source/WebKit:

Add the helpers QualifiedResourceHeap::getSourceImage() and
RemoteResourceCache::cachedSourceImage() which will be used by
RemoteDisplayListRecorder::setState() to replace the
RenderingResourceIdentifier of the pattern's tileImage by an actual
SourceImage.

* GPUProcess/graphics/QualifiedResourceHeap.h:
(WebKit::QualifiedResourceHeap::getSourceImage const):
* GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::setState):
(WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
(WebKit::RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers): Deleted.
* GPUProcess/graphics/RemoteResourceCache.cpp:
(WebKit::RemoteResourceCache::cachedSourceImage const):
* GPUProcess/graphics/RemoteResourceCache.h:

LayoutTests:

Unskip layout tests for gpu process because they are fixed by this change.

* gpu-process/TestExpectations:



Canonical link: https://commits.webkit.org/246617@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@288865 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
shallawa committed Feb 1, 2022
1 parent 1f400b5 commit 04f246f532ec345259a3862720c3024f99959939
Showing 26 changed files with 300 additions and 201 deletions.
@@ -1,3 +1,15 @@
2022-01-31 Said Abou-Hallawa <said@apple.com>

[GPU Process] Pattern should hold SourceImage which can be converted to a NativeImage only when needed
https://bugs.webkit.org/show_bug.cgi?id=232411
<rdar://problem/84998738>

Reviewed by Darin Adler.

Unskip layout tests for gpu process because they are fixed by this change.

* gpu-process/TestExpectations:

2022-01-31 Robert Jenner <Jenner@apple.com>

REGRESSION(288052?): editing/execCommand/paste-as-quotation-disconnected-paragraph-ancestor-crash.html makes subsequent test fail, as DumpRenderTree compares to wrong expected result
@@ -245,8 +245,6 @@ imported/blink/svg/as-image/svg-as-image-object-fit-contain.html
imported/blink/svg/as-image/svg-as-image-object-fit-cover.html
imported/blink/svg/as-image/svgview-references.html
imported/blink/svg/custom/fill-fallback-currentcolor-1.svg
imported/blink/svg/custom/transformed-text-pattern.html [ Crash ]
imported/blink/svg/custom/viewport-resource-inval.svg [ Crash ]
imported/blink/svg/text/obb-paintserver.html
imported/mozilla/svg/as-image/background-resize-3.html
imported/mozilla/svg/as-image/background-resize-4.html
@@ -261,39 +259,19 @@ imported/mozilla/svg/blend-overlay.svg
imported/mozilla/svg/blend-saturation.svg
imported/mozilla/svg/conditions-08.svg [ Crash ]
imported/mozilla/svg/dynamic-pattern-01.svg [ Crash ]
imported/mozilla/svg/dynamic-pattern-02.svg [ Crash ]
imported/mozilla/svg/dynamic-pattern-contents-01.svg [ Crash ]
imported/mozilla/svg/dynamic-pattern-contents-02.svg [ Crash ]
imported/mozilla/svg/filters/feComposite-2.svg
imported/mozilla/svg/filters/feFlood-1.svg
imported/mozilla/svg/filters/feFlood-2.svg
imported/mozilla/svg/filters/feImage-1.svg
imported/mozilla/svg/linearGradient-basic-03.svg
imported/mozilla/svg/mask-type-01.svg
imported/mozilla/svg/objectBoundingBox-and-pattern-01a.svg [ Crash ]
imported/mozilla/svg/objectBoundingBox-and-pattern-01b.svg [ Crash ]
imported/mozilla/svg/objectBoundingBox-and-pattern-01c.svg [ Crash ]
imported/mozilla/svg/objectBoundingBox-and-pattern-02.svg [ Crash ]
imported/mozilla/svg/objectBoundingBox-and-pattern-03.svg [ Crash ]
imported/mozilla/svg/opacity-and-gradient-02.svg
imported/mozilla/svg/paint-order-01.svg
imported/mozilla/svg/path-02.svg
imported/mozilla/svg/pattern-basic-01.svg [ Crash ]
imported/mozilla/svg/pattern-live-01a.svg [ Crash ]
imported/mozilla/svg/pattern-live-01b.svg [ Crash ]
imported/mozilla/svg/pattern-scale-01a.svg [ Crash ]
imported/mozilla/svg/pattern-scale-01b.svg [ Crash ]
imported/mozilla/svg/pattern-scale-01c.svg [ Crash ]
imported/mozilla/svg/pattern-transform-presence-01.svg [ Crash ]
imported/mozilla/svg/pattern-transformed-01.svg
imported/mozilla/svg/text-gradient-01.svg
imported/mozilla/svg/text-scale-02.svg
imported/mozilla/svg/text/mask-content-2.svg [ Crash ]
imported/mozilla/svg/text/simple-fill-gradient.svg
imported/mozilla/svg/userSpaceOnUse-and-pattern-01.svg [ Crash ]
imported/mozilla/svg/viewBox-and-pattern-01.svg [ Crash ]
imported/mozilla/svg/viewBox-and-pattern-02.svg [ Crash ]
imported/mozilla/svg/viewBox-and-pattern-03.svg [ Crash ]
imported/w3c/i18n/bidi/bidi-plaintext-011.html [ Pass ]
imported/w3c/web-platform-tests/compat/webkit-background-origin-text.html
imported/w3c/web-platform-tests/compat/webkit-linear-gradient-line-bottom.html
@@ -910,24 +888,7 @@ imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-peerconnection
imported/w3c/web-platform-tests/mimesniff/mime-types/charset-parameter.window.html
imported/w3c/web-platform-tests/selection/selection-select-all-move-input-crash.html
imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html [ Pass ]
imported/w3c/web-platform-tests/svg/animations/animateTransform-pattern-transform.html [ Crash ]
imported/w3c/web-platform-tests/svg/animations/svgenum-animation-1.html [ Crash ]
imported/w3c/web-platform-tests/svg/extensibility/foreignObject/masked.html
imported/w3c/web-platform-tests/svg/import/coords-units-01-b-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/linking-a-10-f-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/masking-path-07-b-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-grad-03-b-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-grad-06-b-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-pattern-01-b-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-pattern-02-f-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-pattern-04-f-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-pattern-05-f-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-pattern-08-f-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/import/pservers-pattern-09-f-manual.svg [ Crash ]
imported/w3c/web-platform-tests/svg/linking/reftests/href-pattern-element.html [ Crash ]
imported/w3c/web-platform-tests/svg/painting/currentColor-override-pserver-stroke.svg [ Crash ]
imported/w3c/web-platform-tests/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-02.tentative.svg [ Crash ]
imported/w3c/web-platform-tests/svg/render/reftests/filter-effects-on-pattern.html [ Crash ]
imported/w3c/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero.html [ Pass ]
imported/w3c/web-platform-tests/webaudio/the-audio-api/the-biquadfilternode-interface/no-dezippering.html
imported/w3c/web-platform-tests/xhr/response-method.htm [ Pass ]
@@ -952,28 +913,11 @@ svg/batik/paints/patternPreserveAspectRatioA.svg [ Crash ]
svg/batik/paints/patternRegionA.svg [ Crash ]
svg/batik/paints/patternRegions-positioned-objects.svg [ Crash ]
svg/batik/paints/patternRegions.svg [ Crash ]
svg/batik/text/textEffect2.svg [ Crash ]
svg/clip-path/clip-path-line-use-before-defined.svg [ Pass ]
svg/clip-path/webkit-clip-path-after.svg
svg/clip-path/webkit-clip-path-before.svg
svg/custom/hidpi-masking-clipping.svg [ Crash ]
svg/custom/href-svg-namespace-static.svg [ Crash ]
svg/custom/js-late-pattern-creation.svg [ Crash ]
svg/custom/js-update-pattern.svg [ Crash ]
svg/custom/large-image-pattern-crash.html [ Crash ]
svg/custom/local-url-reference-pattern.html [ Crash ]
svg/custom/new-image-is-html-element.svg [ Crash ]
svg/custom/subpaths-moveto-only-rendering.svg [ Pass ]
svg/custom/svg-fonts-skip-ink.html
svg/dom/viewport-container-crash.svg [ Crash ]
svg/dynamic-updates/SVGPatternElement-dom-height-attr.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-dom-patternTransform-attr.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-dom-patternUnits-attr.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-dom-width-attr.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-dom-y-attr.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-svgdom-patternContentUnits-prop.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-svgdom-width-prop.html [ Crash ]
svg/dynamic-updates/SVGPatternElement-svgdom-y-prop.html [ Crash ]
svg/gradients/gradient-flipped-start-end-points.svg
svg/gradients/spreadMethod.svg
svg/gradients/spreadMethodAlpha.svg
@@ -987,11 +931,6 @@ svg/gradients/spreadMethodReversed.svg
svg/gradients/stopAlpha.svg
svg/transforms/transformed-text-fill-gradient.html
svg/transforms/transformed-text-fill-pattern.html
svg/W3C-SVG-1.1-SE/struct-dom-11-f.svg [ Crash ]
svg/W3C-SVG-1.1/coords-units-01-b.svg [ Crash ]
svg/W3C-SVG-1.1/pservers-grad-04-b.svg [ Crash ]
svg/W3C-SVG-1.1/pservers-grad-07-b.svg [ Crash ]
svg/W3C-SVG-1.1/render-elems-01-t.svg [ Crash ]
system-preview/badge.html
webanimations/opacity-animation.html
webgl/1.0.3/conformance/context/premultiplyalpha-test.html
@@ -1,3 +1,84 @@
2022-01-31 Said Abou-Hallawa <said@apple.com>

[GPU Process] Pattern should hold SourceImage which can be converted to a NativeImage only when needed
https://bugs.webkit.org/show_bug.cgi?id=232411
<rdar://problem/84998738>

Reviewed by Darin Adler.

Make Pattern hold a SourceImage and add getters to retrieve a NativeImage
and an ImageBuffer. In these getters the SourceImage will either return
the current image source or get one from the other if needed.

* html/canvas/CanvasPattern.cpp:
(WebCore::CanvasPattern::create):
(WebCore::CanvasPattern::CanvasPattern):
* html/canvas/CanvasPattern.h:
* html/canvas/CanvasRenderingContext2DBase.cpp:
(WebCore::CanvasRenderingContext2DBase::createPattern):
* inspector/InspectorCanvas.cpp:
(WebCore::InspectorCanvas::buildArrayForCanvasPattern):

* platform/graphics/NativeImage.h:
Make NativeImage a thread-safe RefCounted and make its destruction happen
on the main thread. This is similar to what we do for ImageBuffer. And
the reason for this is the message handler in the GPUProcess may create
NativeImages on the main thread as the SourceImages for the Patterns of
the SetState item. These NativeImages will be deleted in the replaying
thread after applying the SetState item.

* platform/graphics/Pattern.cpp:
(WebCore::Pattern::create):
(WebCore::Pattern::Pattern):

* platform/graphics/Pattern.h:
(WebCore::Pattern::encode const):
(WebCore::Pattern::decode):
Add encoding and decoding mehods for Pattern which will be called from
SetState::encode() and SetState::decode().

* platform/graphics/SourceImage.cpp:
(WebCore::SourceImage::nativeImage const):
(WebCore::SourceImage::imageBuffer const):
(WebCore::SourceImage::size const):
(WebCore::SourceImage::nativeImage): Deleted.
(WebCore::SourceImage::imageBuffer): Deleted.
* platform/graphics/SourceImage.h:
Make SourceImage keep the image source it was created with. Get a temporary
image source if it is different from what is stored in m_imageVariant.

* platform/graphics/cairo/PatternCairo.cpp:
(WebCore::Pattern::createPlatformPattern const):
* platform/graphics/cg/PatternCG.cpp:
(WebCore::Pattern::createPlatformPattern const):
* platform/graphics/displaylists/DisplayListItems.cpp:
(WebCore::DisplayList::SetState::SetState):
(WebCore::DisplayList::SetState::apply):
* platform/graphics/displaylists/DisplayListItems.h:
(WebCore::DisplayList::SetState::stateChange):
(WebCore::DisplayList::SetState::encode const):
(WebCore::DisplayList::SetState::decode):
(WebCore::DisplayList::SetState::strokePatternParameters const): Deleted.
(WebCore::DisplayList::SetState::fillPatternParameters const): Deleted.
(WebCore::DisplayList::SetState::strokePatternImageIdentifier const): Deleted.
(WebCore::DisplayList::SetState::fillPatternImageIdentifier const): Deleted.
Simplify SetState by deleting the PatternData members. Replace these members
by the strokePattern and fillPattern since these patterns can be encoded
and decoded.

* platform/graphics/displaylists/DisplayListReplayer.cpp:
(WebCore::DisplayList::applySetStateItem):
* platform/graphics/displaylists/DisplayListResourceHeap.h:
Add the helper LocalResourceHeap::getSourceImage() to be used by
applySetStateItem().

* platform/graphics/filters/software/FETileSoftwareApplier.cpp:
(WebCore::FETileSoftwareApplier::apply const):
* rendering/RenderLayerBacking.cpp:
(WebCore::patternForDescription):
* rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::buildPattern):

2022-01-31 Andres Gonzalez <andresg_22@apple.com>

Add to AXLogger the ability to log only from the specified thread.
@@ -34,12 +34,12 @@

namespace WebCore {

Ref<CanvasPattern> CanvasPattern::create(Ref<NativeImage>&& image, bool repeatX, bool repeatY, bool originClean)
Ref<CanvasPattern> CanvasPattern::create(SourceImage&& image, bool repeatX, bool repeatY, bool originClean)
{
return adoptRef(*new CanvasPattern(WTFMove(image), repeatX, repeatY, originClean));
}

CanvasPattern::CanvasPattern(Ref<NativeImage>&& image, bool repeatX, bool repeatY, bool originClean)
CanvasPattern::CanvasPattern(SourceImage&& image, bool repeatX, bool repeatY, bool originClean)
: m_pattern(Pattern::create(WTFMove(image), { repeatX, repeatY }))
, m_originClean(originClean)
{
@@ -32,13 +32,13 @@

namespace WebCore {

class NativeImage;
class Pattern;
class SourceImage;
struct DOMMatrix2DInit;

class CanvasPattern : public RefCounted<CanvasPattern> {
public:
static Ref<CanvasPattern> create(Ref<NativeImage>&&, bool repeatX, bool repeatY, bool originClean);
static Ref<CanvasPattern> create(SourceImage&&, bool repeatX, bool repeatY, bool originClean);
~CanvasPattern();

static bool parseRepetitionType(const String&, bool& repeatX, bool& repeatY);
@@ -51,7 +51,7 @@ class CanvasPattern : public RefCounted<CanvasPattern> {
ExceptionOr<void> setTransform(DOMMatrix2DInit&&);

private:
CanvasPattern(Ref<NativeImage>&&, bool repeatX, bool repeatY, bool originClean);
CanvasPattern(SourceImage&&, bool repeatX, bool repeatY, bool originClean);

Ref<Pattern> m_pattern;
bool m_originClean;
@@ -1953,7 +1953,7 @@ ExceptionOr<RefPtr<CanvasPattern>> CanvasRenderingContext2DBase::createPattern(H
if (!nativeImage)
return Exception { InvalidStateError };

return RefPtr<CanvasPattern> { CanvasPattern::create(nativeImage.releaseNonNull(), repeatX, repeatY, originClean) };
return RefPtr<CanvasPattern> { CanvasPattern::create({ nativeImage.releaseNonNull() }, repeatX, repeatY, originClean) };
}

ExceptionOr<RefPtr<CanvasPattern>> CanvasRenderingContext2DBase::createPattern(CanvasBase& canvas, bool repeatX, bool repeatY)
@@ -1969,7 +1969,7 @@ ExceptionOr<RefPtr<CanvasPattern>> CanvasRenderingContext2DBase::createPattern(C
if (!nativeImage)
return Exception { InvalidStateError };

return RefPtr<CanvasPattern> { CanvasPattern::create(nativeImage.releaseNonNull(), repeatX, repeatY, canvas.originClean()) };
return RefPtr<CanvasPattern> { CanvasPattern::create({ nativeImage.releaseNonNull() }, repeatX, repeatY, canvas.originClean()) };
}

#if ENABLE(VIDEO)
@@ -1984,7 +1984,7 @@ ExceptionOr<RefPtr<CanvasPattern>> CanvasRenderingContext2DBase::createPattern(H

#if USE(CG)
if (auto nativeImage = videoElement.nativeImageForCurrentTime())
return RefPtr<CanvasPattern> { CanvasPattern::create(nativeImage.releaseNonNull(), repeatX, repeatY, originClean) };
return RefPtr<CanvasPattern> { CanvasPattern::create({ nativeImage.releaseNonNull() }, repeatX, repeatY, originClean) };
#endif

auto renderingMode = drawingContext() ? drawingContext()->renderingMode() : RenderingMode::Unaccelerated;
@@ -1994,7 +1994,7 @@ ExceptionOr<RefPtr<CanvasPattern>> CanvasRenderingContext2DBase::createPattern(H

videoElement.paintCurrentFrameInContext(imageBuffer->context(), FloatRect(FloatPoint(), size(videoElement)));

return RefPtr<CanvasPattern> { CanvasPattern::create(ImageBuffer::sinkIntoNativeImage(WTFMove(imageBuffer)).releaseNonNull(), repeatX, repeatY, originClean) };
return RefPtr<CanvasPattern> { CanvasPattern::create({ imageBuffer.releaseNonNull() }, repeatX, repeatY, originClean) };
}

#endif
@@ -1336,10 +1336,7 @@ Ref<JSON::ArrayOf<JSON::Value>> InspectorCanvas::buildArrayForCanvasGradient(con

Ref<JSON::ArrayOf<JSON::Value>> InspectorCanvas::buildArrayForCanvasPattern(const CanvasPattern& canvasPattern)
{
auto& tileImage = canvasPattern.pattern().tileImage();
FloatRect rect = { { }, tileImage.size() };
auto imageBuffer = ImageBuffer::create(tileImage.size(), RenderingMode::Unaccelerated, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);
imageBuffer->context().drawNativeImage(tileImage, tileImage.size(), rect, rect);
auto imageBuffer = canvasPattern.pattern().tileImageBuffer();

String repeat;
bool repeatX = canvasPattern.pattern().repeatX();
@@ -38,7 +38,7 @@

namespace WebCore {

class NativeImage : public RefCounted<NativeImage>, public CanMakeWeakPtr<NativeImage> {
class NativeImage : public ThreadSafeRefCounted<NativeImage, WTF::DestructionThread::Main>, public CanMakeWeakPtr<NativeImage> {
WTF_MAKE_FAST_ALLOCATED;
public:
class Observer {
@@ -31,13 +31,13 @@

namespace WebCore {

Ref<Pattern> Pattern::create(Ref<NativeImage>&& tileImage, const Parameters& parameters)
Ref<Pattern> Pattern::create(SourceImage&& tileImage, const Parameters& parameters)
{
return adoptRef(*new Pattern(WTFMove(tileImage), parameters));
}

Pattern::Pattern(Ref<NativeImage>&& image, const Parameters& parameters)
: m_tileImage(WTFMove(image))
Pattern::Pattern(SourceImage&& tileImage, const Parameters& parameters)
: m_tileImage(WTFMove(tileImage))
, m_parameters(parameters)
{
}

0 comments on commit 04f246f

Please sign in to comment.