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