blob: 3cc0c818653349b8c022bebb2e515de4b9c70c8d [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGradientShader.h"
5#include "SkPath.h"
6#include "SkRegion.h"
7#include "SkShader.h"
8#include "SkUtils.h"
9#include "SkShaderExtras.h"
10#include "Sk1DPathEffect.h"
11#include "SkCornerPathEffect.h"
12#include "SkPathMeasure.h"
13#include "SkRandom.h"
14#include "SkColorPriv.h"
15#include "SkColorFilter.h"
16#include "SkDither.h"
17
18// exercise scale/linear/devkern
19struct Setting {
20 SkScalar fScale;
21 bool fLinearText;
22 bool fDevKernText;
23};
24
25static const SkScalar ONE = SkIntToScalar(9999)/10000;
26
27static const Setting gSettings[] = {
28 { 0, false, false },
29 { 0, false, true },
30 { 0, true, false },
31 { 0, true, true },
32 { ONE, false, false },
33 { ONE, false, true },
34 { ONE, true, false },
35 { ONE, true, true }
36};
37
38static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[])
39{
40 SkScalar dy = paint.getFontMetrics(NULL);
41
42 size_t len = strlen(text);
43 SkAutoTMalloc<SkScalar> autoWidths(len);
44 SkScalar* widths = autoWidths.get();
45 SkAutoTMalloc<SkRect> autoRects(len);
46 SkRect* rects = autoRects.get();
47 SkRect bounds;
48
49 SkPaint p(paint);
50 for (int i = 0; i < SK_ARRAY_COUNT(gSettings); i++) {
51 p.setLinearText(gSettings[i].fLinearText);
52 p.setDevKernText(gSettings[i].fDevKernText);
53 SkScalar scale = gSettings[i].fScale;
54
55 int n = p.getTextWidths(text, len, widths, rects);
56 SkScalar w = p.measureText(text, len, &bounds, scale);
57
58 p.setStyle(SkPaint::kFill_Style);
59 p.setColor(0x8888FF88);
60 canvas->drawRect(bounds, p);
61 p.setColor(0xFF000000);
62 canvas->drawText(text, len, 0, 0, p);
63
64 p.setStyle(SkPaint::kStroke_Style);
65 p.setStrokeWidth(0);
66 p.setColor(0xFFFF0000);
67 SkScalar x = 0;
68 for (int j = 0; j < n; j++) {
69 SkRect r = rects[j];
70 r.offset(x, 0);
71 canvas->drawRect(r, p);
72 x += widths[j];
73 }
74
75 p.setColor(0xFF0000FF);
76 canvas->drawLine(0, 0, w, 0, p);
77 p.setStrokeWidth(SkIntToScalar(4));
78 canvas->drawPoint(x, 0, p);
79
80 canvas->translate(0, dy);
81 }
82}
83
84class MeasureView : public SkView {
85public:
86 SkPaint fPaint;
87
88 MeasureView()
89 {
90 fPaint.setAntiAlias(true);
91 fPaint.setTextSize(SkIntToScalar(64));
92 }
93
94protected:
95 // overrides from SkEventSink
96 virtual bool onQuery(SkEvent* evt)
97 {
98 if (SampleCode::TitleQ(*evt))
99 {
100 SampleCode::TitleR(evt, "Measure");
101 return true;
102 }
103 return this->INHERITED::onQuery(evt);
104 }
105
106 void drawBG(SkCanvas* canvas)
107 {
108 canvas->drawColor(0xFFDDDDDD);
109 }
110
111 virtual void onDraw(SkCanvas* canvas)
112 {
113 this->drawBG(canvas);
114
115 canvas->translate(fPaint.getTextSize(), fPaint.getTextSize());
116 doMeasure(canvas, fPaint, "Hamburgefons");
117 }
118
119 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
120 {
121 // fSweep += SK_Scalar1;
122 this->inval(NULL);
123 return this->INHERITED::onFindClickHandler(x, y);
124 }
125
126 virtual bool onClick(Click* click)
127 {
128 return this->INHERITED::onClick(click);
129 }
130
131private:
132 typedef SkView INHERITED;
133};
134
135//////////////////////////////////////////////////////////////////////////////
136
137static SkView* MyFactory() { return new MeasureView; }
138static SkViewRegister reg(MyFactory);
139