1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/utils/SkCamera.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/effects/SkEmbossMaskFilter.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/timer/TimeUtils.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/Slide.h" 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker namespace { 24*c8dee2aaSAndroid Build Coastguard Worker class CameraSlide : public Slide { 25*c8dee2aaSAndroid Build Coastguard Worker TArray<sk_sp<SkShader>> fShaders; 26*c8dee2aaSAndroid Build Coastguard Worker int fShaderIndex = 0; 27*c8dee2aaSAndroid Build Coastguard Worker bool fFrontFace = false; 28*c8dee2aaSAndroid Build Coastguard Worker SkScalar fRX = 0; 29*c8dee2aaSAndroid Build Coastguard Worker SkScalar fRY = 0; 30*c8dee2aaSAndroid Build Coastguard Worker SkSize fSize; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker public: CameraSlide()33*c8dee2aaSAndroid Build Coastguard Worker CameraSlide() { fName = "Camera"; } 34*c8dee2aaSAndroid Build Coastguard Worker load(SkScalar w,SkScalar h)35*c8dee2aaSAndroid Build Coastguard Worker void load(SkScalar w, SkScalar h) override { 36*c8dee2aaSAndroid Build Coastguard Worker fSize = {w, h}; 37*c8dee2aaSAndroid Build Coastguard Worker for (const char* resource : { 38*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill_512_q075.jpg", 39*c8dee2aaSAndroid Build Coastguard Worker "images/dog.jpg", 40*c8dee2aaSAndroid Build Coastguard Worker "images/gamut.png", 41*c8dee2aaSAndroid Build Coastguard Worker }) { 42*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm; 43*c8dee2aaSAndroid Build Coastguard Worker if (ToolUtils::GetResourceAsBitmap(resource, &bm)) { 44*c8dee2aaSAndroid Build Coastguard Worker SkRect src = { 0, 0, SkIntToScalar(bm.width()), SkIntToScalar(bm.height()) }; 45*c8dee2aaSAndroid Build Coastguard Worker SkRect dst = { -150, -150, 150, 150 }; 46*c8dee2aaSAndroid Build Coastguard Worker fShaders.push_back(bm.makeShader(SkSamplingOptions(SkFilterMode::kLinear), 47*c8dee2aaSAndroid Build Coastguard Worker SkMatrix::RectToRect(src, dst))); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)52*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 53*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(0xFFDDDDDD); 54*c8dee2aaSAndroid Build Coastguard Worker if (fShaders.size() > 0) { 55*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(fSize.width()/2, fSize.height()/2); 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker Sk3DView view; 58*c8dee2aaSAndroid Build Coastguard Worker view.rotateX(fRX); 59*c8dee2aaSAndroid Build Coastguard Worker view.rotateY(fRY); 60*c8dee2aaSAndroid Build Coastguard Worker view.applyToCanvas(canvas); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker bool frontFace = view.dotWithNormal(0, 0, SK_Scalar1) < 0; 63*c8dee2aaSAndroid Build Coastguard Worker if (frontFace != fFrontFace) { 64*c8dee2aaSAndroid Build Coastguard Worker fFrontFace = frontFace; 65*c8dee2aaSAndroid Build Coastguard Worker fShaderIndex = (fShaderIndex + 1) % fShaders.size(); 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 69*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 70*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(fShaders[fShaderIndex]); 71*c8dee2aaSAndroid Build Coastguard Worker SkRect r = { -150, -150, 150, 150 }; 72*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRoundRect(r, 30, 30, paint); 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker resize(SkScalar w,SkScalar h)76*c8dee2aaSAndroid Build Coastguard Worker void resize(SkScalar w, SkScalar h) override { fSize = {w, h}; } 77*c8dee2aaSAndroid Build Coastguard Worker animate(double nanos)78*c8dee2aaSAndroid Build Coastguard Worker bool animate(double nanos) override { 79*c8dee2aaSAndroid Build Coastguard Worker fRY = nanos ? TimeUtils::Scaled(1e-9 * nanos, 90, 360) : 0; 80*c8dee2aaSAndroid Build Coastguard Worker return true; 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker } // namespace 84*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new CameraSlide(); ) 85