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" 16e2380570de11226a93362d017e93c4790641c027halcanary@google.com#include "SkDecodingImageGenerator.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) { 433d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com SkInstallDiscardablePixelRef(SkDecodingImageGenerator::Create( 442d970b5128f7270cd01a93e4ce68d0c3ea67ac71commit-bot@chromium.org data, SkDecodingImageGenerator::Options()), &bm); 45c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com } 46c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com return bm; 47c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com} 48c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void drawCircle(SkCanvas* canvas, int r, SkColor color) { 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(color); 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawCircle(SkIntToScalar(r), SkIntToScalar(r), SkIntToScalar(r), 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 585fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.orgclass PictureView : public SampleView { 59c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com SkBitmap fBitmap; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 61e2380570de11226a93362d017e93c4790641c027halcanary@google.com PictureView() { 62c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 63c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com fBitmap = load_bitmap(); 64c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 6584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 6684b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 675fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org recorder.beginRecording(100, 100, NULL, 0); 6884b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com fSubPicture = recorder.endRecording(); 6984b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 705fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 73ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 74c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->drawBitmap(fBitmap, 0, 0, NULL); 75c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com drawCircle(canvas, 50, SK_ColorBLACK); 779b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(50), 0); 799b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(0, SkIntToScalar(50)); 819b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(-50), 0); 839b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fSubPicture); 8484b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 8584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com fPicture = recorder.endRecording(); 8684b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 875199701acbf386cdc315de440eeafcc10fd0cdc3skia.committer@gmail.com // fPicture now has (4) references to fSubPicture. We can release our ref, 8884b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com // and just unref fPicture in our destructor, and it will in turn take care of 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // the other references to fSubPicture 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fSubPicture->unref(); 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 92ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~PictureView() { 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPicture->unref(); 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 96ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onQuery(SkEvent* evt) { 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SampleCode::TitleQ(*evt)) { 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleCode::TitleR(evt, "Picture"); 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void drawSomething(SkCanvas* canvas) { 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 109c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 110c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->save(); 1114b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas->scale(0.5f, 0.5f); 112c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->drawBitmap(fBitmap, 0, 0, NULL); 113c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com canvas->restore(); 114c6ddc110c0f4bd16b5ce61cad6c6ac4213c026a0reed@android.com 115cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com const char beforeStr[] = "before circle"; 116cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com const char afterStr[] = "after circle"; 117cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setAntiAlias(true); 119ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorRED); 121cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com canvas->drawData(beforeStr, sizeof(beforeStr)); 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50), 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(40), paint); 124cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com canvas->drawData(afterStr, sizeof(afterStr)); 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setColor(SK_ColorBLACK); 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint.setTextSize(SkIntToScalar(40)); 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62), 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint); 129ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1325fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org virtual void onDrawContent(SkCanvas* canvas) { 13384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com this->drawSomething(canvas); 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 13584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 1365fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org this->drawSomething(recorder.beginRecording(100, 100, NULL, 0)); 13784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 138ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(300), SkIntToScalar(50)); 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->scale(-SK_Scalar1, -SK_Scalar1); 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(-SkIntToScalar(100), -SkIntToScalar(50)); 1439b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(pict); 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(200), SkIntToScalar(150)); 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->scale(SK_Scalar1, -SK_Scalar1); 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(0, -SkIntToScalar(50)); 1509b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(pict); 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 152ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(); 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->scale(-SK_Scalar1, SK_Scalar1); 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(-SkIntToScalar(100), 0); 1579b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(pict); 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 159cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com 16076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#ifdef SK_DEVELOPER 161cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com if (false) { 162cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com SkDebugfDumper dumper; 163cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com SkDumpCanvas dumpCanvas(&dumper); 1649b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips dumpCanvas.drawPicture(pict); 165cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com } 16676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 167ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 16884b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com // This used to re-record the sub-picture and redraw the parent 16984b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com // A capability that is now forbidden! 170ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 171e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand(SampleCode::GetAnimTime()); 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(10), SkIntToScalar(250)); 1739b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(fPicture); 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delayInval(500); 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 176ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define INVAL_ALL_TYPE "inval-all" 179ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void delayInval(SkMSec delay) { 18187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com (new SkEvent(INVAL_ALL_TYPE, this->getSinkID()))->postDelay(delay); 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 183ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onEvent(const SkEvent& evt) { 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (evt.isType(INVAL_ALL_TYPE)) { 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onEvent(evt); 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPicture* fPicture; 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPicture* fSubPicture; 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1955fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org typedef SampleView INHERITED; 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new PictureView; } 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 202