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