10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkColor.h"
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkLayerDrawLooper.h"
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkUnPreMultiply.h"
687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
787b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerSkLayerDrawLooper::LayerInfo::LayerInfo() {
835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    fFlagsMask = 0;                     // ignore our paint flags
935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    fPaintBits = 0;                     // ignore our paint fields
1087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fColorMode = SkXfermode::kDst_Mode; // ignore our color
1187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fOffset.set(0, 0);
1287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fPostTranslate = false;
1387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::SkLayerDrawLooper() {
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRecs = NULL;
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fCount = 0;
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::~SkLayerDrawLooper() {
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = fRecs;
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while (rec) {
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* next = rec->fNext;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDELETE(rec);
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec = next;
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
2987b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerSkPaint* SkLayerDrawLooper::addLayer(const LayerInfo& info) {
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fCount += 1;
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = SkNEW(Rec);
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rec->fNext = fRecs;
3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    rec->fInfo = info;
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRecs = rec;
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return &rec->fPaint;
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkLayerDrawLooper::addLayer(SkScalar dx, SkScalar dy) {
4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    LayerInfo info;
4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    info.fOffset.set(dx, dy);
4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    (void)this->addLayer(info);
4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergervoid SkLayerDrawLooper::init(SkCanvas* canvas) {
4887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fCurrRec = fRecs;
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    canvas->save(SkCanvas::kMatrix_SaveFlag);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkColor xferColor(SkColor src, SkColor dst, SkXfermode::Mode mode) {
5387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (mode) {
5487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case SkXfermode::kSrc_Mode:
5587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return src;
5687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case SkXfermode::kDst_Mode:
5787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return dst;
5887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default: {
5987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            SkPMColor pmS = SkPreMultiplyColor(src);
6087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            SkPMColor pmD = SkPreMultiplyColor(dst);
6187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            SkPMColor result = SkXfermode::GetProc(mode)(pmS, pmD);
6287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return SkUnPreMultiply::PMColorToColor(result);
6387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        }
6487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
6587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
6687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
67717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger// Even with kEntirePaint_Bits, we always ensure that the master paint's
68717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger// text-encoding is respected, since that controls how we interpret the
69717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger// text/length parameters of a draw[Pos]Text call.
7035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkLayerDrawLooper::ApplyInfo(SkPaint* dst, const SkPaint& src,
7135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                  const LayerInfo& info) {
7235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
7335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    uint32_t mask = info.fFlagsMask;
7435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    dst->setFlags((dst->getFlags() & ~mask) | (src.getFlags() & mask));
7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    dst->setColor(xferColor(src.getColor(), dst->getColor(), info.fColorMode));
7635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
7735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    BitFlags bits = info.fPaintBits;
78717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    SkPaint::TextEncoding encoding = dst->getTextEncoding();
7987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
8087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (0 == bits) {
8187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return;
8287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
8387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (kEntirePaint_Bits == bits) {
8435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        // we've already computed these, so save it from the assignment
8535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        uint32_t f = dst->getFlags();
8687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        SkColor c = dst->getColor();
8787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        *dst = src;
8835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        dst->setFlags(f);
8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setColor(c);
90717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        dst->setTextEncoding(encoding);
9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return;
9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kStyle_Bit) {
9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStyle(src.getStyle());
9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeWidth(src.getStrokeWidth());
9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeMiter(src.getStrokeMiter());
9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeCap(src.getStrokeCap());
9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeJoin(src.getStrokeJoin());
10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
10287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kTextSkewX_Bit) {
10387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setTextSkewX(src.getTextSkewX());
10487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
10687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kPathEffect_Bit) {
10787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setPathEffect(src.getPathEffect());
10887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
10987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kMaskFilter_Bit) {
11087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setMaskFilter(src.getMaskFilter());
11187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
11287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kShader_Bit) {
11387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setShader(src.getShader());
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
11587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kColorFilter_Bit) {
11687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setColorFilter(src.getColorFilter());
11787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
11887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kXfermode_Bit) {
11987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setXfermode(src.getXfermode());
12087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
12187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
12287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // we never copy these
12387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#if 0
12487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setFlags(src.getFlags());
12587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTypeface(src.getTypeface());
12687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextSize(src.getTextSize());
12787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextScaleX(src.getTextScaleX());
12887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextSkewX(src.getTextSkewX());
12987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setRasterizer(src.getRasterizer());
13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setLooper(src.getLooper());
13187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextEncoding(src.getTextEncoding());
13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setHinting(src.getHinting());
13387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#endif
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
13687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger// Should we add this to canvas?
13787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic void postTranslate(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
13887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkMatrix m = canvas->getTotalMatrix();
13987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    m.postTranslate(dx, dy);
14087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas->setMatrix(m);
14187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
14287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
14387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerbool SkLayerDrawLooper::next(SkCanvas* canvas, SkPaint* paint) {
14487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas->restore();
14587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (NULL == fCurrRec) {
14687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return false;
14787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
14887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
14935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    ApplyInfo(paint, fCurrRec->fPaint, fCurrRec->fInfo);
15087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
15187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas->save(SkCanvas::kMatrix_SaveFlag);
15287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (fCurrRec->fInfo.fPostTranslate) {
15387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        postTranslate(canvas, fCurrRec->fInfo.fOffset.fX,
15487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                      fCurrRec->fInfo.fOffset.fY);
15587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    } else {
15687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        canvas->translate(fCurrRec->fInfo.fOffset.fX, fCurrRec->fInfo.fOffset.fY);
15787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
15887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fCurrRec = fCurrRec->fNext;
15987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
16087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return true;
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) {
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = head;
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* prev = NULL;
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while (rec) {
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* next = rec->fNext;
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fNext = prev;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        prev = rec;
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec = next;
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return prev;
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) {
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->INHERITED::flatten(buffer);
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* rec = fRecs;
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int count = 0;
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while (rec) {
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            rec = rec->fNext;
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            count += 1;
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(count == fCount);
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeInt(fCount);
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = fRecs;
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int i = 0; i < fCount; i++) {
1969770b0f3d2b5d512daac50c2c9561d2c073cd8d2Derek Sollenberger        buffer.writeInt(rec->fInfo.fFlagsMask);
19787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeInt(rec->fInfo.fPaintBits);
19887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeInt(rec->fInfo.fColorMode);
19987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeScalar(rec->fInfo.fOffset.fX);
20087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeScalar(rec->fInfo.fOffset.fY);
20187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeBool(rec->fInfo.fPostTranslate);
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fPaint.flatten(buffer);
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec = rec->fNext;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer)
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : INHERITED(buffer) {
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRecs = NULL;
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fCount = 0;
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = buffer.readInt();
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int i = 0; i < count; i++) {
21587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        LayerInfo info;
2169770b0f3d2b5d512daac50c2c9561d2c073cd8d2Derek Sollenberger        info.fFlagsMask = buffer.readInt();
21787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fPaintBits = buffer.readInt();
21887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fColorMode = (SkXfermode::Mode)buffer.readInt();
21987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fOffset.fX = buffer.readScalar();
22087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fOffset.fY = buffer.readScalar();
22187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fPostTranslate = buffer.readBool();
22287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        this->addLayer(info)->unflatten(buffer);
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count == fCount);
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // we're in reverse order, so fix it now
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRecs = Rec::Reverse(fRecs);
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* rec = fRecs;
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int n = 0;
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while (rec) {
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            rec = rec->fNext;
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            n += 1;
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(count == n);
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkFlattenable::Registrar gReg("SkLayerDrawLooper",
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                     SkLayerDrawLooper::CreateProc);
246