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" 22b3c9d1c33caf325aada244204215eb790c228c12dandov#include "SkPatchUtils.h" 2310dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkPathEffect.h" 2410dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkPictureFlat.h" 25acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita#include "SkPtrRecorder.h" 2610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkRasterizer.h" 274ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com#include "SkRRect.h" 2810dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com#include "SkShader.h" 29f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkStream.h" 30228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita#include "SkTextBlob.h" 31b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com#include "SkTSearch.h" 32f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com#include "SkTypeface.h" 33bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkWriter32.h" 34b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 354ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comenum { 364ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com kSizeOfFlatRRect = sizeof(SkRect) + 4 * sizeof(SkVector) 374ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}; 384ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 39acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalitastatic bool is_cross_process(uint32_t flags) { 400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag); 410c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 420c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 43b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comstatic SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { 44b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com SkASSERT(paintFlat < kCount_PaintFlats); 45b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com switch (paintFlat) { 46b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kColorFilter_PaintFlat: return paint.getColorFilter(); 470faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com case kDrawLooper_PaintFlat: return paint.getLooper(); 48b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kMaskFilter_PaintFlat: return paint.getMaskFilter(); 49b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kPathEffect_PaintFlat: return paint.getPathEffect(); 50b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kRasterizer_PaintFlat: return paint.getRasterizer(); 51b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kShader_PaintFlat: return paint.getShader(); 5216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com case kImageFilter_PaintFlat: return paint.getImageFilter(); 53b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com case kXfermode_PaintFlat: return paint.getXfermode(); 54b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 550c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("never gets here"); 56b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return NULL; 57b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 58bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 59f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comstatic size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { 60f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkASSERT(typeface); 61f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com SkDynamicMemoryWStream stream; 62f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com typeface->serialize(&stream); 63f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = stream.getOffset(); 64f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (writer) { 65b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org writer->write32(SkToU32(size)); 668a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com SkAutoDataUnref data(stream.copyToData()); 6759f46b81f8bdd1b524f5cc43bc27603f9604c71arobertphillips@google.com writer->writePad(data->data(), size); 68f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 695af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com return 4 + SkAlign4(size); 70f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 71f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 72bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 73bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 744dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comclass FlattenableHeap : public SkFlatController { 754dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.compublic: 76664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset, bool isCrossProcess) 77a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org : INHERITED(isCrossProcess ? SkWriteBuffer::kCrossProcess_Flag : 0) 78a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org , fNumFlatsToKeep(numFlatsToKeep) { 79664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com SkASSERT((isCrossProcess && fset != NULL) || (!isCrossProcess && NULL == fset)); 80664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com if (isCrossProcess) { 81664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com this->setNamedFactorySet(fset); 82664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com } 830c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 844dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 854dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com ~FlattenableHeap() { 864dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fPointers.freeAll(); 874dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 884dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 8936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void* allocThrow(size_t bytes) override; 904dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 9136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void unalloc(void* ptr) override; 924dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 937ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com void setBitmapStorage(SkBitmapHeap* heap) { 947ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com this->setBitmapHeap(heap); 957ca24437c71af06fc06ab5f6f261b185882fa440scroggo@google.com } 96d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 974dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const SkFlatData* flatToReplace() const; 984dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 994dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Mark an SkFlatData as one that should not be returned by flatToReplace. 1004dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Takes the result of SkFlatData::index() as its parameter. 1014dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void markFlatForKeeping(int index) { 1024dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fFlatsThatMustBeKept.append() = index; 1034dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1044dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1054dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void markAllFlatsSafeToDelete() { 1064dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlatsThatMustBeKept.reset(); 1074dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1084dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1094dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comprivate: 1104dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Keep track of the indices (i.e. the result of SkFlatData::index()) of 1114dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // flats that must be kept, since they are on the current paint. 1124dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkTDArray<int> fFlatsThatMustBeKept; 1134dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkTDArray<void*> fPointers; 1144dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com const int fNumFlatsToKeep; 115a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org 116a2bd2d12ad9504583e9311404fcd82b40df49d30commit-bot@chromium.org typedef SkFlatController INHERITED; 1174dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com}; 1184dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1194dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comvoid FlattenableHeap::unalloc(void* ptr) { 1204dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int indexToRemove = fPointers.rfind(ptr); 1214dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (indexToRemove >= 0) { 1224dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com sk_free(ptr); 1234dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fPointers.remove(indexToRemove); 1244dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1254dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1264dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1274dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comvoid* FlattenableHeap::allocThrow(size_t bytes) { 1284dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com void* ptr = sk_malloc_throw(bytes); 1294dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com *fPointers.append() = ptr; 1304dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return ptr; 1314dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1324dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1334dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.comconst SkFlatData* FlattenableHeap::flatToReplace() const { 1344dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // First, determine whether we should replace one. 1354dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (fPointers.count() > fNumFlatsToKeep) { 1364dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Look through the flattenable heap. 1374dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // TODO: Return the LRU flat. 1384dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com for (int i = 0; i < fPointers.count(); i++) { 1394dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkFlatData* potential = (SkFlatData*)fPointers[i]; 1404dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Make sure that it is not one that must be kept. 1414dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool mustKeep = false; 1424dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com for (int j = 0; j < fFlatsThatMustBeKept.count(); j++) { 1434dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (potential->index() == fFlatsThatMustBeKept[j]) { 1444dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com mustKeep = true; 1454dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com break; 1464dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1474dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1484dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (!mustKeep) { 1494dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return potential; 1504dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1514dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1524dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 1534dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return NULL; 1544dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com} 1554dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1564dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com/////////////////////////////////////////////////////////////////////////////// 1574dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 15807adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgstruct SkFlattenableTraits { 159186c0ccac25229534ec6fb84726043083304d4d1commit-bot@chromium.org static void Flatten(SkWriteBuffer& buffer, const SkFlattenable& flattenable) { 16007adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org buffer.writeFlattenable(&flattenable); 1614dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 16207adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.org // No need to define unflatten if we never call it. 1634dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com}; 16407adb6359fd137ccb633b2c64ee2287c8edfd701commit-bot@chromium.orgtypedef SkFlatDictionary<SkFlattenable, SkFlattenableTraits> FlatDictionary; 1654dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 1664dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com/////////////////////////////////////////////////////////////////////////////// 1674dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com 16859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com/** 16959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * If SkBitmaps are to be flattened to send to the reader, this class is 17059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * provided to the SkBitmapHeap to tell the SkGPipeCanvas to do so. 17159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com */ 17259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comclass BitmapShuttle : public SkBitmapHeap::ExternalStorage { 17359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.compublic: 17459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com BitmapShuttle(SkGPipeCanvas*); 17559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 17659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com ~BitmapShuttle(); 17759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 17836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool insert(const SkBitmap& bitmap, int32_t slot) override; 17959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 18059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com /** 18159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * Remove the SkGPipeCanvas used for insertion. After this, calls to 18259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * insert will crash. 18359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com */ 18459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com void removeCanvas(); 18559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 18659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comprivate: 18759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkGPipeCanvas* fCanvas; 18859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com}; 18959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 19059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com/////////////////////////////////////////////////////////////////////////////// 19159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 192bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comclass SkGPipeCanvas : public SkCanvas { 193bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.compublic: 194a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org SkGPipeCanvas(SkGPipeController*, SkWriter32*, uint32_t flags, 195a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height); 196bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com virtual ~SkGPipeCanvas(); 197bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 19859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com /** 19959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * Called when nothing else is to be written to the stream. Any repeated 20059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * calls are ignored. 20159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * 20259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * @param notifyReaders Whether to send a message to the reader(s) that 20359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * the writer is through sending commands. Should generally be true, 20459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * unless there is an error which prevents further messages from 20559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com * being sent. 20659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com */ 20759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com void finish(bool notifyReaders) { 20859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (fDone) { 20959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com return; 21059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 21159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (notifyReaders && this->needOpBytes()) { 21259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->writeOp(kDone_DrawOp); 21359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->doNotify(); 214bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 21559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (shouldFlattenBitmaps(fFlags)) { 21659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // The following circular references exist: 21759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // fFlattenableHeap -> fWriteBuffer -> fBitmapStorage -> fExternalStorage -> fCanvas 21859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // fBitmapHeap -> fExternalStorage -> fCanvas 21959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // fFlattenableHeap -> fBitmapStorage -> fExternalStorage -> fCanvas 22059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 22159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // Break them all by destroying the final link to this SkGPipeCanvas. 22259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fBitmapShuttle->removeCanvas(); 22359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 22459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fDone = true; 225bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 226bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 22777eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org void flushRecording(bool detachCurrentBlock); 2282e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org size_t freeMemoryIfPossible(size_t bytesToFree); 22977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 23015011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com size_t storageAllocatedForRecording() { 231d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->bytesAllocated(); 23215011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com } 23315011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 23436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void beginCommentGroup(const char* description) override; 23536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void addComment(const char* kywd, const char* value) override; 23636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void endCommentGroup() override; 237bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 2383e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com /** 2393e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * Flatten an SkBitmap to send to the reader, where it will be referenced 2403e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com * according to slot. 2413e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com */ 2423e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com bool shuttleBitmap(const SkBitmap&, int32_t slot); 243ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 244ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgprotected: 24536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void willSave() override; 24636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) override; 24736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void willRestore() override; 248e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 24936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void didConcat(const SkMatrix&) override; 25036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void didSetMatrix(const SkMatrix&) override; 25144c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org 25236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 253d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 254d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina const SkPaint&) override; 255d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 256d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina const SkPaint&) override; 257d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 258d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina SkScalar constY, const SkPaint&) override; 259d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 260d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina const SkMatrix* matrix, const SkPaint&) override; 261d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 262d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina const SkPaint& paint) override; 263d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 264d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina const SkPoint texCoords[4], SkXfermode* xmode, 265d96fd0c073fa44a475363003c8f0d25a077edc6ctfarina const SkPaint& paint) override; 26636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPaint(const SkPaint&) override; 26736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; 26836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawRect(const SkRect&, const SkPaint&) override; 26936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawOval(const SkRect&, const SkPaint&) override; 27036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawRRect(const SkRRect&, const SkPaint&) override; 27136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPath(const SkPath&, const SkPaint&) override; 27236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; 27341af966ab338e95eee81ab618ab28195075338f7reed void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, 27436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein DrawBitmapRectFlags flags) override; 27536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; 27641af966ab338e95eee81ab618ab28195075338f7reed void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, 27736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint*) override; 27841af966ab338e95eee81ab618ab28195075338f7reed void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 27936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint*) override; 28036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override; 28141af966ab338e95eee81ab618ab28195075338f7reed void onDrawVertices(VertexMode vmode, int vertexCount, 28241af966ab338e95eee81ab618ab28195075338f7reed const SkPoint vertices[], const SkPoint texs[], 28341af966ab338e95eee81ab618ab28195075338f7reed const SkColor colors[], SkXfermode* xmode, 28441af966ab338e95eee81ab618ab28195075338f7reed const uint16_t indices[], int indexCount, 28536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkPaint&) override; 28636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; 28736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; 28836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; 28936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onClipRegion(const SkRegion&, SkRegion::Op) override; 2908f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com 29136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) 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 2980c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkNamedFactorySet* fFactorySet; 299d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkBitmapHeap* fBitmapHeap; 300a85d4d0814818e4ddabb9237da209d61d6cd5854reed SkImageHeap* fImageHeap; 301acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com SkGPipeController* fController; 3020c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkWriter32& fWriter; 3030c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBlockSize; // amount allocated for writer 3040c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t fBytesNotified; 3050c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com bool fDone; 3063e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const uint32_t fFlags; 307bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3080c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkRefCntSet fTypefaceSet; 309f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 310f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t getTypefaceID(SkTypeface*); 311f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 312acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op, unsigned flags, unsigned data) { 313bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, flags, data)); 314bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 31574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 316acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void writeOp(DrawOps op) { 317bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fWriter.write32(DrawOp_packOpFlagData(op, 0, 0)); 318bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 319acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 320acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com bool needOpBytes(size_t size = 0); 321acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 322acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com inline void doNotify() { 323acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (!fDone) { 3244469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t bytes = fWriter.bytesWritten() - fBytesNotified; 32516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (bytes > 0) { 32616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fController->notifyWritten(bytes); 32716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fBytesNotified += bytes; 32816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 329acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 330acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 331b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 332acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita typedef SkAutoSTMalloc<128, uint8_t> TypefaceBuffer; 333acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita size_t getInProcessTypefaces(const SkRefCntSet& typefaceSet, TypefaceBuffer*); 334acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita size_t getCrossProcessTypefaces(const SkRefCntSet& typefaceSet, TypefaceBuffer*); 335acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 3360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // Should be called after any calls to an SkFlatDictionary::findAndReplace 3370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com // if a new SkFlatData was added when in cross process mode 3380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com void flattenFactoryNames(); 3390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 34059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com FlattenableHeap fFlattenableHeap; 34159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com FlatDictionary fFlatDictionary; 34259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkAutoTUnref<BitmapShuttle> fBitmapShuttle; 34359c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com int fCurrFlatIndex[kCount_PaintFlats]; 34459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 345b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int flattenToIndex(SkFlattenable* obj, PaintFlats); 346b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 3473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // Common code used by drawBitmap*. Behaves differently depending on the 3483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com // type of SkBitmapHeap being used, which is determined by the flags used. 349a85d4d0814818e4ddabb9237da209d61d6cd5854reed bool commonDrawBitmap(const SkBitmap&, DrawOps, unsigned flags, size_t bytes, const SkPaint*); 350a85d4d0814818e4ddabb9237da209d61d6cd5854reed bool commonDrawImage(const SkImage*, DrawOps, unsigned flags, size_t bytes, const SkPaint*); 35158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 35231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint fPaint; 35331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com void writePaint(const SkPaint&); 354bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 355f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org class AutoPipeNotify { 356f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org public: 357f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} 358f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org ~AutoPipeNotify() { fCanvas->doNotify(); } 359f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org private: 360f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org SkGPipeCanvas* fCanvas; 361f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org }; 362f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org friend class AutoPipeNotify; 363f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org 364bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com typedef SkCanvas INHERITED; 365bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com}; 366bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 3670c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comvoid SkGPipeCanvas::flattenFactoryNames() { 3680c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com const char* name; 3690c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com while ((name = fFactorySet->getNextAddedFactoryName()) != NULL) { 3700c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t len = strlen(name); 371d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (this->needOpBytes(SkWriter32::WriteStringSize(name, len))) { 3720c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Factory_DrawOp); 3730c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.writeString(name, len); 3740c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3750c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 3760c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 3770c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 3783e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::shuttleBitmap(const SkBitmap& bm, int32_t slot) { 379565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com SkASSERT(shouldFlattenBitmaps(fFlags)); 3808b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkWriteBuffer buffer; 3813e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.setNamedFactoryRecorder(fFactorySet); 38274b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com buffer.writeBitmap(bm); 3833e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->flattenFactoryNames(); 384b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org size_t size = buffer.bytesWritten(); 3853e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->needOpBytes(size)) { 3863e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com this->writeOp(kDef_Bitmap_DrawOp, 0, slot); 3873e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com void* dst = static_cast<void*>(fWriter.reserve(size)); 3883e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com buffer.writeToMemory(dst); 3893e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return true; 3904dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 3913e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return false; 392d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com} 393d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com 394b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// return 0 for NULL (or unflattenable obj), or index-base-1 395d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com// return ~(index-base-1) if an old flattenable was replaced 396b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.comint SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { 397d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com SkASSERT(!fDone && fBitmapHeap != NULL); 398b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com if (NULL == obj) { 399b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com return 0; 400b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 401b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 402d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->deferAddingOwners(); 4034dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com bool added, replaced; 404664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHeap.flatToReplace(), 405664fab1b3454faea01cbae2f1dc2777c5afb9998scroggo@google.com &added, &replaced); 406d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com fBitmapHeap->endAddingOwnersDeferral(added); 4074dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com int index = flat->index(); 4080c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (added) { 409acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita if (is_cross_process(fFlags)) { 4100c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->flattenFactoryNames(); 4110c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 4120c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com size_t flatSize = flat->flatSize(); 4130c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (this->needOpBytes(flatSize)) { 4140c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com this->writeOp(kDef_Flattenable_DrawOp, paintflat, index); 4150c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com fWriter.write(flat->data(), flatSize); 4160c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 417b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 4184dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (replaced) { 4194dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com index = ~index; 420d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 4214dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com return index; 422b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com} 423b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 424bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 425bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 426f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org#define MIN_BLOCK_SIZE (16 * 1024) 4274dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define BITMAPS_TO_KEEP 5 4284dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com#define FLATTENABLES_TO_KEEP 10 429bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 430acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.comSkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, 431d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkWriter32* writer, uint32_t flags, 432a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) 433403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org : SkCanvas(width, height) 434acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita , fFactorySet(is_cross_process(flags) ? SkNEW(SkNamedFactorySet) : NULL) 435403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fWriter(*writer) 436403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlags(flags) 437acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita , fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, is_cross_process(flags)) 438403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org , fFlatDictionary(&fFlattenableHeap) 439403f8d7a052269583175e945689824838e5e0ef4commit-bot@chromium.org{ 440acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fController = controller; 441bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fDone = false; 442acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBlockSize = 0; // need first block from controller 4435a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fBytesNotified = 0; 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); 463a85d4d0814818e4ddabb9237da209d61d6cd5854reed 464a85d4d0814818e4ddabb9237da209d61d6cd5854reed fImageHeap = SkNEW(SkImageHeap); 465a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (this->needOpBytes(sizeof(void*))) { 466a85d4d0814818e4ddabb9237da209d61d6cd5854reed this->writeOp(kShareImageHeap_DrawOp); 467a85d4d0814818e4ddabb9237da209d61d6cd5854reed fWriter.writePtr(static_cast<void*>(fImageHeap)); 468a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 469a85d4d0814818e4ddabb9237da209d61d6cd5854reed 470f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org this->doNotify(); 471bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 472bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 473bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeCanvas::~SkGPipeCanvas() { 47459c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->finish(true); 4750c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com SkSafeUnref(fFactorySet); 476d9d2967ce1cca98c7992ac034a6b6e0707c56051scroggo@google.com SkSafeUnref(fBitmapHeap); 477a85d4d0814818e4ddabb9237da209d61d6cd5854reed SkSafeUnref(fImageHeap); 478bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 479bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 480acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.combool SkGPipeCanvas::needOpBytes(size_t needed) { 481acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (fDone) { 482acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 483acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 484acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 485acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com needed += 4; // size of DrawOp atom 486d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org needed = SkAlign4(needed); 4874469938e92d779dff05e745559e67907bbf21e78reed@google.com if (fWriter.bytesWritten() + needed > fBlockSize) { 4886d88e6ce51ff34c99a1135161f06f29322f58e5amtklein // Before we wipe out any data that has already been written, read it out. 4895a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->doNotify(); 4906d88e6ce51ff34c99a1135161f06f29322f58e5amtklein 4916d88e6ce51ff34c99a1135161f06f29322f58e5amtklein // If we're going to allocate a new block, allocate enough to make it worthwhile. 4926d88e6ce51ff34c99a1135161f06f29322f58e5amtklein needed = SkTMax<size_t>(MIN_BLOCK_SIZE, needed); 4936d88e6ce51ff34c99a1135161f06f29322f58e5amtklein 494d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org void* block = fController->requestBlock(needed, &fBlockSize); 495acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (NULL == block) { 49659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com // Do not notify the readers, which would call this function again. 49759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->finish(false); 498acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return false; 499acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 500460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com SkASSERT(SkIsAlign4(fBlockSize)); 501acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(block, fBlockSize); 502acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fBytesNotified = 0; 503acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 504acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com return true; 505acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com} 506acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 507f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.comuint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) { 508f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com uint32_t id = 0; // 0 means default/null typeface 509f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (face) { 510f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.find(face); 511f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (0 == id) { 512f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com id = fTypefaceSet.add(face); 513f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com size_t size = writeTypeface(NULL, face); 514f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (this->needOpBytes(size)) { 515bb6793bd7751f7a4e48c942567cd6c5270661a2freed@google.com this->writeOp(kDef_Typeface_DrawOp); 516f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com writeTypeface(&fWriter, face); 517f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 518f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 519f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 520f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com return id; 521f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com} 522f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 523bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 524bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 525f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org#define NOTIFY_SETUP(canvas) \ 526f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org AutoPipeNotify apn(canvas) 527f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org 5285f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malitavoid SkGPipeCanvas::willSave() { 529f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 530acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 5315f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita this->writeOp(kSave_DrawOp); 532acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 533e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org 5345f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita this->INHERITED::willSave(); 535bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 536bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 537e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkGPipeCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint, 538e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org SaveFlags saveFlags) { 539f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 540acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = 0; 541bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned opFlags = 0; 54274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 543bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (bounds) { 544bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasBounds_DrawOpFlag; 545acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += sizeof(SkRect); 546bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 547bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (paint) { 548bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com opFlags |= kSaveLayer_HasPaint_DrawOpFlag; 54931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(*paint); 550bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 551bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 552acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 553acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSaveLayer_DrawOp, opFlags, saveFlags); 554acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (bounds) { 555acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(*bounds); 556acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 557bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 55874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 559e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSaveLayer(bounds, paint, saveFlags); 560e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org // we don't create a layer 561e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org return kNoLayer_SaveLayerStrategy; 562bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 563bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 564e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkGPipeCanvas::willRestore() { 565f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 566acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 567acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kRestore_DrawOp); 568acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 569fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 570e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willRestore(); 571fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org} 572fbe9c8fbb8e74ad55694f8bb7fa5463708e94a6djunov@chromium.org 573d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordTranslate(const SkMatrix& m) { 574d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(2 * sizeof(SkScalar))) { 575d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kTranslate_DrawOp); 576d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getTranslateX()); 577d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getTranslateY()); 578bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 579bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 580bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 581d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordScale(const SkMatrix& m) { 582d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(2 * sizeof(SkScalar))) { 583d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kScale_DrawOp); 584d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getScaleX()); 585d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeScalar(m.getScaleY()); 586bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 587bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 588bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 589d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.orgvoid SkGPipeCanvas::recordConcat(const SkMatrix& m) { 590d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org if (this->needOpBytes(m.writeToMemory(NULL))) { 591d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->writeOp(kConcat_DrawOp); 592d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org fWriter.writeMatrix(m); 593bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 594bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 595bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 59644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkGPipeCanvas::didConcat(const SkMatrix& matrix) { 597bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (!matrix.isIdentity()) { 598f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 599d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org switch (matrix.getType()) { 600d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org case SkMatrix::kTranslate_Mask: 601d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordTranslate(matrix); 602d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 603d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org case SkMatrix::kScale_Mask: 604d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordScale(matrix); 605d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 606d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org default: 607d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org this->recordConcat(matrix); 608d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org break; 609acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 610bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 611d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org 61244c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didConcat(matrix); 613bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 614bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 61544c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkGPipeCanvas::didSetMatrix(const SkMatrix& matrix) { 616f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 61794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(matrix.writeToMemory(NULL))) { 618acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kSetMatrix_DrawOp); 6192b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(matrix); 620acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 62144c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didSetMatrix(matrix); 622bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 623bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6248f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRect(const SkRect& rect, SkRegion::Op rgnOp, 6258f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 626f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 627460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(sizeof(SkRect))) { 6288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6298f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 632460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipRect_DrawOp, flags, rgnOp); 633acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 634acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6358f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(rect, rgnOp, edgeStyle); 636bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 637bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6388f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op rgnOp, 6398f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 640f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 6414ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 6428f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6438f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6448f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6458f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 6464ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kClipRRect_DrawOp, flags, rgnOp); 6474ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 6484ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 6498f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRRect(rrect, rgnOp, edgeStyle); 6504ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 6514ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 6528f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipPath(const SkPath& path, SkRegion::Op rgnOp, 6538f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 654f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 655460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 6568f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com unsigned flags = 0; 6578f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com if (kSoft_ClipEdgeStyle == edgeStyle) { 6588f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com flags = kClip_HasAntiAlias_DrawOpFlag; 6598f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com } 660460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com this->writeOp(kClipPath_DrawOp, flags, rgnOp); 66194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 662acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 663bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com // we just pass on the bounds of the path 6648f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(path.getBounds(), rgnOp, edgeStyle); 665bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 666bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 6678f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { 668f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 66994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(region.writeToMemory(NULL))) { 670acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->writeOp(kClipRegion_DrawOp, 0, rgnOp); 6712b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeRegion(region); 672acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 6738f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRegion(region, rgnOp); 674bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 675bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 676bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 677bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 67841af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawPaint(const SkPaint& paint) { 679f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 68031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 681acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes()) { 68231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPaint_DrawOp); 683acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 684bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 685bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 68641af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawPoints(PointMode mode, size_t count, 68741af966ab338e95eee81ab618ab28195075338f7reed const SkPoint pts[], const SkPaint& paint) { 688bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (count) { 689f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 69031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 691acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + count * sizeof(SkPoint))) { 69231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPoints_DrawOp, mode, 0); 693b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(count)); 694acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pts, count * sizeof(SkPoint)); 695acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 696bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 697bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 698bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 69941af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) { 700f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 7014ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7024ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 7034ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawOval_DrawOp); 7044ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRect(rect); 7054ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7064ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7074ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 70841af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) { 709f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 71031891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 711acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(sizeof(SkRect))) { 71231891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawRect_DrawOp); 713acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeRect(rect); 714acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 715bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 716bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 71741af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { 718f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 7194ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writePaint(paint); 7204ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (this->needOpBytes(kSizeOfFlatRRect)) { 7214ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->writeOp(kDrawRRect_DrawOp); 7224ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com fWriter.writeRRect(rrect); 7234ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 7244ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7254ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 726ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.orgvoid SkGPipeCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, 727ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org const SkPaint& paint) { 728f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 729ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->writePaint(paint); 730ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org if (this->needOpBytes(kSizeOfFlatRRect * 2)) { 731ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org this->writeOp(kDrawDRRect_DrawOp); 732ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org fWriter.writeRRect(outer); 733ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org fWriter.writeRRect(inner); 734ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org } 735ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org} 736ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org 73741af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { 738f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 73931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 74094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com if (this->needOpBytes(path.writeToMemory(NULL))) { 74131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPath_DrawOp); 74294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 743acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 744bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 745bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 7463e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool SkGPipeCanvas::commonDrawBitmap(const SkBitmap& bm, DrawOps op, 7473e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com unsigned flags, 7483e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com size_t opBytesNeeded, 7493e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com const SkPaint* paint) { 75044803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org if (fDone) { 75144803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org return false; 75244803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org } 75344803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org 75458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com if (paint != NULL) { 755460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags |= kDrawBitmap_HasPaint_DrawOpFlag; 7565a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com this->writePaint(*paint); 7575a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 75844803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org // This needs to run first so its calls to needOpBytes() and its writes 75944803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org // don't interlace with the needOpBytes() and write below. 76044803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org SkASSERT(fBitmapHeap != NULL); 76144803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org int32_t bitmapIndex = fBitmapHeap->insert(bm); 76244803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org if (SkBitmapHeap::INVALID_SLOT == bitmapIndex) { 76344803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org return false; 76444803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org } 76544803fb451e87287282f95043c6b367fdd509519commit-bot@chromium.org 76610dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com if (this->needOpBytes(opBytesNeeded)) { 76710dccde54a769b8d472bccf8c1993034b93ef58dscroggo@google.com this->writeOp(op, flags, bitmapIndex); 76858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return true; 769565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 77058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return false; 77158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com} 77258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 77341af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawBitmap(const SkBitmap& bm, SkScalar left, SkScalar top, 77441af966ab338e95eee81ab618ab28195075338f7reed const SkPaint* paint) { 775f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 77658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkScalar) * 2; 77758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7783e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmap_DrawOp, 0, opBytesNeeded, paint)) { 7795a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(left); 7805a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com fWriter.writeScalar(top); 7815a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com } 782bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 783bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 78441af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawBitmapRect(const SkBitmap& bm, const SkRect* src, const SkRect& dst, 78541af966ab338e95eee81ab618ab28195075338f7reed const SkPaint* paint, DrawBitmapRectFlags dbmrFlags) { 786f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 78758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(SkRect); 78816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com bool hasSrc = src != NULL; 78958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com unsigned flags; 79016d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 791460a23e6fd6b71c80d5515300c6b989cd3383029scroggo@google.com flags = kDrawBitmap_HasSrcRect_DrawOpFlag; 79216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com opBytesNeeded += sizeof(int32_t) * 4; 79358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } else { 79458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com flags = 0; 79516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 796eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org if (dbmrFlags & kBleed_DrawBitmapRectFlag) { 797eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org flags |= kDrawBitmap_Bleed_DrawOpFlag; 798eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org } 799d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8007112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com if (this->commonDrawBitmap(bm, kDrawBitmapRectToRect_DrawOp, flags, opBytesNeeded, paint)) { 80116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com if (hasSrc) { 8027112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com fWriter.writeRect(*src); 80316d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 80416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 80516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 806bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 807bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 80841af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawBitmapNine(const SkBitmap& bm, const SkIRect& center, 80941af966ab338e95eee81ab618ab28195075338f7reed const SkRect& dst, const SkPaint* paint) { 810f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 81158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 4 + sizeof(SkRect); 81216d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8133e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawBitmapNine_DrawOp, 0, opBytesNeeded, paint)) { 81416d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fLeft); 81516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fTop); 81616d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fRight); 81716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(center.fBottom); 81816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.writeRect(dst); 81916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 8205a2e879ef8a3720ac3f06fbc13dcdaeb179f30c3scroggo@google.com} 82116d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 82241af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const SkPaint* paint) { 823f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 82458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com size_t opBytesNeeded = sizeof(int32_t) * 2; 82516d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com 8263e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint)) { 82716d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(left); 82816d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com fWriter.write32(top); 82916d1d0b39a78fa4ab4fbd6ed3296cf010ea9a61cscroggo@google.com } 830bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 831bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 832a85d4d0814818e4ddabb9237da209d61d6cd5854reedbool SkGPipeCanvas::commonDrawImage(const SkImage* image, DrawOps op, unsigned flags, 833a85d4d0814818e4ddabb9237da209d61d6cd5854reed size_t opBytesNeeded, const SkPaint* paint) { 834a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (fDone) { 835a85d4d0814818e4ddabb9237da209d61d6cd5854reed return false; 836a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 837a85d4d0814818e4ddabb9237da209d61d6cd5854reed 838a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (paint != NULL) { 839a85d4d0814818e4ddabb9237da209d61d6cd5854reed flags |= kDrawBitmap_HasPaint_DrawOpFlag; 840a85d4d0814818e4ddabb9237da209d61d6cd5854reed this->writePaint(*paint); 841a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 842a85d4d0814818e4ddabb9237da209d61d6cd5854reed // This needs to run first so its calls to needOpBytes() and its writes 843a85d4d0814818e4ddabb9237da209d61d6cd5854reed // don't interlace with the needOpBytes() and write below. 844a85d4d0814818e4ddabb9237da209d61d6cd5854reed int32_t slot = fImageHeap->insert(image); 845a85d4d0814818e4ddabb9237da209d61d6cd5854reed SkASSERT(slot != 0); 846a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (this->needOpBytes(opBytesNeeded)) { 847a85d4d0814818e4ddabb9237da209d61d6cd5854reed this->writeOp(op, flags, slot); 848a85d4d0814818e4ddabb9237da209d61d6cd5854reed return true; 849a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 850a85d4d0814818e4ddabb9237da209d61d6cd5854reed return false; 851a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 852a85d4d0814818e4ddabb9237da209d61d6cd5854reed 853a85d4d0814818e4ddabb9237da209d61d6cd5854reedvoid SkGPipeCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, 854a85d4d0814818e4ddabb9237da209d61d6cd5854reed const SkPaint* paint) { 855a85d4d0814818e4ddabb9237da209d61d6cd5854reed NOTIFY_SETUP(this); 856a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (this->commonDrawImage(image, kDrawImage_DrawOp, 0, sizeof(SkScalar) * 2, paint)) { 857a85d4d0814818e4ddabb9237da209d61d6cd5854reed fWriter.writeScalar(x); 858a85d4d0814818e4ddabb9237da209d61d6cd5854reed fWriter.writeScalar(y); 859a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 860a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 861a85d4d0814818e4ddabb9237da209d61d6cd5854reed 862a85d4d0814818e4ddabb9237da209d61d6cd5854reedvoid SkGPipeCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, 863a85d4d0814818e4ddabb9237da209d61d6cd5854reed const SkPaint* paint) { 864a85d4d0814818e4ddabb9237da209d61d6cd5854reed NOTIFY_SETUP(this); 865a85d4d0814818e4ddabb9237da209d61d6cd5854reed unsigned flags = 0; 866a85d4d0814818e4ddabb9237da209d61d6cd5854reed size_t opBytesNeeded = sizeof(SkRect); // dst 867a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (src) { 868a85d4d0814818e4ddabb9237da209d61d6cd5854reed flags |= kDrawBitmap_HasSrcRect_DrawOpFlag; 869a85d4d0814818e4ddabb9237da209d61d6cd5854reed opBytesNeeded += sizeof(SkRect); // src 870a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 871a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (this->commonDrawImage(image, kDrawImageRect_DrawOp, flags, opBytesNeeded, paint)) { 872a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (src) { 873a85d4d0814818e4ddabb9237da209d61d6cd5854reed fWriter.writeRect(*src); 874a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 875a85d4d0814818e4ddabb9237da209d61d6cd5854reed fWriter.writeRect(dst); 876a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 877a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 878a85d4d0814818e4ddabb9237da209d61d6cd5854reed 879e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 880e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 881bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 882f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 88331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 884acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar))) { 88531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawText_DrawOp); 886b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 887acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 888acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(x); 889acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(y); 890acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 891bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 892bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 893bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 894e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 895e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 896bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 897f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 89831891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 899bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 900acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkPoint))) { 90131891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosText_DrawOp); 902b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 903acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 904acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 905acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(pos, count * sizeof(SkPoint)); 906acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 907bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 908bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 909bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 910e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 911e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint& paint) { 912bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 913f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 91431891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 915bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com int count = paint.textToGlyphs(text, byteLength, NULL); 916acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(4 + SkAlign4(byteLength) + 4 + count * sizeof(SkScalar) + 4)) { 91731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawPosTextH_DrawOp); 918b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 919acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 920acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(count); 921acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(xpos, count * sizeof(SkScalar)); 922acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writeScalar(constY); 923acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 924bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 925bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 926bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 927e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkGPipeCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 928e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint& paint) { 929bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (byteLength) { 930f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 931bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com unsigned flags = 0; 93294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = 4 + SkAlign4(byteLength) + path.writeToMemory(NULL); 933bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (matrix) { 934bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawTextOnPath_HasMatrix_DrawOpFlag; 93594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size += matrix->writeToMemory(NULL); 936bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 93731891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 938acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 93931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawTextOnPath_DrawOp, flags, 0); 940bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 941b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org fWriter.write32(SkToU32(byteLength)); 942acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(text, byteLength); 943bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 94494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com fWriter.writePath(path); 945acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (matrix) { 9462b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com fWriter.writeMatrix(*matrix); 947acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 948bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 949bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 950bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 951bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 952acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalitasize_t SkGPipeCanvas::getInProcessTypefaces(const SkRefCntSet& typefaceSet, 953acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita TypefaceBuffer* buffer) { 954acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // When in-process, we simply write out the typeface pointers. 955acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita size_t size = typefaceSet.count() * sizeof(SkTypeface*); 956acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita buffer->reset(size); 957acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita typefaceSet.copyToArray(reinterpret_cast<SkRefCnt**>(buffer->get())); 958acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 959acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita return size; 960acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita} 961acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 962acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalitasize_t SkGPipeCanvas::getCrossProcessTypefaces(const SkRefCntSet& typefaceSet, 963acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita TypefaceBuffer* buffer) { 964acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // For cross-process we use typeface IDs. 965acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita size_t size = typefaceSet.count() * sizeof(uint32_t); 966acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita buffer->reset(size); 967acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 968acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita uint32_t* idBuffer = reinterpret_cast<uint32_t*>(buffer->get()); 969acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita SkRefCntSet::Iter iter(typefaceSet); 970acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita int i = 0; 971acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 972acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita for (void* setPtr = iter.next(); setPtr; setPtr = iter.next()) { 973acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita idBuffer[i++] = this->getTypefaceID(reinterpret_cast<SkTypeface*>(setPtr)); 974acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita } 975acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 976acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita SkASSERT(i == typefaceSet.count()); 977acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 978acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita return size; 979acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita} 980acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 981b7425173f96e93b090787e2386ba5f022b6c2869fmalitavoid SkGPipeCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 982b7425173f96e93b090787e2386ba5f022b6c2869fmalita const SkPaint& paint) { 983228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita NOTIFY_SETUP(this); 984228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita this->writePaint(paint); 985228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita 986228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita // FIXME: this is inefficient but avoids duplicating the blob serialization logic. 987acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita SkRefCntSet typefaceSet; 988228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita SkWriteBuffer blobBuffer; 989acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita blobBuffer.setTypefaceRecorder(&typefaceSet); 990228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita blob->flatten(blobBuffer); 991228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita 992acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // Unlike most draw ops (which only use one paint/typeface), text blobs may reference 993acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // an arbitrary number of typefaces. Since the one-paint-per-op model is not applicable, 994acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // we need to serialize these explicitly. 995acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita TypefaceBuffer typefaceBuffer; 996acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita size_t typefaceSize = is_cross_process(fFlags) 997acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita ? this->getCrossProcessTypefaces(typefaceSet, &typefaceBuffer) 998acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita : this->getInProcessTypefaces(typefaceSet, &typefaceBuffer); 999acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 1000acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // blob byte count + typeface count + x + y + blob data + an index (cross-process) 1001acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita // or pointer (in-process) for each typeface 1002acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita size_t size = 2 * sizeof(uint32_t) 1003acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita + 2 * sizeof(SkScalar) 1004acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita + blobBuffer.bytesWritten() 1005acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita + typefaceSize; 1006acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 1007228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita if (this->needOpBytes(size)) { 1008228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita this->writeOp(kDrawTextBlob_DrawOp); 1009acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita SkDEBUGCODE(size_t initialOffset = fWriter.bytesWritten();) 1010acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 1011228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita fWriter.writeScalar(x); 1012228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita fWriter.writeScalar(y); 1013acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 1014acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita fWriter.write32(typefaceSet.count()); 1015acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita fWriter.write(typefaceBuffer.get(), typefaceSize); 1016acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 1017228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita fWriter.write32(SkToU32(blobBuffer.bytesWritten())); 1018228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita uint32_t* pad = fWriter.reservePad(blobBuffer.bytesWritten()); 1019228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita blobBuffer.writeToMemory(pad); 1020acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita 1021acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita SkASSERT(initialOffset + size == fWriter.bytesWritten()); 1022228a6f275d7c5c17c48c20b57df971d9848f5dfffmalita } 1023b7425173f96e93b090787e2386ba5f022b6c2869fmalita} 1024b7425173f96e93b090787e2386ba5f022b6c2869fmalita 1025d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reedvoid SkGPipeCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, 1026d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed const SkPaint* paint) { 10270faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com // we want to playback the picture into individual draw calls 1028d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed // 1029d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed // todo: do we always have to unroll? If the pipe is not cross-process, seems like 1030d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed // we could just ref the picture and move on...? <reed, scroggo> 1031d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed // 1032d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed this->INHERITED::onDrawPicture(picture, matrix, paint); 1033bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1034bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 103541af966ab338e95eee81ab618ab28195075338f7reedvoid SkGPipeCanvas::onDrawVertices(VertexMode vmode, int vertexCount, 103641af966ab338e95eee81ab618ab28195075338f7reed const SkPoint vertices[], const SkPoint texs[], 103741af966ab338e95eee81ab618ab28195075338f7reed const SkColor colors[], SkXfermode* xfer, 103841af966ab338e95eee81ab618ab28195075338f7reed const uint16_t indices[], int indexCount, 103941af966ab338e95eee81ab618ab28195075338f7reed const SkPaint& paint) { 1040bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (0 == vertexCount) { 1041bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return; 1042bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1043bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1044f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org NOTIFY_SETUP(this); 104531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writePaint(paint); 1046d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org 1047d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org unsigned flags = 0; // packs with the op, so needs no extra space 1048d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org 1049d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size_t size = 0; 1050d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += 4; // vmode 1051d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += 4; // vertex count 1052d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += vertexCount * sizeof(SkPoint); // vertices 1053d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org 1054bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (texs) { 1055bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasTexs_DrawOpFlag; 1056acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkPoint); 1057bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1058bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (colors) { 1059bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com flags |= kDrawVertices_HasColors_DrawOpFlag; 1060acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size += vertexCount * sizeof(SkColor); 1061bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1062f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org if (xfer && !SkXfermode::IsMode(xfer, SkXfermode::kModulate_Mode)) { 1063f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org flags |= kDrawVertices_HasXfermode_DrawOpFlag; 1064d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += sizeof(int32_t); // SkXfermode::Mode 1065d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org } 1066d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (indices && indexCount > 0) { 1067d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org flags |= kDrawVertices_HasIndices_DrawOpFlag; 1068d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += 4; // index count 1069d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org size += SkAlign4(indexCount * sizeof(uint16_t)); // indices 107085e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 107174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org 1072acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (this->needOpBytes(size)) { 107331891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com this->writeOp(kDrawVertices_DrawOp, flags, 0); 107485e143c33c214e54187aa28146aa7666961a0d17reed@google.com fWriter.write32(vmode); 1075acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(vertexCount); 1076acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(vertices, vertexCount * sizeof(SkPoint)); 1077d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (flags & kDrawVertices_HasTexs_DrawOpFlag) { 1078acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(texs, vertexCount * sizeof(SkPoint)); 1079acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 1080d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (flags & kDrawVertices_HasColors_DrawOpFlag) { 1081acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write(colors, vertexCount * sizeof(SkColor)); 1082acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 108385e143c33c214e54187aa28146aa7666961a0d17reed@google.com if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { 108485e143c33c214e54187aa28146aa7666961a0d17reed@google.com SkXfermode::Mode mode = SkXfermode::kModulate_Mode; 1085d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org SkAssertResult(xfer->asMode(&mode)); 108685e143c33c214e54187aa28146aa7666961a0d17reed@google.com fWriter.write32(mode); 108785e143c33c214e54187aa28146aa7666961a0d17reed@google.com } 1088d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org if (flags & kDrawVertices_HasIndices_DrawOpFlag) { 1089acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.write32(indexCount); 1090acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.writePad(indices, indexCount * sizeof(uint16_t)); 1091acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com } 1092bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1093bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1094bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1095b3c9d1c33caf325aada244204215eb790c228c12dandovvoid SkGPipeCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 1096b3c9d1c33caf325aada244204215eb790c228c12dandov const SkPoint texCoords[4], SkXfermode* xmode, 1097b3c9d1c33caf325aada244204215eb790c228c12dandov const SkPaint& paint) { 1098963137b75c0a1fe91f35e9826742f36309f5e65ddandov NOTIFY_SETUP(this); 10992bf8d09689715eaa84deebe11b62d987013923c3piotaixr 1100b3c9d1c33caf325aada244204215eb790c228c12dandov size_t size = SkPatchUtils::kNumCtrlPts * sizeof(SkPoint); 1101b3c9d1c33caf325aada244204215eb790c228c12dandov unsigned flags = 0; 110249f085dddff10473b6ebf832a974288300224e60bsalomon if (colors) { 1103b3c9d1c33caf325aada244204215eb790c228c12dandov flags |= kDrawVertices_HasColors_DrawOpFlag; 1104b3c9d1c33caf325aada244204215eb790c228c12dandov size += SkPatchUtils::kNumCorners * sizeof(SkColor); 1105b3c9d1c33caf325aada244204215eb790c228c12dandov } 110649f085dddff10473b6ebf832a974288300224e60bsalomon if (texCoords) { 1107b3c9d1c33caf325aada244204215eb790c228c12dandov flags |= kDrawVertices_HasTexs_DrawOpFlag; 1108b3c9d1c33caf325aada244204215eb790c228c12dandov size += SkPatchUtils::kNumCorners * sizeof(SkPoint); 1109b3c9d1c33caf325aada244204215eb790c228c12dandov } 111049f085dddff10473b6ebf832a974288300224e60bsalomon if (xmode) { 1111b3c9d1c33caf325aada244204215eb790c228c12dandov SkXfermode::Mode mode; 1112b3c9d1c33caf325aada244204215eb790c228c12dandov if (xmode->asMode(&mode) && SkXfermode::kModulate_Mode != mode) { 1113b3c9d1c33caf325aada244204215eb790c228c12dandov flags |= kDrawVertices_HasXfermode_DrawOpFlag; 1114b3c9d1c33caf325aada244204215eb790c228c12dandov size += sizeof(int32_t); 1115b3c9d1c33caf325aada244204215eb790c228c12dandov } 1116b3c9d1c33caf325aada244204215eb790c228c12dandov } 11172bf8d09689715eaa84deebe11b62d987013923c3piotaixr 1118963137b75c0a1fe91f35e9826742f36309f5e65ddandov this->writePaint(paint); 1119b3c9d1c33caf325aada244204215eb790c228c12dandov if (this->needOpBytes(size)) { 1120b3c9d1c33caf325aada244204215eb790c228c12dandov this->writeOp(kDrawPatch_DrawOp, flags, 0); 11212bf8d09689715eaa84deebe11b62d987013923c3piotaixr 1122b3c9d1c33caf325aada244204215eb790c228c12dandov fWriter.write(cubics, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); 11232bf8d09689715eaa84deebe11b62d987013923c3piotaixr 112449f085dddff10473b6ebf832a974288300224e60bsalomon if (colors) { 1125b3c9d1c33caf325aada244204215eb790c228c12dandov fWriter.write(colors, SkPatchUtils::kNumCorners * sizeof(SkColor)); 1126b3c9d1c33caf325aada244204215eb790c228c12dandov } 11272bf8d09689715eaa84deebe11b62d987013923c3piotaixr 112849f085dddff10473b6ebf832a974288300224e60bsalomon if (texCoords) { 1129b3c9d1c33caf325aada244204215eb790c228c12dandov fWriter.write(texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint)); 1130b3c9d1c33caf325aada244204215eb790c228c12dandov } 11312bf8d09689715eaa84deebe11b62d987013923c3piotaixr 1132b3c9d1c33caf325aada244204215eb790c228c12dandov if (flags & kDrawVertices_HasXfermode_DrawOpFlag) { 1133b3c9d1c33caf325aada244204215eb790c228c12dandov SkXfermode::Mode mode = SkXfermode::kModulate_Mode; 1134b3c9d1c33caf325aada244204215eb790c228c12dandov SkAssertResult(xmode->asMode(&mode)); 1135b3c9d1c33caf325aada244204215eb790c228c12dandov fWriter.write32(mode); 1136b3c9d1c33caf325aada244204215eb790c228c12dandov } 1137963137b75c0a1fe91f35e9826742f36309f5e65ddandov } 1138963137b75c0a1fe91f35e9826742f36309f5e65ddandov} 1139963137b75c0a1fe91f35e9826742f36309f5e65ddandov 11400a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::beginCommentGroup(const char* description) { 11410a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 11420a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 11430a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 11440a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::addComment(const char* kywd, const char* value) { 11450a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 11460a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 11470a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 11480a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comvoid SkGPipeCanvas::endCommentGroup() { 11490a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com // ignore for now 11500a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com} 11510a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com 115277eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.orgvoid SkGPipeCanvas::flushRecording(bool detachCurrentBlock) { 1153d0490172e5ba729181e238f19da6194cd135ba25commit-bot@chromium.org this->doNotify(); 115477eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org if (detachCurrentBlock) { 115577eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org // force a new block to be requested for the next recorded command 1156d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com fBlockSize = 0; 115777eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org } 115877eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 115977eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 11602e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) { 1161d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesToFree); 11622e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 11632e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 1164bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1165bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1166bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comtemplate <typename T> uint32_t castToU32(T value) { 1167bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com union { 1168bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com T fSrc; 1169bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t fDst; 1170bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } data; 1171bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com data.fSrc = value; 1172bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return data.fDst; 1173bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1174bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 117531891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.comvoid SkGPipeCanvas::writePaint(const SkPaint& paint) { 1176d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com if (fDone) { 1177d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com return; 1178d5d158b325f05902ac845f2f7c8c65ffe6074257scroggo@google.com } 117931891584fef10c88b39f6bf19ac5cde0a862b8c4reed@google.com SkPaint& base = fPaint; 1180bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t storage[32]; 1181bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com uint32_t* ptr = storage; 1182bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1183bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getFlags() != paint.getFlags()) { 1184bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kFlags_PaintOp, paint.getFlags()); 1185f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setFlags(paint.getFlags()); 1186bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1187bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getColor() != paint.getColor()) { 1188bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kColor_PaintOp); 1189bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = paint.getColor(); 1190f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setColor(paint.getColor()); 1191bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 119293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed if (base.getFilterQuality() != paint.getFilterQuality()) { 119393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed *ptr++ = PaintOp_packOpData(kFilterLevel_PaintOp, paint.getFilterQuality()); 119493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed base.setFilterQuality(paint.getFilterQuality()); 119585faf50875fcf6008880a98aaa05d12ae8dad343commit-bot@chromium.org } 1196bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStyle() != paint.getStyle()) { 1197bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kStyle_PaintOp, paint.getStyle()); 1198f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStyle(paint.getStyle()); 1199bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1200bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeJoin() != paint.getStrokeJoin()) { 1201bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kJoin_PaintOp, paint.getStrokeJoin()); 1202f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeJoin(paint.getStrokeJoin()); 1203bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1204bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeCap() != paint.getStrokeCap()) { 1205bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kCap_PaintOp, paint.getStrokeCap()); 1206f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeCap(paint.getStrokeCap()); 1207bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1208bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeWidth() != paint.getStrokeWidth()) { 1209bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kWidth_PaintOp); 1210bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeWidth()); 1211f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeWidth(paint.getStrokeWidth()); 1212bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1213bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getStrokeMiter() != paint.getStrokeMiter()) { 1214bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kMiter_PaintOp); 1215bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getStrokeMiter()); 1216f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setStrokeMiter(paint.getStrokeMiter()); 1217bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1218bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextEncoding() != paint.getTextEncoding()) { 1219bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kEncoding_PaintOp, paint.getTextEncoding()); 1220f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextEncoding(paint.getTextEncoding()); 1221bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1222bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getHinting() != paint.getHinting()) { 1223bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kHinting_PaintOp, paint.getHinting()); 1224f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setHinting(paint.getHinting()); 1225bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1226bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextAlign() != paint.getTextAlign()) { 1227bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOpData(kAlign_PaintOp, paint.getTextAlign()); 1228f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextAlign(paint.getTextAlign()); 1229bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1230bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSize() != paint.getTextSize()) { 1231bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSize_PaintOp); 1232bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSize()); 1233f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSize(paint.getTextSize()); 1234bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1235bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextScaleX() != paint.getTextScaleX()) { 1236bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextScaleX_PaintOp); 1237bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextScaleX()); 1238f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextScaleX(paint.getTextScaleX()); 1239bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1240bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (base.getTextSkewX() != paint.getTextSkewX()) { 1241bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = PaintOp_packOp(kTextSkewX_PaintOp); 1242bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com *ptr++ = castToU32(paint.getTextSkewX()); 1243f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTextSkewX(paint.getTextSkewX()); 1244f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com } 1245f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com 1246f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com if (!SkTypeface::Equal(base.getTypeface(), paint.getTypeface())) { 1247acb882c239c0cfea738fe63ed9de48ddc2ddc76afmalita if (is_cross_process(fFlags)) { 12483cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com uint32_t id = this->getTypefaceID(paint.getTypeface()); 12493cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com *ptr++ = PaintOp_packOpData(kTypeface_PaintOp, id); 12503cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } else if (this->needOpBytes(sizeof(void*))) { 12513cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // Add to the set for ref counting. 12523cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fTypefaceSet.add(paint.getTypeface()); 12533cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // It is safe to write the typeface to the stream before the rest 12543cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // of the paint unless we ever send a kReset_PaintOp, which we 12553cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com // currently never do. 12563cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com this->writeOp(kSetTypeface_DrawOp); 12573cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com fWriter.writePtr(paint.getTypeface()); 12583cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com } 1259f5842f773b7e8612a52784b3c35c7455e67cb90areed@google.com base.setTypeface(paint.getTypeface()); 1260bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1261bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 12624dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // This is a new paint, so all old flats can be safely purged, if necessary. 12634dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markAllFlatsSafeToDelete(); 1264b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com for (int i = 0; i < kCount_PaintFlats; i++) { 1265b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com int index = this->flattenToIndex(get_paintflat(paint, i), (PaintFlats)i); 1266d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com bool replaced = index < 0; 1267d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (replaced) { 1268d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com index = ~index; 1269d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com } 12704dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com // Store the index of any flat that needs to be kept. 0 means no flat. 12714dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com if (index > 0) { 12724dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com fFlattenableHeap.markFlatForKeeping(index); 12734dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com } 12744dffc596aa9fabd3104e66bc1f9957e8de4cb65dscroggo@google.com SkASSERT(index >= 0 && index <= fFlatDictionary.count()); 1275d3ba5cc85e24896f980ed1ba6e3f4495973baeb3scroggo@google.com if (index != fCurrFlatIndex[i] || replaced) { 1276b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com *ptr++ = PaintOp_packOpFlagData(kFlatIndex_PaintOp, i, index); 1277b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fCurrFlatIndex[i] = index; 1278b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1279b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com } 1280b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com 1281acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com size_t size = (char*)ptr - (char*)storage; 1282acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com if (size && this->needOpBytes(size)) { 1283b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org this->writeOp(kPaintOp_DrawOp, 0, SkToU32(size)); 1284b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com fWriter.write(storage, size); 1285bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com for (size_t i = 0; i < size/4; i++) { 1286b55d118e32062b1ddd88e7fcf8fa86303f887d8freed@google.com// SkDebugf("[%d] %08X\n", i, storage[i]); 1287bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1288bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 12890cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com 12900cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com // 12910cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com // Do these after we've written kPaintOp_DrawOp 1292fbc58a305518fe611113a51649bf557c991ac8cfskia.committer@gmail.com 12930cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com if (base.getAnnotation() != paint.getAnnotation()) { 12940cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com if (NULL == paint.getAnnotation()) { 129589ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (this->needOpBytes()) { 129689ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org this->writeOp(kSetAnnotation_DrawOp, 0, 0); 129789ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org } 12980cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } else { 12998b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org SkWriteBuffer buffer; 13000cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com paint.getAnnotation()->writeToBuffer(buffer); 130189ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org const size_t size = buffer.bytesWritten(); 130289ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org if (this->needOpBytes(size)) { 1303b45bd1f7fd60dbaa38340359f14e96b6a475d12dcommit-bot@chromium.org this->writeOp(kSetAnnotation_DrawOp, 0, SkToU32(size)); 130489ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org buffer.writeToMemory(fWriter.reserve(size)); 130589ff3dd5af99fb31931a63298617d9a91bff2ca6commit-bot@chromium.org } 13060cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 130740258a5be9afe3820bdc6aed4dd94abff3160d94commit-bot@chromium.org base.setAnnotation(paint.getAnnotation()); 13080cd2ac6c721120a2628524dad91798aa3e7ec41dreed@google.com } 1309bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1310bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1311bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com/////////////////////////////////////////////////////////////////////////////// 1312bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1313bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com#include "SkGPipe.h" 1314bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 13153cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeController::~SkGPipeController() { 13163cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkSafeUnref(fCanvas); 13173cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 13183cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 13193cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comvoid SkGPipeController::setCanvas(SkGPipeCanvas* canvas) { 13203cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com SkRefCnt_SafeAssign(fCanvas, canvas); 13213cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com} 13223cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 13233cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com/////////////////////////////////////////////////////////////////////////////// 13243cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com 13253cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.comSkGPipeWriter::SkGPipeWriter() 13260c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com: fWriter(0) { 1327bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1328bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1329bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1330bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comSkGPipeWriter::~SkGPipeWriter() { 1331acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com this->endRecording(); 1332bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1333bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1334a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.orgSkCanvas* SkGPipeWriter::startRecording(SkGPipeController* controller, uint32_t flags, 1335a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org uint32_t width, uint32_t height) { 1336bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (NULL == fCanvas) { 1337acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com fWriter.reset(NULL, 0); 1338a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org fCanvas = SkNEW_ARGS(SkGPipeCanvas, (controller, &fWriter, flags, width, height)); 1339bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 13403cb969f27de56df0d9116c13f18bd31ee0715f1ascroggo@google.com controller->setCanvas(fCanvas); 1341bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com return fCanvas; 1342bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1343bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 1344bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.comvoid SkGPipeWriter::endRecording() { 1345bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com if (fCanvas) { 134659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas->finish(true); 1347bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas->unref(); 1348bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com fCanvas = NULL; 1349bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com } 1350bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com} 1351bb6992a9d6e21b3f28068765de0a41c6f2508dfdreed@google.com 13522e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgvoid SkGPipeWriter::flushRecording(bool detachCurrentBlock) { 13532e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 13542e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org fCanvas->flushRecording(detachCurrentBlock); 13552e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 13562e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 13572e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 13582e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::freeMemoryIfPossible(size_t bytesToFree) { 13592e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org if (fCanvas) { 13602e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return fCanvas->freeMemoryIfPossible(bytesToFree); 13612e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org } 13622e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return 0; 136377eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org} 136477eec248cbd5a0c2f5f8595e62e3bff5ea363f17junov@chromium.org 13652e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkGPipeWriter::storageAllocatedForRecording() const { 136615011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com return NULL == fCanvas ? 0 : fCanvas->storageAllocatedForRecording(); 136715011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com} 136815011ee5e4068ab6523e432e435473a822ee7d80scroggo@google.com 13693e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com/////////////////////////////////////////////////////////////////////////////// 13703e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 13713e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::BitmapShuttle(SkGPipeCanvas* canvas) { 13723e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com SkASSERT(canvas != NULL); 13733e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas = canvas; 13743e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com fCanvas->ref(); 13753e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 13763e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 13773e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.comBitmapShuttle::~BitmapShuttle() { 137859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com this->removeCanvas(); 13793e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 13803e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com 13813e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.combool BitmapShuttle::insert(const SkBitmap& bitmap, int32_t slot) { 138259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com SkASSERT(fCanvas != NULL); 13833e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com return fCanvas->shuttleBitmap(bitmap, slot); 13843e26bd0c357d849ff40b092decd7a5c46ec2ada4scroggo@google.com} 138559c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com 138659c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.comvoid BitmapShuttle::removeCanvas() { 138759c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com if (NULL == fCanvas) { 138859c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com return; 138959c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com } 139059c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas->unref(); 139159c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com fCanvas = NULL; 139259c3ab637b7cb23c1afc098a2967518788a671eascroggo@google.com} 1393a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1394a85d4d0814818e4ddabb9237da209d61d6cd5854reed/////////////////////////////////////////////////////////////////////////////////////////////////// 1395a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1396a85d4d0814818e4ddabb9237da209d61d6cd5854reedSkImageHeap::SkImageHeap() {} 1397a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1398a85d4d0814818e4ddabb9237da209d61d6cd5854reedSkImageHeap::~SkImageHeap() { 1399a85d4d0814818e4ddabb9237da209d61d6cd5854reed fArray.unrefAll(); 1400a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 1401a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1402a85d4d0814818e4ddabb9237da209d61d6cd5854reedconst SkImage* SkImageHeap::get(int32_t slot) const { 1403a85d4d0814818e4ddabb9237da209d61d6cd5854reed SkASSERT(slot > 0); 1404a85d4d0814818e4ddabb9237da209d61d6cd5854reed return fArray[slot - 1]; 1405a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 1406a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1407a85d4d0814818e4ddabb9237da209d61d6cd5854reedint32_t SkImageHeap::find(const SkImage* img) const { 1408a85d4d0814818e4ddabb9237da209d61d6cd5854reed int index = fArray.find(img); 1409a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (index >= 0) { 1410a85d4d0814818e4ddabb9237da209d61d6cd5854reed return index + 1; // found 1411a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 1412a85d4d0814818e4ddabb9237da209d61d6cd5854reed return 0; // not found 1413a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 1414a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1415a85d4d0814818e4ddabb9237da209d61d6cd5854reedint32_t SkImageHeap::insert(const SkImage* img) { 1416a85d4d0814818e4ddabb9237da209d61d6cd5854reed int32_t slot = this->find(img); 1417a85d4d0814818e4ddabb9237da209d61d6cd5854reed if (slot) { 1418a85d4d0814818e4ddabb9237da209d61d6cd5854reed return slot; 1419a85d4d0814818e4ddabb9237da209d61d6cd5854reed } 1420a85d4d0814818e4ddabb9237da209d61d6cd5854reed *fArray.append() = SkRef(img); 1421a85d4d0814818e4ddabb9237da209d61d6cd5854reed return fArray.count(); // slot is always index+1 1422a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 1423a85d4d0814818e4ddabb9237da209d61d6cd5854reed 1424