1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SampleCode.h" 9837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkView.h" 10837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkCanvas.h" 118b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h" 128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h" 13837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkGradientShader.h" 14837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkPath.h" 15837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkRegion.h" 16837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkShader.h" 17837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkUtils.h" 18837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkColorPriv.h" 19837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkColorFilter.h" 20837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkTypeface.h" 21837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 22102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.orgstatic inline SkPMColor rgb2gray(SkPMColor c) { 23837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com unsigned r = SkGetPackedR32(c); 24837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com unsigned g = SkGetPackedG32(c); 25837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com unsigned b = SkGetPackedB32(c); 26dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 2764cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org unsigned x = (r * 5 + g * 7 + b * 4) >> 4; 28dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 29837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com return SkPackARGB32(0, x, x, x) | (c & (SK_A32_MASK << SK_A32_SHIFT)); 30837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com} 31837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 32837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comclass SkGrayScaleColorFilter : public SkColorFilter { 33837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.compublic: 34102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org virtual void filterSpan(const SkPMColor src[], int count, 3536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkPMColor result[]) const override { 36102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org for (int i = 0; i < count; i++) { 37837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com result[i] = rgb2gray(src[i]); 38102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org } 39837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 40837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com}; 41837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 42837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comclass SkChannelMaskColorFilter : public SkColorFilter { 43837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.compublic: 44102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org SkChannelMaskColorFilter(U8CPU redMask, U8CPU greenMask, U8CPU blueMask) { 45837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fMask = SkPackARGB32(0xFF, redMask, greenMask, blueMask); 46837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 47837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 48102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org virtual void filterSpan(const SkPMColor src[], int count, 4936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkPMColor result[]) const override { 50837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPMColor mask = fMask; 51102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org for (int i = 0; i < count; i++) { 52837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com result[i] = src[i] & mask; 53102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org } 54837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 55dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 56837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comprivate: 57837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPMColor fMask; 58837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com}; 59837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 60102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 61837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 62837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkGradientShader.h" 63837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkLayerRasterizer.h" 64837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkBlurMaskFilter.h" 65837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 66837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "Sk2DPathEffect.h" 67837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 68837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comclass Dot2DPathEffect : public Sk2DPathEffect { 69837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.compublic: 70837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com Dot2DPathEffect(SkScalar radius, const SkMatrix& matrix, 71837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkTDArray<SkPoint>* pts) 72837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com : Sk2DPathEffect(matrix), fRadius(radius), fPts(pts) {} 73837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 74ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Dot2DPathEffect) 75837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 76837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comprotected: 7736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void begin(const SkIRect& uvBounds, SkPath* dst) const override { 78837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com if (fPts) { 79837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fPts->reset(); 80837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 81837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com this->INHERITED::begin(uvBounds, dst); 82837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 83548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com 84548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com virtual void next(const SkPoint& loc, int u, int v, 8536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkPath* dst) const override { 86837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com if (fPts) { 87837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com *fPts->append() = loc; 88837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 89837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com dst->addCircle(loc.fX, loc.fY, fRadius); 90837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 91dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 9236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void flatten(SkWriteBuffer& buffer) const override { 939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.writeMatrix(this->getMatrix()); 9454924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com buffer.writeScalar(fRadius); 9554924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com } 9654924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com 97837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comprivate: 98837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkScalar fRadius; 99837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkTDArray<SkPoint>* fPts; 100837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 101837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com typedef Sk2DPathEffect INHERITED; 102837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com}; 103837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 1049fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* Dot2DPathEffect::CreateProc(SkReadBuffer& buffer) { 1059fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkMatrix matrix; 1069fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.readMatrix(&matrix); 1079fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return SkNEW_ARGS(Dot2DPathEffect, (buffer.readScalar(), matrix, NULL)); 1089fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 1099fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 110837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comclass InverseFillPE : public SkPathEffect { 111837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.compublic: 112837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com InverseFillPE() {} 113548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com virtual bool filterPath(SkPath* dst, const SkPath& src, 11436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkStrokeRec*, const SkRect*) const override { 115837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com *dst = src; 116837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com dst->setFillType(SkPath::kInverseWinding_FillType); 117837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com return true; 118837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 11942dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips 12042dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips#ifndef SK_IGNORE_TO_STRING 12136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void toString(SkString* str) const override { 12242dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips str->appendf("InverseFillPE: ()"); 12342dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips } 12442dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips#endif 12542dbfa8651861f2f686879c996aab9f9f82277ddrobertphillips 126ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(InverseFillPE) 127ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com 128837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comprivate: 129837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com typedef SkPathEffect INHERITED; 130837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com}; 131837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 1329fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* InverseFillPE::CreateProc(SkReadBuffer& buffer) { 1339fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return SkNEW(InverseFillPE); 1349fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 1359fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 136837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comstatic SkPathEffect* makepe(float interp, SkTDArray<SkPoint>* pts) { 137837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkMatrix lattice; 138837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkScalar rad = 3 + SkIntToScalar(4) * (1 - interp); 139837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com lattice.setScale(rad*2, rad*2, 0, 0); 140837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com lattice.postSkew(SK_Scalar1/3, 0, 0, 0); 141837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com return new Dot2DPathEffect(rad, lattice, pts); 142837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com} 143837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 144f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.orgstatic void r7(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p, SkScalar interp) { 145c6ce750c73c6586a5c2e88a0620b04e9569af401robertphillips@google.com p.setPathEffect(makepe(SkScalarToFloat(interp), NULL))->unref(); 146f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org rastBuilder->addLayer(p); 147837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#if 0 148837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setPathEffect(new InverseFillPE())->unref(); 149837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setXfermodeMode(SkXfermode::kSrcIn_Mode); 150837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setXfermodeMode(SkXfermode::kClear_Mode); 151837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setAlpha((1 - interp) * 255); 152f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org rastBuilder->addLayer(p); 153837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#endif 154837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com} 155837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 156837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comtypedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&); 157837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 158837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com#include "SkXfermode.h" 159837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 160837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comstatic void apply_shader(SkPaint* paint, float scale) 161dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com{ 162837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPaint p; 163f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org SkLayerRasterizer::Builder rastBuilder; 164837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 165837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setAntiAlias(true); 166f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org r7(&rastBuilder, p, scale); 167f792a1b20747f769b28906a4b00fd67691ce8d0bcommit-bot@chromium.org paint->setRasterizer(rastBuilder.detachRasterizer())->unref(); 168837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 169837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com paint->setColor(SK_ColorBLUE); 170837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com} 171837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 172837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comclass ClockFaceView : public SkView { 173837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkTypeface* fFace; 174837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkScalar fInterp; 175837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkScalar fDx; 176102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org 177837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.compublic: 178102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org ClockFaceView() { 179837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fFace = SkTypeface::CreateFromFile("/Users/reed/Downloads/p052024l.pfb"); 180837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fInterp = 0; 181837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fDx = SK_Scalar1/64; 182837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 183dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 184102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org virtual ~ClockFaceView() { 185dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com SkSafeUnref(fFace); 186837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 187837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 188837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comprotected: 189837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com // overrides from SkEventSink 190102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org virtual bool onQuery(SkEvent* evt) { 191102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org if (SampleCode::TitleQ(*evt)) { 192837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SampleCode::TitleR(evt, "Text Effects"); 193837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com return true; 194837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 195837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com return this->INHERITED::onQuery(evt); 196837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 197dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 198102b4d57afa42587d0bc9bcbb0bff6fae791af85mike@reedtribe.org void drawBG(SkCanvas* canvas) { 199837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com// canvas->drawColor(0xFFDDDDDD); 200837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com canvas->drawColor(SK_ColorWHITE); 201837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 202dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 203837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com static void drawdots(SkCanvas* canvas, const SkPaint& orig) { 204837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkTDArray<SkPoint> pts; 205837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPathEffect* pe = makepe(0, &pts); 206dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 207fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); 208837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPath path, dstPath; 209837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com orig.getTextPath("9", 1, 0, 0, &path); 2104bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com pe->filterPath(&dstPath, path, &rec, NULL); 211dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 212837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPaint p; 213837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setAntiAlias(true); 214837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setStrokeWidth(10); 215837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p.setColor(SK_ColorRED); 216837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com canvas->drawPoints(SkCanvas::kPoints_PointMode, pts.count(), pts.begin(), 217837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com p); 218837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 219dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 220837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com virtual void onDraw(SkCanvas* canvas) { 221837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com this->drawBG(canvas); 222dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 223837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkScalar x = SkIntToScalar(20); 224837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkScalar y = SkIntToScalar(300); 225837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkPaint paint; 226dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 227837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com paint.setAntiAlias(true); 228837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com paint.setTextSize(SkIntToScalar(240)); 229837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com paint.setTypeface(SkTypeface::CreateFromName("sans-serif", 230837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkTypeface::kBold)); 231837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 232837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com SkString str("9"); 233837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 234837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com paint.setTypeface(fFace); 235dd53d91b60e368f1bbff6fb22d796765205ae25dbsalomon@google.com 236c6ce750c73c6586a5c2e88a0620b04e9569af401robertphillips@google.com apply_shader(&paint, SkScalarToFloat(fInterp)); 237837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com canvas->drawText(str.c_str(), str.size(), x, y, paint); 238837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 239837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com // drawdots(canvas, paint); 240837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 241837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com if (false) { 242837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fInterp += fDx; 243837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com if (fInterp > 1) { 244837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fInterp = 1; 245837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fDx = -fDx; 246837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } else if (fInterp < 0) { 247837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fInterp = 0; 248837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com fDx = -fDx; 249837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 250837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com this->inval(NULL); 251837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 252837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com } 253837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 254837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comprivate: 255837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com typedef SkView INHERITED; 256837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com}; 257837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 258837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com////////////////////////////////////////////////////////////////////////////// 259837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.com 260837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comstatic SkView* MyFactory() { return new ClockFaceView; } 261837cf7866e62e6a9f831e4e6de414c172a9d711areed@android.comstatic SkViewRegister reg(MyFactory); 262