start to change Viewer's filtering to know about fonts
Did not hook-up all of the font flags, but these did not appear to be
"filtered" by viewer, so landing this version for now (to stop assuming
that text-fields are in paint).
Bug: skia:
Change-Id: Id8bdfc12f838b6c3ddc2981aca698d4d80a4c639
Reviewed-on: https://skia-review.googlesource.com/c/181169
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Auto-Submit: Mike Reed <reed@google.com>
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index b871de4..7ec001b 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -356,23 +356,23 @@
fWindow->inval();
});
fCommands.addCommand('H', "Paint", "Hinting mode", [this]() {
- if (!fPaintOverrides.fHinting) {
- fPaintOverrides.fHinting = true;
- fPaint.setHinting(kNo_SkFontHinting);
+ if (!fFontOverrides.fHinting) {
+ fFontOverrides.fHinting = true;
+ fFont.setHinting(kNo_SkFontHinting);
} else {
- switch ((SkFontHinting)fPaint.getHinting()) {
+ switch (fFont.getHinting()) {
case kNo_SkFontHinting:
- fPaint.setHinting(kSlight_SkFontHinting);
+ fFont.setHinting(kSlight_SkFontHinting);
break;
case kSlight_SkFontHinting:
- fPaint.setHinting(kNormal_SkFontHinting);
+ fFont.setHinting(kNormal_SkFontHinting);
break;
case kNormal_SkFontHinting:
- fPaint.setHinting(kFull_SkFontHinting);
+ fFont.setHinting(kFull_SkFontHinting);
break;
case kFull_SkFontHinting:
- fPaint.setHinting(kNo_SkFontHinting);
- fPaintOverrides.fHinting = false;
+ fFont.setHinting(kNo_SkFontHinting);
+ fFontOverrides.fHinting = false;
break;
}
}
@@ -708,8 +708,8 @@
paintFlag(SkPaint::kAutoHinting_Flag, &SkPaint::isAutohinted,
"Force Autohint", "No Force Autohint");
- if (fPaintOverrides.fHinting) {
- switch ((SkFontHinting)fPaint.getHinting()) {
+ if (fFontOverrides.fHinting) {
+ switch (fFont.getHinting()) {
case kNo_SkFontHinting:
paintTitle.append("No Hinting");
break;
@@ -962,18 +962,17 @@
class OveridePaintFilterCanvas : public SkPaintFilterCanvas {
public:
- OveridePaintFilterCanvas(SkCanvas* canvas, SkPaint* paint, Viewer::SkPaintFields* fields)
- : SkPaintFilterCanvas(canvas), fPaint(paint), fPaintOverrides(fields)
+ OveridePaintFilterCanvas(SkCanvas* canvas, SkPaint* paint, Viewer::SkPaintFields* pfields,
+ SkFont* font, Viewer::SkFontFields* ffields)
+ : SkPaintFilterCanvas(canvas), fPaint(paint), fPaintOverrides(pfields), fFont(font), fFontOverrides(ffields)
{ }
const SkTextBlob* filterTextBlob(const SkPaint& paint, const SkTextBlob* blob,
sk_sp<SkTextBlob>* cache) {
bool blobWillChange = false;
for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) {
- SkPaint blobPaint = paint;
- it.applyFontToPaint(&blobPaint);
- SkTCopyOnFirstWrite<SkPaint> filteredPaint(blobPaint);
- bool shouldDraw = this->onFilter(&filteredPaint, kTextBlob_Type);
- if (blobPaint != *filteredPaint || !shouldDraw) {
+ SkTCopyOnFirstWrite<SkFont> filteredFont(it.font());
+ bool shouldDraw = this->filterFont(&filteredFont);
+ if (it.font() != *filteredFont || !shouldDraw) {
blobWillChange = true;
break;
}
@@ -984,15 +983,13 @@
SkTextBlobBuilder builder;
for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) {
- SkPaint blobPaint = paint;
- it.applyFontToPaint(&blobPaint);
- SkTCopyOnFirstWrite<SkPaint> filteredPaint(blobPaint);
- bool shouldDraw = this->onFilter(&filteredPaint, kTextBlob_Type);
+ SkTCopyOnFirstWrite<SkFont> filteredFont(it.font());
+ bool shouldDraw = this->filterFont(&filteredFont);
if (!shouldDraw) {
continue;
}
- SkFont font = SkFont::LEGACY_ExtractFromPaint(*filteredPaint);
+ SkFont font = *filteredFont;
const SkTextBlobBuilder::RunBuffer& runBuffer
= it.positioning() == SkTextBlobRunIterator::kDefault_Positioning
@@ -1034,46 +1031,54 @@
this->SkPaintFilterCanvas::onDrawTextBlob(
this->filterTextBlob(paint, blob, &cache), x, y, paint);
}
+ bool filterFont(SkTCopyOnFirstWrite<SkFont>* font) const {
+ if (fFontOverrides->fTextSize) {
+ font->writable()->setSize(fFont->getSize());
+ }
+ if (fFontOverrides->fHinting) {
+ font->writable()->setHinting(fFont->getHinting());
+ }
+#if 0
+ if (fFontOverrides->fFlags & SkPaint::kAntiAlias_Flag) {
+ paint->writable()->setAntiAlias(fPaint->isAntiAlias());
+ }
+ if (fFontOverrides->fFlags & SkPaint::kFakeBoldText_Flag) {
+ paint->writable()->setFakeBoldText(fPaint->isFakeBoldText());
+ }
+ if (fFontOverrides->fFlags & SkPaint::kLinearText_Flag) {
+ paint->writable()->setLinearText(fPaint->isLinearText());
+ }
+ if (fFontOverrides->fFlags & SkPaint::kSubpixelText_Flag) {
+ paint->writable()->setSubpixelText(fPaint->isSubpixelText());
+ }
+ if (fFontOverrides->fFlags & SkPaint::kLCDRenderText_Flag) {
+ paint->writable()->setLCDRenderText(fPaint->isLCDRenderText());
+ }
+ if (fFontOverrides->fFlags & SkPaint::kEmbeddedBitmapText_Flag) {
+ paint->writable()->setEmbeddedBitmapText(fPaint->isEmbeddedBitmapText());
+ }
+ if (fFontOverrides->fFlags & SkPaint::kAutoHinting_Flag) {
+ paint->writable()->setAutohinted(fPaint->isAutohinted());
+ }
+#endif
+ return true;
+ }
bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type) const override {
if (*paint == nullptr) {
return true;
}
- if (fPaintOverrides->fTextSize) {
- paint->writable()->setTextSize(fPaint->getTextSize());
- }
- if (fPaintOverrides->fHinting) {
- paint->writable()->setHinting(fPaint->getHinting());
- }
-
if (fPaintOverrides->fFlags & SkPaint::kAntiAlias_Flag) {
paint->writable()->setAntiAlias(fPaint->isAntiAlias());
}
if (fPaintOverrides->fFlags & SkPaint::kDither_Flag) {
paint->writable()->setDither(fPaint->isDither());
}
- if (fPaintOverrides->fFlags & SkPaint::kFakeBoldText_Flag) {
- paint->writable()->setFakeBoldText(fPaint->isFakeBoldText());
- }
- if (fPaintOverrides->fFlags & SkPaint::kLinearText_Flag) {
- paint->writable()->setLinearText(fPaint->isLinearText());
- }
- if (fPaintOverrides->fFlags & SkPaint::kSubpixelText_Flag) {
- paint->writable()->setSubpixelText(fPaint->isSubpixelText());
- }
- if (fPaintOverrides->fFlags & SkPaint::kLCDRenderText_Flag) {
- paint->writable()->setLCDRenderText(fPaint->isLCDRenderText());
- }
- if (fPaintOverrides->fFlags & SkPaint::kEmbeddedBitmapText_Flag) {
- paint->writable()->setEmbeddedBitmapText(fPaint->isEmbeddedBitmapText());
- }
- if (fPaintOverrides->fFlags & SkPaint::kAutoHinting_Flag) {
- paint->writable()->setAutohinted(fPaint->isAutohinted());
- }
-
return true;
}
SkPaint* fPaint;
Viewer::SkPaintFields* fPaintOverrides;
+ SkFont* fFont;
+ Viewer::SkFontFields* fFontOverrides;
};
void Viewer::drawSlide(SkCanvas* canvas) {
@@ -1145,7 +1150,8 @@
tileCanvas->translate(-x, -y);
tileCanvas->clear(SK_ColorTRANSPARENT);
tileCanvas->concat(m);
- OveridePaintFilterCanvas filterCanvas(tileCanvas, &fPaint, &fPaintOverrides);
+ OveridePaintFilterCanvas filterCanvas(tileCanvas, &fPaint, &fPaintOverrides,
+ &fFont, &fFontOverrides);
fSlides[fCurrentSlide]->draw(&filterCanvas);
tileSurface->draw(slideCanvas, x, y, nullptr);
}
@@ -1167,7 +1173,7 @@
if (kPerspective_Real == fPerspectiveMode) {
slideCanvas->clipRect(SkRect::MakeWH(fWindow->width(), fWindow->height()));
}
- OveridePaintFilterCanvas filterCanvas(slideCanvas, &fPaint, &fPaintOverrides);
+ OveridePaintFilterCanvas filterCanvas(slideCanvas, &fPaint, &fPaintOverrides, &fFont, &fFontOverrides);
fSlides[fCurrentSlide]->draw(&filterCanvas);
}
fStatsLayer.endTiming(fPaintTimer);
@@ -1610,19 +1616,19 @@
if (ImGui::CollapsingHeader("Paint")) {
int hintingIdx = 0;
- if (fPaintOverrides.fHinting) {
- hintingIdx = static_cast<unsigned>(fPaint.getHinting()) + 1;
+ if (fFontOverrides.fHinting) {
+ hintingIdx = static_cast<unsigned>(fFont.getHinting()) + 1;
}
if (ImGui::Combo("Hinting", &hintingIdx,
"Default\0None\0Slight\0Normal\0Full\0\0"))
{
if (hintingIdx == 0) {
- fPaintOverrides.fHinting = false;
- fPaint.setHinting(kNo_SkFontHinting);
+ fFontOverrides.fHinting = false;
+ fFont.setHinting(kNo_SkFontHinting);
} else {
- fPaintOverrides.fHinting = true;
+ fFontOverrides.fHinting = true;
SkFontHinting hinting = SkTo<SkFontHinting>(hintingIdx - 1);
- fPaint.setHinting(hinting);
+ fFont.setHinting(hinting);
}
paramsChanged = true;
}
@@ -1698,7 +1704,7 @@
"Default\0No Dither\0Dither\0\0",
SkPaint::kDither_Flag,
&SkPaint::isDither, &SkPaint::setDither);
-
+#if 0
paintFlag("Fake Bold Glyphs",
"Default\0No Fake Bold\0Fake Bold\0\0",
SkPaint::kFakeBoldText_Flag,
@@ -1728,18 +1734,18 @@
"Default\0No Force Auto-Hinting\0Force Auto-Hinting\0\0",
SkPaint::kAutoHinting_Flag,
&SkPaint::isAutohinted, &SkPaint::setAutohinted);
-
- ImGui::Checkbox("Override TextSize", &fPaintOverrides.fTextSize);
- if (fPaintOverrides.fTextSize) {
- ImGui::DragFloat2("TextRange", fPaintOverrides.fTextSizeRange,
+#endif
+ ImGui::Checkbox("Override TextSize", &fFontOverrides.fTextSize);
+ if (fFontOverrides.fTextSize) {
+ ImGui::DragFloat2("TextRange", fFontOverrides.fTextSizeRange,
0.001f, -10.0f, 300.0f, "%.6f", 2.0f);
- float textSize = fPaint.getTextSize();
+ float textSize = fFont.getSize();
if (ImGui::DragFloat("TextSize", &textSize, 0.001f,
- fPaintOverrides.fTextSizeRange[0],
- fPaintOverrides.fTextSizeRange[1],
+ fFontOverrides.fTextSizeRange[0],
+ fFontOverrides.fTextSizeRange[1],
"%.6f", 2.0f))
{
- fPaint.setTextSize(textSize);
+ fFont.setSize(textSize);
this->preTouchMatrixChanged();
paramsChanged = true;
}