blob: 8078e03df1d0ac29fde24625ed3b516a4cc76e35 [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
reed@google.com81e3d7f2011-06-01 12:42:36 +000037static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000038 SkScalar dy = paint.getFontMetrics(NULL);
39
40 size_t len = strlen(text);
41 SkAutoTMalloc<SkScalar> autoWidths(len);
42 SkScalar* widths = autoWidths.get();
43 SkAutoTMalloc<SkRect> autoRects(len);
44 SkRect* rects = autoRects.get();
45 SkRect bounds;
46
47 SkPaint p(paint);
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000048 for (size_t i = 0; i < SK_ARRAY_COUNT(gSettings); i++) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000049 p.setLinearText(gSettings[i].fLinearText);
50 p.setDevKernText(gSettings[i].fDevKernText);
51 SkScalar scale = gSettings[i].fScale;
52
53 int n = p.getTextWidths(text, len, widths, rects);
54 SkScalar w = p.measureText(text, len, &bounds, scale);
55
56 p.setStyle(SkPaint::kFill_Style);
57 p.setColor(0x8888FF88);
58 canvas->drawRect(bounds, p);
59 p.setColor(0xFF000000);
60 canvas->drawText(text, len, 0, 0, p);
61
62 p.setStyle(SkPaint::kStroke_Style);
63 p.setStrokeWidth(0);
64 p.setColor(0xFFFF0000);
65 SkScalar x = 0;
66 for (int j = 0; j < n; j++) {
67 SkRect r = rects[j];
68 r.offset(x, 0);
69 canvas->drawRect(r, p);
70 x += widths[j];
71 }
72
73 p.setColor(0xFF0000FF);
74 canvas->drawLine(0, 0, w, 0, p);
75 p.setStrokeWidth(SkIntToScalar(4));
76 canvas->drawPoint(x, 0, p);
77
78 canvas->translate(0, dy);
79 }
80}
81
reed@google.com81e3d7f2011-06-01 12:42:36 +000082class MeasureView : public SampleView {
reed@android.com8a1c16f2008-12-17 15:59:43 +000083public:
84 SkPaint fPaint;
85
reed@google.com81e3d7f2011-06-01 12:42:36 +000086 MeasureView() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000087 fPaint.setAntiAlias(true);
88 fPaint.setTextSize(SkIntToScalar(64));
reed@google.com81e3d7f2011-06-01 12:42:36 +000089 this->setBGColor(0xFFDDDDDD);
reed@android.com8a1c16f2008-12-17 15:59:43 +000090 }
91
92protected:
93 // overrides from SkEventSink
reed@google.com81e3d7f2011-06-01 12:42:36 +000094 virtual bool onQuery(SkEvent* evt) {
95 if (SampleCode::TitleQ(*evt)) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000096 SampleCode::TitleR(evt, "Measure");
97 return true;
98 }
99 return this->INHERITED::onQuery(evt);
100 }
101
reed@google.com81e3d7f2011-06-01 12:42:36 +0000102 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000103 canvas->translate(fPaint.getTextSize(), fPaint.getTextSize());
104 doMeasure(canvas, fPaint, "Hamburgefons");
105 }
106
reed@android.com8a1c16f2008-12-17 15:59:43 +0000107private:
reed@google.com81e3d7f2011-06-01 12:42:36 +0000108 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000109};
110
111//////////////////////////////////////////////////////////////////////////////
112
113static SkView* MyFactory() { return new MeasureView; }
114static SkViewRegister reg(MyFactory);
115