1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SampleCode.h" 9 #include "SkView.h" 10 #include "SkCanvas.h" 11 #include "SkReadBuffer.h" 12 #include "SkWriteBuffer.h" 13 #include "SkGradientShader.h" 14 #include "SkGraphics.h" 15 #include "SkImageDecoder.h" 16 #include "SkPath.h" 17 #include "SkRandom.h" 18 #include "SkRegion.h" 19 #include "SkShader.h" 20 #include "SkUtils.h" 21 #include "SkColorPriv.h" 22 #include "SkColorFilter.h" 23 #include "SkTime.h" 24 #include "SkTypeface.h" 25 #include "SkXfermode.h" 26 27 #include "SkStream.h" 28 #include "SkXMLParser.h" 29 30 static const struct { 31 const char* fName; 32 uint32_t fFlags; 33 bool fFlushCache; 34 } gHints[] = { 35 { "Linear", SkPaint::kLinearText_Flag, false }, 36 { "Normal", 0, true }, 37 { "Subpixel", SkPaint::kSubpixelText_Flag, true } 38 }; 39 40 static void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y, 41 const SkPaint& paint, SkScalar clickX) { 42 SkPaint p(paint); 43 44 #if 0 45 canvas->drawText(text, length, x, y, paint); 46 #else 47 { 48 SkPoint pts[1000]; 49 SkScalar xpos = x; 50 SkASSERT(length <= SK_ARRAY_COUNT(pts)); 51 for (size_t i = 0; i < length; i++) { 52 pts[i].set(xpos, y), xpos += paint.getTextSize(); 53 } 54 canvas->drawPosText(text, length, pts, paint); 55 } 56 #endif 57 58 p.setSubpixelText(true); 59 x += SkIntToScalar(180); 60 canvas->drawText(text, length, x, y, p); 61 62 #ifdef SK_DEBUG 63 if (true) { 64 p.setSubpixelText(false); 65 p.setLinearText(true); 66 x += SkIntToScalar(180); 67 canvas->drawText(text, length, x, y, p); 68 } 69 #endif 70 } 71 72 class TextSpeedView : public SampleView { 73 public: 74 TextSpeedView() { 75 fHints = 0; 76 fClickX = 0; 77 } 78 79 protected: 80 // overrides from SkEventSink 81 bool onQuery(SkEvent* evt) override { 82 if (SampleCode::TitleQ(*evt)) { 83 SampleCode::TitleR(evt, "Text"); 84 return true; 85 } 86 return this->INHERITED::onQuery(evt); 87 } 88 89 static void make_textstrip(SkBitmap* bm) { 90 bm->allocPixels(SkImageInfo::Make(200, 18, kRGB_565_SkColorType, 91 kOpaque_SkAlphaType)); 92 bm->eraseColor(SK_ColorWHITE); 93 94 SkCanvas canvas(*bm); 95 SkPaint paint; 96 const char* s = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit"; 97 98 paint.setFlags(paint.getFlags() | SkPaint::kAntiAlias_Flag 99 | SkPaint::kDevKernText_Flag); 100 paint.setTextSize(SkIntToScalar(14)); 101 canvas.drawText(s, strlen(s), SkIntToScalar(8), SkIntToScalar(14), paint); 102 } 103 104 static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand) { 105 for (size_t i = 0; i < n; i++) 106 pts[i].set(rand->nextUScalar1() * 640, rand->nextUScalar1() * 480); 107 } 108 109 void onDrawContent(SkCanvas* canvas) override { 110 SkAutoCanvasRestore restore(canvas, false); 111 { 112 SkRect r; 113 r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20)); 114 // canvas->saveLayer(&r, nullptr, SkCanvas::kHasAlphaLayer_SaveFlag); 115 } 116 117 SkPaint paint; 118 // const uint16_t glyphs[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }; 119 int index = fHints % SK_ARRAY_COUNT(gHints); 120 index = 1; 121 // const char* style = gHints[index].fName; 122 123 // canvas->translate(0, SkIntToScalar(50)); 124 125 // canvas->drawText(style, strlen(style), SkIntToScalar(20), SkIntToScalar(20), paint); 126 127 SkSafeUnref(paint.setTypeface(SkTypeface::CreateFromFile("/skimages/samplefont.ttf"))); 128 paint.setAntiAlias(true); 129 paint.setFlags(paint.getFlags() | gHints[index].fFlags); 130 131 SkRect clip; 132 clip.set(SkIntToScalar(25), SkIntToScalar(34), SkIntToScalar(88), SkIntToScalar(155)); 133 134 const char* text = "Hamburgefons"; 135 size_t length = strlen(text); 136 137 SkScalar y = SkIntToScalar(0); 138 for (int i = 9; i <= 24; i++) { 139 paint.setTextSize(SkIntToScalar(i) /*+ (gRand.nextU() & 0xFFFF)*/); 140 for (SkScalar dx = 0; dx <= SkIntToScalar(3)/4; 141 dx += SkIntToScalar(1) /* /4 */) { 142 y += paint.getFontSpacing(); 143 DrawTheText(canvas, text, length, SkIntToScalar(20) + dx, y, paint, fClickX); 144 } 145 } 146 if (gHints[index].fFlushCache) { 147 // SkGraphics::SetFontCacheUsed(0); 148 } 149 } 150 151 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, 152 unsigned modi) override { 153 fClickX = x; 154 this->inval(nullptr); 155 return this->INHERITED::onFindClickHandler(x, y, modi); 156 } 157 158 bool onClick(Click* click) override { 159 return this->INHERITED::onClick(click); 160 } 161 162 private: 163 int fHints; 164 SkScalar fClickX; 165 166 typedef SampleView INHERITED; 167 }; 168 169 ////////////////////////////////////////////////////////////////////////////// 170 171 static SkView* MyFactory() { return new TextSpeedView; } 172 static SkViewRegister reg(MyFactory); 173