OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2008 The Android Open Source Project | 3 * Copyright 2008 The Android Open Source Project |
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 | 8 |
9 | 9 |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 | 205 |
206 /* This is the record we keep for each save/restore level in the stack. | 206 /* This is the record we keep for each save/restore level in the stack. |
207 Since a level optionally copies the matrix and/or stack, we have pointers | 207 Since a level optionally copies the matrix and/or stack, we have pointers |
208 for these fields. If the value is copied for this level, the copy is | 208 for these fields. If the value is copied for this level, the copy is |
209 stored in the ...Storage field, and the pointer points to that. If the | 209 stored in the ...Storage field, and the pointer points to that. If the |
210 value is not copied for this level, we ignore ...Storage, and just point | 210 value is not copied for this level, we ignore ...Storage, and just point |
211 at the corresponding value in the previous level in the stack. | 211 at the corresponding value in the previous level in the stack. |
212 */ | 212 */ |
213 class SkCanvas::MCRec { | 213 class SkCanvas::MCRec { |
214 public: | 214 public: |
215 MCRec* fNext; | |
216 int fFlags; | 215 int fFlags; |
217 SkMatrix* fMatrix; // points to either fMatrixStorage or prev M
CRec | 216 SkMatrix* fMatrix; // points to either fMatrixStorage or prev M
CRec |
218 SkRasterClip* fRasterClip; // points to either fRegionStorage or prev M
CRec | 217 SkRasterClip* fRasterClip; // points to either fRegionStorage or prev M
CRec |
219 SkDrawFilter* fFilter; // the current filter (or null) | 218 SkDrawFilter* fFilter; // the current filter (or null) |
220 | 219 |
221 DeviceCM* fLayer; | 220 DeviceCM* fLayer; |
222 /* If there are any layers in the stack, this points to the top-most | 221 /* If there are any layers in the stack, this points to the top-most |
223 one that is at or below this level in the stack (so we know what | 222 one that is at or below this level in the stack (so we know what |
224 bitmap/device to draw into from this level. This value is NOT | 223 bitmap/device to draw into from this level. This value is NOT |
225 reference counted, since the real owner is either our fLayer field, | 224 reference counted, since the real owner is either our fLayer field, |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 fDeviceCMDirty = false; | 490 fDeviceCMDirty = false; |
492 fSaveLayerCount = 0; | 491 fSaveLayerCount = 0; |
493 fCullCount = 0; | 492 fCullCount = 0; |
494 fMetaData = NULL; | 493 fMetaData = NULL; |
495 | 494 |
496 fMCRec = (MCRec*)fMCStack.push_back(); | 495 fMCRec = (MCRec*)fMCStack.push_back(); |
497 new (fMCRec) MCRec(NULL, 0); | 496 new (fMCRec) MCRec(NULL, 0); |
498 | 497 |
499 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL)); | 498 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL)); |
500 fMCRec->fTopLayer = fMCRec->fLayer; | 499 fMCRec->fTopLayer = fMCRec->fLayer; |
501 fMCRec->fNext = NULL; | |
502 | 500 |
503 fSurfaceBase = NULL; | 501 fSurfaceBase = NULL; |
504 | 502 |
505 return this->setRootDevice(device); | 503 return this->setRootDevice(device); |
506 } | 504 } |
507 | 505 |
508 SkCanvas::SkCanvas() | 506 SkCanvas::SkCanvas() |
509 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 507 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
510 { | 508 { |
511 inc_canvas(); | 509 inc_canvas(); |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 } | 733 } |
736 | 734 |
737 /////////////////////////////////////////////////////////////////////////////// | 735 /////////////////////////////////////////////////////////////////////////////// |
738 | 736 |
739 int SkCanvas::internalSave(SaveFlags flags) { | 737 int SkCanvas::internalSave(SaveFlags flags) { |
740 int saveCount = this->getSaveCount(); // record this before the actual save | 738 int saveCount = this->getSaveCount(); // record this before the actual save |
741 | 739 |
742 MCRec* newTop = (MCRec*)fMCStack.push_back(); | 740 MCRec* newTop = (MCRec*)fMCStack.push_back(); |
743 new (newTop) MCRec(fMCRec, flags); // balanced in restore() | 741 new (newTop) MCRec(fMCRec, flags); // balanced in restore() |
744 | 742 |
745 newTop->fNext = fMCRec; | |
746 fMCRec = newTop; | 743 fMCRec = newTop; |
747 | 744 |
748 if (SkCanvas::kClip_SaveFlag & flags) { | 745 if (SkCanvas::kClip_SaveFlag & flags) { |
749 fClipStack.save(); | 746 fClipStack.save(); |
750 } | 747 } |
751 | 748 |
752 return saveCount; | 749 return saveCount; |
753 } | 750 } |
754 | 751 |
755 int SkCanvas::save(SaveFlags flags) { | 752 int SkCanvas::save(SaveFlags flags) { |
(...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2381 if (!bitmap.allocPixels(info)) { | 2378 if (!bitmap.allocPixels(info)) { |
2382 return NULL; | 2379 return NULL; |
2383 } | 2380 } |
2384 | 2381 |
2385 // should this functionality be moved into allocPixels()? | 2382 // should this functionality be moved into allocPixels()? |
2386 if (!bitmap.info().isOpaque()) { | 2383 if (!bitmap.info().isOpaque()) { |
2387 bitmap.eraseColor(0); | 2384 bitmap.eraseColor(0); |
2388 } | 2385 } |
2389 return SkNEW_ARGS(SkCanvas, (bitmap)); | 2386 return SkNEW_ARGS(SkCanvas, (bitmap)); |
2390 } | 2387 } |
OLD | NEW |