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; 252bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual void drawVertices(VertexMode, int vertexCount, 253bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 254bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkColor colors[], SkXfermode*, 255bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 2563b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com const SkPaint&) SK_OVERRIDE; 2573b45cd53f0c4c9b810b6383f529a72ecfa4e6e7fscroggo@google.com virtual void drawData(const void*, size_t) SK_OVERRIDE; 2580a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 2590a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 2600a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com virtual void endCommentGroup() SK_OVERRIDE; 261bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2623e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com /** 2633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * Flatten an SkBitmap to send to the reader, where it will be referenced 2643e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * according to slot. 2653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com */ 2663e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool shuttleBitmap(const SkBitmap&, int32_t slot); 267ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 268ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgprotected: 269e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual void willSave(SaveFlags) SK_OVERRIDE; 270e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE; 271e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org virtual void willRestore() SK_OVERRIDE; 272e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 27344c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org virtual void didConcat(const SkMatrix&) SK_OVERRIDE; 27444c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 27544c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org 276ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 277e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 278e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint&) SK_OVERRIDE; 279e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 280e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint&) SK_OVERRIDE; 281e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 282e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint&) SK_OVERRIDE; 283e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 284e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE; 285ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 2868f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2878f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2888f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 2898f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE; 2908f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com 2919b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips virtual void onDrawPicture(const SkPicture* picture) SK_OVERRIDE; 2929b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips 293bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comprivate: 294d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordTranslate(const SkMatrix&); 295d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordScale(const SkMatrix&); 296d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org void recordConcat(const SkMatrix&); 297d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org 298fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org enum { 299fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org kNoSaveLayer = -1, 300fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org }; 3010c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkNamedFactorySet* fFactorySet; 3020c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com int fFirstSaveLayerStackLevel; 303d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkBitmapHeap* fBitmapHeap; 304acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 3050c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkWriter32& fWriter; 3060c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBlockSize; // amount allocated for writer 3070c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBytesNotified; 3080c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com bool fDone; 3093e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const uint32_t fFlags; 310bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3110c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkRefCntSet fTypefaceSet; 312f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 313f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 314f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 315acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 316bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 317bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 31874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 319acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 320bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 321bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 323acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 324acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 325acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 326acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 3274469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t bytes = fWriter.bytesWritten() - fBytesNotified; 32816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (bytes > 0) { 32916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fController->notifyWritten(bytes); 33016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBytesNotified += bytes; 33116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 332acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 333acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 334b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // Should be called after any calls to an SkFlatDictionary::findAndReplace 3360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // if a new SkFlatData was added when in cross process mode 3370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com void flattenFactoryNames(); 3380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 33959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com FlattenableHeap fFlattenableHeap; 34059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com FlatDictionary fFlatDictionary; 34159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkAutoTUnref<BitmapShuttle> fBitmapShuttle; 34259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com int fCurrFlatIndex[kCount_PaintFlats]; 34359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 344b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 345b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // Common code used by drawBitmap*. Behaves differently depending on the 3473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // type of SkBitmapHeap being used, which is determined by the flags used. 3483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, 3493e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, const SkPaint* paint); 35058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 35131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 35231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 353bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 354f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org class AutoPipeNotify { 355f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org public: 356f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 357f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org ~AutoPipeNotify() { fCanvas->doNotify(); } 358f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org private: 359f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org SkGPipeCanvas* fCanvas; 360f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org }; 361f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org friend class AutoPipeNotify; 362f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org 363bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 365bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3660c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comvoid SkGPipeCanvas::flattenFactoryNames() { 3670c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com const char* name; 3680c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) { 3690c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t len = strlen(name); 370d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (this->needOpBytes(SkWriter32::WriteStringSize(name, len))) { 3710c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Factory_DrawOp); 3720c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.writeString(name, len); 3730c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3740c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3750c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 3760c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 3773e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { 378565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 3798b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkWriteBuffer buffer; 3803e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.setNamedFactoryRecorder(fFactorySet); 38174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com buffer.writeBitmap(bm); 3823e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->flattenFactoryNames(); 383b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org size_t size = buffer.bytesWritten(); 3843e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->needOpBytes(size)) { 3853e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->writeOp(kDef_Bitmap_DrawOp, 0, slot); 3863e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com void* dst = static_cast<void*>(fWriter.reserve(size)); 3873e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.writeToMemory(dst); 3883e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return true; 3894dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 3903e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return false; 391d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com} 392d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com 393b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 394d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com// return ~(index-base-1) if an old flattenable was replaced 395b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 396d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com SkASSERT(!fDone && fBitmapHeap != NULL); 397b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 398b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 399b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 400b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 401d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->deferAddingOwners(); 4024dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool added, replaced; 403664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHeap.flatToReplace(), 404664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com &added, &replaced); 405d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->endAddingOwnersDeferral(added); 4064dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int index = flat->index(); 4070c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (added) { 4080c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (isCrossProcess(fFlags)) { 4090c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->flattenFactoryNames(); 4100c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 4110c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t flatSize = flat->flatSize(); 4120c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (this->needOpBytes(flatSize)) { 4130c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, index); 4140c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.write(flat->data(), flatSize); 4150c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 416b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 4174dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (replaced) { 4184dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com index = ~index; 419d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 4204dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return index; 421b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 422b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 423bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 425f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org#define MIN_BLOCK_SIZE (16 * 1024) 4264dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define BITMAPS_TO_KEEP 5 4274dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define FLATTENABLES_TO_KEEP 10 428bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 429acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 430d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkWriter32* writer, uint32_t flags, 431a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) 432403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org : SkCanvas(width, height) 433403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFactorySet(isCrossProcess(flags) ? SkNEW(SkNamedFactorySet) : NULL) 434403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fWriter(*writer) 435403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlags(flags) 436403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, isCrossProcess(flags)) 437403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlatDictionary(&fFlattenableHeap) 438403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org{ 439acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 440bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 441acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 4425a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fBytesNotified = 0; 443fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = kNoSaveLayer; 444b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com sk_bzero(fCurrFlatIndex, sizeof(fCurrFlatIndex)); 445acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 446565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com // Tell the reader the appropriate flags to use. 447565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com if (this->needOpBytes()) { 448565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com this->writeOp(kReportFlags_DrawOp, fFlags, 0); 449565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 450d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 45110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (shouldFlattenBitmaps(flags)) { 45259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fBitmapShuttle.reset(SkNEW_ARGS(BitmapShuttle, (this))); 45359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO_KEEP)); 45410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } else { 455d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, 4563e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com (BITMAPS_TO_KEEP, controller->numberOfReaders())); 45710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(sizeof(void*))) { 458d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com this->writeOp(kShareBitmapHeap_DrawOp); 459d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fWriter.writePtr(static_cast<void*>(fBitmapHeap)); 46010dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 46110dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com } 462d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fFlattenableHeap.setBitmapStorage(fBitmapHeap); 463f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org this->doNotify(); 464bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 465bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 466bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 46759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->finish(true); 4680c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkSafeUnref(fFactorySet); 469d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkSafeUnref(fBitmapHeap); 470bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 471bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 472acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 473acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 474acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 475acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 476acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 477acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 478d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org needed = SkTMax<size_t>(MIN_BLOCK_SIZE, needed); 479d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org needed = SkAlign4(needed); 4804469938e92d779dff05e745559e67907bbf21e78reed@google.com if (fWriter.bytesWritten() + needed > fBlockSize) { 481f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org // Before we wipe out any data that has already been written, read it 482f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org // out. 4835a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->doNotify(); 484d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org void* block = fController->requestBlock(needed, &fBlockSize); 485acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 48659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // Do not notify the readers, which would call this function again. 48759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->finish(false); 488acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 489acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 490460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com SkASSERT(SkIsAlign4(fBlockSize)); 491acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 492acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 493acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 494acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 495acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 496acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 497f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 498f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 499f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 500f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 501f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 502f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 503f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 504f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 505bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 506f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 507f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 508f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 509f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 510f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 511f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 512f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 513bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 514bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 515f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org#define NOTIFY_SETUP(canvas) \ 516f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org AutoPipeNotify apn(canvas) 517f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org 518e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkGPipeCanvas::willSave(SaveFlags flags) { 519f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 520acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 521acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSave_DrawOp, 0, flags); 522acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 523e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 524e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSave(flags); 525bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 526bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 527e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkGPipeCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint, 528e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org SaveFlags saveFlags) { 529f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 530acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 531bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 53274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 533bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 534bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 535acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 536bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 537bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 538bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 53931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 540bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 541bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 542acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 543acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 544acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 545acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 546acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 547bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 54874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 549fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org if (kNoSaveLayer == fFirstSaveLayerStackLevel){ 550fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = this->getSaveCount(); 551fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org } 552e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 553e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSaveLayer(bounds, paint, saveFlags); 554e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org // we don't create a layer 555e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org return kNoLayer_SaveLayerStrategy; 556bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 557bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 558e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkGPipeCanvas::willRestore() { 559f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 560acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 561acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 562acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 563fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 564e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org if (this->getSaveCount() - 1 == fFirstSaveLayerStackLevel){ 565fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org fFirstSaveLayerStackLevel = kNoSaveLayer; 566fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org } 567e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 568e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willRestore(); 569fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org} 570fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 571fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.orgbool SkGPipeCanvas::isDrawingToLayer() const { 572fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org return kNoSaveLayer != fFirstSaveLayerStackLevel; 573bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 574bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 575d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordTranslate(const SkMatrix& m) { 576d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(2 * sizeof(SkScalar))) { 577d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kTranslate_DrawOp); 578d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getTranslateX()); 579d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getTranslateY()); 580bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 581bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 582bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 583d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordScale(const SkMatrix& m) { 584d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(2 * sizeof(SkScalar))) { 585d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kScale_DrawOp); 586d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getScaleX()); 587d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getScaleY()); 588bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 589bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 590bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 591d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordConcat(const SkMatrix& m) { 592d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(m.writeToMemory(NULL))) { 593d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kConcat_DrawOp); 594d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeMatrix(m); 595bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 596bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 597bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 59844c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkGPipeCanvas::didConcat(const SkMatrix& matrix) { 599bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 600f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 601d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org switch (matrix.getType()) { 602d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org case SkMatrix::kTranslate_Mask: 603d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordTranslate(matrix); 604d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 605d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org case SkMatrix::kScale_Mask: 606d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordScale(matrix); 607d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 608d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org default: 609d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordConcat(matrix); 610d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 611acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 612bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 613d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org 61444c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didConcat(matrix); 615bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 616bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 61744c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) { 618f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 61994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(matrix.writeToMemory(NULL))) { 620acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 6212b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 622acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 62344c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didSetMatrix(matrix); 624bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 625bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6268f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp, 6278f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 628f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 629460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(sizeof(SkRect))) { 6308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6328f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6338f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 634460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipRect_DrawOp, flags, rgnOp); 635acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 636acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6378f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(rect, rgnOp, edgeStyle); 638bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 639bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6408f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op rgnOp, 6418f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 642f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 6434ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 6448f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6458f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6468f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6478f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 6484ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kClipRRect_DrawOp, flags, rgnOp); 6494ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 6504ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 6518f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle); 6524ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 6534ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 6548f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp, 6558f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 656f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 657460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 6588f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6598f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6608f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6618f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 662460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipPath_DrawOp, flags, rgnOp); 66394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 664acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 665bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 6668f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle); 667bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 668bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6698f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 670f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 67194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(region.writeToMemory(NULL))) { 672acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 6732b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeRegion(region); 674acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6758f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRegion(region, rgnOp); 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 678bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 679bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 680bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::clear(SkColor color) { 681f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 682bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 683bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (color) { 684bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kClear_HasColor_DrawOpFlag; 685bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 686acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkColor))) { 687acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawClear_DrawOp, flags, 0); 688acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (color) { 689acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(color); 690acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 691bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 692bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 693bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 694bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPaint(const SkPaint& paint) { 695f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 69631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 697acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 69831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 699acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 700bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 701bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 702bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeCanvas::drawPoints(PointMode mode, size_t count, 7038b169311b59ab84e8ca6f3630a1e960cc1be751erobertphillips@google.com const SkPoint pts[], const SkPaint& paint) { 704bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 705f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 70631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 707acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 70831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 709b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(count)); 710acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 711acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 712bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 713bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 714bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7154ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkGPipeCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 716f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 7174ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7184ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 7194ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawOval_DrawOp); 7204ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRect(rect); 7214ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7224ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7234ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 7247ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 725f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 72631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 727acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 72831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 729acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 730acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 731bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 732bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7334ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkGPipeCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 734f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 7354ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7364ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 7374ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawRRect_DrawOp); 7384ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 7394ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7404ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7414ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 742ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgvoid SkGPipeCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, 743ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org const SkPaint& paint) { 744f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 745ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->writePaint(paint); 746ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org if (this->needOpBytes(kSizeOfFlatRRect * 2)) { 747ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->writeOp(kDrawDRRect_DrawOp); 748ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org fWriter.writeRRect(outer); 749ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org fWriter.writeRRect(inner); 750ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org } 751ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org} 752ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 7537ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 754f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 75531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 75694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 75731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 75894e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 759acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 760bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 761bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7623e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, 7633e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com unsigned flags, 7643e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, 7653e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const SkPaint* paint) { 76644803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org if (fDone) { 76744803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org return false; 76844803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org } 76944803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org 77058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com if (paint != NULL) { 771460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags |= kDrawBitmap_HasPaint_DrawOpFlag; 7725a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writePaint(*paint); 7735a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 77444803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org // This needs to run first so its calls to needOpBytes() and its writes 77544803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org // don't interlace with the needOpBytes() and write below. 77644803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org SkASSERT(fBitmapHeap != NULL); 77744803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org int32_t bitmapIndex = fBitmapHeap->insert(bm); 77844803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) { 77944803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org return false; 78044803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org } 78144803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org 78210dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(opBytesNeeded)) { 78310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com this->writeOp(op, flags, bitmapIndex); 78458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return true; 785565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 78658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return false; 78758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com} 78858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 78958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comvoid SkGPipeCanvas::drawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 79058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkPaint* paint) { 791f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 79258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkScalar) * 2; 79358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7943e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint)) { 7955a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(left); 7965a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(top); 7975a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 798bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 799bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 8007112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comvoid SkGPipeCanvas::drawBitmapRectToRect(const SkBitmap& bm, const SkRect* src, 801eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org const SkRect& dst, const SkPaint* paint, 802eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org DrawBitmapRectFlags dbmrFlags) { 803f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 80458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkRect); 80516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com bool hasSrc = src != NULL; 80658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com unsigned flags; 80716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 808460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags = kDrawBitmap_HasSrcRect_DrawOpFlag; 80916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com opBytesNeeded += sizeof(int32_t) * 4; 81058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } else { 81158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com flags = 0; 81216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 813eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org if (dbmrFlags & kBleed_DrawBitmapRectFlag) { 814eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org flags |= kDrawBitmap_Bleed_DrawOpFlag; 815eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org } 816d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8177112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com if (this->commonDrawBitmap(bm, kDrawBitmapRectToRect_DrawOp, flags, opBytesNeeded, paint)) { 81816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 8197112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com fWriter.writeRect(*src); 82016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 82116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 82216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 823bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 824bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 82558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comvoid SkGPipeCanvas::drawBitmapMatrix(const SkBitmap& bm, const SkMatrix& matrix, 82658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com const SkPaint* paint) { 827f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 82858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = matrix.writeToMemory(NULL); 829d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8303e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapMatrix_DrawOp, 0, opBytesNeeded, paint)) { 83158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com fWriter.writeMatrix(matrix); 83258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 833bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 83416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 83516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawBitmapNine(const SkBitmap& bm, const SkIRect& center, 8365a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com const SkRect& dst, const SkPaint* paint) { 837f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 83858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 4 + sizeof(SkRect); 83916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8403e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapNine_DrawOp, 0, opBytesNeeded, paint)) { 84116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fLeft); 84216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fTop); 84316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fRight); 84416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fBottom); 84516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 84616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 8475a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com} 84816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 84916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.comvoid SkGPipeCanvas::drawSprite(const SkBitmap& bm, int left, int top, 85016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com const SkPaint* paint) { 851f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 85258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 2; 85316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8543e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint)) { 85516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(left); 85616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(top); 85716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 858bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 859bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 860e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 861e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 862bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 863f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 86431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 865acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 86631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 867b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 868acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 869acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 870acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 871acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 872bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 873bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 874bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 875e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 876e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 877bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 878f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 87931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 880bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 881acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 88231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 883b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 884acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 885acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 886acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 887acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 888bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 889bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 890bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 891e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 892e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint& paint) { 893bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 894f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 89531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 896bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 897acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 89831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 899b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 900acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 901acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 902acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 903acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 904acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 905bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 906bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 907bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 908e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 909e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint& paint) { 910bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 911f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 912bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 91394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL); 914bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 915bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 91694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size += matrix->writeToMemory(NULL); 917bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 91831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 919acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 92031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 921bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 922b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 923acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 924bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 92594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 926acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 9272b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(*matrix); 928acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 929bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 930bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 931bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 932bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 9339b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillipsvoid SkGPipeCanvas::onDrawPicture(const SkPicture* picture) { 9340faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 9359b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips this->INHERITED::onDrawPicture(picture); 936bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 937bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 93885e143c33c214e54187aa28146aa7666961a0d17reed@google.comvoid SkGPipeCanvas::drawVertices(VertexMode vmode, int vertexCount, 939bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPoint vertices[], const SkPoint texs[], 94085e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkColor colors[], SkXfermode* xfer, 941bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const uint16_t indices[], int indexCount, 942bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com const SkPaint& paint) { 943bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 944bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 945bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 946bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 947f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 94831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 949d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org 950d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org unsigned flags = 0; // packs with the op, so needs no extra space 951d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org 952d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size_t size = 0; 953d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += 4; // vmode 954d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += 4; // vertex count 955d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += vertexCount * sizeof(SkPoint); // vertices 956d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org 957bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 958bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 959acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 960bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 961bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 962bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 963acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 964bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 965f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org if (xfer && !SkXfermode::IsMode(xfer, SkXfermode::kModulate_Mode)) { 966f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org flags |= kDrawVertices_HasXfermode_DrawOpFlag; 967d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += sizeof(int32_t); // SkXfermode::Mode 968d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org } 969d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (indices && indexCount > 0) { 970d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org flags |= kDrawVertices_HasIndices_DrawOpFlag; 971d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += 4; // index count 972d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += SkAlign4(indexCount * sizeof(uint16_t)); // indices 97385e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 97474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 975acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 97631891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 97785e143c33c214e54187aa28146aa7666961a0d17reed@google.com fWriter.write32(vmode); 978acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 979acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 980d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (flags & kDrawVertices_HasTexs_DrawOpFlag) { 981acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 982acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 983d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (flags & kDrawVertices_HasColors_DrawOpFlag) { 984acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 985acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 98685e143c33c214e54187aa28146aa7666961a0d17reed@google.com if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { 98785e143c33c214e54187aa28146aa7666961a0d17reed@google.com SkXfermode::Mode mode = SkXfermode::kModulate_Mode; 988d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org SkAssertResult(xfer->asMode(&mode)); 98985e143c33c214e54187aa28146aa7666961a0d17reed@google.com fWriter.write32(mode); 99085e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 991d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (flags & kDrawVertices_HasIndices_DrawOpFlag) { 992acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 993acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 994acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 995bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 996bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 997bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 998acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comvoid SkGPipeCanvas::drawData(const void* ptr, size_t size) { 999acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && ptr) { 1000f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 1001bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned data = 0; 1002bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (size < (1 << DRAWOPS_DATA_BITS)) { 1003bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data = (unsigned)size; 1004bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1005acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(size))) { 1006acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kDrawData_DrawOp, 0, data); 1007acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (0 == data) { 1008b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(size)); 1009acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 1010bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com fWriter.writePad(ptr, size); 1011bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1012bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1013bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1014bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 10150a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::beginCommentGroup(const char* description) { 10160a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 10170a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 10180a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 10190a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::addComment(const char* kywd, const char* value) { 10200a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 10210a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 10220a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 10230a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::endCommentGroup() { 10240a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 10250a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 10260a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 102777eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.orgvoid SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { 1028d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org this->doNotify(); 102977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org if (detachCurrentBlock) { 103077eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org // force a new block to be requested for the next recorded command 1031d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com fBlockSize = 0; 103277eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org } 103377eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 103477eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 10352e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { 1036d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesToFree); 10372e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 10382e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 1039bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1040bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1041bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 1042bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 1043bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 1044bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 1045bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 1046bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 1047bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 1048bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1049bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 105031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 1051d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com if (fDone) { 1052d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return; 1053d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com } 105431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 1055bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 1056bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 1057bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1058bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 1059bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 1060f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 1061bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1062bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 1063bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 1064bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 1065f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 1066bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 106785faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org if (base.getFilterLevel() != paint.getFilterLevel()) { 106885faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org *ptr++ = PaintOp_packOpData(kFilterLevel_PaintOp, paint.getFilterLevel()); 106985faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org base.setFilterLevel(paint.getFilterLevel()); 107085faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org } 1071bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 1072bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 1073f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 1074bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1075bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 1076bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 1077f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 1078bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1079bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 1080bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 1081f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 1082bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1083bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 1084bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 1085bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 1086f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 1087bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1088bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 1089bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 1090bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 1091f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 1092bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1093bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 1094bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 1095f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 1096bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1097bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 1098bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 1099f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 1100bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1101bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 1102bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 1103f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 1104bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1105bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 1106bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 1107bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 1108f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 1109bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1110bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 1111bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 1112bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 1113f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 1114bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1115bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 1116bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 1117bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 1118f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 1119f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 1120f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 1121f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 11220c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (isCrossProcess(fFlags)) { 11233cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 11243cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 11253cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } else if (this->needOpBytes(sizeof(void*))) { 11263cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // Add to the set for ref counting. 11273cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fTypefaceSet.add(paint.getTypeface()); 11283cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // It is safe to write the typeface to the stream before the rest 11293cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // of the paint unless we ever send a kReset_PaintOp, which we 11303cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // currently never do. 11313cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com this->writeOp(kSetTypeface_DrawOp); 11323cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fWriter.writePtr(paint.getTypeface()); 11333cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } 1134f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 1135bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1136bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 11374dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // This is a new paint, so all old flats can be safely purged, if necessary. 11384dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markAllFlatsSafeToDelete(); 1139b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 1140b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 1141d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com bool replaced = index < 0; 1142d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (replaced) { 1143d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com index = ~index; 1144d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 11454dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Store the index of any flat that needs to be kept. 0 means no flat. 11464dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (index > 0) { 11474dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markFlatForKeeping(index); 11484dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 11494dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkASSERT(index >= 0 && index <= fFlatDictionary.count()); 1150d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (index != fCurrFlatIndex[i] || replaced) { 1151b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 1152b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 1153b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1154b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1155b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 1156acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 1157acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 1158b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org this->writeOp(kPaintOp_DrawOp, 0, SkToU32(size)); 1159b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 1160bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 1161b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 1162bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1163bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 11640cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com 11650cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com // 11660cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com // Do these after we've written kPaintOp_DrawOp 1167fbc58a305518fe611113a51649bf557c991ac8cfskia.committer@gmail.com 11680cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com if (base.getAnnotation() != paint.getAnnotation()) { 11690cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com if (NULL == paint.getAnnotation()) { 117089ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (this->needOpBytes()) { 117189ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org this->writeOp(kSetAnnotation_DrawOp, 0, 0); 117289ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org } 11730cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } else { 11748b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkWriteBuffer buffer; 11750cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com paint.getAnnotation()->writeToBuffer(buffer); 117689ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org const size_t size = buffer.bytesWritten(); 117789ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (this->needOpBytes(size)) { 1178b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org this->writeOp(kSetAnnotation_DrawOp, 0, SkToU32(size)); 117989ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org buffer.writeToMemory(fWriter.reserve(size)); 118089ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org } 11810cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 118240258a5be9afe3820bdc6aed4dd94abff3160d94commit-bot@chromium.org base.setAnnotation(paint.getAnnotation()); 11830cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 1184bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1185bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1186bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1187bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1188bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 1189bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 11903cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeController::~SkGPipeController() { 11913cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkSafeUnref(fCanvas); 11923cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 11933cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11943cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comvoid SkGPipeController::setCanvas(SkGPipeCanvas* canvas) { 11953cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkRefCnt_SafeAssign(fCanvas, canvas); 11963cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 11973cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 11983cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com/////////////////////////////////////////////////////////////////////////////// 11993cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 12003cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeWriter::SkGPipeWriter() 12010c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com: fWriter(0) { 1202bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1203bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1204bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1205bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 1206acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 1207bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1208bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1209a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.orgSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t flags, 1210a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) { 1211bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 1212acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 1213a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, flags, width, height)); 1214bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 12153cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com controller->setCanvas(fCanvas); 1216bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 1217bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1218bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1219bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 1220bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 122159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas->finish(true); 1222bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 1223bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1224bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1225bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1226bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 12272e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgvoid SkGPipeWriter::flushRecording(bool detachCurrentBlock) { 12282e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 12292e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org fCanvas->flushRecording(detachCurrentBlock); 12302e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 12312e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 12322e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 12332e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::freeMemoryIfPossible(size_t bytesToFree) { 12342e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 12352e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return fCanvas->freeMemoryIfPossible(bytesToFree); 12362e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 12372e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return 0; 123877eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 123977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 12402e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::storageAllocatedForRecording() const { 124115011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com return NULL == fCanvas ? 0 : fCanvas->storageAllocatedForRecording(); 124215011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com} 124315011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 12443e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com/////////////////////////////////////////////////////////////////////////////// 12453e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 12463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::BitmapShuttle(SkGPipeCanvas* canvas) { 12473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com SkASSERT(canvas != NULL); 12483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas = canvas; 12493e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas->ref(); 12503e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 12513e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 12523e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::~BitmapShuttle() { 125359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->removeCanvas(); 12543e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 12553e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 12563e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool BitmapShuttle::insert(const SkBitmap& bitmap, int32_t slot) { 125759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkASSERT(fCanvas != NULL); 12583e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return fCanvas->shuttleBitmap(bitmap, slot); 12593e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 126059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 126159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comvoid BitmapShuttle::removeCanvas() { 126259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (NULL == fCanvas) { 126359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com return; 126459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 126559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas->unref(); 126659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas = NULL; 126759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com} 1268