[webkit-reviews] review granted: [Bug 240422] Avoid the overhead of DrawGlyphsRecorder when drawing cached glyph buffers : [Attachment 459375] Patch

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Mon May 16 22:44:28 PDT 2022


Myles C. Maxfield <mmaxfield at apple.com> has granted Simon Fraser (smfr)
<simon.fraser at apple.com>'s request for review:
Bug 240422: Avoid the overhead of DrawGlyphsRecorder when drawing cached glyph
buffers
https://bugs.webkit.org/show_bug.cgi?id=240422

Attachment 459375: Patch

https://bugs.webkit.org/attachment.cgi?id=459375&action=review




--- Comment #10 from Myles C. Maxfield <mmaxfield at apple.com> ---
Comment on attachment 459375
  --> https://bugs.webkit.org/attachment.cgi?id=459375
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=459375&action=review

I guess if you want to do it this way it's fine, but I guess I just wanted to
make sure that you thought about doing this in a way that abided by layering a
bit more strictly.

>> Source/WebCore/ChangeLog:25
>> +	      image drawing, or any double glyph drawing (which can happen with
some kind of fonts),
> 
> In what situations do we get this "double glyph drawing", and why does it
mean we can't avoid using DrawGlyphsRecorder? Is this for glyphs with multiple,
colored outlines, or something else?

I believe Simon is talking about COLRv0 glyphs here.

> Source/WebCore/ChangeLog:26
> +	     and GraphicsContext::drawGlyphs() returns a DidDecomposeGlyphs
result indicating this.

GraphicsContext seems like the wrong level of abstraction here. Is there really
no displaylist-specific way to do this?

> Source/WebCore/ChangeLog:27
> +	   * DisplayList gains an optional<bool> indicating whether any glyph
decomposition happened

DisplayList gets the optional<bool>, rather than the DisplayListReplayer?
Shouldn't DisplayLists be immutable once they are recorded?

> Source/WebCore/ChangeLog:30
> +	     on the cached display list when glyph decomposition was requested
by the destination

Did you consider adding a new entry point to the Recorder? Would such a thing
even work?

> Source/WebCore/ChangeLog:42
> +	   Display list logging currently dumps resource identifiers, which is
a problem for 
> +	   layout test because they are't necessarily stable. So we plumb
through a IncludesResourceIdentifiers
> +	   flag, which needs to propagate into all the display item logging
functions, requiring them to
> +	   converted from operator<<(TextStream&, ...) to dumpItem() functions
that take a flags argument.

Surely this could have been done as a separate patch ��

> Source/WebKit/ChangeLog:7
> +

Didn't you tell me years ago not to duplicate ChangeLog prose?

> Source/WebCore/platform/graphics/GraphicsContext.h:295
> +    WEBCORE_EXPORT virtual DidDecomposeGlyphs drawGlyphs(const Font&, const
GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned numGlyphs, const
FloatPoint&, FontSmoothingMode, std::optional<bool> needsGlyphDecomposition = {
});

I guess I said this in an earlier comment but this feels like a layering
violation.

> Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:408
> +    if (m_didDrawImage || m_outputGlyphCount != numGlyphs)

I think you should be trying to determine if the decomposition process is the
identity function. E.g. consider a COLRv0 glyph that has a single layer; the
number of glyphs will be equal and the drawImage flag will be false, but the
decomposition process would still have to happen (in the web process).

> Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:409
> +	   return GraphicsContext::DidDecomposeGlyphs::Yes;

This name is a little misleading. You're not returning information about
whether or not glyphs were decomposed - because all glyphs will get decomposed;
instead, you're returning information about whether the decomposition was the
identity function.

> Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp:691
> -TextStream& operator<<(TextStream& ts, const Translate& item)
> +void dumpItem(TextStream& ts, const Translate& item, OptionSet<AsTextFlag>)

Definitely feels like you put 2 patches inside a single patch

> LayoutTests/TestExpectations:5112
> +[ Release ] fast/text/glyph-display-list-emoji.html [ Skip ]
> +[ Release ] fast/text/glyph-display-list-svg-font.html [ Skip ]

Did you forget to add the test files?


More information about the webkit-reviews mailing list