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