| 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" |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 */ | 473 */ |
| 474 SkPaint tmp; | 474 SkPaint tmp; |
| 475 tmp.setImageFilter(fPaint->getImageFilter()); | 475 tmp.setImageFilter(fPaint->getImageFilter()); |
| 476 tmp.setXfermode(fPaint->getXfermode()); | 476 tmp.setXfermode(fPaint->getXfermode()); |
| 477 SkRect storage; | 477 SkRect storage; |
| 478 if (rawBounds) { | 478 if (rawBounds) { |
| 479 // Make rawBounds include all paint outsets except for those due
to image filters. | 479 // Make rawBounds include all paint outsets except for those due
to image filters. |
| 480 rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *ra
wBounds, &storage); | 480 rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *ra
wBounds, &storage); |
| 481 } | 481 } |
| 482 (void)canvas->internalSaveLayer(rawBounds, &tmp, SkCanvas::kARGB_Cli
pLayer_SaveFlag, | 482 (void)canvas->internalSaveLayer(rawBounds, &tmp, SkCanvas::kARGB_Cli
pLayer_SaveFlag, |
| 483 SkCanvas::kFullLayer_SaveLayerStrate
gy); | 483 SkCanvas::kFullLayer_SaveLayerStrate
gy, nullptr); |
| 484 fTempLayerForImageFilter = true; | 484 fTempLayerForImageFilter = true; |
| 485 // we remove the imagefilter/xfermode inside doNext() | 485 // we remove the imagefilter/xfermode inside doNext() |
| 486 } | 486 } |
| 487 | 487 |
| 488 if (SkDrawLooper* looper = paint.getLooper()) { | 488 if (SkDrawLooper* looper = paint.getLooper()) { |
| 489 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( | 489 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( |
| 490 looper->contextSize()); | 490 looper->contextSize()); |
| 491 fLooperContext = looper->createContext(canvas, buffer); | 491 fLooperContext = looper->createContext(canvas, buffer); |
| 492 fIsSimple = false; | 492 fIsSimple = false; |
| 493 } else { | 493 } else { |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1114 fMCRec->fRasterClip.setRect(ir); | 1114 fMCRec->fRasterClip.setRect(ir); |
| 1115 } | 1115 } |
| 1116 | 1116 |
| 1117 if (intersection) { | 1117 if (intersection) { |
| 1118 *intersection = ir; | 1118 *intersection = ir; |
| 1119 } | 1119 } |
| 1120 return true; | 1120 return true; |
| 1121 } | 1121 } |
| 1122 | 1122 |
| 1123 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { | 1123 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { |
| 1124 return this->saveLayerWithPickup(bounds, paint, nullptr); |
| 1125 } |
| 1126 |
| 1127 int SkCanvas::saveLayerWithPickup(const SkRect* bounds, const SkPaint* paint, |
| 1128 SkImageFilter* pickup) { |
| 1124 if (gIgnoreSaveLayerBounds) { | 1129 if (gIgnoreSaveLayerBounds) { |
| 1125 bounds = nullptr; | 1130 bounds = nullptr; |
| 1126 } | 1131 } |
| 1127 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, kARGB_ClipLa
yer_SaveFlag); | 1132 SaveFlags flags = kARGB_ClipLayer_SaveFlag; |
| 1133 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); |
| 1128 fSaveCount += 1; | 1134 fSaveCount += 1; |
| 1129 this->internalSaveLayer(bounds, paint, kARGB_ClipLayer_SaveFlag, strategy); | 1135 this->internalSaveLayer(bounds, paint, flags, strategy, pickup); |
| 1130 return this->getSaveCount() - 1; | 1136 return this->getSaveCount() - 1; |
| 1131 } | 1137 } |
| 1132 | 1138 |
| 1133 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags fl
ags) { | 1139 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags fl
ags) { |
| 1134 if (gIgnoreSaveLayerBounds) { | 1140 if (gIgnoreSaveLayerBounds) { |
| 1135 bounds = nullptr; | 1141 bounds = nullptr; |
| 1136 } | 1142 } |
| 1137 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); | 1143 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); |
| 1138 fSaveCount += 1; | 1144 fSaveCount += 1; |
| 1139 this->internalSaveLayer(bounds, paint, flags, strategy); | 1145 this->internalSaveLayer(bounds, paint, flags, strategy, nullptr); |
| 1140 return this->getSaveCount() - 1; | 1146 return this->getSaveCount() - 1; |
| 1141 } | 1147 } |
| 1142 | 1148 |
| 1143 int SkCanvas::saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPai
nt* paint) { | 1149 int SkCanvas::saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPai
nt* paint) { |
| 1144 unsigned flags = kARGB_ClipLayer_SaveFlag | kPreserveLCDText_PrivateSaveFlag
; | 1150 unsigned flags = kARGB_ClipLayer_SaveFlag | kPreserveLCDText_PrivateSaveFlag
; |
| 1145 return this->saveLayer(bounds, paint, (SaveFlags)flags); | 1151 return this->saveLayer(bounds, paint, (SaveFlags)flags); |
| 1146 } | 1152 } |
| 1147 | 1153 |
| 1154 static void draw_filter_into_device(SkBaseDevice* src, SkImageFilter* filter, Sk
BaseDevice* dst) { |
| 1155 SkCanvas c(dst); |
| 1156 |
| 1157 const SkBitmap& srcBM = src->accessBitmap(false); |
| 1158 SkPaint p; |
| 1159 p.setImageFilter(filter); |
| 1160 c.drawBitmap(srcBM, 0, 0, &p); |
| 1161 } |
| 1148 | 1162 |
| 1149 void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Sav
eFlags flags, | 1163 void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Sav
eFlags flags, |
| 1150 SaveLayerStrategy strategy) { | 1164 SaveLayerStrategy strategy, SkImageFilter* pick
up) { |
| 1151 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG | 1165 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
| 1152 flags |= kClipToLayer_SaveFlag; | 1166 flags |= kClipToLayer_SaveFlag; |
| 1153 #endif | 1167 #endif |
| 1154 | 1168 |
| 1155 // do this before we create the layer. We don't call the public save() since | 1169 // do this before we create the layer. We don't call the public save() since |
| 1156 // that would invoke a possibly overridden virtual | 1170 // that would invoke a possibly overridden virtual |
| 1157 this->internalSave(); | 1171 this->internalSave(); |
| 1158 | 1172 |
| 1159 fDeviceCMDirty = true; | 1173 fDeviceCMDirty = true; |
| 1160 | 1174 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); | 1215 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); |
| 1202 if (nullptr == newDev) { | 1216 if (nullptr == newDev) { |
| 1203 SkErrorInternals::SetError(kInternalError_SkError, | 1217 SkErrorInternals::SetError(kInternalError_SkError, |
| 1204 "Unable to create device for layer.")
; | 1218 "Unable to create device for layer.")
; |
| 1205 return; | 1219 return; |
| 1206 } | 1220 } |
| 1207 forceSpriteOnRestore = true; | 1221 forceSpriteOnRestore = true; |
| 1208 } | 1222 } |
| 1209 device = newDev; | 1223 device = newDev; |
| 1210 } | 1224 } |
| 1225 device->setOrigin(ir.fLeft, ir.fTop); |
| 1211 | 1226 |
| 1212 device->setOrigin(ir.fLeft, ir.fTop); | 1227 if (pickup) { |
| 1228 draw_filter_into_device(fMCRec->fTopLayer->fDevice, pickup, device); |
| 1229 } |
| 1230 |
| 1213 DeviceCM* layer = | 1231 DeviceCM* layer = |
| 1214 new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
teOnRestore); | 1232 new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
teOnRestore); |
| 1215 device->unref(); | 1233 device->unref(); |
| 1216 | 1234 |
| 1217 layer->fNext = fMCRec->fTopLayer; | 1235 layer->fNext = fMCRec->fTopLayer; |
| 1218 fMCRec->fLayer = layer; | 1236 fMCRec->fLayer = layer; |
| 1219 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer | 1237 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer |
| 1220 } | 1238 } |
| 1221 | 1239 |
| 1222 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { | 1240 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { |
| (...skipping 1790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3013 } | 3031 } |
| 3014 | 3032 |
| 3015 if (matrix) { | 3033 if (matrix) { |
| 3016 canvas->concat(*matrix); | 3034 canvas->concat(*matrix); |
| 3017 } | 3035 } |
| 3018 } | 3036 } |
| 3019 | 3037 |
| 3020 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3038 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
| 3021 fCanvas->restoreToCount(fSaveCount); | 3039 fCanvas->restoreToCount(fSaveCount); |
| 3022 } | 3040 } |
| OLD | NEW |