SampleCamera.cpp revision 5fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3
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 145fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.orgclass CameraView : public SampleView { 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 } 435fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org this->setBGColor(0xFFDDDDDD); 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 46f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com virtual ~CameraView() { 47f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fShaders.unrefAll(); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 52f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com virtual bool onQuery(SkEvent* evt) { 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SampleCode::TitleQ(*evt)) 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleCode::TitleR(evt, "Camera"); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 60f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 615fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org virtual void onDrawContent(SkCanvas* canvas) { 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(this->width()/2, this->height()/2); 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Sk3DView view; 65f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com view.rotateX(fRX); 66f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com view.rotateY(fRY); 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com view.applyToCanvas(canvas); 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 70f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com if (fShaders.count() > 0) { 71f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com bool frontFace = view.dotWithNormal(0, 0, SK_Scalar1) < 0; 72f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com if (frontFace != fFrontFace) { 73f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fFrontFace = frontFace; 74f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fShaderIndex = (fShaderIndex + 1) % fShaders.count(); 75f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com } 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 77f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com paint.setAntiAlias(true); 78f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com paint.setShader(fShaders[fShaderIndex]); 79f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com SkRect r = { -150, -150, 150, 150 }; 80f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com canvas->drawRoundRect(r, 30, 30, paint); 81f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com } 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 83f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fRY += SampleCode::GetAnimSecondsDelta() * 90; 84f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com if (fRY >= SkIntToScalar(360)) { 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRY = 0; 86f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com } 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 91f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com SkScalar fRX, fRY, fRZ; 925fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org typedef SampleView INHERITED; 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new CameraView; } 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 100