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