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