Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 00ddf13

Browse files
libtxt: apply an offset to drawing operations instead of translating the canvas (#5628)
Fixes flutter/flutter#18710
1 parent 2c5647c commit 00ddf13

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

third_party/txt/src/txt/paragraph.cc

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@ sk_sp<SkTypeface> Paragraph::GetDefaultSkiaTypeface(const TextStyle& style) {
877877
// The x,y coordinates will be the very top left corner of the rendered
878878
// paragraph.
879879
void Paragraph::Paint(SkCanvas* canvas, double x, double y) {
880-
canvas->translate(x, y);
880+
SkPoint base_offset = SkPoint::Make(x, y);
881881
SkPaint paint;
882882
for (const PaintRecord& record : records_) {
883883
if (record.style().has_foreground) {
@@ -886,15 +886,16 @@ void Paragraph::Paint(SkCanvas* canvas, double x, double y) {
886886
paint.reset();
887887
paint.setColor(record.style().color);
888888
}
889-
SkPoint offset = record.offset();
890-
PaintBackground(canvas, record);
889+
SkPoint offset = base_offset + record.offset();
890+
PaintBackground(canvas, record, base_offset);
891891
canvas->drawTextBlob(record.text(), offset.x(), offset.y(), paint);
892-
PaintDecorations(canvas, record);
892+
PaintDecorations(canvas, record, base_offset);
893893
}
894-
canvas->translate(-x, -y);
895894
}
896895

897-
void Paragraph::PaintDecorations(SkCanvas* canvas, const PaintRecord& record) {
896+
void Paragraph::PaintDecorations(SkCanvas* canvas,
897+
const PaintRecord& record,
898+
SkPoint base_offset) {
898899
if (record.style().decoration == TextDecoration::kNone)
899900
return;
900901

@@ -935,8 +936,9 @@ void Paragraph::PaintDecorations(SkCanvas* canvas, const PaintRecord& record) {
935936
paint.setStrokeWidth(underline_thickness *
936937
record.style().decoration_thickness_multiplier);
937938

938-
SkScalar x = record.offset().x();
939-
SkScalar y = record.offset().y();
939+
SkPoint record_offset = base_offset + record.offset();
940+
SkScalar x = record_offset.x();
941+
SkScalar y = record_offset.y();
940942

941943
// Setup the decorations.
942944
switch (record.style().decoration_style) {
@@ -1052,14 +1054,16 @@ void Paragraph::PaintDecorations(SkCanvas* canvas, const PaintRecord& record) {
10521054
}
10531055
}
10541056

1055-
void Paragraph::PaintBackground(SkCanvas* canvas, const PaintRecord& record) {
1057+
void Paragraph::PaintBackground(SkCanvas* canvas,
1058+
const PaintRecord& record,
1059+
SkPoint base_offset) {
10561060
if (!record.style().has_background)
10571061
return;
10581062

10591063
const SkPaint::FontMetrics& metrics = record.metrics();
10601064
SkRect rect(SkRect::MakeLTRB(0, metrics.fAscent, record.GetRunWidth(),
10611065
metrics.fDescent));
1062-
rect.offset(record.offset());
1066+
rect.offset(base_offset + record.offset());
10631067
canvas->drawRect(rect, record.style().background);
10641068
}
10651069

third_party/txt/src/txt/paragraph.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,14 @@ class Paragraph {
318318
double GetLineXOffset(double line_total_advance);
319319

320320
// Creates and draws the decorations onto the canvas.
321-
void PaintDecorations(SkCanvas* canvas, const PaintRecord& record);
321+
void PaintDecorations(SkCanvas* canvas,
322+
const PaintRecord& record,
323+
SkPoint base_offset);
322324

323325
// Draws the background onto the canvas.
324-
void PaintBackground(SkCanvas* canvas, const PaintRecord& record);
326+
void PaintBackground(SkCanvas* canvas,
327+
const PaintRecord& record,
328+
SkPoint base_offset);
325329

326330
// Obtain a Minikin font collection matching this text style.
327331
std::shared_ptr<minikin::FontCollection> GetMinikinFontCollectionForStyle(

0 commit comments

Comments
 (0)