SkGPipeWrite.cpp revision b45bd1f7fd60dbaa38340359f14e96b6a475d12d
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" 101f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com#include "SkBitmapDevice.h" 1110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkBitmapHeap.h" 12bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkCanvas.h" 1310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkColorFilter.h" 148a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com#include "SkData.h" 1510dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkDrawLooper.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" 208b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.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(); 51b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 520c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("never gets here"); 53b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 54b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 55bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 56f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comstatic size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { 57f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkASSERT(typeface); 58f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkDynamicMemoryWStream stream; 59f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com typeface->serialize(&stream); 60f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = stream.getOffset(); 61f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (writer) { 62b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org writer->write32(SkToU32(size)); 638a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com SkAutoDataUnref data(stream.copyToData()); 6459f46b81f8bdd1b524f5cc43bc27603f9604c71arobertphillips@google.com writer->writePad(data->data(), size); 65f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 665af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com return 4 + SkAlign4(size); 67f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 68f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 69bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 70bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 714dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comclass FlattenableHeap : public SkFlatController { 724dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.compublic: 73664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset, bool isCrossProcess) 74a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org : INHERITED(isCrossProcess ? SkWriteBuffer::kCrossProcess_Flag : 0) 75a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org , 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 } 800c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 814dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 824dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com ~FlattenableHeap() { 834dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fPointers.freeAll(); 844dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 854dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 864dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com virtual void* allocThrow(size_t bytes) SK_OVERRIDE; 874dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 884dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com virtual void unalloc(void* ptr) SK_OVERRIDE; 894dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 907ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com void setBitmapStorage(SkBitmapHeap* heap) { 917ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com this->setBitmapHeap(heap); 927ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com } 93d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 944dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const SkFlatData* flatToReplace() const; 954dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 964dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Mark an SkFlatData as one that should not be returned by flatToReplace. 974dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Takes the result of SkFlatData::index() as its parameter. 984dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void markFlatForKeeping(int index) { 994dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fFlatsThatMustBeKept.append() = index; 1004dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1014dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1024dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void markAllFlatsSafeToDelete() { 1034dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlatsThatMustBeKept.reset(); 1044dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1054dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1064dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comprivate: 1074dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Keep track of the indices (i.e. the result of SkFlatData::index()) of 1084dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // flats that must be kept, since they are on the current paint. 1094dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkTDArray<int> fFlatsThatMustBeKept; 1104dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkTDArray<void*> fPointers; 1114dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const int fNumFlatsToKeep; 112a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org 113a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org typedef SkFlatController INHERITED; 1144dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com}; 1154dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1164dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comvoid FlattenableHeap::unalloc(void* ptr) { 1174dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int indexToRemove = fPointers.rfind(ptr); 1184dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (indexToRemove >= 0) { 1194dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com sk_free(ptr); 1204dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fPointers.remove(indexToRemove); 1214dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1224dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1234dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1244dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comvoid* FlattenableHeap::allocThrow(size_t bytes) { 1254dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void* ptr = sk_malloc_throw(bytes); 1264dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fPointers.append() = ptr; 1274dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return ptr; 1284dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1294dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1304dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comconst SkFlatData* FlattenableHeap::flatToReplace() const { 1314dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // First, determine whether we should replace one. 1324dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (fPointers.count() > fNumFlatsToKeep) { 1334dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Look through the flattenable heap. 1344dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // TODO: Return the LRU flat. 1354dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com for (int i = 0; i < fPointers.count(); i++) { 1364dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkFlatData* potential = (SkFlatData*)fPointers[i]; 1374dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Make sure that it is not one that must be kept. 1384dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool mustKeep = false; 1394dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com for (int j = 0; j < fFlatsThatMustBeKept.count(); j++) { 1404dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (potential->index() == fFlatsThatMustBeKept[j]) { 1414dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com mustKeep = true; 1424dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com break; 1434dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1444dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1454dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (!mustKeep) { 1464dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return potential; 1474dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1484dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1494dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1504dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return NULL; 1514dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1524dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1534dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com/////////////////////////////////////////////////////////////////////////////// 1544dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 15507adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgstruct SkFlattenableTraits { 156186c0ccac25229534ec6fb84726043083304d4d1commit-bot@chromium.org static void Flatten(SkWriteBuffer& buffer, const SkFlattenable& flattenable) { 15707adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org buffer.writeFlattenable(&flattenable); 1584dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 15907adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org // No need to define unflatten if we never call it. 1604dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com}; 16107adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgtypedef SkFlatDictionary<SkFlattenable, SkFlattenableTraits> FlatDictionary; 1624dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1634dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com/////////////////////////////////////////////////////////////////////////////// 1644dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 16559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com/** 16659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * If SkBitmaps are to be flattened to send to the reader, this class is 16759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * provided to the SkBitmapHeap to tell the SkGPipeCanvas to do so. 16859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com */ 16959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comclass BitmapShuttle : public SkBitmapHeap::ExternalStorage { 17059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.compublic: 17159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com BitmapShuttle(SkGPipeCanvas*); 17259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 17359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com ~BitmapShuttle(); 17459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 17559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com virtual bool insert(const SkBitmap& bitmap, int32_t slot) SK_OVERRIDE; 17659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 17759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com /** 17859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * Remove the SkGPipeCanvas used for insertion. After this, calls to 17959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * insert will crash. 18059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com */ 18159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com void removeCanvas(); 18259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 18359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comprivate: 18459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkGPipeCanvas* fCanvas; 18559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com}; 18659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 18759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com/////////////////////////////////////////////////////////////////////////////// 18859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 189bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 190bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 191a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org SkGPipeCanvas(SkGPipeController*, SkWriter32*, uint32_t flags, 192a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height); 193bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 194bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 19559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com /** 19659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * Called when nothing else is to be written to the stream. Any repeated 19759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * calls are ignored. 19859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * 19959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * @param notifyReaders Whether to send a message to the reader(s) that 20059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * the writer is through sending commands. Should generally be true, 20159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * unless there is an error which prevents further messages from 20259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * being sent. 20359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com */ 20459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com void finish(bool notifyReaders) { 20559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (fDone) { 20659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com return; 20759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 20859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (notifyReaders && this->needOpBytes()) { 20959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->writeOp(kDone_DrawOp); 21059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->doNotify(); 211bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 21259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (shouldFlattenBitmaps(fFlags)) { 21359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // The following circular references exist: 21459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // fFlattenableHeap -> fWriteBuffer -> fBitmapStorage -> fExternalStorage -> fCanvas 21559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // fBitmapHeap -> fExternalStorage -> fCanvas 21659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // fFlattenableHeap -> fBitmapStorage -> fExternalStorage -> fCanvas 21759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 21859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // Break them all by destroying the final link to this SkGPipeCanvas. 21959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fBitmapShuttle->removeCanvas(); 22059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 22159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fDone = true; 222bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 223bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 22477eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org void flushRecording(bool detachCurrentBlock); 2252e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org size_t freeMemoryIfPossible(size_t bytesToFree); 22677eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 22715011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com size_t storageAllocatedForRecording() { 228d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->bytesAllocated(); 22915011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com } 23015011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // overrides from SkCanvas 232fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org virtual bool isDrawingToLayer() const SK_OVERRIDE; 2333b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void clear(SkColor) SK_OVERRIDE; 2343b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 235bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 2363b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 2374ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE; 2387ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 2394ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE; 2407ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 241bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 2423b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 2437112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src, 2447475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com const SkRect& dst, const SkPaint* paint, 245eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org DrawBitmapRectFlags flags) SK_OVERRIDE; 246bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 2473b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 2485a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 2495a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint = NULL) SK_OVERRIDE; 250bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawSprite(const SkBitmap&, int left, int top, 2513b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint*) SK_OVERRIDE; 2523b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; 253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 255bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 256bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 2573b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 2583b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawData(const void*, size_t) SK_OVERRIDE; 2590a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 2600a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 2610a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void endCommentGroup() SK_OVERRIDE; 262bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com /** 2643e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * Flatten an SkBitmap to send to the reader, where it will be referenced 2653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * according to slot. 2663e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com */ 2673e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool shuttleBitmap(const SkBitmap&, int32_t slot); 268ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 269ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgprotected: 270e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual void willSave(SaveFlags) SK_OVERRIDE; 271e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE; 272e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual void willRestore() SK_OVERRIDE; 273e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 27444c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org virtual void didConcat(const SkMatrix&) SK_OVERRIDE; 27544c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 27644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org 277ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 278e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 279e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint&) SK_OVERRIDE; 280e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 281e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint&) SK_OVERRIDE; 282e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 283e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint&) SK_OVERRIDE; 284e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 285e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE; 286ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 2878f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2888f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2898f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2908f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE; 2918f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com 292bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 293d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordTranslate(const SkMatrix&); 294d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordScale(const SkMatrix&); 295d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordConcat(const SkMatrix&); 296d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org 297fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org enum { 298fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org kNoSaveLayer = -1, 299fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org }; 3000c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkNamedFactorySet* fFactorySet; 3010c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com int fFirstSaveLayerStackLevel; 302d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkBitmapHeap* fBitmapHeap; 303acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 3040c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkWriter32& fWriter; 3050c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBlockSize; // amount allocated for writer 3060c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBytesNotified; 3070c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com bool fDone; 3083e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const uint32_t fFlags; 309bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3100c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkRefCntSet fTypefaceSet; 311f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 312f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 313f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 314acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 315bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 31774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 318acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 319bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 320bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 321acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 323acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 324acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 325acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 3264469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t bytes = fWriter.bytesWritten() - fBytesNotified; 32716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (bytes > 0) { 32816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fController->notifyWritten(bytes); 32916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBytesNotified += bytes; 33016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 331acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 332acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 333b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // Should be called after any calls to an SkFlatDictionary::findAndReplace 3350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // if a new SkFlatData was added when in cross process mode 3360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com void flattenFactoryNames(); 3370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 33859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com FlattenableHeap fFlattenableHeap; 33959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com FlatDictionary fFlatDictionary; 34059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkAutoTUnref<BitmapShuttle> fBitmapShuttle; 34159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com int fCurrFlatIndex[kCount_PaintFlats]; 34259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 343b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 344b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3453e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // Common code used by drawBitmap*. Behaves differently depending on the 3463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // type of SkBitmapHeap being used, which is determined by the flags used. 3473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, 3483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, const SkPaint* paint); 34958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 35031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 35131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 352bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 353acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com class AutoPipeNotify { 354acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com public: 355acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 356acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com ~AutoPipeNotify() { fCanvas->doNotify(); } 357acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com private: 358acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeCanvas* fCanvas; 359acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com }; 360acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com friend class AutoPipeNotify; 361acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 362bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 363bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3650c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comvoid SkGPipeCanvas::flattenFactoryNames() { 3660c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com const char* name; 3670c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) { 3680c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t len = strlen(name); 3690c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (this->needOpBytes(len)) { 3700c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Factory_DrawOp); 3710c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.writeString(name, len); 3720c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3730c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3740c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 3750c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 3763e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { 377565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 3788b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkWriteBuffer buffer; 3793e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.setNamedFactoryRecorder(fFactorySet); 38074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com buffer.writeBitmap(bm); 3813e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->flattenFactoryNames(); 382b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org size_t size = buffer.bytesWritten(); 3833e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->needOpBytes(size)) { 3843e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->writeOp(kDef_Bitmap_DrawOp, 0, slot); 3853e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com void* dst = static_cast<void*>(fWriter.reserve(size)); 3863e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.writeToMemory(dst); 3873e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return true; 3884dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 3893e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return false; 390d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com} 391d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com 392b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 393d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com// return ~(index-base-1) if an old flattenable was replaced 394b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 395d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com SkASSERT(!fDone && fBitmapHeap != NULL); 396b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 397b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 398b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 399b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 400d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->deferAddingOwners(); 4014dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool added, replaced; 402664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHeap.flatToReplace(), 403664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com &added, &replaced); 404d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->endAddingOwnersDeferral(added); 4054dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int index = flat->index(); 4060c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (added) { 4070c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (isCrossProcess(fFlags)) { 4080c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->flattenFactoryNames(); 4090c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 4100c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t flatSize = flat->flatSize(); 4110c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (this->needOpBytes(flatSize)) { 4120c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, index); 4130c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.write(flat->data(), flatSize); 4140c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 415b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 4164dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (replaced) { 4174dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com index = ~index; 418d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 4194dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return index; 420b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 421b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 422bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 424acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define MIN_BLOCK_SIZE (16 * 1024) 4254dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define BITMAPS_TO_KEEP 5 4264dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define FLATTENABLES_TO_KEEP 10 427bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 428acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 429d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkWriter32* writer, uint32_t flags, 430a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) 431403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org : SkCanvas(width, height) 432403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFactorySet(isCrossProcess(flags) ? SkNEW(SkNamedFactorySet) : NULL) 433403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fWriter(*writer) 434403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlags(flags) 435403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, isCrossProcess(flags)) 436403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlatDictionary(&fFlattenableHeap) 437403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org{ 438acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 439bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 440acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 4415a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fBytesNotified = 0; 442fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = kNoSaveLayer; 443b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); 444acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 445565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com // Tell the reader the appropriate flags to use. 446565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com if (this->needOpBytes()) { 447565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com this->writeOp(kReportFlags_DrawOp, fFlags, 0); 448565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 449d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 45010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (shouldFlattenBitmaps(flags)) { 45159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fBitmapShuttle.reset(SkNEW_ARGS(BitmapShuttle, (this))); 45259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO_KEEP)); 45310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } else { 454d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, 4553e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com (BITMAPS_TO_KEEP, controller->numberOfReaders())); 45610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(sizeof(void*))) { 457d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com this->writeOp(kShareBitmapHeap_DrawOp); 458d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fWriter.writePtr(static_cast<void*>(fBitmapHeap)); 45910dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 46010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 461d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fFlattenableHeap.setBitmapStorage(fBitmapHeap); 46210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com this->doNotify(); 463bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 464bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 465bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 46659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->finish(true); 4670c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkSafeUnref(fFactorySet); 468d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkSafeUnref(fBitmapHeap); 469bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 470bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 471acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 472acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 473acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 474acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 475acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 476acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 4774469938e92d779dff05e745559e67907bbf21e78reed@google.com if (fWriter.bytesWritten() + needed > fBlockSize) { 4785a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // Before we wipe out any data that has already been written, read it 4795a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com // out. 4805a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->doNotify(); 481b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org size_t blockSize = SkTMax<size_t>(MIN_BLOCK_SIZE, needed); 4825a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com void* block = fController->requestBlock(blockSize, &fBlockSize); 483acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 48459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // Do not notify the readers, which would call this function again. 48559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->finish(false); 486acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 487acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 488460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com SkASSERT(SkIsAlign4(fBlockSize)); 489acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 490acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 491acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 492acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 493acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 494acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 495f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 496f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 497f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 498f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 499f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 500f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 501f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 502f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 503bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 504f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 505f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 506f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 507f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 508f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 509f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 510f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 511bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 512bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 513acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com#define NOTIFY_SETUP(canvas) \ 514acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com AutoPipeNotify apn(canvas) 515acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 516e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkGPipeCanvas::willSave(SaveFlags flags) { 517acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 518acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 519acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 520acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 521e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 522e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSave(flags); 523bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 524bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 525e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkGPipeCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint, 526e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org SaveFlags saveFlags) { 527acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 528acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 529bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 53074b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 531bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 532bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 533acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 534bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 535bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 536bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 53731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 538bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 539bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 540acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 541acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 542acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 543acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 544acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 545bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 54674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 547fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org if (kNoSaveLayer == fFirstSaveLayerStackLevel){ 548fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = this->getSaveCount(); 549fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org } 550e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 551e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSaveLayer(bounds, paint, saveFlags); 552e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org // we don't create a layer 553e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org return kNoLayer_SaveLayerStrategy; 554bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 555bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 556e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkGPipeCanvas::willRestore() { 557acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 558acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 559acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 560acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 561fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 562e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org if (this->getSaveCount() - 1 == fFirstSaveLayerStackLevel){ 563fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = kNoSaveLayer; 564fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org } 565e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 566e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willRestore(); 567fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org} 568fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 569fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.orgbool SkGPipeCanvas::isDrawingToLayer() const { 570fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org return kNoSaveLayer != fFirstSaveLayerStackLevel; 571bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 572bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 573d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordTranslate(const SkMatrix& m) { 574d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(2 * sizeof(SkScalar))) { 575d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kTranslate_DrawOp); 576d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getTranslateX()); 577d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getTranslateY()); 578bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 579bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 580bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 581d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordScale(const SkMatrix& m) { 582d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(2 * sizeof(SkScalar))) { 583d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kScale_DrawOp); 584d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getScaleX()); 585d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getScaleY()); 586bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 587bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 588bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 589d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordConcat(const SkMatrix& m) { 590d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(m.writeToMemory(NULL))) { 591d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kConcat_DrawOp); 592d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeMatrix(m); 593bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 594bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 595bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 59644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkGPipeCanvas::didConcat(const SkMatrix& matrix) { 597bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 598acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 599d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org switch (matrix.getType()) { 600d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org case SkMatrix::kTranslate_Mask: 601d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordTranslate(matrix); 602d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 603d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org case SkMatrix::kScale_Mask: 604d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordScale(matrix); 605d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 606d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org default: 607d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordConcat(matrix); 608d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 609acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 610bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 611d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org 61244c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didConcat(matrix); 613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 61544c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) { 616acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 61794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(matrix.writeToMemory(NULL))) { 618acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 6192b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 620acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 62144c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didSetMatrix(matrix); 622bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 623bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6248f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp, 6258f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 626acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 627460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(sizeof(SkRect))) { 6288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6298f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 632460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipRect_DrawOp, flags, rgnOp); 633acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 634acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6358f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(rect, rgnOp, edgeStyle); 636bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 637bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6388f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op rgnOp, 6398f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 6404ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com NOTIFY_SETUP(this); 6414ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 6428f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6438f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6448f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6458f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 6464ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kClipRRect_DrawOp, flags, rgnOp); 6474ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 6484ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 6498f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle); 6504ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 6514ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 6528f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp, 6538f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 654acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 655460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 6568f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6578f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6588f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6598f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 660460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipPath_DrawOp, flags, rgnOp); 66194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 662acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 663bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 6648f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle); 665bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 666bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6678f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 668acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 66994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(region.writeToMemory(NULL))) { 670acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 6712b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeRegion(region); 672acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6738f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRegion(region, rgnOp); 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 678bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 679acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 680bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 681bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 682bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 683bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 684acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 685acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 686acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 687acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 688acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 689bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 690bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 691bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 692bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 693acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 69431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 695acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 69631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 697acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 698bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 699bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 700bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 7018b169311b59ab84e8ca6f3630a1e960cc1be751erobertphillips@google.com const SkPoint pts[], const SkPaint& paint) { 702bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 703acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 70431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 705acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 70631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 707b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(count)); 708acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 709acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 710bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 711bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 712bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7134ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkGPipeCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 7144ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com NOTIFY_SETUP(this); 7154ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7164ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 7174ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawOval_DrawOp); 7184ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRect(rect); 7194ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7204ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7214ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 7227ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 723acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 72431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 725acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 72631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 727acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 728acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 729bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 730bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7314ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkGPipeCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 7324ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com NOTIFY_SETUP(this); 7334ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7344ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 7354ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawRRect_DrawOp); 7364ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 7374ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7384ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7394ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 740ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgvoid SkGPipeCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, 741ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org const SkPaint& paint) { 742ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org NOTIFY_SETUP(this); 743ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->writePaint(paint); 744ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org if (this->needOpBytes(kSizeOfFlatRRect * 2)) { 745ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->writeOp(kDrawDRRect_DrawOp); 746ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org fWriter.writeRRect(outer); 747ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org fWriter.writeRRect(inner); 748ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org } 749ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org} 750ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 7517ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 752acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 75331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 75494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 75531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 75694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 757acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 758bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 759bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7603e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, 7613e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com unsigned flags, 7623e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, 7633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const SkPaint* paint) { 76458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com if (paint != NULL) { 765460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags |= kDrawBitmap_HasPaint_DrawOpFlag; 7665a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writePaint(*paint); 7675a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 76810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(opBytesNeeded)) { 769d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com SkASSERT(fBitmapHeap != NULL); 770d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com int32_t bitmapIndex = fBitmapHeap->insert(bm); 771d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) { 772d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return false; 773d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com } 77410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com this->writeOp(op, flags, bitmapIndex); 77558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return true; 776565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 77758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return false; 77858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com} 77958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 78058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 78158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkPaint* paint) { 78258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com NOTIFY_SETUP(this); 78358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkScalar) * 2; 78458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7853e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint)) { 7865a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(left); 7875a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(top); 7885a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 789bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 790bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7917112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comvoid SkGPipeCanvas::drawBitmapRectToRect(const SkBitmap& bm, const SkRect* src, 792eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org const SkRect& dst, const SkPaint* paint, 793eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org DrawBitmapRectFlags dbmrFlags) { 79416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 79558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkRect); 79616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com bool hasSrc = src != NULL; 79758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com unsigned flags; 79816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 799460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags = kDrawBitmap_HasSrcRect_DrawOpFlag; 80016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com opBytesNeeded += sizeof(int32_t) * 4; 80158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } else { 80258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com flags = 0; 80316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 804eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org if (dbmrFlags & kBleed_DrawBitmapRectFlag) { 805eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org flags |= kDrawBitmap_Bleed_DrawOpFlag; 806eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org } 807d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8087112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com if (this->commonDrawBitmap(bm, kDrawBitmapRectToRect_DrawOp, flags, opBytesNeeded, paint)) { 80916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 8107112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com fWriter.writeRect(*src); 81116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 81216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 81316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 814bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 815bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 81658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap& bm, const SkMatrix& matrix, 81758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkPaint* paint) { 81858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com NOTIFY_SETUP(this); 81958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = matrix.writeToMemory(NULL); 820d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8213e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapMatrix_DrawOp, 0, opBytesNeeded, paint)) { 82258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com fWriter.writeMatrix(matrix); 82358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 824bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 82516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 82616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawBitmapNine(const SkBitmap& bm, const SkIRect& center, 8275a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint) { 82816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 82958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 4 + sizeof(SkRect); 83016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8313e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapNine_DrawOp, 0, opBytesNeeded, paint)) { 83216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fLeft); 83316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fTop); 83416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fRight); 83516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fBottom); 83616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 83716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 8385a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com} 83916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 84016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap& bm, int left, int top, 84116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkPaint* paint) { 84216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com NOTIFY_SETUP(this); 84358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 2; 84416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8453e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint)) { 84616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(left); 84716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(top); 84816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 849bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 850bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 851e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 852e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 853bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 854acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 85531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 856acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 85731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 858b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 859acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 860acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 861acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 862acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 863bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 864bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 865bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 866e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 867e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 868bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 869acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 87031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 871bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 872acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 87331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 874b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 875acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 876acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 877acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 878acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 879bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 880bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 881bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 882e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 883e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint& paint) { 884bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 885acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 88631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 887bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 888acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 88931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 890b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 891acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 892acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 893acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 894acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 895acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 896bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 897bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 898bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 899e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 900e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint& paint) { 901bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 902acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 903bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 90494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL); 905bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 906bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 90794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size += matrix->writeToMemory(NULL); 908bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 90931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 910acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 91131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 912bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 913b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 914acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 915bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 91694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 917acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 9182b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(*matrix); 919acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 920bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 921bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 922bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 923bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 924bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPicture(SkPicture& picture) { 9250faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 9260faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->INHERITED::drawPicture(picture); 927bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 928bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 92985e143c33c214e54187aa28146aa7666961a0d17reed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount, 930bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 93185e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkColor colors[], SkXfermode* xfer, 932bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 933bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 934bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 935bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 936bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 937bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 938acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 939acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 4 + vertexCount * sizeof(SkPoint); 94031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 941bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 942bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 943bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 944acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 945bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 946bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 947bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 948acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 949bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 950bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (indices && indexCount > 0) { 951bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasIndices_DrawOpFlag; 952acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += 4 + SkAlign4(indexCount * sizeof(uint16_t)); 953bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 95485e143c33c214e54187aa28146aa7666961a0d17reed@google.com if (xfer && !SkXfermode::IsMode(xfer, SkXfermode::kModulate_Mode)) { 95585e143c33c214e54187aa28146aa7666961a0d17reed@google.com flags |= kDrawVertices_HasXfermode_DrawOpFlag; 95685e143c33c214e54187aa28146aa7666961a0d17reed@google.com size += sizeof(int32_t); // mode enum 95785e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 95874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 959acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 96031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 96185e143c33c214e54187aa28146aa7666961a0d17reed@google.com fWriter.write32(vmode); 962acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 963acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 964acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (texs) { 965acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 966acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 967acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (colors) { 968acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 969acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 97085e143c33c214e54187aa28146aa7666961a0d17reed@google.com if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { 97185e143c33c214e54187aa28146aa7666961a0d17reed@google.com SkXfermode::Mode mode = SkXfermode::kModulate_Mode; 97285e143c33c214e54187aa28146aa7666961a0d17reed@google.com (void)xfer->asMode(&mode); 97385e143c33c214e54187aa28146aa7666961a0d17reed@google.com fWriter.write32(mode); 97485e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 975acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (indices && indexCount > 0) { 976acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 977acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 978acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 979bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 980bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 981bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 982acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 983acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 984acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com NOTIFY_SETUP(this); 985bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 986bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 987bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 988bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 989acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 990acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 991acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 992b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(size)); 993acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 994bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fWriter.writePad(ptr, size); 995bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 996bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 997bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 998bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 9990a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::beginCommentGroup(const char* description) { 10000a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 10010a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 10020a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 10030a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::addComment(const char* kywd, const char* value) { 10040a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 10050a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 10060a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 10070a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::endCommentGroup() { 10080a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 10090a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 10100a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 101177eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.orgvoid SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { 101277eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org doNotify(); 101377eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org if (detachCurrentBlock) { 101477eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org // force a new block to be requested for the next recorded command 1015d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com fBlockSize = 0; 101677eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org } 101777eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 101877eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 10192e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { 1020d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesToFree); 10212e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 10222e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 1023bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1024bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1025bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 1026bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 1027bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 1028bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 1029bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 1030bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 1031bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 1032bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1033bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 103431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 1035d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com if (fDone) { 1036d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return; 1037d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com } 103831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 1039bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 1040bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 1041bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1042bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 1043bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 1044f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 1045bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1046bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 1047bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 1048bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 1049f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 1050bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 105185faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org if (base.getFilterLevel() != paint.getFilterLevel()) { 105285faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org *ptr++ = PaintOp_packOpData(kFilterLevel_PaintOp, paint.getFilterLevel()); 105385faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org base.setFilterLevel(paint.getFilterLevel()); 105485faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org } 1055bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 1056bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 1057f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 1058bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1059bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 1060bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 1061f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 1062bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1063bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 1064bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 1065f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 1066bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1067bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 1068bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 1069bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 1070f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 1071bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1072bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 1073bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 1074bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 1075f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 1076bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1077bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 1078bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 1079f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 1080bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1081bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 1082bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 1083f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 1084bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1085bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 1086bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 1087f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 1088bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1089bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 1090bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 1091bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 1092f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 1093bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1094bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 1095bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 1096bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 1097f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 1098bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1099bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 1100bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 1101bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 1102f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 1103f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 1104f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 1105f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 11060c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (isCrossProcess(fFlags)) { 11073cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 11083cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 11093cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } else if (this->needOpBytes(sizeof(void*))) { 11103cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // Add to the set for ref counting. 11113cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fTypefaceSet.add(paint.getTypeface()); 11123cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // It is safe to write the typeface to the stream before the rest 11133cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // of the paint unless we ever send a kReset_PaintOp, which we 11143cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // currently never do. 11153cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com this->writeOp(kSetTypeface_DrawOp); 11163cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fWriter.writePtr(paint.getTypeface()); 11173cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } 1118f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 1119bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1120bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 11214dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // This is a new paint, so all old flats can be safely purged, if necessary. 11224dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markAllFlatsSafeToDelete(); 1123b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 1124b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 1125d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com bool replaced = index < 0; 1126d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (replaced) { 1127d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com index = ~index; 1128d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 11294dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Store the index of any flat that needs to be kept. 0 means no flat. 11304dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (index > 0) { 11314dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markFlatForKeeping(index); 11324dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 11334dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkASSERT(index >= 0 && index <= fFlatDictionary.count()); 1134d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (index != fCurrFlatIndex[i] || replaced) { 1135b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 1136b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 1137b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1138b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1139b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 1140acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 1141acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 1142b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org this->writeOp(kPaintOp_DrawOp, 0, SkToU32(size)); 1143b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 1144bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 1145b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 1146bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1147bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 11480cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com 11490cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com // 11500cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com // Do these after we've written kPaintOp_DrawOp 1151fbc58a305518fe611113a51649bf557c991ac8cfskia.committer@gmail.com 11520cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com if (base.getAnnotation() != paint.getAnnotation()) { 11530cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com if (NULL == paint.getAnnotation()) { 115489ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (this->needOpBytes()) { 115589ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org this->writeOp(kSetAnnotation_DrawOp, 0, 0); 115689ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org } 11570cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } else { 11588b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkWriteBuffer buffer; 11590cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com paint.getAnnotation()->writeToBuffer(buffer); 116089ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org const size_t size = buffer.bytesWritten(); 116189ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (this->needOpBytes(size)) { 1162b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org this->writeOp(kSetAnnotation_DrawOp, 0, SkToU32(size)); 116389ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org buffer.writeToMemory(fWriter.reserve(size)); 116489ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org } 11650cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 116640258a5be9afe3820bdc6aed4dd94abff3160d94commit-bot@chromium.org base.setAnnotation(paint.getAnnotation()); 11670cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 1168bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1169bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1170bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1171bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1172bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 1173bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 11743cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeController::~SkGPipeController() { 11753cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkSafeUnref(fCanvas); 11763cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 11773cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11783cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comvoid SkGPipeController::setCanvas(SkGPipeCanvas* canvas) { 11793cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkRefCnt_SafeAssign(fCanvas, canvas); 11803cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 11813cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11823cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com/////////////////////////////////////////////////////////////////////////////// 11833cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11843cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeWriter::SkGPipeWriter() 11850c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com: fWriter(0) { 1186bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1187bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1188bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1189bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 1190acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 1191bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1192bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1193a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.orgSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t flags, 1194a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) { 1195bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 1196acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 1197a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, flags, width, height)); 1198bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 11993cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com controller->setCanvas(fCanvas); 1200bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 1201bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1202bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1203bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 1204bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 120559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas->finish(true); 1206bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 1207bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1208bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1209bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1210bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 12112e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgvoid SkGPipeWriter::flushRecording(bool detachCurrentBlock) { 12122e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 12132e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org fCanvas->flushRecording(detachCurrentBlock); 12142e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 12152e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 12162e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 12172e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::freeMemoryIfPossible(size_t bytesToFree) { 12182e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 12192e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return fCanvas->freeMemoryIfPossible(bytesToFree); 12202e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 12212e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return 0; 122277eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 122377eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 12242e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::storageAllocatedForRecording() const { 122515011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com return NULL == fCanvas ? 0 : fCanvas->storageAllocatedForRecording(); 122615011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com} 122715011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 12283e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com/////////////////////////////////////////////////////////////////////////////// 12293e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 12303e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::BitmapShuttle(SkGPipeCanvas* canvas) { 12313e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com SkASSERT(canvas != NULL); 12323e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas = canvas; 12333e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas->ref(); 12343e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 12353e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 12363e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::~BitmapShuttle() { 123759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->removeCanvas(); 12383e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 12393e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 12403e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool BitmapShuttle::insert(const SkBitmap& bitmap, int32_t slot) { 124159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkASSERT(fCanvas != NULL); 12423e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return fCanvas->shuttleBitmap(bitmap, slot); 12433e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 124459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 124559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comvoid BitmapShuttle::removeCanvas() { 124659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (NULL == fCanvas) { 124759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com return; 124859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 124959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas->unref(); 125059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas = NULL; 125159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com} 1252