1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
976113a9b7716748c70ea0ecf7aacbabe4cce5009reed#include "SkAnimTimer.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCamera.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEmbossMaskFilter.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h"
20f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "SkImageDecoder.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
225fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.orgclass CameraView : public SampleView {
23f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkTDArray<SkShader*> fShaders;
24f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int     fShaderIndex;
25f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    bool    fFrontFace;
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
27ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    CameraView() {
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fRX = fRY = fRZ = 0;
29f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fShaderIndex = 0;
30f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fFrontFace = false;
31f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
32f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int i = 0;; i++) {
33f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkString str;
34f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            str.printf("/skimages/elephant%d.jpeg", i);
35f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkBitmap bm;
36f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (SkImageDecoder::DecodeFile(str.c_str(), &bm)) {
37261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                SkRect src = { 0, 0, SkIntToScalar(bm.width()), SkIntToScalar(bm.height()) };
38f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                SkRect dst = { -150, -150, 150, 150 };
39f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                SkMatrix matrix;
40f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                matrix.setRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
419c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org
429c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                SkShader* s = SkShader::CreateBitmapShader(bm,
439c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                           SkShader::kClamp_TileMode,
449c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                           SkShader::kClamp_TileMode,
459c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                           &matrix);
46f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                *fShaders.append() = s;
47f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            } else {
48f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                break;
49f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
50f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
515fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org        this->setBGColor(0xFFDDDDDD);
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
53ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
54f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual ~CameraView() {
55f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fShaders.unrefAll();
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
60f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual bool onQuery(SkEvent* evt) {
61d173b8760887f9b10cd43cc99ad6b8011e269370mike@reedtribe.org        if (SampleCode::TitleQ(*evt)) {
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Camera");
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
67f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
685fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(this->width()/2, this->height()/2);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        Sk3DView    view;
72f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        view.rotateX(fRX);
73f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        view.rotateY(fRY);
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        view.applyToCanvas(canvas);
75ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint paint;
77f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (fShaders.count() > 0) {
78f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            bool frontFace = view.dotWithNormal(0, 0, SK_Scalar1) < 0;
79f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (frontFace != fFrontFace) {
80f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                fFrontFace = frontFace;
81f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                fShaderIndex = (fShaderIndex + 1) % fShaders.count();
82f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
83ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
84f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            paint.setAntiAlias(true);
85f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            paint.setShader(fShaders[fShaderIndex]);
8693a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed            paint.setFilterQuality(kLow_SkFilterQuality);
87f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkRect r = { -150, -150, 150, 150 };
88f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawRoundRect(r, 30, 30, paint);
89f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
90d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    }
91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
9236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onAnimate(const SkAnimTimer& timer) override {
9376113a9b7716748c70ea0ecf7aacbabe4cce5009reed        if (timer.isStopped()) {
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fRY = 0;
9576113a9b7716748c70ea0ecf7aacbabe4cce5009reed        } else {
9676113a9b7716748c70ea0ecf7aacbabe4cce5009reed            fRY = timer.scaled(90, 360);
97f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
98d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed        return true;
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
102f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkScalar fRX, fRY, fRZ;
1035fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org    typedef SampleView INHERITED;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new CameraView; }
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
110