11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
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 */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkLayerRasterizer.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBuffer.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDraw.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMask.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMaskFilter.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPath.h"
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "../core/SkRasterClip.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkXfermode.h"
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include <new>
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkLayerRasterizer_Rec {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPaint     fPaint;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkVector    fOffset;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerRasterizer::SkLayerRasterizer() : fLayers(sizeof(SkLayerRasterizer_Rec))
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkLayerRasterizer::~SkLayerRasterizer() {
3171531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    SkDeque::F2BIter        iter(fLayers);
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkLayerRasterizer_Rec*  rec;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL)
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fPaint.~SkPaint();
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkLayerRasterizer::addLayer(const SkPaint& paint, SkScalar dx,
3935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                 SkScalar dy) {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers.push_back();
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    new (&rec->fPaint) SkPaint(paint);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rec->fOffset.set(dx, dy);
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic bool compute_bounds(const SkDeque& layers, const SkPath& path,
4735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                           const SkMatrix& matrix,
4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                           const SkIRect* clipBounds, SkIRect* bounds) {
4971531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    SkDeque::F2BIter        iter(layers);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkLayerRasterizer_Rec*  rec;
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bounds->set(SK_MaxS32, SK_MaxS32, SK_MinS32, SK_MinS32);
5340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
5435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL) {
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkPaint&  paint = rec->fPaint;
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPath          fillPath, devPath;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkPath*   p = &path;
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        if (paint.getPathEffect() || paint.getStyle() != SkPaint::kFill_Style) {
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            paint.getFillPath(path, &fillPath);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p = &fillPath;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
6335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        if (p->isEmpty()) {
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
6535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        }
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // apply the matrix and offset
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        {
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkMatrix m = matrix;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            m.preTranslate(rec->fOffset.fX, rec->fOffset.fY);
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p->transform(m, &devPath);
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkMask  mask;
7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        if (!SkDraw::DrawToMask(devPath, clipBounds, paint.getMaskFilter(),
7635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                &matrix, &mask,
7735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                SkMask::kJustComputeBounds_CreateMode)) {
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
7935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        }
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bounds->join(mask.fBounds);
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                    const SkIRect* clipBounds,
8835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                    SkMask* mask, SkMask::CreateMode mode) {
8935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (fLayers.empty()) {
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
9135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    }
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (SkMask::kJustRenderImage_CreateMode != mode) {
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (!compute_bounds(fLayers, path, matrix, clipBounds, &mask->fBounds))
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (SkMask::kComputeBoundsAndRenderImage_CreateMode == mode) {
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        mask->fFormat   = SkMask::kA8_Format;
100aa4832adcc7eba085987357591bcfeb530ba7b0dMike Reed        mask->fRowBytes = mask->fBounds.width();
101eba9f316916f3381d6a5dd5c1300fea6ec6da8dcMike Reed        size_t size = mask->computeImageSize();
102eba9f316916f3381d6a5dd5c1300fea6ec6da8dcMike Reed        if (0 == size) {
103eba9f316916f3381d6a5dd5c1300fea6ec6da8dcMike Reed            return false;   // too big to allocate, abort
104eba9f316916f3381d6a5dd5c1300fea6ec6da8dcMike Reed        }
105eba9f316916f3381d6a5dd5c1300fea6ec6da8dcMike Reed        mask->fImage = SkMask::AllocImage(size);
106eba9f316916f3381d6a5dd5c1300fea6ec6da8dcMike Reed        memset(mask->fImage, 0, size);
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
10935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (SkMask::kJustComputeBounds_CreateMode != mode) {
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkBitmap        device;
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRasterClip    rectClip;
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkDraw          draw;
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkMatrix        translatedMatrix;  // this translates us to our local pixels
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkMatrix        drawMatrix;        // this translates the path by each layer's offset
11540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rectClip.setRect(SkIRect::MakeWH(mask->fBounds.width(), mask->fBounds.height()));
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        translatedMatrix = matrix;
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        translatedMatrix.postTranslate(-SkIntToScalar(mask->fBounds.fLeft),
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                       -SkIntToScalar(mask->fBounds.fTop));
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        device.setConfig(SkBitmap::kA8_Config, mask->fBounds.width(), mask->fBounds.height(), mask->fRowBytes);
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        device.setPixels(mask->fImage);
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        draw.fBitmap    = &device;
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        draw.fMatrix    = &drawMatrix;
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        draw.fRC        = &rectClip;
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        draw.fClip      = &rectClip.bwRgn();
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // we set the matrixproc in the loop, as the matrix changes each time (potentially)
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        draw.fBounder   = NULL;
13140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
13271531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        SkDeque::F2BIter        iter(fLayers);
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkLayerRasterizer_Rec*  rec;
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL) {
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            drawMatrix = translatedMatrix;
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            drawMatrix.preTranslate(rec->fOffset.fX, rec->fOffset.fY);
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            draw.drawPath(path, rec->fPaint);
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////// Routines for flattening /////////////////
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
14635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic void paint_read(SkPaint* paint, SkFlattenableReadBuffer& buffer) {
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    paint->setAntiAlias(buffer.readBool());
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    paint->setStyle((SkPaint::Style)buffer.readU8());
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    paint->setAlpha(buffer.readU8());
15040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
15135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (paint->getStyle() != SkPaint::kFill_Style) {
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint->setStrokeWidth(buffer.readScalar());
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint->setStrokeMiter(buffer.readScalar());
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint->setStrokeCap((SkPaint::Cap)buffer.readU8());
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint->setStrokeJoin((SkPaint::Join)buffer.readU8());
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
15840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkSafeUnref(paint->setMaskFilter((SkMaskFilter*)buffer.readFlattenable()));
15940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkSafeUnref(paint->setPathEffect((SkPathEffect*)buffer.readFlattenable()));
16040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkSafeUnref(paint->setRasterizer((SkRasterizer*)buffer.readFlattenable()));
16140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkSafeUnref(paint->setXfermode((SkXfermode*)buffer.readFlattenable()));
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
16435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic void paint_write(const SkPaint& paint, SkFlattenableWriteBuffer& buffer) {
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeBool(paint.isAntiAlias());
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.write8(paint.getStyle());
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.write8(paint.getAlpha());
16840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
16935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    if (paint.getStyle() != SkPaint::kFill_Style) {
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        buffer.writeScalar(paint.getStrokeWidth());
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        buffer.writeScalar(paint.getStrokeMiter());
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        buffer.write8(paint.getStrokeCap());
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        buffer.write8(paint.getStrokeJoin());
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
17540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeFlattenable(paint.getMaskFilter());
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeFlattenable(paint.getPathEffect());
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeFlattenable(paint.getRasterizer());
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeFlattenable(paint.getXfermode());
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerRasterizer::SkLayerRasterizer(SkFlattenableReadBuffer& buffer)
18335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    : SkRasterizer(buffer), fLayers(sizeof(SkLayerRasterizer_Rec)) {
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = buffer.readS32();
18540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
18635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    for (int i = 0; i < count; i++) {
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers.push_back();
18840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if 0
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        new (&rec->fPaint) SkPaint(buffer);
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        new (&rec->fPaint) SkPaint;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint_read(&rec->fPaint, buffer);
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fOffset.fX = buffer.readScalar();
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fOffset.fY = buffer.readScalar();
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
20035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkLayerRasterizer::flatten(SkFlattenableWriteBuffer& buffer) {
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->INHERITED::flatten(buffer);
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.write32(fLayers.count());
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
20571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    SkDeque::F2BIter                iter(fLayers);
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkLayerRasterizer_Rec*    rec;
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
20835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    while ((rec = (const SkLayerRasterizer_Rec*)iter.next()) != NULL) {
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if 0
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fPaint.flatten(buffer);
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        paint_write(rec->fPaint, buffer);
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        buffer.writeScalar(rec->fOffset.fX);
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        buffer.writeScalar(rec->fOffset.fY);
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
21935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkFlattenable* SkLayerRasterizer::CreateProc(SkFlattenableReadBuffer& buffer) {
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkNEW_ARGS(SkLayerRasterizer, (buffer));
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
22335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkFlattenable::Factory SkLayerRasterizer::getFactory() {
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return CreateProc;
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2271cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSK_DEFINE_FLATTENABLE_REGISTRAR(SkLayerRasterizer)
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
229