SampleMeasure.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
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 25struct Setting { 26 SkScalar fScale; 27 bool fLinearText; 28 bool fDevKernText; 29}; 30 31static const SkScalar ONE = SkIntToScalar(9999)/10000; 32 33static 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 44static 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 89class MeasureView : public SampleView { 90public: 91 SkPaint fPaint; 92 93 MeasureView() { 94 fPaint.setAntiAlias(true); 95 fPaint.setTextSize(SkIntToScalar(64)); 96 this->setBGColor(0xFFDDDDDD); 97 } 98 99protected: 100 // overrides from SkEventSink 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 109 virtual void onDrawContent(SkCanvas* canvas) { 110 canvas->translate(fPaint.getTextSize(), fPaint.getTextSize()); 111 doMeasure(canvas, fPaint, "Hamburgefons"); 112 } 113 114private: 115 typedef SampleView INHERITED; 116}; 117 118////////////////////////////////////////////////////////////////////////////// 119 120static SkView* MyFactory() { return new MeasureView; } 121static SkViewRegister reg(MyFactory); 122 123