SkLayerDrawLooper.cpp revision cdcb2ce2744c7e5c47453328dbf292edee79ab37
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 90716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com#include "SkColor.h" 10c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com#include "SkFlattenableBuffers.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkLayerDrawLooper.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h" 134991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "SkString.h" 144991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "SkStringUtils.h" 150716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com#include "SkUnPreMultiply.h" 160716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 170456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.comSK_DEFINE_INST_COUNT(SkLayerDrawLooper) 180456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com 190716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.comSkLayerDrawLooper::LayerInfo::LayerInfo() { 20a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org fFlagsMask = 0; // ignore our paint flags 21a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org fPaintBits = 0; // ignore our paint fields 220716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com fColorMode = SkXfermode::kDst_Mode; // ignore our color 230716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com fOffset.set(0, 0); 240716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com fPostTranslate = false; 250716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com} 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 273c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.orgSkLayerDrawLooper::SkLayerDrawLooper() 283c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org : fRecs(NULL), 293c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org fCount(0), 303c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org fCurrRec(NULL) { 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkLayerDrawLooper::~SkLayerDrawLooper() { 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* rec = fRecs; 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (rec) { 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* next = rec->fNext; 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDELETE(rec); 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec = next; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 410716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 420716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.comSkPaint* SkLayerDrawLooper::addLayer(const LayerInfo& info) { 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount += 1; 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* rec = SkNEW(Rec); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec->fNext = fRecs; 470716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com rec->fInfo = info; 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRecs = rec; 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return &rec->fPaint; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 53a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.orgvoid SkLayerDrawLooper::addLayer(SkScalar dx, SkScalar dy) { 540716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com LayerInfo info; 550716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 560716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com info.fOffset.set(dx, dy); 57a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org (void)this->addLayer(info); 580716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com} 590716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 604e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.comvoid SkLayerDrawLooper::init(SkCanvas* canvas) { 614e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com fCurrRec = fRecs; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->save(SkCanvas::kMatrix_SaveFlag); 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 650716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.comstatic SkColor xferColor(SkColor src, SkColor dst, SkXfermode::Mode mode) { 660716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com switch (mode) { 670716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com case SkXfermode::kSrc_Mode: 680716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com return src; 690716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com case SkXfermode::kDst_Mode: 700716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com return dst; 710716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com default: { 720716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com SkPMColor pmS = SkPreMultiplyColor(src); 730716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com SkPMColor pmD = SkPreMultiplyColor(dst); 740716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com SkPMColor result = SkXfermode::GetProc(mode)(pmS, pmD); 750716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com return SkUnPreMultiply::PMColorToColor(result); 760716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com } 770716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com } 780716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com} 790716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 808426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com// Even with kEntirePaint_Bits, we always ensure that the master paint's 818426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com// text-encoding is respected, since that controls how we interpret the 828426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com// text/length parameters of a draw[Pos]Text call. 83a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.orgvoid SkLayerDrawLooper::ApplyInfo(SkPaint* dst, const SkPaint& src, 84a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org const LayerInfo& info) { 85a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org 86a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org uint32_t mask = info.fFlagsMask; 87a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org dst->setFlags((dst->getFlags() & ~mask) | (src.getFlags() & mask)); 88a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org dst->setColor(xferColor(src.getColor(), dst->getColor(), info.fColorMode)); 89a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org 90a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org BitFlags bits = info.fPaintBits; 918426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com SkPaint::TextEncoding encoding = dst->getTextEncoding(); 920716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 933c1225bee4d9ea0963acf47fc5df080b2d5b26b2mike@reedtribe.org if (0 == bits) { 943c1225bee4d9ea0963acf47fc5df080b2d5b26b2mike@reedtribe.org return; 953c1225bee4d9ea0963acf47fc5df080b2d5b26b2mike@reedtribe.org } 960e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (kEntirePaint_Bits == bits) { 97a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org // we've already computed these, so save it from the assignment 98a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org uint32_t f = dst->getFlags(); 990716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com SkColor c = dst->getColor(); 1000e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org *dst = src; 101a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org dst->setFlags(f); 1020716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com dst->setColor(c); 1038426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com dst->setTextEncoding(encoding); 1040e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org return; 1050e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1060e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org 1070e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kStyle_Bit) { 1080e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setStyle(src.getStyle()); 1090e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setStrokeWidth(src.getStrokeWidth()); 1100e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setStrokeMiter(src.getStrokeMiter()); 1110e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setStrokeCap(src.getStrokeCap()); 1120e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setStrokeJoin(src.getStrokeJoin()); 1130e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1140e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org 1150e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kTextSkewX_Bit) { 1160e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setTextSkewX(src.getTextSkewX()); 1170e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1180e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org 1190e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kPathEffect_Bit) { 1200e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setPathEffect(src.getPathEffect()); 1210e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1220e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kMaskFilter_Bit) { 1230e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setMaskFilter(src.getMaskFilter()); 1240e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1250e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kShader_Bit) { 1260e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setShader(src.getShader()); 1270e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1280e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kColorFilter_Bit) { 1290e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setColorFilter(src.getColorFilter()); 1300e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1310e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org if (bits & kXfermode_Bit) { 1320e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setXfermode(src.getXfermode()); 1330e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org } 1340e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org 1358426058dee0faf75a18b81cfcde47ee8ab8c31d9reed@google.com // we don't override these 1360e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org#if 0 1370e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setTypeface(src.getTypeface()); 1380e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setTextSize(src.getTextSize()); 1390e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setTextScaleX(src.getTextScaleX()); 1400e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setRasterizer(src.getRasterizer()); 1410e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setLooper(src.getLooper()); 1420e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setTextEncoding(src.getTextEncoding()); 1430e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org dst->setHinting(src.getHinting()); 1440e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org#endif 1450e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org} 1460e2810be95d3f1aa95c341521d3f514eb9e9ebdemike@reedtribe.org 1470716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com// Should we add this to canvas? 1480716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.comstatic void postTranslate(SkCanvas* canvas, SkScalar dx, SkScalar dy) { 1490716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com SkMatrix m = canvas->getTotalMatrix(); 1500716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com m.postTranslate(dx, dy); 1510716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com canvas->setMatrix(m); 1520716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com} 1530716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 1544e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.combool SkLayerDrawLooper::next(SkCanvas* canvas, SkPaint* paint) { 1554e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com canvas->restore(); 1564e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com if (NULL == fCurrRec) { 1574e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com return false; 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 160a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org ApplyInfo(paint, fCurrRec->fPaint, fCurrRec->fInfo); 1610716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com 1624e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com canvas->save(SkCanvas::kMatrix_SaveFlag); 1630716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com if (fCurrRec->fInfo.fPostTranslate) { 1640716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com postTranslate(canvas, fCurrRec->fInfo.fOffset.fX, 1650716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com fCurrRec->fInfo.fOffset.fY); 1660716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com } else { 1670716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com canvas->translate(fCurrRec->fInfo.fOffset.fX, fCurrRec->fInfo.fOffset.fY); 1680716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com } 169e5d0def6d9864463565f9ca6a6e9ceedcb72712dmike@reedtribe.org fCurrRec = fCurrRec->fNext; 170e5d0def6d9864463565f9ca6a6e9ceedcb72712dmike@reedtribe.org 1714e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7breed@google.com return true; 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) { 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* rec = head; 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* prev = NULL; 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (rec) { 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* next = rec->fNext; 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec->fNext = prev; 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com prev = rec; 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec = next; 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return prev; 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18854924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comvoid SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) const { 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->INHERITED::flatten(buffer); 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* rec = fRecs; 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count = 0; 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (rec) { 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec = rec->fNext; 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com count += 1; 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count == fCount); 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com buffer.writeInt(fCount); 204fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* rec = fRecs; 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = 0; i < fCount; i++) { 207076f4c9791c3710a3714452b61d61fd049601f57reed@google.com buffer.writeInt(rec->fInfo.fFlagsMask); 2080716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com buffer.writeInt(rec->fInfo.fPaintBits); 2090716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com buffer.writeInt(rec->fInfo.fColorMode); 210c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.writePoint(rec->fInfo.fOffset); 2110716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com buffer.writeBool(rec->fInfo.fPostTranslate); 212c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.writePaint(rec->fPaint); 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec = rec->fNext; 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer) 2183c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org : INHERITED(buffer), 2193c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org fRecs(NULL), 2203c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org fCount(0), 2213c898186c9082c535e589807752a0a9dc5d28aa0vandebo@chromium.org fCurrRec(NULL) { 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count = buffer.readInt(); 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = 0; i < count; i++) { 2250716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com LayerInfo info; 226076f4c9791c3710a3714452b61d61fd049601f57reed@google.com info.fFlagsMask = buffer.readInt(); 2270716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com info.fPaintBits = buffer.readInt(); 2280716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com info.fColorMode = (SkXfermode::Mode)buffer.readInt(); 229c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.readPoint(&info.fOffset); 2300716c63332a64c3cc77a9afb87ae2fd9614f0c4freed@google.com info.fPostTranslate = buffer.readBool(); 231c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.readPaint(this->addLayer(info)); 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count == fCount); 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // we're in reverse order, so fix it now 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRecs = Rec::Reverse(fRecs); 237fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Rec* rec = fRecs; 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int n = 0; 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (rec) { 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com rec = rec->fNext; 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com n += 1; 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count == n); 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2504991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 2514991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#ifdef SK_DEVELOPER 2524991b8f23482afc1494fd17647421ce68de53331robertphillips@google.comvoid SkLayerDrawLooper::toString(SkString* str) const { 2534991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->appendf("SkLayerDrawLooper (%d): ", fCount); 2544991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 2554991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com Rec* rec = fRecs; 2564991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com for (int i = 0; i < fCount; i++) { 2574991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->appendf("%d: ", i); 2584991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 2594991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("flagsMask: ("); 2604991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com if (0 == rec->fInfo.fFlagsMask) { 2614991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("None"); 2624991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } else { 2634991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com bool needSeparator = false; 264cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kAntiAlias_Flag & rec->fInfo.fFlagsMask), 2654991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "AntiAlias", &needSeparator); 266cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kFilterBitmap_Flag & rec->fInfo.fFlagsMask), 2674991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "FilterBitmap", &needSeparator); 268cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kDither_Flag & rec->fInfo.fFlagsMask), 2694991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "Dither", &needSeparator); 270cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kUnderlineText_Flag & rec->fInfo.fFlagsMask), 2714991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "UnderlineText", &needSeparator); 272cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kStrikeThruText_Flag & rec->fInfo.fFlagsMask), 2734991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "StrikeThruText", &needSeparator); 274cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kFakeBoldText_Flag & rec->fInfo.fFlagsMask), 2754991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "FakeBoldText", &needSeparator); 276cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kLinearText_Flag & rec->fInfo.fFlagsMask), 2774991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "LinearText", &needSeparator); 278cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kSubpixelText_Flag & rec->fInfo.fFlagsMask), 2794991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "SubpixelText", &needSeparator); 280cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kDevKernText_Flag & rec->fInfo.fFlagsMask), 2814991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "DevKernText", &needSeparator); 282cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kLCDRenderText_Flag & rec->fInfo.fFlagsMask), 2834991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "LCDRenderText", &needSeparator); 2844991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com SkAddFlagToString(str, SkToBool(SkPaint::kEmbeddedBitmapText_Flag & rec->fInfo.fFlagsMask), 2854991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "EmbeddedBitmapText", &needSeparator); 286cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kAutoHinting_Flag & rec->fInfo.fFlagsMask), 2874991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "Autohinted", &needSeparator); 288cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(SkPaint::kVerticalText_Flag & rec->fInfo.fFlagsMask), 2894991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "VerticalText", &needSeparator); 2904991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com SkAddFlagToString(str, SkToBool(SkPaint::kGenA8FromLCD_Flag & rec->fInfo.fFlagsMask), 2914991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "GenA8FromLCD", &needSeparator); 2924991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } 2934991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append(") "); 2944991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 2954991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("paintBits: ("); 2964991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com if (0 == rec->fInfo.fPaintBits) { 2974991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("None"); 2984991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } else if (kEntirePaint_Bits == rec->fInfo.fPaintBits) { 2994991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("EntirePaint"); 3004991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } else { 3014991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com bool needSeparator = false; 3024991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com SkAddFlagToString(str, SkToBool(kStyle_Bit & rec->fInfo.fPaintBits), "Style", 3034991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 304cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(kTextSkewX_Bit & rec->fInfo.fPaintBits), "TextSkewX", 3054991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 3064991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com SkAddFlagToString(str, SkToBool(kPathEffect_Bit & rec->fInfo.fPaintBits), "PathEffect", 3074991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 3084991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com SkAddFlagToString(str, SkToBool(kMaskFilter_Bit & rec->fInfo.fPaintBits), "MaskFilter", 3094991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 310cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(kShader_Bit & rec->fInfo.fPaintBits), "Shader", 3114991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 312cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(kColorFilter_Bit & rec->fInfo.fPaintBits), "ColorFilter", 3134991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 314cdcb2ce2744c7e5c47453328dbf292edee79ab37skia.committer@gmail.com SkAddFlagToString(str, SkToBool(kXfermode_Bit & rec->fInfo.fPaintBits), "Xfermode", 3154991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com &needSeparator); 3164991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } 3174991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append(") "); 3184991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 3194991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com static const char* gModeStrings[SkXfermode::kLastMode+1] = { 3204991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "kClear", "kSrc", "kDst", "kSrcOver", "kDstOver", "kSrcIn", "kDstIn", 3214991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "kSrcOut", "kDstOut", "kSrcATop", "kDstATop", "kXor", "kPlus", 3224991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "kMultiply", "kScreen", "kOverlay", "kDarken", "kLighten", "kColorDodge", 3234991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com "kColorBurn", "kHardLight", "kSoftLight", "kDifference", "kExclusion" 3244991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com }; 3254991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 3264991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->appendf("mode: %s ", gModeStrings[rec->fInfo.fColorMode]); 3274991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 3284991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("offset: ("); 3294991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->appendScalar(rec->fInfo.fOffset.fX); 3304991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append(", "); 3314991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->appendScalar(rec->fInfo.fOffset.fY); 3324991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append(") "); 3334991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 3344991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("postTranslate: "); 3354991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com if (rec->fInfo.fPostTranslate) { 3364991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("true "); 3374991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } else { 3384991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com str->append("false "); 3394991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } 3404991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com 3414991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com // TODO: add "rec->fPaint.toString(str);" when SkPaint::toString is added 3424991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com rec = rec->fNext; 3434991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com } 3444991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com} 3454991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#endif 346