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 "SkCanvas.h"
987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkColor.h"
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkLayerDrawLooper.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
1287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkUnPreMultiply.h"
1387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1487b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerSkLayerDrawLooper::LayerInfo::LayerInfo() {
1535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    fFlagsMask = 0;                     // ignore our paint flags
1635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    fPaintBits = 0;                     // ignore our paint fields
1787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fColorMode = SkXfermode::kDst_Mode; // ignore our color
1887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fOffset.set(0, 0);
1987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fPostTranslate = false;
2087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
221cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkLayerDrawLooper::SkLayerDrawLooper()
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : fRecs(NULL),
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fCount(0),
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fCurrRec(NULL) {
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::~SkLayerDrawLooper() {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = fRecs;
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while (rec) {
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* next = rec->fNext;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDELETE(rec);
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec = next;
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3787b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerSkPaint* SkLayerDrawLooper::addLayer(const LayerInfo& info) {
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fCount += 1;
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = SkNEW(Rec);
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rec->fNext = fRecs;
4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    rec->fInfo = info;
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRecs = rec;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return &rec->fPaint;
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkLayerDrawLooper::addLayer(SkScalar dx, SkScalar dy) {
4987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    LayerInfo info;
5087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
5187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    info.fOffset.set(dx, dy);
5235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    (void)this->addLayer(info);
5387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
5487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
5587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergervoid SkLayerDrawLooper::init(SkCanvas* canvas) {
5687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fCurrRec = fRecs;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    canvas->save(SkCanvas::kMatrix_SaveFlag);
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkColor xferColor(SkColor src, SkColor dst, SkXfermode::Mode mode) {
6187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (mode) {
6287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case SkXfermode::kSrc_Mode:
6387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return src;
6487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case SkXfermode::kDst_Mode:
6587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return dst;
6687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default: {
6787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            SkPMColor pmS = SkPreMultiplyColor(src);
6887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            SkPMColor pmD = SkPreMultiplyColor(dst);
6987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            SkPMColor result = SkXfermode::GetProc(mode)(pmS, pmD);
7087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return SkUnPreMultiply::PMColorToColor(result);
7187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        }
7287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
7387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
7487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
75717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger// Even with kEntirePaint_Bits, we always ensure that the master paint's
76717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger// text-encoding is respected, since that controls how we interpret the
77717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger// text/length parameters of a draw[Pos]Text call.
7835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergervoid SkLayerDrawLooper::ApplyInfo(SkPaint* dst, const SkPaint& src,
7935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                  const LayerInfo& info) {
8035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
8135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    uint32_t mask = info.fFlagsMask;
8235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    dst->setFlags((dst->getFlags() & ~mask) | (src.getFlags() & mask));
8335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    dst->setColor(xferColor(src.getColor(), dst->getColor(), info.fColorMode));
8435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
8535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    BitFlags bits = info.fPaintBits;
86717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger    SkPaint::TextEncoding encoding = dst->getTextEncoding();
8787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
8887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (0 == bits) {
8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return;
9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (kEntirePaint_Bits == bits) {
9235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        // we've already computed these, so save it from the assignment
9335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        uint32_t f = dst->getFlags();
9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        SkColor c = dst->getColor();
9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        *dst = src;
9635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        dst->setFlags(f);
9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setColor(c);
98717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger        dst->setTextEncoding(encoding);
9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return;
10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
10287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kStyle_Bit) {
10387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStyle(src.getStyle());
10487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeWidth(src.getStrokeWidth());
10587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeMiter(src.getStrokeMiter());
10687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeCap(src.getStrokeCap());
10787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setStrokeJoin(src.getStrokeJoin());
10887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
10987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
11087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kTextSkewX_Bit) {
11187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setTextSkewX(src.getTextSkewX());
11287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
11487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kPathEffect_Bit) {
11587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setPathEffect(src.getPathEffect());
11687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
11787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kMaskFilter_Bit) {
11887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setMaskFilter(src.getMaskFilter());
11987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
12087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kShader_Bit) {
12187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setShader(src.getShader());
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
12387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kColorFilter_Bit) {
12487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setColorFilter(src.getColorFilter());
12587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
12687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (bits & kXfermode_Bit) {
12787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        dst->setXfermode(src.getXfermode());
12887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
12987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we don't override these
13187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#if 0
13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTypeface(src.getTypeface());
13387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextSize(src.getTextSize());
13487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextScaleX(src.getTextScaleX());
13587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setRasterizer(src.getRasterizer());
13687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setLooper(src.getLooper());
13787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setTextEncoding(src.getTextEncoding());
13887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    dst->setHinting(src.getHinting());
13987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#endif
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
14287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger// Should we add this to canvas?
14387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic void postTranslate(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
14487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkMatrix m = canvas->getTotalMatrix();
14587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    m.postTranslate(dx, dy);
14687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas->setMatrix(m);
14787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
14887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
14987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerbool SkLayerDrawLooper::next(SkCanvas* canvas, SkPaint* paint) {
15087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas->restore();
15187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (NULL == fCurrRec) {
15287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return false;
15387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
15487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
15535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    ApplyInfo(paint, fCurrRec->fPaint, fCurrRec->fInfo);
15687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
15787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas->save(SkCanvas::kMatrix_SaveFlag);
15887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (fCurrRec->fInfo.fPostTranslate) {
15987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        postTranslate(canvas, fCurrRec->fInfo.fOffset.fX,
16087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                      fCurrRec->fInfo.fOffset.fY);
16187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    } else {
16287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        canvas->translate(fCurrRec->fInfo.fOffset.fX, fCurrRec->fInfo.fOffset.fY);
16387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
16487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    fCurrRec = fCurrRec->fNext;
16587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
16687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return true;
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) {
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = head;
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* prev = NULL;
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while (rec) {
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* next = rec->fNext;
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fNext = prev;
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        prev = rec;
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec = next;
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return prev;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) {
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->INHERITED::flatten(buffer);
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* rec = fRecs;
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int count = 0;
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while (rec) {
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            rec = rec->fNext;
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            count += 1;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(count == fCount);
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    buffer.writeInt(fCount);
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Rec* rec = fRecs;
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int i = 0; i < fCount; i++) {
20287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeInt(rec->fInfo.fPaintBits);
20387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeInt(rec->fInfo.fColorMode);
20487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeScalar(rec->fInfo.fOffset.fX);
20587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeScalar(rec->fInfo.fOffset.fY);
20687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        buffer.writeBool(rec->fInfo.fPostTranslate);
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec->fPaint.flatten(buffer);
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        rec = rec->fNext;
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer)
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        : INHERITED(buffer),
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fRecs(NULL),
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fCount(0),
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          fCurrRec(NULL) {
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = buffer.readInt();
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int i = 0; i < count; i++) {
22087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        LayerInfo info;
221341c93bd153d8fcc55114b0148301e98e34bc13cDerek Sollenberger        if (buffer.getPictureVersion() == PICTURE_VERSION_ICS)
222341c93bd153d8fcc55114b0148301e98e34bc13cDerek Sollenberger            info.fFlagsMask = buffer.readInt();
22387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fPaintBits = buffer.readInt();
22487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fColorMode = (SkXfermode::Mode)buffer.readInt();
22587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fOffset.fX = buffer.readScalar();
22687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fOffset.fY = buffer.readScalar();
22787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        info.fPostTranslate = buffer.readBool();
22887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        this->addLayer(info)->unflatten(buffer);
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count == fCount);
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // we're in reverse order, so fix it now
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRecs = Rec::Reverse(fRecs);
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Rec* rec = fRecs;
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int n = 0;
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while (rec) {
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            rec = rec->fNext;
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            n += 1;
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(count == n);
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2501cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSK_DEFINE_FLATTENABLE_REGISTRAR(SkLayerDrawLooper)
251