1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc. 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Resources.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPoint3.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShadowUtils.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////// 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Sample to demonstrate tonal color shadows 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ShadowColorView : public SampleView { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath fRectPath; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fZIndex; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fShowAmbient; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fShowSpot; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fUseAlt; 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fShowObject; 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fTwoPassColor; 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fDarkBackground; 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ShadowColorView() 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fZIndex(8) 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fShowAmbient(true) 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fShowSpot(true) 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fUseAlt(false) 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fShowObject(true) 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fTwoPassColor(false) 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDarkBackground(false) {} 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRectPath.addRect(SkRect::MakeXYWH(-50, -50, 100, 100)); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // overrides from SkEventSink 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onQuery(SkEvent* evt) override { 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::TitleQ(*evt)) { 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SampleCode::TitleR(evt, "ShadowColor"); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkUnichar uni; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::CharQ(*evt, &uni)) { 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool handled = false; 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (uni) { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'W': 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fShowAmbient = !fShowAmbient; 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'S': 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fShowSpot = !fShowSpot; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'T': 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fUseAlt = !fUseAlt; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'O': 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fShowObject = !fShowObject; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'X': 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTwoPassColor = !fTwoPassColor; 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 'Z': 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDarkBackground = !fDarkBackground; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case '>': 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fZIndex = SkTMin(9, fZIndex+1); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case '<': 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fZIndex = SkTMax(0, fZIndex-1); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot handled = true; 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (handled) { 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->INHERITED::onQuery(evt); 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void drawShadowedPath(SkCanvas* canvas, const SkPath& path, 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPoint3& zPlaneParams, 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint& paint, SkScalar ambientAlpha, 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPoint3& lightPos, SkScalar lightWidth, SkScalar spotAlpha) { 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fShowAmbient) { 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ambientAlpha = 0; 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fShowSpot) { 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot spotAlpha = 0; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t flags = 0; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fUseAlt) { 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot flags |= SkShadowFlags::kGeometricOnly_ShadowFlag; 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fTwoPassColor) { 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot flags |= SkShadowFlags::kDisableTonalColor_ShadowFlag; 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos, lightWidth, 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ambientAlpha, 0, SK_ColorBLACK, flags); 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (paint.getColor() != SK_ColorBLACK) { 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor color = paint.getColor(); 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint8_t max = SkTMax(SkTMax(SkColorGetR(color), SkColorGetG(color)), 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorGetB(color)); 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint8_t min = SkTMin(SkTMin(SkColorGetR(color), SkColorGetG(color)), 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColorGetB(color)); 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar luminance = 0.5f*(max + min) / 255.f; 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar alpha = (.6 - .4*luminance)*luminance*luminance + 0.3f; 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot spotAlpha -= (alpha - 0.3f)*.5f; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos, lightWidth, 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, alpha, paint.getColor(), flags); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos, lightWidth, 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, spotAlpha, SK_ColorBLACK, flags); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos, lightWidth, 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ambientAlpha, spotAlpha, paint.getColor(), flags); 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fShowObject) { 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, paint); 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint strokePaint; 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot strokePaint.setColor(paint.getColor()); 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot strokePaint.setStyle(SkPaint::kStroke_Style); 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, strokePaint); 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawContent(SkCanvas* canvas) override { 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar kLightWidth = 600; 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar kAmbientAlpha = 0.03f; 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar kSpotAlpha = 0.25f; 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar kZValues[10] = { 1, 2, 3, 4, 6, 8, 9, 12, 16, 24 }; 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkColor kColors[30] = { 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // purples 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xFF3A0072, 0xFF5D0099, 0xFF7F12B2, 0xFFA02AD1, 0xFFC245E5, 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xFFE95AF9, 0xFFFC79F0, 0xFFFDA6F0, 0xFFFFCCF8, 0xFFFFE1F9, 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // oranges 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xFFEA3200, 0xFFFF4E00, 0xFFFF7300, 0xFFFF9100, 0xFFFFB000, 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xFFFFCE00, 0xFFFFE000, 0xFFFFF64D, 0xFFFFF98F, 0xFFFFFBCC, 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // teals 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xFF004D51, 0xFF066266, 0xFF057F7F, 0xFF009999, 0xFF00B2B2, 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xFF15CCBE, 0xFF25E5CE, 0xFF2CFFE0, 0xFF80FFEA, 0xFFB3FFF0 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDarkBackground) { 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawColor(0xFF111111); 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorWHITE); 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawColor(0xFFEAEAEA); 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorBLACK); 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fTwoPassColor) { 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawText("Two pass", 8, 10, 15, paint); 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawText("One pass", 8, 10, 15, paint); 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint3 lightPos = { 75, -400, 600 }; 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint3 zPlaneParams = SkPoint3::Make(0, 0, kZValues[fZIndex]); 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar yPos = 75; 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int row = 0; row < 3; ++row) { 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos.fX = 75; 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar xPos = 75; 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int col = 0; col < 10; ++col) { 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(kColors[10*row + col]); 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(xPos, yPos); 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->drawShadowedPath(canvas, fRectPath, zPlaneParams, paint, kAmbientAlpha, 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos, kLightWidth, kSpotAlpha); 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos.fX += 120; 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xPos += 120; 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot lightPos.fY += 200; 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot yPos += 200; 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SampleView INHERITED; 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new ShadowColorView; } 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory); 223