/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Sample.h" #include "SkCanvas.h" #include "SkReadBuffer.h" #include "SkWriteBuffer.h" #include "SkGradientShader.h" #include "SkGraphics.h" #include "SkPath.h" #include "SkRandom.h" #include "SkRegion.h" #include "SkShader.h" #include "SkUtils.h" #include "SkColorPriv.h" #include "SkColorFilter.h" #include "SkTime.h" #include "SkTypeface.h" #include "SkStream.h" static const struct { const char* fName; uint32_t fFlags; bool fFlushCache; } gHints[] = { { "Linear", SkPaint::kLinearText_Flag, false }, { "Normal", 0, true }, { "Subpixel", SkPaint::kSubpixelText_Flag, true } }; static void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y, const SkPaint& paint, SkScalar clickX) { SkPaint p(paint); #if 0 canvas->drawText(text, length, x, y, paint); #else { SkPoint pts[1000]; SkScalar xpos = x; SkASSERT(length <= SK_ARRAY_COUNT(pts)); for (size_t i = 0; i < length; i++) { pts[i].set(xpos, y); xpos += paint.getTextSize(); } canvas->drawPosText(text, length, pts, paint); } #endif p.setSubpixelText(true); x += SkIntToScalar(180); canvas->drawText(text, length, x, y, p); #ifdef SK_DEBUG if (true) { p.setSubpixelText(false); p.setLinearText(true); x += SkIntToScalar(180); canvas->drawText(text, length, x, y, p); } #endif } class TextSpeedView : public Sample { public: TextSpeedView() { fHints = 0; fClickX = 0; } protected: bool onQuery(Sample::Event* evt) override { if (Sample::TitleQ(*evt)) { Sample::TitleR(evt, "Text"); return true; } return this->INHERITED::onQuery(evt); } static void make_textstrip(SkBitmap* bm) { bm->allocPixels(SkImageInfo::Make(200, 18, kRGB_565_SkColorType, kOpaque_SkAlphaType)); bm->eraseColor(SK_ColorWHITE); SkCanvas canvas(*bm); SkPaint paint; const char* s = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit"; paint.setFlags(paint.getFlags() | SkPaint::kAntiAlias_Flag); paint.setTextSize(SkIntToScalar(14)); canvas.drawString(s, SkIntToScalar(8), SkIntToScalar(14), paint); } static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand) { for (size_t i = 0; i < n; i++) pts[i].set(rand->nextUScalar1() * 640, rand->nextUScalar1() * 480); } void onDrawContent(SkCanvas* canvas) override { SkAutoCanvasRestore restore(canvas, false); { SkRect r; r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20)); // canvas->saveLayer(&r, nullptr, SkCanvas::kHasAlphaLayer_SaveFlag); } SkPaint paint; // const uint16_t glyphs[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }; int index = fHints % SK_ARRAY_COUNT(gHints); index = 1; // const char* style = gHints[index].fName; // canvas->translate(0, SkIntToScalar(50)); // canvas->drawString(style, SkIntToScalar(20), SkIntToScalar(20), paint); paint.setTypeface(SkTypeface::MakeFromFile("/skimages/samplefont.ttf")); paint.setAntiAlias(true); paint.setFlags(paint.getFlags() | gHints[index].fFlags); SkRect clip; clip.set(SkIntToScalar(25), SkIntToScalar(34), SkIntToScalar(88), SkIntToScalar(155)); const char* text = "Hamburgefons"; size_t length = strlen(text); SkScalar y = SkIntToScalar(0); for (int i = 9; i <= 24; i++) { paint.setTextSize(SkIntToScalar(i) /*+ (gRand.nextU() & 0xFFFF)*/); for (SkScalar dx = 0; dx <= SkIntToScalar(3)/4; dx += SkIntToScalar(1) /* /4 */) { y += paint.getFontSpacing(); DrawTheText(canvas, text, length, SkIntToScalar(20) + dx, y, paint, fClickX); } } if (gHints[index].fFlushCache) { // SkGraphics::SetFontCacheUsed(0); } } virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override { fClickX = x; return this->INHERITED::onFindClickHandler(x, y, modi); } bool onClick(Click* click) override { return this->INHERITED::onClick(click); } private: int fHints; SkScalar fClickX; typedef Sample INHERITED; }; ////////////////////////////////////////////////////////////////////////////// DEF_SAMPLE( return new TextSpeedView(); )