SkPDF: de-duplicate text-as-paths

TBR=

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2851

Change-Id: I0accbca13945587cd5ef903cbd4127f1f6a3fb13
Reviewed-on: https://skia-review.googlesource.com/2851
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
This commit is contained in:
Hal Canary 2016-09-30 14:53:15 -04:00 committed by Skia Commit-Bot
parent c8962518dd
commit b3480e1cb7
2 changed files with 2 additions and 75 deletions

View File

@ -1205,47 +1205,6 @@ static Clusterator make_clusterator(
return Clusterator(clusters, utf8Text, SkToU32(glyphCount), utf8ByteCount);
}
static void draw_transparent_text(SkPDFDevice* device,
const SkDraw& d,
const void* text, size_t len,
SkScalar x, SkScalar y,
const SkPaint& srcPaint) {
sk_sp<SkTypeface> defaultFace = SkTypeface::MakeDefault();
if (!SkPDFFont::CanEmbedTypeface(defaultFace.get(), device->getCanon())) {
SkDebugf("SkPDF: default typeface should be embeddable");
return; // Avoid infinite loop in release.
}
SkPaint transparent;
transparent.setTypeface(std::move(defaultFace));
transparent.setTextSize(srcPaint.getTextSize());
transparent.setColor(SK_ColorTRANSPARENT);
switch (srcPaint.getTextEncoding()) {
case SkPaint::kGlyphID_TextEncoding: {
// Since a glyphId<->Unicode mapping is typeface-specific,
// map back to Unicode first.
size_t glyphCount = len / 2;
SkAutoTMalloc<SkUnichar> unichars(glyphCount);
srcPaint.glyphsToUnichars(
(const uint16_t*)text, SkToInt(glyphCount), &unichars[0]);
transparent.setTextEncoding(SkPaint::kUTF32_TextEncoding);
// TODO(halcanary): deal with case where default typeface
// does not have glyphs for these unicode code points.
device->drawText(d, &unichars[0],
glyphCount * sizeof(SkUnichar),
x, y, transparent);
break;
}
case SkPaint::kUTF8_TextEncoding:
case SkPaint::kUTF16_TextEncoding:
case SkPaint::kUTF32_TextEncoding:
transparent.setTextEncoding(srcPaint.getTextEncoding());
device->drawText(d, text, len, x, y, transparent);
break;
default:
SkFAIL("unknown text encoding");
}
}
static SkUnichar map_glyph(const SkTDArray<SkUnichar>& glyphToUnicode, SkGlyphID glyph) {
return SkToInt(glyph) < glyphToUnicode.count() ? glyphToUnicode[SkToInt(glyph)] : -1;
}
@ -1302,39 +1261,6 @@ void SkPDFDevice::internalDrawText(
if (glyphCount <= 0) {
return;
}
// TODO(halcanary): use metrics->fGlyphToUnicode to check Unicode mapping.
if (!SkPDFFont::CanEmbedTypeface(typeface, fDocument->canon())) {
SkPath path; // https://bug.skia.org/3866
switch (positioning) {
case SkTextBlob::kDefault_Positioning:
srcPaint.getTextPath(sourceText, sourceByteCount,
offset.x(), offset.y(), &path);
break;
case SkTextBlob::kHorizontal_Positioning: {
SkAutoTMalloc<SkPoint> positionsBuffer(glyphCount);
for (int i = 0; i < glyphCount; ++i) {
positionsBuffer[i] = offset + SkPoint{pos[i], 0};
}
srcPaint.getPosTextPath(sourceText, sourceByteCount,
&positionsBuffer[0], &path);
break;
}
case SkTextBlob::kFull_Positioning: {
SkAutoTMalloc<SkPoint> positionsBuffer(glyphCount);
for (int i = 0; i < glyphCount; ++i) {
positionsBuffer[i] = offset + SkPoint{pos[2 * i], pos[2 * i + 1]};
}
srcPaint.getPosTextPath(sourceText, sourceByteCount,
&positionsBuffer[0], &path);
break;
}
}
this->drawPath(d, path, srcPaint, &SkMatrix::I(), true);
// Draw text transparently to make it copyable/searchable/accessable.
draw_transparent_text(this, d, sourceText, sourceByteCount,
offset.x(), offset.y(), paint);
return;
}
// These three heap buffers are only used in the case where no glyphs
// are passed to drawText() (most clients pass glyphs or a textblob).

View File

@ -162,7 +162,8 @@ const SkAdvancedTypefaceMetrics* SkPDFFont::GetMetrics(SkTypeface* typeface,
}
SkAdvancedTypefaceMetrics::FontType SkPDFFont::FontType(const SkAdvancedTypefaceMetrics& metrics) {
if (SkToBool(metrics.fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag)) {
if (SkToBool(metrics.fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag) ||
SkToBool(metrics.fFlags & SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag)) {
// force Type3 fallback.
return SkAdvancedTypefaceMetrics::kOther_Font;
}