11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPictureRecord.h"
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTSearch.h"
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MIN_WRITER_SIZE 16384
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define HEAP_BLOCK_SIZE 4096
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPictureRecord::SkPictureRecord(uint32_t flags) :
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fHeap(HEAP_BLOCK_SIZE), fWriter(MIN_WRITER_SIZE), fRecordFlags(flags) {
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fBitmapIndex = fMatrixIndex = fPaintIndex = fRegionIndex = 1;
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointBytes = fRectBytes = fTextBytes = 0;
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointWrites = fRectWrites = fTextWrites = 0;
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.setReserve(32);
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.push(0);
2440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPathHeap = NULL;   // lazy allocate
264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    fFirstSavedLayerIndex = kNoSavedLayerIndex;
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPictureRecord::~SkPictureRecord() {
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    reset();
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::save(SaveFlags flags) {
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(SAVE);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(flags);
3840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.push(0);
4040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::save(flags);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint,
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                               SaveFlags flags) {
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(SAVE_LAYER);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addRectPtr(bounds);
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaintPtr(paint);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(flags);
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.push(0);
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (kNoSavedLayerIndex == fFirstSavedLayerIndex) {
554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fFirstSavedLayerIndex = fRestoreOffsetStack.count();
564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
59ea8eb95a903dda7b277cdbc97523688b9857963bMike Reed    /*  Don't actually call saveLayer, because that will try to allocate an
60ea8eb95a903dda7b277cdbc97523688b9857963bMike Reed        offscreen device (potentially very big) which we don't actually need
61ea8eb95a903dda7b277cdbc97523688b9857963bMike Reed        at this time (and may not be able to afford since during record our
62ea8eb95a903dda7b277cdbc97523688b9857963bMike Reed        clip starts out the size of the picture, which is often much larger
63ea8eb95a903dda7b277cdbc97523688b9857963bMike Reed        than the size of the actual device we'll use during playback).
64ea8eb95a903dda7b277cdbc97523688b9857963bMike Reed     */
654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int count = this->INHERITED::save(flags);
664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    this->clipRectBounds(bounds, flags, NULL);
674f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return count;
684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}
694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkPictureRecord::isDrawingToLayer() const {
714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return fFirstSavedLayerIndex != kNoSavedLayerIndex;
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::restore() {
75ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    // check for underflow
76ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    if (fRestoreOffsetStack.count() == 0) {
77ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed        return;
78ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    }
79a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // patch up the clip offsets
81ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    uint32_t restoreOffset = (uint32_t)fWriter.size();
82ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    uint32_t offset = fRestoreOffsetStack.top();
83ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    while (offset) {
84ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed        uint32_t* peek = fWriter.peek32(offset);
85ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed        offset = *peek;
86ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed        *peek = restoreOffset;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (fRestoreOffsetStack.count() == fFirstSavedLayerIndex) {
904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fFirstSavedLayerIndex = kNoSavedLayerIndex;
914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
93ee38d710c05d4a6a8d8a649f5a05b8380ba748bcMike Reed    fRestoreOffsetStack.pop();
94a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(RESTORE);
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::restore();
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPictureRecord::translate(SkScalar dx, SkScalar dy) {
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(TRANSLATE);
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(dx);
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(dy);
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::translate(dx, dy);
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPictureRecord::scale(SkScalar sx, SkScalar sy) {
10940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    addDraw(SCALE);
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(sx);
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(sy);
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::scale(sx, sy);
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPictureRecord::rotate(SkScalar degrees) {
11740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    addDraw(ROTATE);
11840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    addScalar(degrees);
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::rotate(degrees);
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPictureRecord::skew(SkScalar sx, SkScalar sy) {
12440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    addDraw(SKEW);
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(sx);
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(sy);
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::skew(sx, sy);
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPictureRecord::concat(const SkMatrix& matrix) {
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(CONCAT);
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addMatrix(matrix);
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::concat(matrix);
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::setMatrix(const SkMatrix& matrix) {
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(SET_MATRIX);
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addMatrix(matrix);
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->INHERITED::setMatrix(matrix);
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic bool regionOpExpands(SkRegion::Op op) {
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (op) {
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkRegion::kUnion_Op:
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkRegion::kXOR_Op:
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkRegion::kReverseDifference_Op:
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkRegion::kReplace_Op:
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkRegion::kIntersect_Op:
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case SkRegion::kDifference_Op:
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkDEBUGFAIL("unknown region op");
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
16240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPictureRecord::recordOffsetForRestore(SkRegion::Op op) {
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (regionOpExpands(op)) {
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Run back through any previous clip ops, and mark their offset to
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // be 0, disabling their ability to trigger a jump-to-restore, otherwise
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // they could hide this clips ability to expand the clip (i.e. go from
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // empty to non-empty).
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint32_t offset = fRestoreOffsetStack.top();
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        while (offset) {
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            uint32_t* peek = fWriter.peek32(offset);
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            offset = *peek;
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *peek = 0;
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1764f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t offset = fWriter.size();
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(fRestoreOffsetStack.top());
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.top() = offset;
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addDraw(CLIP_RECT);
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addRect(rect);
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addInt(ClipParams_pack(op, doAA));
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->recordOffsetForRestore(op);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return this->INHERITED::clipRect(rect, op, doAA);
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(CLIP_PATH);
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPath(path);
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addInt(ClipParams_pack(op, doAA));
19740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->recordOffsetForRestore(op);
19940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
20140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) {
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->INHERITED::clipRect(path.getBounds(), op, doAA);
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->INHERITED::clipPath(path, op, doAA);
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) {
21040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    addDraw(CLIP_REGION);
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addRegion(region);
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addInt(ClipParams_pack(op, false));
21340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->recordOffsetForRestore(op);
21540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return this->INHERITED::clipRegion(region, op);
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
22035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkPictureRecord::clear(SkColor color) {
22135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    addDraw(DRAW_CLEAR);
22235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    addInt(color);
22335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    validate();
22435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger}
22535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawPaint(const SkPaint& paint) {
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_PAINT);
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkPaint& paint) {
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_POINTS);
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(mode);
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(count);
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.writeMul4(pts, count * sizeof(SkPoint));
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) {
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_RECT);
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addRect(rect);
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) {
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_PATH);
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPath(path);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkPaint* paint = NULL) {
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_BITMAP);
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaintPtr(paint);
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addBitmap(bitmap);
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(left);
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(top);
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkRect& dst, const SkPaint* paint) {
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_BITMAP_RECT);
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaintPtr(paint);
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addBitmap(bitmap);
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addIRectPtr(src);  // may be null
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addRect(dst);
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& matrix,
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                       const SkPaint* paint) {
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_BITMAP_MATRIX);
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaintPtr(paint);
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addBitmap(bitmap);
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addMatrix(matrix);
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     const SkRect& dst, const SkPaint* paint) {
2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addDraw(DRAW_BITMAP_NINE);
2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addPaintPtr(paint);
2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addBitmap(bitmap);
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addIRect(center);
2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    addRect(dst);
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    validate();
2931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top,
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkPaint* paint = NULL) {
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_SPRITE);
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaintPtr(paint);
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addBitmap(bitmap);
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(left);
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(top);
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint,
306717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger                                              SkScalar minY, SkScalar maxY) {
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPaint::FontMetrics metrics;
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    paint.getFontMetrics(&metrics);
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkRect bounds;
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // construct a rect so we can see any adjustments from the paint.
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // we use 0,1 for left,right, just so the rect isn't empty
312717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    bounds.set(0, metrics.fTop + minY,
313717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger               SK_Scalar1, metrics.fBottom + maxY);
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    (void)paint.computeFastBounds(bounds, &bounds);
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // now record the top and bottom
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(bounds.fTop);
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(bounds.fBottom);
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
32040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x,
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      SkScalar y, const SkPaint& paint) {
32217e8e7f090bf84986b3fc2c9822daa83c8719eccDerek Sollenberger    bool fast = !paint.isVerticalText() && paint.canComputeFastBounds();
32340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT);
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addText(text, byteLength);
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(x);
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(y);
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fast) {
330717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        addFontMetricsTopBottom(paint, y, y);
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
33540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkPictureRecord::drawPosText(const void* text, size_t byteLength,
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                         const SkPoint pos[], const SkPaint& paint) {
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t points = paint.countText(text, byteLength);
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (0 == points)
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool canUseDrawH = true;
342717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    SkScalar minY = pos[0].fY;
343717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    SkScalar maxY = pos[0].fY;
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // check if the caller really should have used drawPosTextH()
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkScalar firstY = pos[0].fY;
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (size_t index = 1; index < points; index++) {
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (pos[index].fY != firstY) {
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                canUseDrawH = false;
350717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger                if (pos[index].fY < minY) {
351717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger                    minY = pos[index].fY;
352717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger                } else if (pos[index].fY > maxY) {
353717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger                    maxY = pos[index].fY;
354717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger                }
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
35840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
35917e8e7f090bf84986b3fc2c9822daa83c8719eccDerek Sollenberger    bool fastBounds = !paint.isVerticalText() && paint.canComputeFastBounds();
360717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    bool fast = canUseDrawH && fastBounds;
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fast) {
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        addDraw(DRAW_POS_TEXT_H_TOP_BOTTOM);
364717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    } else if (canUseDrawH) {
365717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        addDraw(DRAW_POS_TEXT_H);
366717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    } else if (fastBounds) {
367717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        addDraw(DRAW_POS_TEXT_TOP_BOTTOM);
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
369717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        addDraw(DRAW_POS_TEXT);
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addText(text, byteLength);
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(points);
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t start = fWriter.size();
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (canUseDrawH) {
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fast) {
380717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger            addFontMetricsTopBottom(paint, pos[0].fY, pos[0].fY);
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        addScalar(pos[0].fY);
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar));
38440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        for (size_t index = 0; index < points; index++)
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xptr++ = pos[index].fX;
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else {
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writeMul4(pos, points * sizeof(SkPoint));
389717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        if (fastBounds) {
390717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger            addFontMetricsTopBottom(paint, minY, maxY);
391717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        }
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointBytes += fWriter.size() - start;
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointWrites += points;
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawPosTextH(const void* text, size_t byteLength,
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkScalar xpos[], SkScalar constY,
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPaint& paint) {
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t points = paint.countText(text, byteLength);
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (0 == points)
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
40640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
40717e8e7f090bf84986b3fc2c9822daa83c8719eccDerek Sollenberger    bool fast = !paint.isVerticalText() && paint.canComputeFastBounds();
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRAW_POS_TEXT_H);
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addText(text, byteLength);
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(points);
41340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t start = fWriter.size();
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fast) {
418717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        addFontMetricsTopBottom(paint, constY, constY);
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addScalar(constY);
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.writeMul4(xpos, points * sizeof(SkScalar));
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointBytes += fWriter.size() - start;
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointWrites += points;
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
42940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength,
43040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                            const SkPath& path, const SkMatrix* matrix,
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint& paint) {
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_TEXT_ON_PATH);
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addText(text, byteLength);
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPath(path);
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addMatrixPtr(matrix);
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawPicture(SkPicture& picture) {
4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_PICTURE);
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPicture(picture);
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validate();
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount,
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPoint vertices[], const SkPoint texs[],
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkColor colors[], SkXfermode*,
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const uint16_t indices[], int indexCount,
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPaint& paint) {
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t flags = 0;
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (texs) {
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        flags |= DRAW_VERTICES_HAS_TEXS;
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (colors) {
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        flags |= DRAW_VERTICES_HAS_COLORS;
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (indexCount > 0) {
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        flags |= DRAW_VERTICES_HAS_INDICES;
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addDraw(DRAW_VERTICES);
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaint(paint);
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(flags);
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(vmode);
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(vertexCount);
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPoints(vertices, vertexCount);
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (flags & DRAW_VERTICES_HAS_TEXS) {
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        addPoints(texs, vertexCount);
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (flags & DRAW_VERTICES_HAS_COLORS) {
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writeMul4(colors, vertexCount * sizeof(SkColor));
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (flags & DRAW_VERTICES_HAS_INDICES) {
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        addInt(indexCount);
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writePad(indices, indexCount * sizeof(uint16_t));
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
48093d11b5b461a8677a8e3ffa94260f4f9897070acMike Reedvoid SkPictureRecord::drawData(const void* data, size_t length) {
48193d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    addDraw(DRAW_DATA);
48293d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    addInt(length);
48393d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed    fWriter.writePad(data, length);
48493d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed}
48593d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
48740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::reset() {
48940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkSafeUnref(fPathHeap);
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPathHeap = NULL;
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fBitmaps.reset();
4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fMatrices.reset();
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPaints.reset();
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPictureRefs.unrefAll();
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRegions.reset();
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.reset();
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fHeap.reset();
49940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.setCount(1);
5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRestoreOffsetStack.top() = 0;
50240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
50335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    fRCSet.reset();
50435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    fTFSet.reset();
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addBitmap(const SkBitmap& bitmap) {
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(find(fBitmaps, bitmap));
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addMatrix(const SkMatrix& matrix) {
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addMatrixPtr(&matrix);
5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addMatrixPtr(const SkMatrix* matrix) {
5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(find(fMatrices, matrix));
5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addPaint(const SkPaint& paint) {
5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addPaintPtr(&paint);
5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addPaintPtr(const SkPaint* paint) {
5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(find(fPaints, paint));
5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addPath(const SkPath& path) {
5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (NULL == fPathHeap) {
5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fPathHeap = SkNEW(SkPathHeap);
5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(fPathHeap->append(path));
5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addPicture(SkPicture& picture) {
5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = fPictureRefs.find(&picture);
5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (index < 0) {    // not found
5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index = fPictureRefs.count();
5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *fPictureRefs.append() = &picture;
5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        picture.ref();
5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // follow the convention of recording a 1-based index
5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(index + 1);
5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addPoint(const SkPoint& point) {
5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t start = fWriter.size();
5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.writePoint(point);
5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointBytes += fWriter.size() - start;
5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointWrites++;
5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
55540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addPoints(const SkPoint pts[], int count) {
5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.writeMul4(pts, count * sizeof(SkPoint));
5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointBytes += count * sizeof(SkPoint);
5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPointWrites++;
5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addRect(const SkRect& rect) {
5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t start = fWriter.size();
5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.writeRect(rect);
5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRectBytes += fWriter.size() - start;
5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRectWrites++;
5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addRectPtr(const SkRect* rect) {
5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fWriter.writeBool(rect != NULL)) {
5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fWriter.writeRect(*rect);
5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkPictureRecord::addIRect(const SkIRect& rect) {
5821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fWriter.write(&rect, sizeof(rect));
5831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addIRectPtr(const SkIRect* rect) {
5860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fWriter.writeBool(rect != NULL)) {
5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *(SkIRect*)fWriter.reserve(sizeof(SkIRect)) = *rect;
5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addRegion(const SkRegion& region) {
5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(find(fRegions, region));
5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::addText(const void* text, size_t byteLength) {
5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
5970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t start = fWriter.size();
5980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    addInt(byteLength);
6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWriter.writePad(text, byteLength);
6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fTextBytes += fWriter.size() - start;
6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fTextWrites++;
6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::find(SkTDArray<const SkFlatBitmap* >& bitmaps, const SkBitmap& bitmap) {
6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFlatBitmap* flat = SkFlatBitmap::Flatten(&fHeap, bitmap, fBitmapIndex,
61135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                               &fRCSet);
61240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(),
6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (index >= 0) {
6155f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed        (void)fHeap.unalloc(flat);
6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return bitmaps[index]->index();
6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index = ~index;
6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *bitmaps.insert(index) = flat;
6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fBitmapIndex++;
6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::find(SkTDArray<const SkFlatMatrix* >& matrices, const SkMatrix* matrix) {
6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (matrix == NULL)
6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFlatMatrix* flat = SkFlatMatrix::Flatten(&fHeap, *matrix, fMatrixIndex);
62740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(),
6280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
6295f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed    if (index >= 0) {
6305f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed        (void)fHeap.unalloc(flat);
6310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return matrices[index]->index();
6325f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed    }
6330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index = ~index;
6340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *matrices.insert(index) = flat;
6350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fMatrixIndex++;
6360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::find(SkTDArray<const SkFlatPaint* >& paints, const SkPaint* paint) {
6390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (paint == NULL) {
6400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
6410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
64240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFlatPaint* flat = SkFlatPaint::Flatten(&fHeap, *paint, fPaintIndex,
64435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                             &fRCSet, &fTFSet);
64540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(),
6460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
6470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (index >= 0) {
6485f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed        (void)fHeap.unalloc(flat);
6490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return paints[index]->index();
6500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
6510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index = ~index;
6530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *paints.insert(index) = flat;
6540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fPaintIndex++;
6550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::find(SkTDArray<const SkFlatRegion* >& regions, const SkRegion& region) {
6580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFlatRegion* flat = SkFlatRegion::Flatten(&fHeap, region, fRegionIndex);
65940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    int index = SkTSearch<SkFlatData>((const SkFlatData**) regions.begin(),
6600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        regions.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
6615f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed    if (index >= 0) {
6625f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed        (void)fHeap.unalloc(flat);
6630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return regions[index]->index();
6645f6af4c62d33f128b6617fa4a038f309627a14d0Mike Reed    }
6650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index = ~index;
6660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *regions.insert(index) = flat;
6670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fRegionIndex++;
6680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_DUMP
6710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::dumpMatrices() {
6720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fMatrices.count();
6730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMatrix defaultMatrix;
6740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    defaultMatrix.reset();
6750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < count; index++) {
6760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFlatMatrix* flatMatrix = fMatrices[index];
6770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        flatMatrix->dump();
6780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
6790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::dumpPaints() {
6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fPaints.count();
68340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    for (int index = 0; index < count; index++)
6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fPaints[index]->dump();
6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_SIZE
6890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectsize_t SkPictureRecord::size() const {
6900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t result = 0;
6910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t sizeData;
6920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bitmaps(&sizeData);
6930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += sizeData;
6940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    matrices(&sizeData);
6950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += sizeData;
6960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    paints(&sizeData);
6970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += sizeData;
6980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    paths(&sizeData);
6990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += sizeData;
7000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    pictures(&sizeData);
7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += sizeData;
7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    regions(&sizeData);
7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += sizeData;
7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    result += streamlen();
7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return result;
7060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::bitmaps(size_t* size) const {
7090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t result = 0;
7100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fBitmaps.count();
71140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    for (int index = 0; index < count; index++)
7120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        result += sizeof(fBitmaps[index]) + fBitmaps[index]->size();
7130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *size = result;
7140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return count;
7150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::matrices(size_t* size) const {
7180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fMatrices.count();
7190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *size = sizeof(fMatrices[0]) * count;
7200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return count;
7210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::paints(size_t* size) const {
7240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t result = 0;
7250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fPaints.count();
72640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    for (int index = 0; index < count; index++)
7270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        result += sizeof(fPaints[index]) + fPaints[index]->size();
7280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *size = result;
7290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return count;
7300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::paths(size_t* size) const {
7330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t result = 0;
7340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fPaths.count();
73540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    for (int index = 0; index < count; index++)
7360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        result += sizeof(fPaths[index]) + fPaths[index]->size();
7370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *size = result;
7380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return count;
7390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint SkPictureRecord::regions(size_t* size) const {
7420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t result = 0;
7430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fRegions.count();
74440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    for (int index = 0; index < count; index++)
7450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        result += sizeof(fRegions[index]) + fRegions[index]->size();
7460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *size = result;
7470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return count;
7480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectsize_t SkPictureRecord::streamlen() const {
7510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fWriter.size();
7520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
7540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG_VALIDATE
7560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::validate() const {
7570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validateBitmaps();
7580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validateMatrices();
7590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validatePaints();
7600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validatePaths();
7610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validatePictures();
7620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    validateRegions();
7630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::validateBitmaps() const {
7660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fBitmaps.count();
7670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned) count < 0x1000);
7680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < count; index++) {
7690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFlatBitmap* bitPtr = fBitmaps[index];
7700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(bitPtr);
7710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitPtr->validate();
7720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::validateMatrices() const {
7760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fMatrices.count();
7770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned) count < 0x1000);
7780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < count; index++) {
7790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFlatMatrix* matrix = fMatrices[index];
7800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(matrix);
78140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        matrix->validate();
7820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::validatePaints() const {
7860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fPaints.count();
7870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned) count < 0x1000);
7880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < count; index++) {
7890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFlatPaint* paint = fPaints[index];
7900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(paint);
7910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//            paint->validate();
7920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
7930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
7940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::validatePaths() const {
7960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fPaths.count();
7970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned) count < 0x1000);
7980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < count; index++) {
7990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFlatPath* path = fPaths[index];
8000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(path);
8010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path->validate();
8020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
8030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPictureRecord::validateRegions() const {
8060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = fRegions.count();
8070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned) count < 0x1000);
8080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < count; index++) {
8090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFlatRegion* region = fRegions[index];
8100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(region);
8110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        region->validate();
8120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
8130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
8140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
8150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
816