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 "SkBitmapDevice.h" | 8 #include "SkBitmapDevice.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkCanvasPriv.h" | 10 #include "SkCanvasPriv.h" |
11 #include "SkClipStack.h" | 11 #include "SkClipStack.h" |
12 #include "SkColorFilter.h" | 12 #include "SkColorFilter.h" |
13 #include "SkDraw.h" | 13 #include "SkDraw.h" |
14 #include "SkDrawable.h" | 14 #include "SkDrawable.h" |
15 #include "SkDrawFilter.h" | 15 #include "SkDrawFilter.h" |
16 #include "SkDrawLooper.h" | 16 #include "SkDrawLooper.h" |
17 #include "SkErrorInternals.h" | 17 #include "SkErrorInternals.h" |
18 #include "SkImage.h" | 18 #include "SkImage.h" |
19 #include "SkImage_Base.h" | 19 #include "SkImage_Base.h" |
20 #include "SkImageFilter.h" | 20 #include "SkImageFilter.h" |
21 #include "SkImageFilterCache.h" | 21 #include "SkImageFilterCache.h" |
22 #include "SkMatrixUtils.h" | 22 #include "SkMatrixUtils.h" |
23 #include "SkMetaData.h" | 23 #include "SkMetaData.h" |
24 #include "SkNinePatchIter.h" | 24 #include "SkNinePatchIter.h" |
25 #include "SkPaintPriv.h" | 25 #include "SkPaintPriv.h" |
26 #include "SkPatchUtils.h" | 26 #include "SkPatchUtils.h" |
27 #include "SkPicture.h" | 27 #include "SkPicture.h" |
| 28 #include "SkRasterCanvasLayerAllocator.h" |
28 #include "SkRasterClip.h" | 29 #include "SkRasterClip.h" |
29 #include "SkReadPixelsRec.h" | 30 #include "SkReadPixelsRec.h" |
30 #include "SkRRect.h" | 31 #include "SkRRect.h" |
31 #include "SkSmallAllocator.h" | 32 #include "SkSmallAllocator.h" |
32 #include "SkSpecialImage.h" | 33 #include "SkSpecialImage.h" |
33 #include "SkSurface_Base.h" | 34 #include "SkSurface_Base.h" |
34 #include "SkTextBlob.h" | 35 #include "SkTextBlob.h" |
35 #include "SkTextFormatParams.h" | 36 #include "SkTextFormatParams.h" |
36 #include "SkTLazy.h" | 37 #include "SkTLazy.h" |
37 #include "SkTraceEvent.h" | 38 #include "SkTraceEvent.h" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 these are used (assuming we're not on a layer) we rebuild these cache | 190 these are used (assuming we're not on a layer) we rebuild these cache |
190 values: they reflect the top of the save stack, but translated and clipped | 191 values: they reflect the top of the save stack, but translated and clipped |
191 by the device's XY offset and bitmap-bounds. | 192 by the device's XY offset and bitmap-bounds. |
192 */ | 193 */ |
193 struct DeviceCM { | 194 struct DeviceCM { |
194 DeviceCM* fNext; | 195 DeviceCM* fNext; |
195 SkBaseDevice* fDevice; | 196 SkBaseDevice* fDevice; |
196 SkRasterClip fClip; | 197 SkRasterClip fClip; |
197 SkPaint* fPaint; // may be null (in the future) | 198 SkPaint* fPaint; // may be null (in the future) |
198 const SkMatrix* fMatrix; | 199 const SkMatrix* fMatrix; |
| 200 SkRasterCanvasLayerAllocator* fAllocator; |
| 201 void* fNativeContext; |
199 SkMatrix fMatrixStorage; | 202 SkMatrix fMatrixStorage; |
200 SkMatrix fStashedMatrix; // original CTM; used by imagefilter in
saveLayer | 203 SkMatrix fStashedMatrix; // original CTM; used by imagefilter in
saveLayer |
201 const bool fDeviceIsBitmapDevice; | 204 const bool fDeviceIsBitmapDevice; |
202 | 205 |
203 DeviceCM(SkBaseDevice* device, const SkPaint* paint, SkCanvas* canvas, | 206 DeviceCM(SkBaseDevice* device, const SkPaint* paint, SkCanvas* canvas, |
204 bool conservativeRasterClip, bool deviceIsBitmapDevice, const SkMat
rix& stashed) | 207 bool conservativeRasterClip, bool deviceIsBitmapDevice, const SkMat
rix& stashed) |
205 : fNext(nullptr) | 208 : fNext(nullptr) |
206 , fClip(conservativeRasterClip) | 209 , fClip(conservativeRasterClip) |
| 210 , fAllocator(nullptr) |
| 211 , fNativeContext(nullptr) |
207 , fStashedMatrix(stashed) | 212 , fStashedMatrix(stashed) |
208 , fDeviceIsBitmapDevice(deviceIsBitmapDevice) | 213 , fDeviceIsBitmapDevice(deviceIsBitmapDevice) |
209 { | 214 { |
210 if (nullptr != device) { | 215 if (nullptr != device) { |
211 device->ref(); | 216 device->ref(); |
212 device->onAttachToCanvas(canvas); | 217 device->onAttachToCanvas(canvas); |
213 } | 218 } |
214 fDevice = device; | 219 fDevice = device; |
215 fPaint = paint ? new SkPaint(*paint) : nullptr; | 220 fPaint = paint ? new SkPaint(*paint) : nullptr; |
216 } | 221 } |
217 | 222 |
218 ~DeviceCM() { | 223 ~DeviceCM() { |
219 if (fDevice) { | 224 if (fDevice) { |
| 225 if (fAllocator) { |
| 226 fAllocator->free(fDevice->accessBitmap(false).getPixels(), |
| 227 fNativeContext); |
| 228 } |
220 fDevice->onDetachFromCanvas(); | 229 fDevice->onDetachFromCanvas(); |
221 fDevice->unref(); | 230 fDevice->unref(); |
222 } | 231 } |
223 delete fPaint; | 232 delete fPaint; |
224 } | 233 } |
225 | 234 |
226 void reset(const SkIRect& bounds) { | 235 void reset(const SkIRect& bounds) { |
227 SkASSERT(!fPaint); | 236 SkASSERT(!fPaint); |
228 SkASSERT(!fNext); | 237 SkASSERT(!fNext); |
229 SkASSERT(fDevice); | 238 SkASSERT(fDevice); |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 fCachedLocalClipBounds.setEmpty(); | 645 fCachedLocalClipBounds.setEmpty(); |
637 fCachedLocalClipBoundsDirty = true; | 646 fCachedLocalClipBoundsDirty = true; |
638 fClipStack->reset(); | 647 fClipStack->reset(); |
639 fMCRec->reset(bounds); | 648 fMCRec->reset(bounds); |
640 | 649 |
641 // We're peering through a lot of structs here. Only at this scope do we | 650 // We're peering through a lot of structs here. Only at this scope do we |
642 // know that the device is an SkBitmapDevice (really an SkNoPixelsBitmapDevi
ce). | 651 // know that the device is an SkBitmapDevice (really an SkNoPixelsBitmapDevi
ce). |
643 static_cast<SkBitmapDevice*>(fMCRec->fLayer->fDevice)->setNewSize(bounds.siz
e()); | 652 static_cast<SkBitmapDevice*>(fMCRec->fLayer->fDevice)->setNewSize(bounds.siz
e()); |
644 } | 653 } |
645 | 654 |
646 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 655 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags, |
| 656 sk_sp<SkRasterCanvasLayerAllocator> allocator) { |
647 if (device && device->forceConservativeRasterClip()) { | 657 if (device && device->forceConservativeRasterClip()) { |
648 flags = InitFlags(flags | kConservativeRasterClip_InitFlag); | 658 flags = InitFlags(flags | kConservativeRasterClip_InitFlag); |
649 } | 659 } |
650 // Since init() is only called once by our constructors, it is safe to perfo
rm this | 660 // Since init() is only called once by our constructors, it is safe to perfo
rm this |
651 // const-cast. | 661 // const-cast. |
652 *const_cast<bool*>(&fConservativeRasterClip) = SkToBool(flags & kConservativ
eRasterClip_InitFlag); | 662 *const_cast<bool*>(&fConservativeRasterClip) = SkToBool(flags & kConservativ
eRasterClip_InitFlag); |
653 | 663 |
654 fCachedLocalClipBounds.setEmpty(); | 664 fCachedLocalClipBounds.setEmpty(); |
655 fCachedLocalClipBoundsDirty = true; | 665 fCachedLocalClipBoundsDirty = true; |
656 fAllowSoftClip = true; | 666 fAllowSoftClip = true; |
657 fAllowSimplifyClip = false; | 667 fAllowSimplifyClip = false; |
658 fDeviceCMDirty = true; | 668 fDeviceCMDirty = true; |
659 fSaveCount = 1; | 669 fSaveCount = 1; |
660 fMetaData = nullptr; | 670 fMetaData = nullptr; |
661 | 671 |
662 fClipStack.reset(new SkClipStack); | 672 fClipStack.reset(new SkClipStack); |
663 | 673 |
664 fMCRec = (MCRec*)fMCStack.push_back(); | 674 fMCRec = (MCRec*)fMCStack.push_back(); |
665 new (fMCRec) MCRec(fConservativeRasterClip); | 675 new (fMCRec) MCRec(fConservativeRasterClip); |
666 | 676 |
667 SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); | 677 SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); |
668 fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; | 678 fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; |
669 new (fDeviceCMStorage) DeviceCM(nullptr, nullptr, nullptr, fConservativeRast
erClip, false, | 679 new (fDeviceCMStorage) DeviceCM(nullptr, nullptr, nullptr, fConservativeRast
erClip, false, |
670 fMCRec->fMatrix); | 680 fMCRec->fMatrix); |
671 | 681 |
672 fMCRec->fTopLayer = fMCRec->fLayer; | 682 fMCRec->fTopLayer = fMCRec->fLayer; |
673 | 683 |
674 fSurfaceBase = nullptr; | 684 fSurfaceBase = nullptr; |
| 685 fAllocator = allocator; |
| 686 fMCRec->fLayer->fAllocator = allocator.get(); |
675 | 687 |
676 if (device) { | 688 if (device) { |
677 // The root device and the canvas should always have the same pixel geom
etry | 689 // The root device and the canvas should always have the same pixel geom
etry |
678 SkASSERT(fProps.pixelGeometry() == device->surfaceProps().pixelGeometry(
)); | 690 SkASSERT(fProps.pixelGeometry() == device->surfaceProps().pixelGeometry(
)); |
679 device->onAttachToCanvas(this); | 691 device->onAttachToCanvas(this); |
680 fMCRec->fLayer->fDevice = SkRef(device); | 692 fMCRec->fLayer->fDevice = SkRef(device); |
681 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); | 693 fMCRec->fRasterClip.setRect(device->getGlobalBounds()); |
682 } | 694 } |
683 return device; | 695 return device; |
684 } | 696 } |
685 | 697 |
686 SkCanvas::SkCanvas() | 698 SkCanvas::SkCanvas() |
687 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 699 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
688 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 700 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) |
689 , fConservativeRasterClip(false) | 701 , fConservativeRasterClip(false) |
690 { | 702 { |
691 inc_canvas(); | 703 inc_canvas(); |
692 | 704 |
693 this->init(nullptr, kDefault_InitFlags); | 705 this->init(nullptr, kDefault_InitFlags, nullptr); |
694 } | 706 } |
695 | 707 |
696 static SkBitmap make_nopixels(int width, int height) { | 708 static SkBitmap make_nopixels(int width, int height) { |
697 SkBitmap bitmap; | 709 SkBitmap bitmap; |
698 bitmap.setInfo(SkImageInfo::MakeUnknown(width, height)); | 710 bitmap.setInfo(SkImageInfo::MakeUnknown(width, height)); |
699 return bitmap; | 711 return bitmap; |
700 } | 712 } |
701 | 713 |
702 class SkNoPixelsBitmapDevice : public SkBitmapDevice { | 714 class SkNoPixelsBitmapDevice : public SkBitmapDevice { |
703 public: | 715 public: |
704 SkNoPixelsBitmapDevice(const SkIRect& bounds, const SkSurfaceProps& surfaceP
rops) | 716 SkNoPixelsBitmapDevice(const SkIRect& bounds, const SkSurfaceProps& surfaceP
rops) |
705 : INHERITED(make_nopixels(bounds.width(), bounds.height()), surfaceProps
) | 717 : INHERITED(make_nopixels(bounds.width(), bounds.height()), surfaceProps
) |
706 { | 718 { |
707 this->setOrigin(bounds.x(), bounds.y()); | 719 this->setOrigin(bounds.x(), bounds.y()); |
708 } | 720 } |
709 | 721 |
710 private: | 722 private: |
711 | 723 |
712 typedef SkBitmapDevice INHERITED; | 724 typedef SkBitmapDevice INHERITED; |
713 }; | 725 }; |
714 | 726 |
715 SkCanvas::SkCanvas(int width, int height, const SkSurfaceProps* props) | 727 SkCanvas::SkCanvas(int width, int height, const SkSurfaceProps* props) |
716 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 728 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
717 , fProps(SkSurfacePropsCopyOrDefault(props)) | 729 , fProps(SkSurfacePropsCopyOrDefault(props)) |
718 , fConservativeRasterClip(false) | 730 , fConservativeRasterClip(false) |
719 { | 731 { |
720 inc_canvas(); | 732 inc_canvas(); |
721 | 733 |
722 this->init(new SkNoPixelsBitmapDevice(SkIRect::MakeWH(width, height), fProps
), | 734 this->init(new SkNoPixelsBitmapDevice(SkIRect::MakeWH(width, height), fProps
), |
723 kDefault_InitFlags)->unref(); | 735 kDefault_InitFlags, nullptr)->unref(); |
724 } | 736 } |
725 | 737 |
726 SkCanvas::SkCanvas(const SkIRect& bounds, InitFlags flags) | 738 SkCanvas::SkCanvas(const SkIRect& bounds, InitFlags flags) |
727 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 739 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
728 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 740 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) |
729 , fConservativeRasterClip(false) | 741 , fConservativeRasterClip(false) |
730 { | 742 { |
731 inc_canvas(); | 743 inc_canvas(); |
732 | 744 |
733 this->init(new SkNoPixelsBitmapDevice(bounds, fProps), flags)->unref(); | 745 this->init(new SkNoPixelsBitmapDevice(bounds, fProps), flags, |
| 746 nullptr)->unref(); |
734 } | 747 } |
735 | 748 |
736 SkCanvas::SkCanvas(SkBaseDevice* device) | 749 SkCanvas::SkCanvas(SkBaseDevice* device) |
737 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 750 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
738 , fProps(device->surfaceProps()) | 751 , fProps(device->surfaceProps()) |
739 , fConservativeRasterClip(false) | 752 , fConservativeRasterClip(false) |
740 { | 753 { |
741 inc_canvas(); | 754 inc_canvas(); |
742 | 755 |
743 this->init(device, kDefault_InitFlags); | 756 this->init(device, kDefault_InitFlags, nullptr); |
744 } | 757 } |
745 | 758 |
746 SkCanvas::SkCanvas(SkBaseDevice* device, InitFlags flags) | 759 SkCanvas::SkCanvas(SkBaseDevice* device, InitFlags flags) |
747 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 760 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
748 , fProps(device->surfaceProps()) | 761 , fProps(device->surfaceProps()) |
749 , fConservativeRasterClip(false) | 762 , fConservativeRasterClip(false) |
750 { | 763 { |
751 inc_canvas(); | 764 inc_canvas(); |
752 | 765 |
753 this->init(device, flags); | 766 this->init(device, flags, nullptr); |
754 } | 767 } |
755 | 768 |
756 SkCanvas::SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props) | 769 SkCanvas::SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props) |
757 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 770 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
758 , fProps(props) | 771 , fProps(props) |
759 , fConservativeRasterClip(false) | 772 , fConservativeRasterClip(false) |
760 { | 773 { |
761 inc_canvas(); | 774 inc_canvas(); |
762 | 775 |
763 SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); | 776 SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); |
764 this->init(device, kDefault_InitFlags); | 777 this->init(device, kDefault_InitFlags, nullptr); |
765 } | 778 } |
766 | 779 |
767 SkCanvas::SkCanvas(const SkBitmap& bitmap) | 780 SkCanvas::SkCanvas(const SkBitmap& bitmap) |
768 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 781 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
769 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 782 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) |
770 , fConservativeRasterClip(false) | 783 , fConservativeRasterClip(false) |
771 { | 784 { |
772 inc_canvas(); | 785 inc_canvas(); |
773 | 786 |
774 SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); | 787 SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); |
775 this->init(device, kDefault_InitFlags); | 788 this->init(device, kDefault_InitFlags, nullptr); |
| 789 } |
| 790 |
| 791 SkCanvas::SkCanvas(const SkBitmap& bitmap, |
| 792 sk_sp<SkRasterCanvasLayerAllocator> allocator) |
| 793 : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) |
| 794 , fProps(SkSurfaceProps::kLegacyFontHost_InitType) |
| 795 , fConservativeRasterClip(false) |
| 796 { |
| 797 inc_canvas(); |
| 798 |
| 799 SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); |
| 800 this->init(device, kDefault_InitFlags, allocator); |
| 801 // TODO(tomhudson): this is circuitous, wasteful, and ugly to boot |
| 802 this->fMCRec->fLayer->fNativeContext = |
| 803 allocator->getNativeContext(this->accessTopLayerPixels(nullptr, nullptr)
); |
776 } | 804 } |
777 | 805 |
778 SkCanvas::~SkCanvas() { | 806 SkCanvas::~SkCanvas() { |
779 // free up the contents of our deque | 807 // free up the contents of our deque |
780 this->restoreToCount(1); // restore everything but the last | 808 this->restoreToCount(1); // restore everything but the last |
781 | 809 |
782 this->internalRestore(); // restore the last, since we're going away | 810 this->internalRestore(); // restore the last, since we're going away |
783 | 811 |
784 delete fMetaData; | 812 delete fMetaData; |
785 | 813 |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 SkImageInfo info = make_layer_info(device->imageInfo(), ir.width(), ir.heigh
t(), isOpaque, | 1296 SkImageInfo info = make_layer_info(device->imageInfo(), ir.width(), ir.heigh
t(), isOpaque, |
1269 paint); | 1297 paint); |
1270 | 1298 |
1271 bool forceSpriteOnRestore = false; | 1299 bool forceSpriteOnRestore = false; |
1272 { | 1300 { |
1273 const bool preserveLCDText = kOpaque_SkAlphaType == info.alphaType() || | 1301 const bool preserveLCDText = kOpaque_SkAlphaType == info.alphaType() || |
1274 (saveLayerFlags & kPreserveLCDText_SaveLaye
rFlag); | 1302 (saveLayerFlags & kPreserveLCDText_SaveLaye
rFlag); |
1275 const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage; | 1303 const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage; |
1276 const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(inf
o, usage, geo, | 1304 const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(inf
o, usage, geo, |
1277 pres
erveLCDText, false); | 1305 pres
erveLCDText, false); |
1278 SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint); | 1306 SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint, fAlloca
tor.get()); |
1279 if (nullptr == newDev) { | 1307 if (nullptr == newDev) { |
1280 // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't h
andle the paint) | 1308 // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't h
andle the paint) |
1281 const SkSurfaceProps surfaceProps(fProps.flags(), createInfo.fPixelG
eometry); | 1309 const SkSurfaceProps surfaceProps(fProps.flags(), createInfo.fPixelG
eometry); |
1282 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); | 1310 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); |
1283 if (nullptr == newDev) { | 1311 if (nullptr == newDev) { |
1284 SkErrorInternals::SetError(kInternalError_SkError, | 1312 SkErrorInternals::SetError(kInternalError_SkError, |
1285 "Unable to create device for layer.")
; | 1313 "Unable to create device for layer.")
; |
1286 return; | 1314 return; |
1287 } | 1315 } |
1288 forceSpriteOnRestore = true; | 1316 forceSpriteOnRestore = true; |
1289 } | 1317 } |
1290 device = newDev; | 1318 device = newDev; |
1291 } | 1319 } |
1292 device->setOrigin(ir.fLeft, ir.fTop); | 1320 device->setOrigin(ir.fLeft, ir.fTop); |
1293 | 1321 |
1294 if (rec.fBackdrop) { | 1322 if (rec.fBackdrop) { |
1295 draw_filter_into_device(fMCRec->fTopLayer->fDevice, rec.fBackdrop, devic
e, fMCRec->fMatrix); | 1323 draw_filter_into_device(fMCRec->fTopLayer->fDevice, rec.fBackdrop, devic
e, fMCRec->fMatrix); |
1296 } | 1324 } |
1297 | 1325 |
1298 DeviceCM* layer = new DeviceCM(device, paint, this, fConservativeRasterClip, | 1326 DeviceCM* layer = new DeviceCM(device, paint, this, fConservativeRasterClip, |
1299 forceSpriteOnRestore, stashedMatrix); | 1327 forceSpriteOnRestore, stashedMatrix); |
1300 device->unref(); | 1328 device->unref(); |
1301 | 1329 |
1302 layer->fNext = fMCRec->fTopLayer; | 1330 layer->fNext = fMCRec->fTopLayer; |
| 1331 layer->fAllocator = fAllocator.get(); |
| 1332 layer->fNativeContext = fAllocator |
| 1333 ? fAllocator->getNativeContext(device->accessBitmap(false).getPixels()) |
| 1334 : nullptr; |
1303 fMCRec->fLayer = layer; | 1335 fMCRec->fLayer = layer; |
1304 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer | 1336 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer |
1305 } | 1337 } |
1306 | 1338 |
1307 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { | 1339 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { |
1308 if (0xFF == alpha) { | 1340 if (0xFF == alpha) { |
1309 return this->saveLayer(bounds, nullptr); | 1341 return this->saveLayer(bounds, nullptr); |
1310 } else { | 1342 } else { |
1311 SkPaint tmpPaint; | 1343 SkPaint tmpPaint; |
1312 tmpPaint.setAlpha(alpha); | 1344 tmpPaint.setAlpha(alpha); |
1313 return this->saveLayer(bounds, &tmpPaint); | 1345 return this->saveLayer(bounds, &tmpPaint); |
1314 } | 1346 } |
1315 } | 1347 } |
1316 | 1348 |
1317 void SkCanvas::internalRestore() { | 1349 void SkCanvas::internalRestore() { |
1318 SkASSERT(fMCStack.count() != 0); | 1350 SkASSERT(fMCStack.count() != 0); |
1319 | 1351 |
1320 fDeviceCMDirty = true; | 1352 fDeviceCMDirty = true; |
1321 fCachedLocalClipBoundsDirty = true; | 1353 fCachedLocalClipBoundsDirty = true; |
1322 | 1354 |
1323 fClipStack->restore(); | 1355 fClipStack->restore(); |
1324 | 1356 |
1325 // reserve our layer (if any) | 1357 // reserve our layer (if any) |
1326 DeviceCM* layer = fMCRec->fLayer; // may be null | 1358 DeviceCM* layer = fMCRec->fLayer; // may be null |
| 1359 |
1327 // now detach it from fMCRec so we can pop(). Gets freed after its drawn | 1360 // now detach it from fMCRec so we can pop(). Gets freed after its drawn |
1328 fMCRec->fLayer = nullptr; | 1361 fMCRec->fLayer = nullptr; |
1329 | 1362 |
1330 // now do the normal restore() | 1363 // now do the normal restore() |
1331 fMCRec->~MCRec(); // balanced in save() | 1364 fMCRec->~MCRec(); // balanced in save() |
1332 fMCStack.pop_back(); | 1365 fMCStack.pop_back(); |
1333 fMCRec = (MCRec*)fMCStack.back(); | 1366 fMCRec = (MCRec*)fMCStack.back(); |
1334 | 1367 |
1335 /* Time to draw the layer's offscreen. We can't call the public drawSprite, | 1368 /* Time to draw the layer's offscreen. We can't call the public drawSprite, |
1336 since if we're being recorded, we don't want to record this (the | 1369 since if we're being recorded, we don't want to record this (the |
1337 recorder will have already recorded the restore). | 1370 recorder will have already recorded the restore). |
1338 */ | 1371 */ |
1339 if (layer) { | 1372 if (layer) { |
| 1373 SkASSERT(layer->fAllocator == fAllocator.get()); |
1340 if (layer->fNext) { | 1374 if (layer->fNext) { |
1341 const SkIPoint& origin = layer->fDevice->getOrigin(); | 1375 const SkIPoint& origin = layer->fDevice->getOrigin(); |
1342 this->internalDrawDevice(layer->fDevice, origin.x(), origin.y(), | 1376 this->internalDrawDevice(layer->fDevice, origin.x(), origin.y(), |
1343 layer->fPaint, layer->fDeviceIsBitmapDevice
); | 1377 layer->fPaint, layer->fDeviceIsBitmapDevice
); |
1344 // restore what we smashed in internalSaveLayer | 1378 // restore what we smashed in internalSaveLayer |
1345 fMCRec->fMatrix = layer->fStashedMatrix; | 1379 fMCRec->fMatrix = layer->fStashedMatrix; |
1346 // reset this, since internalDrawDevice will have set it to true | 1380 // reset this, since internalDrawDevice will have set it to true |
1347 fDeviceCMDirty = true; | 1381 fDeviceCMDirty = true; |
1348 delete layer; | 1382 delete layer; |
1349 } else { | 1383 } else { |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1760 | 1794 |
1761 void SkCanvas::replayClips(ClipVisitor* visitor) const { | 1795 void SkCanvas::replayClips(ClipVisitor* visitor) const { |
1762 SkClipStack::B2TIter iter(*fClipStack); | 1796 SkClipStack::B2TIter iter(*fClipStack); |
1763 const SkClipStack::Element* element; | 1797 const SkClipStack::Element* element; |
1764 | 1798 |
1765 while ((element = iter.next()) != nullptr) { | 1799 while ((element = iter.next()) != nullptr) { |
1766 element->replay(visitor); | 1800 element->replay(visitor); |
1767 } | 1801 } |
1768 } | 1802 } |
1769 | 1803 |
| 1804 void* SkCanvas::getTopLayerNative() const { |
| 1805 return fMCRec->fLayer->fNativeContext; |
| 1806 } |
| 1807 |
| 1808 |
1770 /////////////////////////////////////////////////////////////////////////////// | 1809 /////////////////////////////////////////////////////////////////////////////// |
1771 | 1810 |
1772 bool SkCanvas::isClipEmpty() const { | 1811 bool SkCanvas::isClipEmpty() const { |
1773 return fMCRec->fRasterClip.isEmpty(); | 1812 return fMCRec->fRasterClip.isEmpty(); |
1774 } | 1813 } |
1775 | 1814 |
1776 bool SkCanvas::isClipRect() const { | 1815 bool SkCanvas::isClipRect() const { |
1777 return fMCRec->fRasterClip.isRect(); | 1816 return fMCRec->fRasterClip.isRect(); |
1778 } | 1817 } |
1779 | 1818 |
(...skipping 1294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3074 | 3113 |
3075 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3114 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
3076 fCanvas->restoreToCount(fSaveCount); | 3115 fCanvas->restoreToCount(fSaveCount); |
3077 } | 3116 } |
3078 | 3117 |
3079 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API | 3118 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API |
3080 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { | 3119 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
rops) { |
3081 return this->makeSurface(info, props).release(); | 3120 return this->makeSurface(info, props).release(); |
3082 } | 3121 } |
3083 #endif | 3122 #endif |
OLD | NEW |