SkGPipeWrite.cpp revision 0a4805e33f8ddb445a2fd061462e715e1707f049
1bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com */ 8bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 9b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com#include "SkAnnotation.h" 1010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkBitmapHeap.h" 11bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkCanvas.h" 1210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkColorFilter.h" 138a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com#include "SkData.h" 1410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkDrawLooper.h" 15bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com#include "SkDevice.h" 16acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#include "SkGPipe.h" 17bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipePriv.h" 1816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com#include "SkImageFilter.h" 1910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkMaskFilter.h" 2010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkOrderedWriteBuffer.h" 2110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkPaint.h" 2210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkPathEffect.h" 2310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkPictureFlat.h" 2410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkRasterizer.h" 254ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com#include "SkRRect.h" 2610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkShader.h" 27f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkStream.h" 28b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkTSearch.h" 29f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkTypeface.h" 30bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkWriter32.h" 31b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 324ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comenum { 334ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com kSizeOfFlatRRect = sizeof(SkRect) + 4 * sizeof(SkVector) 344ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}; 354ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comstatic bool isCrossProcess(uint32_t flags) { 370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag); 380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 40b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { 41b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 42b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com switch (paintFlat) { 43b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kColorFilter_PaintFlat: return paint.getColorFilter(); 440faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com case kDrawLooper_PaintFlat: return paint.getLooper(); 45b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kMaskFilter_PaintFlat: return paint.getMaskFilter(); 46b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kPathEffect_PaintFlat: return paint.getPathEffect(); 47b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kRasterizer_PaintFlat: return paint.getRasterizer(); 48b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kShader_PaintFlat: return paint.getShader(); 4916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com case kImageFilter_PaintFlat: return paint.getImageFilter(); 50b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kXfermode_PaintFlat: return paint.getXfermode(); 51b58772f86659cfe0e8d9247fcee878dddd8fdad9epoger@google.com case kAnnotation_PaintFlat: return paint.getAnnotation(); 52b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 530c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("never gets here"); 54b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 55b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 56bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 57f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comstatic size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { 58f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkASSERT(typeface); 59f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkDynamicMemoryWStream stream; 60f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com typeface->serialize(&stream); 61f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = stream.getOffset(); 62f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (writer) { 63f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writer->write32(size); 648a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com SkAutoDataUnref data(stream.copyToData()); 6559f46b81f8bdd1b524f5cc43bc27603f9604c71arobertphillips@google.com writer->writePad(data->data(), size); 66f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 675af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com return 4 + SkAlign4(size); 68f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 69f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 70bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 71bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 724dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comclass FlattenableHeap : public SkFlatController { 734dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.compublic: 74664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset, bool isCrossProcess) 751554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com : fNumFlatsToKeep(numFlatsToKeep) { 76664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com SkASSERT((isCrossProcess && fset != NULL) || (!isCrossProcess && NULL == fset)); 77664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com if (isCrossProcess) { 78664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com this->setNamedFactorySet(fset); 79664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com this->setWriteBufferFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag); 80664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com } 810c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 824dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 834dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com ~FlattenableHeap() { 844dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fPointers.freeAll(); 854dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 864dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 874dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com virtual void* allocThrow(size_t bytes) SK_OVERRIDE; 884dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 894dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com virtual void unalloc(void* ptr) SK_OVERRIDE; 904dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 917ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com void setBitmapStorage(SkBitmapHeap* heap) { 927ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com this->setBitmapHeap(heap); 937ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com } 94d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 954dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const SkFlatData* flatToReplace() const; 964dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 974dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Mark an SkFlatData as one that should not be returned by flatToReplace. 984dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Takes the result of SkFlatData::index() as its parameter. 994dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void markFlatForKeeping(int index) { 1004dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fFlatsThatMustBeKept.append() = index; 1014dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1024dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1034dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void markAllFlatsSafeToDelete() { 1044dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlatsThatMustBeKept.reset(); 1054dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1064dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1074dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comprivate: 1084dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Keep track of the indices (i.e. the result of SkFlatData::index()) of 1094dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // flats that must be kept, since they are on the current paint. 1104dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkTDArray<int> fFlatsThatMustBeKept; 1114dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkTDArray<void*> fPointers; 1124dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const int fNumFlatsToKeep; 1134dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com}; 1144dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1154dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comvoid FlattenableHeap::unalloc(void* ptr) { 1164dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int indexToRemove = fPointers.rfind(ptr); 1174dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (indexToRemove >= 0) { 1184dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com sk_free(ptr); 1194dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fPointers.remove(indexToRemove); 1204dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1214dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1224dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1234dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comvoid* FlattenableHeap::allocThrow(size_t bytes) { 1244dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void* ptr = sk_malloc_throw(bytes); 1254dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fPointers.append() = ptr; 1264dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return ptr; 1274dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1284dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1294dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comconst SkFlatData* FlattenableHeap::flatToReplace() const { 1304dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // First, determine whether we should replace one. 1314dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (fPointers.count() > fNumFlatsToKeep) { 1324dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Look through the flattenable heap. 1334dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // TODO: Return the LRU flat. 1344dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com for (int i = 0; i < fPointers.count(); i++) { 1354dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkFlatData* potential = (SkFlatData*)fPointers[i]; 1364dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Make sure that it is not one that must be kept. 1374dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool mustKeep = false; 1384dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com for (int j = 0; j < fFlatsThatMustBeKept.count(); j++) { 1394dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (potential->index() == fFlatsThatMustBeKept[j]) { 1404dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com mustKeep = true; 1414dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com break; 1424dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1434dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1444dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (!mustKeep) { 1454dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return potential; 1464dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1474dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1484dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1494dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return NULL; 1504dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1514dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1524dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com/////////////////////////////////////////////////////////////////////////////// 1534dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1544dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comclass FlatDictionary : public SkFlatDictionary<SkFlattenable> { 1554dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.compublic: 1561554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com FlatDictionary(FlattenableHeap* heap) 1571554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com : SkFlatDictionary<SkFlattenable>(heap) { 1584dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenProc = &flattenFlattenableProc; 1594dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // No need to define fUnflattenProc since the writer will never 1604dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // unflatten the data. 1614dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1624dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com static void flattenFlattenableProc(SkOrderedWriteBuffer& buffer, 1634dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const void* obj) { 1644dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com buffer.writeFlattenable((SkFlattenable*)obj); 1654dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1664dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1674dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com}; 1684dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1694dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com/////////////////////////////////////////////////////////////////////////////// 1704dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 171bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 172bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 173a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org SkGPipeCanvas(SkGPipeController*, SkWriter32*, uint32_t flags, 174a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height); 175bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 176bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 177bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com void finish() { 178bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!fDone) { 179dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com if (this->needOpBytes()) { 180dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->writeOp(kDone_DrawOp); 181dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com this->doNotify(); 1823e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (shouldFlattenBitmaps(fFlags)) { 183d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com // In this case, a BitmapShuttle is reffed by the SkBitmapHeap 184d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com // and refs this canvas. Unref the SkBitmapHeap to end the 1853e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // circular reference. When shouldFlattenBitmaps is false, 186d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com // there is no circular reference, so the SkBitmapHeap can be 1873e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // safely unreffed in the destructor. 188d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->unref(); 1897ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com // This eliminates a similar circular reference (Canvas owns 190d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com // the FlattenableHeap which holds a ref to the SkBitmapHeap). 1917ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com fFlattenableHeap.setBitmapStorage(NULL); 192d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap = NULL; 1933e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com } 194dbccc88f84e5330ce6e52512fcefd375ee2eda49reed@google.com } 195bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = true; 196bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 197bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 198bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 19977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org void flushRecording(bool detachCurrentBlock); 2002e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org size_t freeMemoryIfPossible(size_t bytesToFree); 20177eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 20215011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com size_t storageAllocatedForRecording() { 203d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->bytesAllocated(); 20415011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com } 20515011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 206bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // overrides from SkCanvas 2073b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual int save(SaveFlags) SK_OVERRIDE; 2083b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual int saveLayer(const SkRect* bounds, const SkPaint*, 2093b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com SaveFlags) SK_OVERRIDE; 2103b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void restore() SK_OVERRIDE; 211fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org virtual bool isDrawingToLayer() const SK_OVERRIDE; 2123b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE; 2133b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE; 2143b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool rotate(SkScalar degrees) SK_OVERRIDE; 2153b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE; 2163b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE; 2173b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE; 2184ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual bool clipRect(const SkRect&, SkRegion::Op op, bool doAntiAlias = false) SK_OVERRIDE; 2194ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual bool clipRRect(const SkRRect&, SkRegion::Op op, bool doAntiAlias = false) SK_OVERRIDE; 2203b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipPath(const SkPath& path, SkRegion::Op op, 2213b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias = false) SK_OVERRIDE; 2223b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE; 2233b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void clear(SkColor) SK_OVERRIDE; 2243b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 225bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 2263b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 2274ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE; 2283b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 2294ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE; 2303b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 2323b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 2337112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src, 2343b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkRect& dst, const SkPaint*) SK_OVERRIDE; 235bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 2363b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 2375a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 2385a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint = NULL) SK_OVERRIDE; 239bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawSprite(const SkBitmap&, int left, int top, 2403b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 24174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawText(const void* text, size_t byteLength, SkScalar x, 2423b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com SkScalar y, const SkPaint&) SK_OVERRIDE; 24374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawPosText(const void* text, size_t byteLength, 2443b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPoint pos[], const SkPaint&) SK_OVERRIDE; 245bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPosTextH(const void* text, size_t byteLength, 2463b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkScalar xpos[], SkScalar constY, 2473b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 24874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org virtual void drawTextOnPath(const void* text, size_t byteLength, 24974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 2503b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 2513b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; 252bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 255bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 2563b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 2573b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawData(const void*, size_t) SK_OVERRIDE; 2580a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 2590a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 2600a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void endCommentGroup() SK_OVERRIDE; 261bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2623e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com /** 2633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * Flatten an SkBitmap to send to the reader, where it will be referenced 2643e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * according to slot. 2653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com */ 2663e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool shuttleBitmap(const SkBitmap&, int32_t slot); 267bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 268fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org enum { 269fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org kNoSaveLayer = -1, 270fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org }; 2710c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkNamedFactorySet* fFactorySet; 2720c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com int fFirstSaveLayerStackLevel; 273d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkBitmapHeap* fBitmapHeap; 274acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 2750c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkWriter32& fWriter; 2760c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBlockSize; // amount allocated for writer 2770c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBytesNotified; 2780c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com bool fDone; 2793e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const uint32_t fFlags; 280bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2810c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkRefCntSet fTypefaceSet; 282f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 283f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 284f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 285acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 286bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 287bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 28874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 289acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 290bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 291bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 292acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 293acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 294acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 295acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 296acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 297acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t bytes = fWriter.size() - fBytesNotified; 29816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (bytes > 0) { 29916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fController->notifyWritten(bytes); 30016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBytesNotified += bytes; 30116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 302acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 303acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 304b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3050c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // Should be called after any calls to an SkFlatDictionary::findAndReplace 3060c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // if a new SkFlatData was added when in cross process mode 3070c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com void flattenFactoryNames(); 3080c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 3094dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com FlattenableHeap fFlattenableHeap; 3104dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com FlatDictionary fFlatDictionary; 311b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int fCurrFlatIndex[kCount_PaintFlats]; 312b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 313b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3143e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // Common code used by drawBitmap*. Behaves differently depending on the 3153e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // type of SkBitmapHeap being used, which is determined by the flags used. 3163e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, 3173e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, const SkPaint* paint); 31858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 31931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 32031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 321bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com class AutoPipeNotify { 323acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com public: 324acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 325acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com ~AutoPipeNotify() { fCanvas->doNotify(); } 326acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com private: 327acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas* fCanvas; 328acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com }; 329acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com friend class AutoPipeNotify; 330acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 331bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 332bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 333bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comvoid SkGPipeCanvas::flattenFactoryNames() { 3350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com const char* name; 3360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) { 3370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t len = strlen(name); 3380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (this->needOpBytes(len)) { 3390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Factory_DrawOp); 3400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.writeString(name, len); 3410c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3420c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3430c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 3440c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 3453e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { 346565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 3473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com SkOrderedWriteBuffer buffer(1024); 3483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.setNamedFactoryRecorder(fFactorySet); 34974b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com buffer.writeBitmap(bm); 3503e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->flattenFactoryNames(); 3513e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com uint32_t size = buffer.size(); 3523e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->needOpBytes(size)) { 3533e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->writeOp(kDef_Bitmap_DrawOp, 0, slot); 3543e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com void* dst = static_cast<void*>(fWriter.reserve(size)); 3553e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.writeToMemory(dst); 3563e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return true; 3574dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 3583e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return false; 359d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com} 360d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com 361b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 362d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com// return ~(index-base-1) if an old flattenable was replaced 363b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 364d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com SkASSERT(!fDone && fBitmapHeap != NULL); 365b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 366b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 367b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 368b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 369d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->deferAddingOwners(); 3704dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool added, replaced; 371664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHeap.flatToReplace(), 372664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com &added, &replaced); 373d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->endAddingOwnersDeferral(added); 3744dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int index = flat->index(); 3750c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (added) { 3760c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (isCrossProcess(fFlags)) { 3770c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->flattenFactoryNames(); 3780c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3790c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t flatSize = flat->flatSize(); 3800c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (this->needOpBytes(flatSize)) { 3810c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, index); 3820c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.write(flat->data(), flatSize); 3830c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 384b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 3854dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (replaced) { 3864dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com index = ~index; 387d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 3884dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return index; 389b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 390b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 391bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 392bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3933e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com/** 3943e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * If SkBitmaps are to be flattened to send to the reader, this class is 3953e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * provided to the SkBitmapHeap to tell the SkGPipeCanvas to do so. 3963e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com */ 3973e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comclass BitmapShuttle : public SkBitmapHeap::ExternalStorage { 3983e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.compublic: 3993e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com BitmapShuttle(SkGPipeCanvas*); 400d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 4013e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com ~BitmapShuttle(); 402d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 4033e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com virtual bool insert(const SkBitmap& bitmap, int32_t slot) SK_OVERRIDE; 404d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 4053e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comprivate: 4063e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com SkGPipeCanvas* fCanvas; 4073e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com}; 4083e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 4093e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com/////////////////////////////////////////////////////////////////////////////// 4103e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 411acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define MIN_BLOCK_SIZE (16 * 1024) 4124dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define BITMAPS_TO_KEEP 5 4134dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define FLATTENABLES_TO_KEEP 10 414bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 415acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 416d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkWriter32* writer, uint32_t flags, 417a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) 4180c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com: fFactorySet(isCrossProcess(flags) ? SkNEW(SkNamedFactorySet) : NULL) 4190c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com, fWriter(*writer) 4200c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com, fFlags(flags) 421664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com, fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, isCrossProcess(flags)) 4221554360a9511d996e1618d19c163c810ef3f128cscroggo@google.com, fFlatDictionary(&fFlattenableHeap) { 423acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 425acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 4265a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fBytesNotified = 0; 427fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = kNoSaveLayer; 428b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); 429acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 430bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com // we need a device to limit our clip 43106b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com // We don't allocate pixels for the bitmap 432bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com SkBitmap bitmap; 433a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); 43406b4da16fd6ed63560d79116c6066534e953a43dyangsu@google.com SkDevice* device = SkNEW_ARGS(SkDevice, (bitmap)); 435bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->setDevice(device)->unref(); 43610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com 437565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com // Tell the reader the appropriate flags to use. 438565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com if (this->needOpBytes()) { 439565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com this->writeOp(kReportFlags_DrawOp, fFlags, 0); 440565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 441d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 44210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (shouldFlattenBitmaps(flags)) { 4433e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com BitmapShuttle* shuttle = SkNEW_ARGS(BitmapShuttle, (this)); 444d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (shuttle, BITMAPS_TO_KEEP)); 4453e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com shuttle->unref(); 44610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } else { 447d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, 4483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com (BITMAPS_TO_KEEP, controller->numberOfReaders())); 44910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(sizeof(void*))) { 450d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com this->writeOp(kShareBitmapHeap_DrawOp); 451d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fWriter.writePtr(static_cast<void*>(fBitmapHeap)); 45210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 45310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 454d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fFlattenableHeap.setBitmapStorage(fBitmapHeap); 45510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com this->doNotify(); 456bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 457bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 458bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 459bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->finish(); 4600c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkSafeUnref(fFactorySet); 461d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkSafeUnref(fBitmapHeap); 462bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 463bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 464acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 465acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 466acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 467acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 468acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 469acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 470acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fWriter.size() + needed > fBlockSize) { 4715a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Before we wipe out any data that has already been written, read it 4725a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // out. 4735a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->doNotify(); 4745a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com size_t blockSize = SkMax32(MIN_BLOCK_SIZE, needed); 4755a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com void* block = fController->requestBlock(blockSize, &fBlockSize); 476acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 477acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fDone = true; 478acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 479acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 480460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com SkASSERT(SkIsAlign4(fBlockSize)); 481acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 482acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 483acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 484acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 485acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 486acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 487f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 488f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 489f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 490f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 491f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 492f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 493f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 494f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 495bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 496f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 497f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 498f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 499f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 500f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 501f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 502f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 503bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 504bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 505acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define NOTIFY_SETUP(canvas) \ 506acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify apn(canvas) 507acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 508bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::save(SaveFlags flags) { 509acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 510acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 511acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 512acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 513bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(flags); 514bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 515bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 516bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comint SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 517bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SaveFlags saveFlags) { 518acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 519acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 520bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 52174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 522bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 523bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 524acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 525bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 526bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 527bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 52831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 529bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 530bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 531acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 532acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 533acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 534acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 535acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 536bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 53774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 538fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org if (kNoSaveLayer == fFirstSaveLayerStackLevel){ 539fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = this->getSaveCount(); 540fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org } 541bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the save, so we don't create a layer 542bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::save(saveFlags); 543bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 544bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 545bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::restore() { 546acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 547acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 548acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 549acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 550fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 551bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::restore(); 552fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 553fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org if (this->getSaveCount() == fFirstSaveLayerStackLevel){ 554fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = kNoSaveLayer; 555fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org } 556fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org} 557fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 558fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.orgbool SkGPipeCanvas::isDrawingToLayer() const { 559fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org return kNoSaveLayer != fFirstSaveLayerStackLevel; 560bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 561bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 562bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::translate(SkScalar dx, SkScalar dy) { 563bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (dx || dy) { 564acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 565acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 566acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kTranslate_DrawOp); 567acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dx); 568acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(dy); 569acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 570bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 571bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::translate(dx, dy); 572bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 573bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::scale(SkScalar sx, SkScalar sy) { 575bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 576acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 577acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 578acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kScale_DrawOp); 579acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 580acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 581acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 582bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 583bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::scale(sx, sy); 584bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 585bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 586bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::rotate(SkScalar degrees) { 587bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (degrees) { 588acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 589acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkScalar))) { 590acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRotate_DrawOp); 591acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(degrees); 592acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 593bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 594bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::rotate(degrees); 595bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 596bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 597bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::skew(SkScalar sx, SkScalar sy) { 598bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (sx || sy) { 599acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 600acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(2 * sizeof(SkScalar))) { 601acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSkew_DrawOp); 602acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sx); 603acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(sy); 604acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 605bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 606bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::skew(sx, sy); 607bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 608bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 609bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::concat(const SkMatrix& matrix) { 610bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 611acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 61294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(matrix.writeToMemory(NULL))) { 613acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kConcat_DrawOp); 6142b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 615acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 616bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 617bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::concat(matrix); 618bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 619bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 620bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::setMatrix(const SkMatrix& matrix) { 621acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 62294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(matrix.writeToMemory(NULL))) { 623acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 6242b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 625acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 626bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com this->INHERITED::setMatrix(matrix); 627bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 628bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6293b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.combool SkGPipeCanvas::clipRect(const SkRect& rect, SkRegion::Op rgnOp, 6303b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias) { 631acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 632460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(sizeof(SkRect))) { 633460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com unsigned flags = doAntiAlias & kClip_HasAntiAlias_DrawOpFlag; 634460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipRect_DrawOp, flags, rgnOp); 635acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 636acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6373b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com return this->INHERITED::clipRect(rect, rgnOp, doAntiAlias); 638bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6404ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.combool SkGPipeCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op rgnOp, 6414ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com bool doAntiAlias) { 6424ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com NOTIFY_SETUP(this); 6434ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 6444ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com unsigned flags = doAntiAlias & kClip_HasAntiAlias_DrawOpFlag; 6454ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kClipRRect_DrawOp, flags, rgnOp); 6464ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 6474ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 6484ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com return this->INHERITED::clipRRect(rrect, rgnOp, doAntiAlias); 6494ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 6504ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 6513b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.combool SkGPipeCanvas::clipPath(const SkPath& path, SkRegion::Op rgnOp, 6523b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com bool doAntiAlias) { 653acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 654460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 655460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com unsigned flags = doAntiAlias & kClip_HasAntiAlias_DrawOpFlag; 656460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipPath_DrawOp, flags, rgnOp); 65794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 658acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 659bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 6603b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com return this->INHERITED::clipRect(path.getBounds(), rgnOp, doAntiAlias); 661bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 662bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 663bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.combool SkGPipeCanvas::clipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 664acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 66594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(region.writeToMemory(NULL))) { 666acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 6672b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeRegion(region); 668acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 669bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return this->INHERITED::clipRegion(region, rgnOp); 670bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 671bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 672bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 673bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 675acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 678bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 679bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 680acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 681acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 682acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 683acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 684acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 685bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 686bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 687bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 688bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 689acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 69031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 691acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 69231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 693acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 694bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 695bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 696bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 697bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pts[], const SkPaint& paint) { 698bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 699acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 70031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 701acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 70231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 703acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 704acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 705acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 706bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 707bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 708bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7094ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkGPipeCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 7104ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com NOTIFY_SETUP(this); 7114ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7124ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 7134ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawOval_DrawOp); 7144ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRect(rect); 7154ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7164ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7174ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 718bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 719acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 72031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 721acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 72231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 723acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 724acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 725bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 726bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7274ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkGPipeCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 7284ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com NOTIFY_SETUP(this); 7294ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7304ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 7314ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawRRect_DrawOp); 7324ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 7334ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7344ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7354ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 736bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 737acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 73831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 73994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 74031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 74194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 742acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 743bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 744bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7453e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, 7463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com unsigned flags, 7473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, 7483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const SkPaint* paint) { 74958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com if (paint != NULL) { 750460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags |= kDrawBitmap_HasPaint_DrawOpFlag; 7515a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writePaint(*paint); 7525a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 75310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(opBytesNeeded)) { 754d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com SkASSERT(fBitmapHeap != NULL); 755d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com int32_t bitmapIndex = fBitmapHeap->insert(bm); 756d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) { 757d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return false; 758d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com } 75910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com this->writeOp(op, flags, bitmapIndex); 76058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return true; 761565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 76258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return false; 76358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com} 76458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 76558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 76658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkPaint* paint) { 76758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com NOTIFY_SETUP(this); 76858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkScalar) * 2; 76958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7703e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint)) { 7715a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(left); 7725a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(top); 7735a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 774bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 775bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7767112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comvoid SkGPipeCanvas::drawBitmapRectToRect(const SkBitmap& bm, const SkRect* src, 77758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkRect& dst, const SkPaint* paint) { 77816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 77958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkRect); 78016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com bool hasSrc = src != NULL; 78158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com unsigned flags; 78216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 783460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags = kDrawBitmap_HasSrcRect_DrawOpFlag; 78416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com opBytesNeeded += sizeof(int32_t) * 4; 78558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } else { 78658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com flags = 0; 78716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 788d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7897112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com if (this->commonDrawBitmap(bm, kDrawBitmapRectToRect_DrawOp, flags, opBytesNeeded, paint)) { 79016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 7917112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com fWriter.writeRect(*src); 79216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 79316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 79416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 795bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 796bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 79758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap& bm, const SkMatrix& matrix, 79858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkPaint* paint) { 79958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com NOTIFY_SETUP(this); 80058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = matrix.writeToMemory(NULL); 801d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8023e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapMatrix_DrawOp, 0, opBytesNeeded, paint)) { 80358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com fWriter.writeMatrix(matrix); 80458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 805bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 80616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 80716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawBitmapNine(const SkBitmap& bm, const SkIRect& center, 8085a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint) { 80916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 81058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 4 + sizeof(SkRect); 81116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8123e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapNine_DrawOp, 0, opBytesNeeded, paint)) { 81316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fLeft); 81416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fTop); 81516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fRight); 81616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fBottom); 81716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 81816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 8195a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com} 82016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 82116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap& bm, int left, int top, 82216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkPaint* paint) { 82316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 82458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 2; 82516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8263e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint)) { 82716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(left); 82816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(top); 82916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 830bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 831bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 83274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 833bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com SkScalar y, const SkPaint& paint) { 834bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 835acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 83631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 837acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 83831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 839acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 840acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 841acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 842acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 843acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 844bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 845bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 846bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 84774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawPosText(const void* text, size_t byteLength, 848bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint pos[], const SkPaint& paint) { 849bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 850acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 85131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 852bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 853acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 85431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 855acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 856acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 857acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 858acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 859acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 860bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 861bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 862bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 863bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPosTextH(const void* text, size_t byteLength, 864bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkScalar xpos[], SkScalar constY, 865bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 866bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 867acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 86831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 869bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 870acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 87131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 872acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 873acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 874acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 875acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 876acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 877acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 878bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 879bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 880bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 88174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.orgvoid SkGPipeCanvas::drawTextOnPath(const void* text, size_t byteLength, 88274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org const SkPath& path, const SkMatrix* matrix, 883bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 884bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 885acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 886bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 88794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL); 888bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 889bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 89094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size += matrix->writeToMemory(NULL); 891bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 89231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 893acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 89431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 895bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 896acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(byteLength); 897acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 898bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 89994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 900acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 9012b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(*matrix); 902acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 903bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 904bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 905bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 906bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 907bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPicture(SkPicture& picture) { 9080faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 9090faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->INHERITED::drawPicture(picture); 910bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 911bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 912bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount, 913bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 914bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 915bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 916bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 917bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 918bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 919bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 920bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 921acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 922acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + vertexCount * sizeof(SkPoint); 92331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 924bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 925bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 926bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 927acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 928bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 929bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 930bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 931acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 932bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 933bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (indices && indexCount > 0) { 934bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasIndices_DrawOpFlag; 935acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 936bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 93774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 938acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 93931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 940acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(mode); 941acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 942acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 943acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (texs) { 944acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 945acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 946acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (colors) { 947acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 948acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 949bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 950acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com // TODO: flatten xfermode 951bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 952acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (indices && indexCount > 0) { 953acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 954acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 955acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 956bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 957bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 958bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 959acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 960acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 961acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 962bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 963bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 964bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 965bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 966acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 967acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 968acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 969acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(size); 970acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 971bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fWriter.writePad(ptr, size); 972bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 973bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 974bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 975bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 9760a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::beginCommentGroup(const char* description) { 9770a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 9780a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 9790a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 9800a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::addComment(const char* kywd, const char* value) { 9810a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 9820a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 9830a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 9840a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::endCommentGroup() { 9850a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 9860a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 9870a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 98877eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.orgvoid SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { 98977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org doNotify(); 99077eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org if (detachCurrentBlock) { 99177eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org // force a new block to be requested for the next recorded command 992d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com fBlockSize = 0; 99377eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org } 99477eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 99577eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 9962e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { 997d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesToFree); 9982e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 9992e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 1000bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1001bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1002bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 1003bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 1004bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 1005bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 1006bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 1007bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 1008bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 1009bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1010bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 101131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 1012d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com if (fDone) { 1013d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return; 1014d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com } 101531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 1016bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 1017bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 1018bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1019bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 1020bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 1021f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 1022bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1023bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 1024bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 1025bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 1026f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 1027bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1028bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 1029bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 1030f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 1031bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1032bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 1033bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 1034f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 1035bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1036bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 1037bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 1038f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 1039bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1040bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 1041bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 1042bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 1043f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 1044bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1045bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 1046bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 1047bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 1048f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 1049bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1050bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 1051bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 1052f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 1053bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1054bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 1055bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 1056f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 1057bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1058bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 1059bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 1060f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 1061bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1062bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 1063bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 1064bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 1065f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 1066bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1067bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 1068bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 1069bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 1070f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 1071bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1072bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 1073bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 1074bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 1075f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 1076f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 1077f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 1078f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 10790c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (isCrossProcess(fFlags)) { 10803cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 10813cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 10823cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } else if (this->needOpBytes(sizeof(void*))) { 10833cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // Add to the set for ref counting. 10843cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fTypefaceSet.add(paint.getTypeface()); 10853cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // It is safe to write the typeface to the stream before the rest 10863cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // of the paint unless we ever send a kReset_PaintOp, which we 10873cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // currently never do. 10883cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com this->writeOp(kSetTypeface_DrawOp); 10893cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fWriter.writePtr(paint.getTypeface()); 10903cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } 1091f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 1092bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1093bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 10944dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // This is a new paint, so all old flats can be safely purged, if necessary. 10954dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markAllFlatsSafeToDelete(); 1096b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 1097b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 1098d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com bool replaced = index < 0; 1099d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (replaced) { 1100d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com index = ~index; 1101d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 11024dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Store the index of any flat that needs to be kept. 0 means no flat. 11034dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (index > 0) { 11044dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markFlatForKeeping(index); 11054dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 11064dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkASSERT(index >= 0 && index <= fFlatDictionary.count()); 1107d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (index != fCurrFlatIndex[i] || replaced) { 1108b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 1109b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 1110b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1111b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1112b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 1113acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 1114acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 1115b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com this->writeOp(kPaintOp_DrawOp, 0, size); 1116b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 1117bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 1118b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 1119bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1120bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1121bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1122bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1123bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1124bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1125bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 1126bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 11273cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeController::~SkGPipeController() { 11283cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkSafeUnref(fCanvas); 11293cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 11303cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11313cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comvoid SkGPipeController::setCanvas(SkGPipeCanvas* canvas) { 11323cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkRefCnt_SafeAssign(fCanvas, canvas); 11333cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 11343cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11353cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com/////////////////////////////////////////////////////////////////////////////// 11363cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11373cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeWriter::SkGPipeWriter() 11380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com: fWriter(0) { 1139bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1140bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1141bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1142bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 1143acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 1144bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1145bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1146a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.orgSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t flags, 1147a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) { 1148bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 1149acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 1150a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, flags, width, height)); 1151bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 11523cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com controller->setCanvas(fCanvas); 1153bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 1154bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1155bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1156bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 1157bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 1158bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->finish(); 1159bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 1160bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1161bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1162bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1163bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 11642e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgvoid SkGPipeWriter::flushRecording(bool detachCurrentBlock) { 11652e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 11662e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org fCanvas->flushRecording(detachCurrentBlock); 11672e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 11682e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 11692e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 11702e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::freeMemoryIfPossible(size_t bytesToFree) { 11712e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 11722e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return fCanvas->freeMemoryIfPossible(bytesToFree); 11732e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 11742e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return 0; 117577eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 117677eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 11772e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::storageAllocatedForRecording() const { 117815011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com return NULL == fCanvas ? 0 : fCanvas->storageAllocatedForRecording(); 117915011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com} 118015011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 11813e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com/////////////////////////////////////////////////////////////////////////////// 11823e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 11833e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::BitmapShuttle(SkGPipeCanvas* canvas) { 11843e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com SkASSERT(canvas != NULL); 11853e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas = canvas; 11863e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas->ref(); 11873e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 11883e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 11893e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::~BitmapShuttle() { 11903e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas->unref(); 11913e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 11923e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 11933e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool BitmapShuttle::insert(const SkBitmap& bitmap, int32_t slot) { 11943e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return fCanvas->shuttleBitmap(bitmap, slot); 11953e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 1196