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