SampleCamera.cpp revision 261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCamera.h"
58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEmbossMaskFilter.h"
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h"
12f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "SkImageDecoder.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass CameraView : public SkView {
15f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkTDArray<SkShader*> fShaders;
16f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    int     fShaderIndex;
17f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    bool    fFrontFace;
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
19f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com	CameraView() {
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fRX = fRY = fRZ = 0;
21f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fShaderIndex = 0;
22f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fFrontFace = false;
23f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
24f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        for (int i = 0;; i++) {
25f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkString str;
26f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            str.printf("/skimages/elephant%d.jpeg", i);
27f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkBitmap bm;
28f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            if (SkImageDecoder::DecodeFile(str.c_str(), &bm)) {
29f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                SkShader* s = SkShader::CreateBitmapShader(bm,
30f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                                                           SkShader::kClamp_TileMode,
31f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                                                           SkShader::kClamp_TileMode);
32f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
33261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                SkRect src = { 0, 0, SkIntToScalar(bm.width()), SkIntToScalar(bm.height()) };
34f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                SkRect dst = { -150, -150, 150, 150 };
35f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                SkMatrix matrix;
36f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                matrix.setRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
37f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                s->setLocalMatrix(matrix);
38f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                *fShaders.append() = s;
39f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            } else {
40f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com                break;
41f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            }
42f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
45f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual ~CameraView() {
46f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fShaders.unrefAll();
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
51f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual bool onQuery(SkEvent* evt) {
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SampleCode::TitleQ(*evt))
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Camera");
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
59f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
60f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    void drawBG(SkCanvas* canvas) {
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawColor(0xFFDDDDDD);
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
64f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    virtual void onDraw(SkCanvas* canvas) {
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->drawBG(canvas);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(this->width()/2, this->height()/2);
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        Sk3DView    view;
70f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        view.rotateX(fRX);
71f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        view.rotateY(fRY);
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        view.applyToCanvas(canvas);
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint paint;
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar rad = SkIntToScalar(50);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar dim = rad*2;
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            }
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
84f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            paint.setAntiAlias(true);
85f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            paint.setShader(fShaders[fShaderIndex]);
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
87f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawCircle(0, 0, rad, paint);
88f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawCircle(-dim, -dim, rad, paint);
89f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawCircle(-dim,  dim, rad, paint);
90f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawCircle( dim, -dim, rad, paint);
91f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawCircle( dim,  dim, rad, paint);
92f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#else
93f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            SkRect r = { -150, -150, 150, 150 };
94f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            canvas->drawRoundRect(r, 30, 30, paint);
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
96f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
98f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        fRY += SampleCode::GetAnimSecondsDelta() * 90;
99f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        if (fRY >= SkIntToScalar(360)) {
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fRY = 0;
101f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        }
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
106f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    SkScalar fRX, fRY, fRZ;
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkView INHERITED;
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new CameraView; }
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
115