OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2008 The Android Open Source Project | 2 * Copyright 2008 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkCanvasDrawable.h" | 9 #include "SkCanvasDrawable.h" |
10 #include "SkCanvasPriv.h" | 10 #include "SkCanvasPriv.h" |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 | 410 |
411 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 411 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { |
412 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
; | 412 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
; |
413 fCachedLocalClipBounds.setEmpty(); | 413 fCachedLocalClipBounds.setEmpty(); |
414 fCachedLocalClipBoundsDirty = true; | 414 fCachedLocalClipBoundsDirty = true; |
415 fAllowSoftClip = true; | 415 fAllowSoftClip = true; |
416 fAllowSimplifyClip = false; | 416 fAllowSimplifyClip = false; |
417 fDeviceCMDirty = true; | 417 fDeviceCMDirty = true; |
418 fSaveCount = 1; | 418 fSaveCount = 1; |
419 fSaveLayerCount = 0; | 419 fSaveLayerCount = 0; |
420 fCullCount = 0; | |
421 fMetaData = NULL; | 420 fMetaData = NULL; |
422 | 421 |
423 fMCRec = (MCRec*)fMCStack.push_back(); | 422 fMCRec = (MCRec*)fMCStack.push_back(); |
424 new (fMCRec) MCRec(fConservativeRasterClip); | 423 new (fMCRec) MCRec(fConservativeRasterClip); |
425 | 424 |
426 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL, fConservative
RasterClip)); | 425 fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, 0, 0, NULL, NULL, fConservative
RasterClip)); |
427 fMCRec->fTopLayer = fMCRec->fLayer; | 426 fMCRec->fTopLayer = fMCRec->fLayer; |
428 | 427 |
429 fSurfaceBase = NULL; | 428 fSurfaceBase = NULL; |
430 | 429 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 } | 688 } |
690 return true; | 689 return true; |
691 } | 690 } |
692 | 691 |
693 bool SkCanvas::readPixels(const SkImageInfo& dstInfo, void* dstP, size_t rowByte
s, int x, int y) { | 692 bool SkCanvas::readPixels(const SkImageInfo& dstInfo, void* dstP, size_t rowByte
s, int x, int y) { |
694 SkBaseDevice* device = this->getDevice(); | 693 SkBaseDevice* device = this->getDevice(); |
695 if (!device) { | 694 if (!device) { |
696 return false; | 695 return false; |
697 } | 696 } |
698 const SkISize size = this->getBaseLayerSize(); | 697 const SkISize size = this->getBaseLayerSize(); |
699 | 698 |
700 SkReadPixelsRec rec(dstInfo, dstP, rowBytes, x, y); | 699 SkReadPixelsRec rec(dstInfo, dstP, rowBytes, x, y); |
701 if (!rec.trim(size.width(), size.height())) { | 700 if (!rec.trim(size.width(), size.height())) { |
702 return false; | 701 return false; |
703 } | 702 } |
704 | 703 |
705 // The device can assert that the requested area is always contained in its
bounds | 704 // The device can assert that the requested area is always contained in its
bounds |
706 return device->readPixels(rec.fInfo, rec.fPixels, rec.fRowBytes, rec.fX, rec
.fY); | 705 return device->readPixels(rec.fInfo, rec.fPixels, rec.fRowBytes, rec.fX, rec
.fY); |
707 } | 706 } |
708 | 707 |
709 bool SkCanvas::writePixels(const SkBitmap& bitmap, int x, int y) { | 708 bool SkCanvas::writePixels(const SkBitmap& bitmap, int x, int y) { |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 this->didRestore(); | 836 this->didRestore(); |
838 } | 837 } |
839 } | 838 } |
840 } | 839 } |
841 | 840 |
842 void SkCanvas::restoreToCount(int count) { | 841 void SkCanvas::restoreToCount(int count) { |
843 // sanity check | 842 // sanity check |
844 if (count < 1) { | 843 if (count < 1) { |
845 count = 1; | 844 count = 1; |
846 } | 845 } |
847 | 846 |
848 int n = this->getSaveCount() - count; | 847 int n = this->getSaveCount() - count; |
849 for (int i = 0; i < n; ++i) { | 848 for (int i = 0; i < n; ++i) { |
850 this->restore(); | 849 this->restore(); |
851 } | 850 } |
852 } | 851 } |
853 | 852 |
854 void SkCanvas::internalSave() { | 853 void SkCanvas::internalSave() { |
855 MCRec* newTop = (MCRec*)fMCStack.push_back(); | 854 MCRec* newTop = (MCRec*)fMCStack.push_back(); |
856 new (newTop) MCRec(*fMCRec); // balanced in restore() | 855 new (newTop) MCRec(*fMCRec); // balanced in restore() |
857 fMCRec = newTop; | 856 fMCRec = newTop; |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 | 1111 |
1113 bool SkAutoROCanvasPixels::asROBitmap(SkBitmap* bitmap) const { | 1112 bool SkAutoROCanvasPixels::asROBitmap(SkBitmap* bitmap) const { |
1114 if (fAddr) { | 1113 if (fAddr) { |
1115 return bitmap->installPixels(fInfo, const_cast<void*>(fAddr), fRowBytes)
; | 1114 return bitmap->installPixels(fInfo, const_cast<void*>(fAddr), fRowBytes)
; |
1116 } else { | 1115 } else { |
1117 bitmap->reset(); | 1116 bitmap->reset(); |
1118 return false; | 1117 return false; |
1119 } | 1118 } |
1120 } | 1119 } |
1121 | 1120 |
1122 void SkCanvas::onPushCull(const SkRect& cullRect) { | |
1123 // do nothing. Subclasses may do something | |
1124 } | |
1125 | |
1126 void SkCanvas::onPopCull() { | |
1127 // do nothing. Subclasses may do something | |
1128 } | |
1129 | |
1130 ///////////////////////////////////////////////////////////////////////////// | |
1131 #ifdef SK_DEBUG | |
1132 // Ensure that cull rects are monotonically nested in device space. | |
1133 void SkCanvas::validateCull(const SkIRect& devCull) { | |
1134 if (fCullStack.isEmpty() | |
1135 || devCull.isEmpty() | |
1136 || fCullStack.top().contains(devCull)) { | |
1137 return; | |
1138 } | |
1139 | |
1140 SkDEBUGF(("Invalid cull: [%d %d %d %d] (previous cull: [%d %d %d %d])\n", | |
1141 devCull.x(), devCull.y(), devCull.right(), devCull.bottom(), | |
1142 fCullStack.top().x(), fCullStack.top().y(), | |
1143 fCullStack.top().right(), fCullStack.top().bottom())); | |
1144 | |
1145 #ifdef ASSERT_NESTED_CULLING | |
1146 SkDEBUGFAIL("Invalid cull."); | |
1147 #endif | |
1148 } | |
1149 #endif | |
1150 | |
1151 void SkCanvas::pushCull(const SkRect& cullRect) { | |
1152 this->checkForDeferredSave(); | |
1153 ++fCullCount; | |
1154 this->onPushCull(cullRect); | |
1155 | |
1156 #ifdef SK_DEBUG | |
1157 // Map the cull rect into device space. | |
1158 SkRect mappedCull; | |
1159 this->getTotalMatrix().mapRect(&mappedCull, cullRect); | |
1160 | |
1161 // Take clipping into account. | |
1162 SkIRect devClip, devCull; | |
1163 mappedCull.roundOut(&devCull); | |
1164 this->getClipDeviceBounds(&devClip); | |
1165 if (!devCull.intersect(devClip)) { | |
1166 devCull.setEmpty(); | |
1167 } | |
1168 | |
1169 this->validateCull(devCull); | |
1170 fCullStack.push(devCull); // balanced in popCull | |
1171 #endif | |
1172 } | |
1173 | |
1174 void SkCanvas::popCull() { | |
1175 SkASSERT(fCullStack.count() == fCullCount); | |
1176 | |
1177 if (fCullCount > 0) { | |
1178 --fCullCount; | |
1179 this->onPopCull(); | |
1180 | |
1181 SkDEBUGCODE(fCullStack.pop()); | |
1182 } | |
1183 } | |
1184 | |
1185 ///////////////////////////////////////////////////////////////////////////// | 1121 ///////////////////////////////////////////////////////////////////////////// |
1186 | |
1187 void SkCanvas::internalDrawBitmap(const SkBitmap& bitmap, | 1122 void SkCanvas::internalDrawBitmap(const SkBitmap& bitmap, |
1188 const SkMatrix& matrix, const SkPaint* paint) { | 1123 const SkMatrix& matrix, const SkPaint* paint) { |
1189 if (bitmap.drawsNothing()) { | 1124 if (bitmap.drawsNothing()) { |
1190 return; | 1125 return; |
1191 } | 1126 } |
1192 | 1127 |
1193 SkLazyPaint lazy; | 1128 SkLazyPaint lazy; |
1194 if (NULL == paint) { | 1129 if (NULL == paint) { |
1195 paint = lazy.init(); | 1130 paint = lazy.init(); |
1196 } | 1131 } |
(...skipping 1370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2567 } | 2502 } |
2568 | 2503 |
2569 if (matrix) { | 2504 if (matrix) { |
2570 canvas->concat(*matrix); | 2505 canvas->concat(*matrix); |
2571 } | 2506 } |
2572 } | 2507 } |
2573 | 2508 |
2574 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 2509 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
2575 fCanvas->restoreToCount(fSaveCount); | 2510 fCanvas->restoreToCount(fSaveCount); |
2576 } | 2511 } |
OLD | NEW |