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