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