-
Notifications
You must be signed in to change notification settings - Fork 6k
[Impeller] Use new SkParagraph APIs for stroked text. #41735
Changes from all commits
d905708
a47bdc0
8a3a522
7831afd
ef55319
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1104,9 +1104,23 @@ void DlDispatcher::drawDisplayList( | |
void DlDispatcher::drawTextBlob(const sk_sp<SkTextBlob> blob, | ||
SkScalar x, | ||
SkScalar y) { | ||
canvas_.DrawTextFrame(TextFrameFromTextBlob(blob), // | ||
impeller::Point{x, y}, // | ||
paint_ // | ||
const auto text_frame = TextFrameFromTextBlob(blob); | ||
if (paint_.style == Paint::Style::kStroke) { | ||
auto path = skia_conversions::PathDataFromTextBlob(blob); | ||
auto bounds = text_frame.GetBounds(); | ||
if (!bounds.has_value()) { | ||
return; | ||
} | ||
canvas_.Save(); | ||
canvas_.Translate({x + bounds->origin.x, y + bounds->origin.y, 0.0}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is the frame bounds origin actually the right thing to be adding here? It would seem weird for Skia's API to circularly depend on the text frame bounds origin when coming up with path coords to output. Needing to add in something like the baseline offset would make sense, though. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To be honest I don't really know. This is similar to the approach I used when drawing with different color sources on top of the text: https://github.com/flutter/engine/blob/main/impeller/aiks/canvas.cc#L529-L534 |
||
canvas_.DrawPath(path, paint_); | ||
canvas_.Restore(); | ||
return; | ||
} | ||
|
||
canvas_.DrawTextFrame(text_frame, // | ||
impeller::Point{x, y}, // | ||
paint_ // | ||
); | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,7 @@ | |
// found in the LICENSE file. | ||
|
||
#include "impeller/display_list/skia_conversions.h" | ||
#include "third_party/skia/modules/skparagraph/include/Paragraph.h" | ||
|
||
namespace impeller { | ||
namespace skia_conversions { | ||
|
@@ -159,6 +160,14 @@ std::vector<Matrix> ToRSXForms(const SkRSXform xform[], int count) { | |
return result; | ||
} | ||
|
||
Path PathDataFromTextBlob(const sk_sp<SkTextBlob>& blob) { | ||
if (!blob) { | ||
return {}; | ||
} | ||
|
||
return ToPath(skia::textlayout::Paragraph::GetPath(blob.get())); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well I'll be damned. That's a lot easier than I was expecting! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, I had to wait 3 months for the API to be added so IMO not that easy 😆 |
||
} | ||
|
||
std::optional<impeller::PixelFormat> ToPixelFormat(SkColorType type) { | ||
switch (type) { | ||
case kRGBA_8888_SkColorType: | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it's strictly necessary, but adding a playground test in
display_list_unittests.cc
would be nice as a jumping off point for debugging in the future.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good idea, will do.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done