[Impeller] Use new SkParagraph APIs for stroked text. (flutter/engine#41735)

~~Requires https://skia-review.googlesource.com/c/skia/+/692196~~ Landed

Fixes https://github.com/flutter/flutter/issues/126010

Looks correct on iOS, renders incorrectly on Android 🤷 . Might be related to all of our text bounds looking off.

### iOS

![flutter_03](https://github.com/flutter/engine/assets/8975114/50897fd0-47fd-4cad-b158-1662aa650092)

### Android

![flutter_04](https://github.com/flutter/engine/assets/8975114/bcefe843-71a0-4b98-956f-039918e9a4cc)
This commit is contained in:
Jonah Williams 2023-07-12 09:29:13 -07:00 committed by GitHub
parent e0d567bc40
commit 9f11809bb7
5 changed files with 43 additions and 3 deletions

View File

@ -15,6 +15,7 @@ impeller_component("skia_conversions") {
"../geometry",
"//flutter/fml",
"//third_party/skia",
"//third_party/skia/modules/skparagraph",
]
}

View File

@ -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});
canvas_.DrawPath(path, paint_);
canvas_.Restore();
return;
}
canvas_.DrawTextFrame(text_frame, //
impeller::Point{x, y}, //
paint_ //
);
}

View File

@ -447,6 +447,19 @@ TEST_P(DisplayListTest, CanDrawWithMaskBlur) {
ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
}
TEST_P(DisplayListTest, CanDrawStrokedText) {
flutter::DisplayListBuilder builder;
flutter::DlPaint paint;
paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
paint.setColor(flutter::DlColor::kRed());
builder.DrawTextBlob(
SkTextBlob::MakeFromString("stoked about stroked text", CreateTestFont()),
250, 250, paint);
ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
}
TEST_P(DisplayListTest, IgnoreMaskFilterWhenSavingLayer) {
auto texture = CreateTextureForFixture("embarcadero.jpg");
flutter::DisplayListBuilder builder;

View File

@ -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()));
}
std::optional<impeller::PixelFormat> ToPixelFormat(SkColorType type) {
switch (type) {
case kRGBA_8888_SkColorType:

View File

@ -16,6 +16,7 @@
#include "third_party/skia/include/core/SkPoint.h"
#include "third_party/skia/include/core/SkRRect.h"
#include "third_party/skia/include/core/SkRSXform.h"
#include "third_party/skia/include/core/SkTextBlob.h"
namespace impeller {
namespace skia_conversions {
@ -40,6 +41,8 @@ Path ToPath(const SkPath& path);
Path ToPath(const SkRRect& rrect);
Path PathDataFromTextBlob(const sk_sp<SkTextBlob>& blob);
std::optional<impeller::PixelFormat> ToPixelFormat(SkColorType type);
} // namespace skia_conversions