mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
[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  ### Android 
This commit is contained in:
parent
e0d567bc40
commit
9f11809bb7
@ -15,6 +15,7 @@ impeller_component("skia_conversions") {
|
||||
"../geometry",
|
||||
"//flutter/fml",
|
||||
"//third_party/skia",
|
||||
"//third_party/skia/modules/skparagraph",
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@ -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_ //
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user