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 */ 7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com 8bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "gm.h" 9bcbc1788b478b1e54079318ad073e8490aa66faetfarina 10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h" 12bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkCanvas.h" 13bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkColorFilter.h" 14bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkColorPriv.h" 15e2380570de11226a93362d017e93c4790641c027halcanary@google.com#include "SkData.h" 165965c8ae4ee960275da4bc40189bdba85aab8b5ereed#include "SkImageGenerator.h" 17cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com#include "SkDumpCanvas.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h" 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h" 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkImageDecoder.h" 21e2380570de11226a93362d017e93c4790641c027halcanary@google.com#include "SkOSFile.h" 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h" 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPicture.h" 24770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h" 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h" 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h" 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h" 28bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkStream.h" 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h" 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h" 31bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkUtils.h" 32bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkView.h" 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXMLParser.h" 34bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkXfermode.h" 357d970c739d44486d3382eed8acc4eecccecf3453reed@android.com 36e2380570de11226a93362d017e93c4790641c027halcanary@google.com/////////////////////////////////////////////////////////////////////////////// 37c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 38c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.comstatic SkBitmap load_bitmap() { 39c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com SkBitmap bm; 40c846f4a96bcde1ffeaf17afc1469db6f2cbd1ad3tfarina SkString pngFilename = GetResourcePath("mandrill_512.png"); 41c846f4a96bcde1ffeaf17afc1469db6f2cbd1ad3tfarina SkAutoDataUnref data(SkData::NewFromFileName(pngFilename.c_str())); 42e2380570de11226a93362d017e93c4790641c027halcanary@google.com if (data.get() != NULL) { 435965c8ae4ee960275da4bc40189bdba85aab8b5ereed SkInstallDiscardablePixelRef(data, &bm); 44c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com } 45c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com return bm; 46c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com} 47c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void drawCircle(SkCanvas* canvas, int r, SkColor color) { 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(color); 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawCircle(SkIntToScalar(r), SkIntToScalar(r), SkIntToScalar(r), 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint); 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 575fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.orgclass PictureView : public SampleView { 58c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com SkBitmap fBitmap; 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 60e2380570de11226a93362d017e93c4790641c027halcanary@google.com PictureView() { 61c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 62c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com fBitmap = load_bitmap(); 63c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 6484b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 6584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 665fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org recorder.beginRecording(100, 100, NULL, 0); 6784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com fSubPicture = recorder.endRecording(); 6884b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 695fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 72ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 73c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->drawBitmap(fBitmap, 0, 0, NULL); 74c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawCircle(canvas, 50, SK_ColorBLACK); 769b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(50), 0); 789b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(0, SkIntToScalar(50)); 809b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(-50), 0); 829b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 8384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 8484b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com fPicture = recorder.endRecording(); 8584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 865199701acbf386cdc315de440eeafcc10fd0cdc3skia.committer@gmail.com // fPicture now has (4) references to fSubPicture. We can release our ref, 8784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com // and just unref fPicture in our destructor, and it will in turn take care of 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // the other references to fSubPicture 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fSubPicture->unref(); 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~PictureView() { 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPicture->unref(); 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 95ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 9836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool onQuery(SkEvent* evt) override { 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SampleCode::TitleQ(*evt)) { 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleCode::TitleR(evt, "Picture"); 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void drawSomething(SkCanvas* canvas) { 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 108c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 109c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->save(); 1104b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas->scale(0.5f, 0.5f); 111c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->drawBitmap(fBitmap, 0, 0, NULL); 112c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->restore(); 113c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 115ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorRED); 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50), 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(40), paint); 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorBLACK); 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setTextSize(SkIntToScalar(40)); 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62), 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint); 123ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 12636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawContent(SkCanvas* canvas) override { 12784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com this->drawSomething(canvas); 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 12984b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 1305fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org this->drawSomething(recorder.beginRecording(100, 100, NULL, 0)); 13184b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 132ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(300), SkIntToScalar(50)); 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->scale(-SK_Scalar1, -SK_Scalar1); 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(-SkIntToScalar(100), -SkIntToScalar(50)); 1379b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(pict); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(200), SkIntToScalar(150)); 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->scale(SK_Scalar1, -SK_Scalar1); 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(0, -SkIntToScalar(50)); 1449b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(pict); 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 146ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->scale(-SK_Scalar1, SK_Scalar1); 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(-SkIntToScalar(100), 0); 1519b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(pict); 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 154ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define INVAL_ALL_TYPE "inval-all" 157ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void delayInval(SkMSec delay) { 15987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com (new SkEvent(INVAL_ALL_TYPE, this->getSinkID()))->postDelay(delay); 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 161ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 16236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool onEvent(const SkEvent& evt) override { 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (evt.isType(INVAL_ALL_TYPE)) { 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onEvent(evt); 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPicture* fPicture; 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPicture* fSubPicture; 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1735fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org typedef SampleView INHERITED; 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new PictureView; } 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 180