OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkColor.h" | 9 #include "SkColor.h" |
10 #include "SkReadBuffer.h" | 10 #include "SkReadBuffer.h" |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 buffer.writeInt(rec->fInfo.fFlagsMask); | 214 buffer.writeInt(rec->fInfo.fFlagsMask); |
215 buffer.writeInt(rec->fInfo.fPaintBits); | 215 buffer.writeInt(rec->fInfo.fPaintBits); |
216 buffer.writeInt(rec->fInfo.fColorMode); | 216 buffer.writeInt(rec->fInfo.fColorMode); |
217 buffer.writePoint(rec->fInfo.fOffset); | 217 buffer.writePoint(rec->fInfo.fOffset); |
218 buffer.writeBool(rec->fInfo.fPostTranslate); | 218 buffer.writeBool(rec->fInfo.fPostTranslate); |
219 buffer.writePaint(rec->fPaint); | 219 buffer.writePaint(rec->fPaint); |
220 rec = rec->fNext; | 220 rec = rec->fNext; |
221 } | 221 } |
222 } | 222 } |
223 | 223 |
224 SkLayerDrawLooper::SkLayerDrawLooper(SkReadBuffer& buffer) | 224 SkFlattenable* SkLayerDrawLooper::CreateProc(SkReadBuffer& buffer) { |
225 : INHERITED(buffer), | |
226 fRecs(NULL), | |
227 fTopRec(NULL), | |
228 fCount(0), | |
229 fCurrRec(NULL) { | |
230 int count = buffer.readInt(); | 225 int count = buffer.readInt(); |
231 | 226 |
| 227 Builder builder; |
232 for (int i = 0; i < count; i++) { | 228 for (int i = 0; i < count; i++) { |
233 LayerInfo info; | 229 LayerInfo info; |
234 info.fFlagsMask = buffer.readInt(); | 230 info.fFlagsMask = buffer.readInt(); |
235 info.fPaintBits = buffer.readInt(); | 231 info.fPaintBits = buffer.readInt(); |
236 info.fColorMode = (SkXfermode::Mode)buffer.readInt(); | 232 info.fColorMode = (SkXfermode::Mode)buffer.readInt(); |
237 buffer.readPoint(&info.fOffset); | 233 buffer.readPoint(&info.fOffset); |
238 info.fPostTranslate = buffer.readBool(); | 234 info.fPostTranslate = buffer.readBool(); |
239 buffer.readPaint(this->addLayerOnTop(info)); | 235 buffer.readPaint(builder.addLayerOnTop(info)); |
240 } | 236 } |
241 SkASSERT(count == fCount); | 237 SkLayerDrawLooper* looper = builder.detachLooper(); |
| 238 SkASSERT(count == looper->fCount); |
242 | 239 |
243 #ifdef SK_DEBUG | 240 #ifdef SK_DEBUG |
244 { | 241 { |
245 Rec* rec = fRecs; | 242 Rec* rec = looper->fRecs; |
246 int n = 0; | 243 int n = 0; |
247 while (rec) { | 244 while (rec) { |
248 rec = rec->fNext; | 245 rec = rec->fNext; |
249 n += 1; | 246 n += 1; |
250 } | 247 } |
251 SkASSERT(count == n); | 248 SkASSERT(count == n); |
252 } | 249 } |
253 #endif | 250 #endif |
| 251 |
| 252 return looper; |
254 } | 253 } |
255 | 254 |
256 #ifdef SK_DEVELOPER | 255 #ifdef SK_DEVELOPER |
257 void SkLayerDrawLooper::toString(SkString* str) const { | 256 void SkLayerDrawLooper::toString(SkString* str) const { |
258 str->appendf("SkLayerDrawLooper (%d): ", fCount); | 257 str->appendf("SkLayerDrawLooper (%d): ", fCount); |
259 | 258 |
260 Rec* rec = fRecs; | 259 Rec* rec = fRecs; |
261 for (int i = 0; i < fCount; i++) { | 260 for (int i = 0; i < fCount; i++) { |
262 str->appendf("%d: ", i); | 261 str->appendf("%d: ", i); |
263 | 262 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 str->append("true "); | 339 str->append("true "); |
341 } else { | 340 } else { |
342 str->append("false "); | 341 str->append("false "); |
343 } | 342 } |
344 | 343 |
345 rec->fPaint.toString(str); | 344 rec->fPaint.toString(str); |
346 rec = rec->fNext; | 345 rec = rec->fNext; |
347 } | 346 } |
348 } | 347 } |
349 #endif | 348 #endif |
| 349 |
| 350 SkLayerDrawLooper::Builder::Builder() |
| 351 : fRecs(NULL), |
| 352 fTopRec(NULL), |
| 353 fCount(0) { |
| 354 } |
| 355 |
| 356 SkLayerDrawLooper::Builder::~Builder() { |
| 357 Rec* rec = fRecs; |
| 358 while (rec) { |
| 359 Rec* next = rec->fNext; |
| 360 SkDELETE(rec); |
| 361 rec = next; |
| 362 } |
| 363 } |
| 364 |
| 365 SkPaint* SkLayerDrawLooper::Builder::addLayer(const LayerInfo& info) { |
| 366 fCount += 1; |
| 367 |
| 368 Rec* rec = SkNEW(Rec); |
| 369 rec->fNext = fRecs; |
| 370 rec->fInfo = info; |
| 371 fRecs = rec; |
| 372 if (NULL == fTopRec) { |
| 373 fTopRec = rec; |
| 374 } |
| 375 |
| 376 return &rec->fPaint; |
| 377 } |
| 378 |
| 379 void SkLayerDrawLooper::Builder::addLayer(SkScalar dx, SkScalar dy) { |
| 380 LayerInfo info; |
| 381 |
| 382 info.fOffset.set(dx, dy); |
| 383 (void)this->addLayer(info); |
| 384 } |
| 385 |
| 386 SkPaint* SkLayerDrawLooper::Builder::addLayerOnTop(const LayerInfo& info) { |
| 387 fCount += 1; |
| 388 |
| 389 Rec* rec = SkNEW(Rec); |
| 390 rec->fNext = NULL; |
| 391 rec->fInfo = info; |
| 392 if (NULL == fRecs) { |
| 393 fRecs = rec; |
| 394 } else { |
| 395 SkASSERT(NULL != fTopRec); |
| 396 fTopRec->fNext = rec; |
| 397 } |
| 398 fTopRec = rec; |
| 399 |
| 400 return &rec->fPaint; |
| 401 } |
| 402 |
| 403 SkLayerDrawLooper* SkLayerDrawLooper::Builder::detachLooper() { |
| 404 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); |
| 405 looper->fCount = fCount; |
| 406 looper->fRecs = fRecs; |
| 407 |
| 408 fCount = 0; |
| 409 fRecs = NULL; |
| 410 fTopRec = NULL; |
| 411 |
| 412 return looper; |
| 413 } |
OLD | NEW |