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