void SkTextUtils::Draw(SkCanvas* canvas, const void* text, size_t size, SkTextEncoding encoding, SkScalar x, SkScalar y, const SkFont& font, const SkPaint& paint, Align align) { if (align != kLeft_Align) { SkScalar width = font.measureText(text, size, encoding); if (align == kCenter_Align) { width *= 0.5f; } x -= width; } canvas->drawTextBlob(SkTextBlob::MakeFromText(text, size, font, encoding), x, y, paint); }
void onDraw(int loops, SkCanvas* canvas) override { SkFont font; font.setEdging(SkFont::Edging::kAntiAlias); const uint16_t* array = gUniqueGlyphIDs; while (*array != gUniqueGlyphIDs_Sentinel) { int count = count_glyphs(array); for (int i = 0; i < loops; ++i) { (void)font.measureText(array, count * sizeof(uint16_t), SkTextEncoding::kGlyphID); } array += count + 1; // skip the sentinel } }
static void make_big_bitmap(SkBitmap* bm) { static const char gText[] = "We the people, in order to form a more perfect union, establish justice," " ensure domestic tranquility, provide for the common defense, promote the" " general welfare and ensure the blessings of liberty to ourselves and our" " posterity, do ordain and establish this constitution for the United" " States of America."; const int BIG_H = 120; SkFont font; font.setSize(SkIntToScalar(BIG_H)); const int BIG_W = SkScalarRoundToInt(font.measureText(gText, strlen(gText), SkTextEncoding::kUTF8)); bm->allocN32Pixels(BIG_W, BIG_H); bm->eraseColor(SK_ColorWHITE); SkCanvas canvas(*bm); canvas.drawSimpleText(gText, strlen(gText), SkTextEncoding::kUTF8, 0, font.getSize()*4/5, font, SkPaint()); }
static void draw_label(SkCanvas* canvas, const SkHighContrastConfig& config) { char labelBuffer[256]; const char* invertStr = (config.fInvertStyle == InvertStyle::kInvertBrightness ? "InvBrightness" : (config.fInvertStyle == InvertStyle::kInvertLightness ? "InvLightness" : "NoInvert")); snprintf(labelBuffer, sizeof(labelBuffer), "%s%s contrast=%.1f", config.fGrayscale ? "Gray " : "", invertStr, config.fContrast); SkFont font; font.setTypeface(ToolUtils::create_portable_typeface()); font.setSize(0.05f); font.setEdging(SkFont::Edging::kAlias); size_t len = strlen(labelBuffer); SkScalar width = font.measureText(labelBuffer, len, SkTextEncoding::kUTF8); canvas->drawSimpleText(labelBuffer, len, SkTextEncoding::kUTF8, 0.5f - width / 2, 0.16f, font, SkPaint()); }
static SkScalar draw_string(SkCanvas* canvas, const SkString& text, SkScalar x, SkScalar y, const SkFont& font) { SkPaint paint; canvas->drawString(text, x, y, font, paint); return x + font.measureText(text.c_str(), text.size(), SkTextEncoding::kUTF8); }
virtual void onDrawContent(SkCanvas* canvas) { SkPath path; path.moveTo(SkIntToScalar(0), SkIntToScalar(50)); path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0)); path.lineTo(SkIntToScalar(175), SkIntToScalar(0)); path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25)); path.lineTo(SkIntToScalar(200), SkIntToScalar(150)); path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200)); path.lineTo(SkIntToScalar(0), SkIntToScalar(200)); path.close(); path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); path.lineTo(SkIntToScalar(150), SkIntToScalar(50)); path.lineTo(SkIntToScalar(150), SkIntToScalar(125)); path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); path.close(); path.setFillType(SkPath::kEvenOdd_FillType); SkColor pathColor = SK_ColorBLACK; SkPaint pathPaint; pathPaint.setAntiAlias(true); pathPaint.setColor(pathColor); SkPath clipA; clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20)); clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22)); clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105)); clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177)); clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180)); clipA.close(); SkColor colorA = SK_ColorCYAN; SkPath clipB; clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10)); clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15)); clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190)); clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185)); clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100)); clipB.close(); SkColor colorB = SK_ColorRED; SkFont font; font.setSize(20); SkPaint paint; paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); paint.setStrokeWidth(0); canvas->translate(SkIntToScalar(10),SkIntToScalar(10)); canvas->drawPath(path, pathPaint); paint.setColor(colorA); canvas->drawPath(clipA, paint); paint.setColor(colorB); canvas->drawPath(clipB, paint); static const struct { SkClipOp fOp; const char* fName; } gOps[] = { //extra spaces in names for measureText {kIntersect_SkClipOp, "Isect "}, {kDifference_SkClipOp, "Diff " }, {kUnion_SkClipOp, "Union "}, {kXOR_SkClipOp, "Xor " }, {kReverseDifference_SkClipOp, "RDiff "} }; canvas->translate(0, SkIntToScalar(40)); canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); canvas->save(); for (int invA = 0; invA < 2; ++invA) { for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { size_t idx = invA * SK_ARRAY_COUNT(gOps) + op; if (!(idx % 3)) { canvas->restore(); canvas->translate(0, SkIntToScalar(250)); canvas->save(); } canvas->save(); // set clip clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType : SkPath::kEvenOdd_FillType); canvas->clipPath(clipA); canvas->clipPath(clipB, gOps[op].fOp); // draw path clipped canvas->drawPath(path, pathPaint); canvas->restore(); // draw path in hairline paint.setColor(pathColor); canvas->drawPath(path, paint); // draw clips in hair line paint.setColor(colorA); canvas->drawPath(clipA, paint); paint.setColor(colorB); canvas->drawPath(clipB, paint); SkScalar txtX = SkIntToScalar(55); paint.setColor(colorA); const char* aTxt = invA ? "InverseA " : "A "; canvas->drawSimpleText(aTxt, strlen(aTxt), SkTextEncoding::kUTF8, txtX, SkIntToScalar(220), font, paint); txtX += font.measureText(aTxt, strlen(aTxt), SkTextEncoding::kUTF8); paint.setColor(SK_ColorBLACK); canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), SkTextEncoding::kUTF8, txtX, 220, font, paint); txtX += font.measureText(gOps[op].fName, strlen(gOps[op].fName), SkTextEncoding::kUTF8); paint.setColor(colorB); canvas->drawSimpleText("B", 1, SkTextEncoding::kUTF8, txtX, 220, font, paint); canvas->translate(SkIntToScalar(250),0); } } canvas->restore(); }