blob: 17456b2ee988e6cbfca5d02d6caa1fba434db5a3 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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 */
reed@google.combf0001d2014-01-13 14:53:55 +00007
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000011#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013#include "SkGradientShader.h"
14#include "SkGraphics.h"
15#include "SkImageDecoder.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016#include "SkPath.h"
17#include "SkRandom.h"
18#include "SkRegion.h"
19#include "SkShader.h"
20#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000021#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
reed@google.com9e39bb32011-05-18 12:17:53 +000030static void test_breakText() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000031 SkPaint paint;
32 const char* text = "sdfkljAKLDFJKEWkldfjlk#$%&sdfs.dsj";
33 size_t length = strlen(text);
34 SkScalar width = paint.measureText(text, length);
reed@google.com82065d62011-02-07 15:30:46 +000035
reed@android.com8a1c16f2008-12-17 15:59:43 +000036 SkScalar mm = 0;
37 SkScalar nn = 0;
reed@google.com9e39bb32011-05-18 12:17:53 +000038 for (SkScalar w = 0; w <= width; w += SK_Scalar1) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000039 SkScalar m;
40 size_t n = paint.breakText(text, length, w, &m,
41 SkPaint::kBackward_TextBufferDirection);
reed@google.com82065d62011-02-07 15:30:46 +000042
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 SkASSERT(n <= length);
44 SkASSERT(m <= width);
reed@google.com82065d62011-02-07 15:30:46 +000045
reed@google.com9e39bb32011-05-18 12:17:53 +000046 if (n == 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000047 SkASSERT(m == 0);
reed@google.com9e39bb32011-05-18 12:17:53 +000048 } else {
reed@android.com8a1c16f2008-12-17 15:59:43 +000049 // now assert that we're monotonic
reed@google.com9e39bb32011-05-18 12:17:53 +000050 if (n == nn) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000051 SkASSERT(m == mm);
reed@google.com9e39bb32011-05-18 12:17:53 +000052 } else {
reed@android.com8a1c16f2008-12-17 15:59:43 +000053 SkASSERT(n > nn);
54 SkASSERT(m > mm);
55 }
56 }
tomhudson@google.comffe39bd2012-05-17 15:38:00 +000057 nn = SkIntToScalar((unsigned int)n);
reed@android.com8a1c16f2008-12-17 15:59:43 +000058 mm = m;
59 }
60
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000061 SkDEBUGCODE(size_t length2 =) paint.breakText(text, length, width, &mm);
reed@google.com261b8e22011-04-14 17:53:24 +000062 SkASSERT(length2 == length);
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 SkASSERT(mm == width);
64}
65
reed@android.com8a1c16f2008-12-17 15:59:43 +000066static const struct {
67 const char* fName;
68 uint32_t fFlags;
69 bool fFlushCache;
70} gHints[] = {
71 { "Linear", SkPaint::kLinearText_Flag, false },
72 { "Normal", 0, true },
73 { "Subpixel", SkPaint::kSubpixelText_Flag, true }
74};
75
commit-bot@chromium.orge003aec2014-05-12 13:35:55 +000076static void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y,
77 const SkPaint& paint, SkScalar clickX) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000078 SkPaint p(paint);
79
80#if 0
81 canvas->drawText(text, length, x, y, paint);
82#else
83 {
84 SkPoint pts[1000];
85 SkScalar xpos = x;
86 SkASSERT(length <= SK_ARRAY_COUNT(pts));
reed@google.com9e39bb32011-05-18 12:17:53 +000087 for (size_t i = 0; i < length; i++) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000088 pts[i].set(xpos, y), xpos += paint.getTextSize();
reed@google.com9e39bb32011-05-18 12:17:53 +000089 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000090 canvas->drawPosText(text, length, pts, paint);
91 }
92#endif
93
94 p.setSubpixelText(true);
95 x += SkIntToScalar(180);
96 canvas->drawText(text, length, x, y, p);
97
reed@android.com8a1c16f2008-12-17 15:59:43 +000098#ifdef SK_DEBUG
reed@google.com9e39bb32011-05-18 12:17:53 +000099 if (true) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100 p.setSubpixelText(false);
101 p.setLinearText(true);
102 x += SkIntToScalar(180);
103 canvas->drawText(text, length, x, y, p);
104 }
105#endif
106}
107
reed@google.com9e39bb32011-05-18 12:17:53 +0000108class TextSpeedView : public SampleView {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000109public:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000110 TextSpeedView() {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000111 fHints = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000112 fClickX = 0;
113
reed@google.com82065d62011-02-07 15:30:46 +0000114 test_breakText();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000115 }
reed@google.com82065d62011-02-07 15:30:46 +0000116
reed@android.com8a1c16f2008-12-17 15:59:43 +0000117protected:
118 // overrides from SkEventSink
reed@google.com9e39bb32011-05-18 12:17:53 +0000119 virtual bool onQuery(SkEvent* evt) {
120 if (SampleCode::TitleQ(*evt)) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000121 SampleCode::TitleR(evt, "Text");
122 return true;
123 }
124 return this->INHERITED::onQuery(evt);
125 }
reed@google.com82065d62011-02-07 15:30:46 +0000126
reed@google.com9e39bb32011-05-18 12:17:53 +0000127 static void make_textstrip(SkBitmap* bm) {
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +0000128 bm->allocPixels(SkImageInfo::Make(200, 18, kRGB_565_SkColorType,
129 kOpaque_SkAlphaType));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000130 bm->eraseColor(SK_ColorWHITE);
reed@google.com82065d62011-02-07 15:30:46 +0000131
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132 SkCanvas canvas(*bm);
133 SkPaint paint;
134 const char* s = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit";
reed@google.com82065d62011-02-07 15:30:46 +0000135
reed@android.com8a1c16f2008-12-17 15:59:43 +0000136 paint.setFlags(paint.getFlags() | SkPaint::kAntiAlias_Flag
137 | SkPaint::kDevKernText_Flag);
138 paint.setTextSize(SkIntToScalar(14));
139 canvas.drawText(s, strlen(s), SkIntToScalar(8), SkIntToScalar(14), paint);
140 }
reed@google.com82065d62011-02-07 15:30:46 +0000141
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000142 static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000143 for (size_t i = 0; i < n; i++)
144 pts[i].set(rand->nextUScalar1() * 640, rand->nextUScalar1() * 480);
145 }
reed@google.com82065d62011-02-07 15:30:46 +0000146
reed@google.com9e39bb32011-05-18 12:17:53 +0000147 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000148 SkAutoCanvasRestore restore(canvas, false);
149 {
150 SkRect r;
151 r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20));
152 // canvas->saveLayer(&r, NULL, SkCanvas::kHasAlphaLayer_SaveFlag);
153 }
154
155 SkPaint paint;
156// const uint16_t glyphs[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 };
157 int index = fHints % SK_ARRAY_COUNT(gHints);
158 index = 1;
159// const char* style = gHints[index].fName;
reed@google.com82065d62011-02-07 15:30:46 +0000160
reed@android.com8a1c16f2008-12-17 15:59:43 +0000161// canvas->translate(0, SkIntToScalar(50));
162
163 // canvas->drawText(style, strlen(style), SkIntToScalar(20), SkIntToScalar(20), paint);
164
reed@android.com04d86c62010-01-25 22:02:44 +0000165 SkSafeUnref(paint.setTypeface(SkTypeface::CreateFromFile("/skimages/samplefont.ttf")));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000166 paint.setAntiAlias(true);
167 paint.setFlags(paint.getFlags() | gHints[index].fFlags);
reed@google.com82065d62011-02-07 15:30:46 +0000168
reed@android.com8a1c16f2008-12-17 15:59:43 +0000169 SkRect clip;
170 clip.set(SkIntToScalar(25), SkIntToScalar(34), SkIntToScalar(88), SkIntToScalar(155));
reed@google.com82065d62011-02-07 15:30:46 +0000171
reed@android.com8a1c16f2008-12-17 15:59:43 +0000172 const char* text = "Hamburgefons";
173 size_t length = strlen(text);
174
reed@google.com2f3dc9d2011-05-02 17:33:45 +0000175 SkScalar y = SkIntToScalar(0);
176 for (int i = 9; i <= 24; i++) {
177 paint.setTextSize(SkIntToScalar(i) /*+ (gRand.nextU() & 0xFFFF)*/);
reed@google.com9e39bb32011-05-18 12:17:53 +0000178 for (SkScalar dx = 0; dx <= SkIntToScalar(3)/4;
179 dx += SkIntToScalar(1) /* /4 */) {
reed@google.com2f3dc9d2011-05-02 17:33:45 +0000180 y += paint.getFontSpacing();
commit-bot@chromium.orge003aec2014-05-12 13:35:55 +0000181 DrawTheText(canvas, text, length, SkIntToScalar(20) + dx, y, paint, fClickX);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182 }
183 }
reed@google.com2f3dc9d2011-05-02 17:33:45 +0000184 if (gHints[index].fFlushCache) {
185// SkGraphics::SetFontCacheUsed(0);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000186 }
187 }
reed@google.com82065d62011-02-07 15:30:46 +0000188
reed@google.com4d5c26d2013-01-08 16:17:50 +0000189 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
190 unsigned modi) SK_OVERRIDE {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000191 fClickX = x;
192 this->inval(NULL);
reed@google.com4d5c26d2013-01-08 16:17:50 +0000193 return this->INHERITED::onFindClickHandler(x, y, modi);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000194 }
reed@google.com82065d62011-02-07 15:30:46 +0000195
reed@google.com9e39bb32011-05-18 12:17:53 +0000196 virtual bool onClick(Click* click) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000197 return this->INHERITED::onClick(click);
198 }
reed@google.com82065d62011-02-07 15:30:46 +0000199
reed@android.com8a1c16f2008-12-17 15:59:43 +0000200private:
201 int fHints;
202 SkScalar fClickX;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000203
reed@google.com9e39bb32011-05-18 12:17:53 +0000204 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000205};
206
207//////////////////////////////////////////////////////////////////////////////
208
209static SkView* MyFactory() { return new TextSpeedView; }
210static SkViewRegister reg(MyFactory);