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