• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     SkScalar    fScale;
27     bool        fLinearText;
28     bool        fDevKernText;
29 };
30 
31 static const SkScalar ONE = SkIntToScalar(9999)/10000;
32 
33 static const Setting gSettings[] = {
34     { 0,            false,  false   },
35     { 0,            false,  true    },
36     { 0,            true,   false   },
37     { 0,            true,   true    },
38     { ONE,   false,  false   },
39     { ONE,   false,  true    },
40     { ONE,   true,   false   },
41     { ONE,   true,   true    }
42 };
43 
doMeasure(SkCanvas * canvas,const SkPaint & paint,const char text[])44 static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
45     SkScalar    dy = paint.getFontMetrics(NULL);
46 
47     size_t      len = strlen(text);
48     SkAutoTMalloc<SkScalar> autoWidths(len);
49     SkScalar*   widths = autoWidths.get();
50     SkAutoTMalloc<SkRect> autoRects(len);
51     SkRect*     rects = autoRects.get();
52     SkRect      bounds;
53 
54     SkPaint p(paint);
55     for (size_t i = 0; i < SK_ARRAY_COUNT(gSettings); i++) {
56         p.setLinearText(gSettings[i].fLinearText);
57         p.setDevKernText(gSettings[i].fDevKernText);
58         SkScalar scale = gSettings[i].fScale;
59 
60         int n = p.getTextWidths(text, len, widths, rects);
61         SkScalar w = p.measureText(text, len, &bounds, scale);
62 
63         p.setStyle(SkPaint::kFill_Style);
64         p.setColor(0x8888FF88);
65         canvas->drawRect(bounds, p);
66         p.setColor(0xFF000000);
67         canvas->drawText(text, len, 0, 0, p);
68 
69         p.setStyle(SkPaint::kStroke_Style);
70         p.setStrokeWidth(0);
71         p.setColor(0xFFFF0000);
72         SkScalar x = 0;
73         for (int j = 0; j < n; j++) {
74             SkRect r = rects[j];
75             r.offset(x, 0);
76             canvas->drawRect(r, p);
77             x += widths[j];
78         }
79 
80         p.setColor(0xFF0000FF);
81         canvas->drawLine(0, 0, w, 0, p);
82         p.setStrokeWidth(SkIntToScalar(4));
83         canvas->drawPoint(x, 0, p);
84 
85         canvas->translate(0, dy);
86     }
87 }
88 
89 class MeasureView : public SampleView {
90 public:
91     SkPaint fPaint;
92 
MeasureView()93 	MeasureView() {
94         fPaint.setAntiAlias(true);
95         fPaint.setTextSize(SkIntToScalar(64));
96         this->setBGColor(0xFFDDDDDD);
97     }
98 
99 protected:
100     // overrides from SkEventSink
onQuery(SkEvent * evt)101     virtual bool onQuery(SkEvent* evt) {
102         if (SampleCode::TitleQ(*evt)) {
103             SampleCode::TitleR(evt, "Measure");
104             return true;
105         }
106         return this->INHERITED::onQuery(evt);
107     }
108 
onDrawContent(SkCanvas * canvas)109     virtual void onDrawContent(SkCanvas* canvas) {
110         canvas->translate(fPaint.getTextSize(), fPaint.getTextSize());
111         doMeasure(canvas, fPaint, "Hamburgefons");
112     }
113 
114 private:
115     typedef SampleView INHERITED;
116 };
117 
118 //////////////////////////////////////////////////////////////////////////////
119 
MyFactory()120 static SkView* MyFactory() { return new MeasureView; }
121 static SkViewRegister reg(MyFactory);
122 
123