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