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 */ 753238bc96051d1774b7f72d3ebfd35a7dd4c04dfrobertphillips@google.com 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDevice.h" 9e010f1c2a0e6fe9cbaa73be01c7d878308b5166creed#include "SkDeviceProperties.h" 10ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov#include "SkDraw.h" 11a7d948523dce6044fc02db90726e5f971a93628breed@google.com#include "SkMetaData.h" 12ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov#include "SkPatchUtils.h" 138483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita#include "SkShader.h" 14aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita#include "SkTextBlob.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 161f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comSkBaseDevice::SkBaseDevice() 174a8126e7f81384526629b1e21bf89b632ea13cd9reed : fLeakyProperties(SkNEW_ARGS(SkDeviceProperties, (SkDeviceProperties::kLegacyLCD_InitType))) 18532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com#ifdef SK_DEBUG 19532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com , fAttachedToCanvas(false) 20532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com#endif 21532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com{ 22532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com fOrigin.setZero(); 23532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com fMetaData = NULL; 241f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com} 25532470f34dbe9fc0b8b71e3917eca8894feaf336bungeman@google.com 261f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comSkBaseDevice::~SkBaseDevice() { 27e010f1c2a0e6fe9cbaa73be01c7d878308b5166creed SkDELETE(fLeakyProperties); 28e010f1c2a0e6fe9cbaa73be01c7d878308b5166creed SkDELETE(fMetaData); 29a7d948523dce6044fc02db90726e5f971a93628breed@google.com} 30a7d948523dce6044fc02db90726e5f971a93628breed@google.com 3115a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.orgSkBaseDevice* SkBaseDevice::createCompatibleDevice(const SkImageInfo& info) { 3215a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org return this->onCreateDevice(info, kGeneral_Usage); 3315a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org} 3415a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org 3515a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.orgSkBaseDevice* SkBaseDevice::createCompatibleDeviceForSaveLayer(const SkImageInfo& info) { 3615a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org return this->onCreateDevice(info, kSaveLayer_Usage); 3715a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org} 3815a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org 39c38dee4f2c4cac24fa926a51069f04df272b1516Stephen WhiteSkBaseDevice* SkBaseDevice::createCompatibleDeviceForImageFilter(const SkImageInfo& info) { 40c38dee4f2c4cac24fa926a51069f04df272b1516Stephen White return this->onCreateDevice(info, kImageFilter_Usage); 41c38dee4f2c4cac24fa926a51069f04df272b1516Stephen White} 42c38dee4f2c4cac24fa926a51069f04df272b1516Stephen White 431f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comSkMetaData& SkBaseDevice::getMetaData() { 44a7d948523dce6044fc02db90726e5f971a93628breed@google.com // metadata users are rare, so we lazily allocate it. If that changes we 45a7d948523dce6044fc02db90726e5f971a93628breed@google.com // can decide to just make it a field in the device (rather than a ptr) 46a7d948523dce6044fc02db90726e5f971a93628breed@google.com if (NULL == fMetaData) { 47a7d948523dce6044fc02db90726e5f971a93628breed@google.com fMetaData = new SkMetaData; 48a7d948523dce6044fc02db90726e5f971a93628breed@google.com } 49a7d948523dce6044fc02db90726e5f971a93628breed@google.com return *fMetaData; 50a7d948523dce6044fc02db90726e5f971a93628breed@google.com} 51a7d948523dce6044fc02db90726e5f971a93628breed@google.com 52c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgSkImageInfo SkBaseDevice::imageInfo() const { 53f252f64f17efddf7235682a96d155d7c86c898e3reed return SkImageInfo::MakeUnknown(); 54c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org} 55c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org 561f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comconst SkBitmap& SkBaseDevice::accessBitmap(bool changePixels) { 571f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com const SkBitmap& bitmap = this->onAccessBitmap(); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (changePixels) { 591f9767c03bad1ef85e5388d84e23e4b5dff4bc1ajunov@chromium.org bitmap.notifyPixelsChanged(); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 611f9767c03bad1ef85e5388d84e23e4b5dff4bc1ajunov@chromium.org return bitmap; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 644a8126e7f81384526629b1e21bf89b632ea13cd9reedvoid SkBaseDevice::setPixelGeometry(SkPixelGeometry geo) { 654a8126e7f81384526629b1e21bf89b632ea13cd9reed fLeakyProperties->fPixelGeometry = geo; 664a8126e7f81384526629b1e21bf89b632ea13cd9reed} 674a8126e7f81384526629b1e21bf89b632ea13cd9reed 684a8126e7f81384526629b1e21bf89b632ea13cd9reedSkSurface* SkBaseDevice::newSurface(const SkImageInfo&, const SkSurfaceProps&) { return NULL; } 69c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org 70c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgconst void* SkBaseDevice::peekPixels(SkImageInfo*, size_t*) { return NULL; } 71ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 72ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgvoid SkBaseDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, 73ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org const SkRRect& inner, const SkPaint& paint) { 74ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org SkPath path; 75ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org path.addRRect(outer); 76ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org path.addRRect(inner); 77ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org path.setFillType(SkPath::kEvenOdd_FillType); 78ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 79ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org const SkMatrix* preMatrix = NULL; 80ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org const bool pathIsMutable = true; 81ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->drawPath(draw, path, paint, preMatrix, pathIsMutable); 82ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org} 834cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org 84b3c9d1c33caf325aada244204215eb790c228c12dandovvoid SkBaseDevice::drawPatch(const SkDraw& draw, const SkPoint cubics[12], const SkColor colors[4], 85b3c9d1c33caf325aada244204215eb790c228c12dandov const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) { 86b3c9d1c33caf325aada244204215eb790c228c12dandov SkPatchUtils::VertexData data; 87ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov 88b3c9d1c33caf325aada244204215eb790c228c12dandov SkISize lod = SkPatchUtils::GetLevelOfDetail(cubics, draw.fMatrix); 89ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov 90ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov // It automatically adjusts lodX and lodY in case it exceeds the number of indices. 9145f7842de7148a544008483a7829071d3dffba51dandov // If it fails to generate the vertices, then we do not draw. 9245f7842de7148a544008483a7829071d3dffba51dandov if (SkPatchUtils::getVertexData(&data, cubics, colors, texCoords, lod.width(), lod.height())) { 9345f7842de7148a544008483a7829071d3dffba51dandov this->drawVertices(draw, SkCanvas::kTriangles_VertexMode, data.fVertexCount, data.fPoints, 9445f7842de7148a544008483a7829071d3dffba51dandov data.fTexCoords, data.fColors, xmode, data.fIndices, data.fIndexCount, 9545f7842de7148a544008483a7829071d3dffba51dandov paint); 9645f7842de7148a544008483a7829071d3dffba51dandov } 97ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov} 98ecfff21bde1f0ca3c36533eded325066b5f2d42ddandov 99aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalitavoid SkBaseDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkScalar x, SkScalar y, 100aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita const SkPaint &paint) { 101aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita 1028483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita SkPaint runPaint = paint; 103aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita SkMatrix localMatrix; 104aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita SkDraw localDraw(draw); 105aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita 106aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita if (x || y) { 107aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita localMatrix = *draw.fMatrix; 108aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita localMatrix.preTranslate(x, y); 109aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita localDraw.fMatrix = &localMatrix; 1108483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita 1118483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita if (paint.getShader()) { 1128483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita // FIXME: We need to compensate for the translate above. This is suboptimal but 1138483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita // temporary -- until we get proper derived class drawTextBlob implementations. 1148483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita 1158483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita // TODO: pass x,y down to the other methods so they can handle the additional 1168483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita // translate without needing to allocate a new shader. 1178483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita SkMatrix shaderMatrix; 1188483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita shaderMatrix.setTranslate(-x, -y); 1198483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita SkAutoTUnref<SkShader> wrapper( 1208483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita SkShader::CreateLocalMatrixShader(paint.getShader(), shaderMatrix)); 1218483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita runPaint.setShader(wrapper); 1228483326704eff3b6a5fcce3f36d857a9779a4dd2fmalita } 123aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita } 124aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita 125aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita SkTextBlob::RunIterator it(blob); 126aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita while (!it.done()) { 127aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita size_t textLen = it.glyphCount() * sizeof(uint16_t); 128aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita const SkPoint& offset = it.offset(); 129aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita // applyFontToPaint() always overwrites the exact same attributes, 130aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita // so it is safe to not re-seed the paint. 131aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita it.applyFontToPaint(&runPaint); 132aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita 133aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita switch (it.positioning()) { 134aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita case SkTextBlob::kDefault_Positioning: 135aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita this->drawText(localDraw, it.glyphs(), textLen, offset.x(), offset.y(), runPaint); 136aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita break; 137aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita case SkTextBlob::kHorizontal_Positioning: 138aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita case SkTextBlob::kFull_Positioning: 139aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita this->drawPosText(localDraw, it.glyphs(), textLen, it.pos(), offset.y(), 140aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita SkTextBlob::ScalarsPerGlyph(it.positioning()), runPaint); 141aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita break; 142aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita default: 143aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita SkFAIL("unhandled positioning mode"); 144aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita } 145aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita 146aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita it.next(); 147aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita } 148aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita} 149aa1b9120463fc69be7a5545eb83e6fbe6955a424fmalita 150a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.orgbool SkBaseDevice::readPixels(const SkImageInfo& info, void* dstP, size_t rowBytes, int x, int y) { 151a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org#ifdef SK_DEBUG 152a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org SkASSERT(info.width() > 0 && info.height() > 0); 153a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org SkASSERT(dstP); 154a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org SkASSERT(rowBytes >= info.minRowBytes()); 155a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org SkASSERT(x >= 0 && y >= 0); 156db0c8753775774aa3f67114491e26ac1be32f38eskia.committer@gmail.com 157a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org const SkImageInfo& srcInfo = this->imageInfo(); 158a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org SkASSERT(x + info.width() <= srcInfo.width()); 159a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org SkASSERT(y + info.height() <= srcInfo.height()); 160a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org#endif 161a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org return this->onReadPixels(info, dstP, rowBytes, x, y); 162a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org} 163a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org 1644ef54f8d72420a521d4aae04ff5cd438810eca7fcommit-bot@chromium.orgbool SkBaseDevice::writePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes, 1654ef54f8d72420a521d4aae04ff5cd438810eca7fcommit-bot@chromium.org int x, int y) { 1664cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org#ifdef SK_DEBUG 1674cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(info.width() > 0 && info.height() > 0); 1684cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(pixels); 1694cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(rowBytes >= info.minRowBytes()); 1704cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(x >= 0 && y >= 0); 1714cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org 1724cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org const SkImageInfo& dstInfo = this->imageInfo(); 1734cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(x + info.width() <= dstInfo.width()); 1744cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(y + info.height() <= dstInfo.height()); 1754cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org#endif 1764cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org return this->onWritePixels(info, pixels, rowBytes, x, y); 1774cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org} 1784cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org 1794cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.orgbool SkBaseDevice::onWritePixels(const SkImageInfo&, const void*, size_t, int, int) { 1804cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org return false; 1814cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org} 1824cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org 183a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.orgbool SkBaseDevice::onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) { 1842cccf833265a607be62f1d77ee51662b49d9e813commit-bot@chromium.org return false; 1852cccf833265a607be62f1d77ee51662b49d9e813commit-bot@chromium.org} 1862cccf833265a607be62f1d77ee51662b49d9e813commit-bot@chromium.org 1879c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid* SkBaseDevice::accessPixels(SkImageInfo* info, size_t* rowBytes) { 1889c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkImageInfo tmpInfo; 1899c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com size_t tmpRowBytes; 1909c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com if (NULL == info) { 1919c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com info = &tmpInfo; 1929c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com } 1939c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com if (NULL == rowBytes) { 1949c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com rowBytes = &tmpRowBytes; 1959c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com } 1969c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com return this->onAccessPixels(info, rowBytes); 1979c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com} 1989c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com 1999c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid* SkBaseDevice::onAccessPixels(SkImageInfo* info, size_t* rowBytes) { 2009c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com return NULL; 2019c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com} 2029c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com 2039b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillipsvoid SkBaseDevice::EXPERIMENTAL_optimize(const SkPicture* picture) { 204145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org // The base class doesn't perform any analysis but derived classes may 205145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org} 206145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org 207d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reedbool SkBaseDevice::EXPERIMENTAL_drawPicture(SkCanvas*, const SkPicture*, const SkMatrix*, 208d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed const SkPaint*) { 209145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org // The base class doesn't perform any accelerated picture rendering 210145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org return false; 211145d1c0fdcef63991d7f910cc067a653a8aa2c4ccommit-bot@chromium.org} 212