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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 static bool gTreatSpriteAsBitmap; | 107 static bool gTreatSpriteAsBitmap; |
108 void SkCanvas::Internal_Private_SetTreatSpriteAsBitmap(bool spriteAsBitmap) { | 108 void SkCanvas::Internal_Private_SetTreatSpriteAsBitmap(bool spriteAsBitmap) { |
109 gTreatSpriteAsBitmap = spriteAsBitmap; | 109 gTreatSpriteAsBitmap = spriteAsBitmap; |
110 } | 110 } |
111 bool SkCanvas::Internal_Private_GetTreatSpriteAsBitmap() { | 111 bool SkCanvas::Internal_Private_GetTreatSpriteAsBitmap() { |
112 return gTreatSpriteAsBitmap; | 112 return gTreatSpriteAsBitmap; |
113 } | 113 } |
114 | 114 |
115 // experimental for faster tiled drawing... | 115 // experimental for faster tiled drawing... |
116 //#define SK_ENABLE_CLIP_QUICKREJECT | 116 //#define SK_ENABLE_CLIP_QUICKREJECT |
117 | |
118 //#define SK_TRACE_SAVERESTORE | 117 //#define SK_TRACE_SAVERESTORE |
119 | 118 |
120 #ifdef SK_TRACE_SAVERESTORE | 119 #ifdef SK_TRACE_SAVERESTORE |
121 static int gLayerCounter; | 120 static int gLayerCounter; |
122 static void inc_layer() { ++gLayerCounter; printf("----- inc layer %d\n", gL
ayerCounter); } | 121 static void inc_layer() { ++gLayerCounter; printf("----- inc layer %d\n", gL
ayerCounter); } |
123 static void dec_layer() { --gLayerCounter; printf("----- dec layer %d\n", gL
ayerCounter); } | 122 static void dec_layer() { --gLayerCounter; printf("----- dec layer %d\n", gL
ayerCounter); } |
124 | 123 |
125 static int gRecCounter; | 124 static int gRecCounter; |
126 static void inc_rec() { ++gRecCounter; printf("----- inc rec %d\n", gRecCoun
ter); } | 125 static void inc_rec() { ++gRecCounter; printf("----- inc rec %d\n", gRecCoun
ter); } |
127 static void dec_rec() { --gRecCounter; printf("----- dec rec %d\n", gRecCoun
ter); } | 126 static void dec_rec() { --gRecCounter; printf("----- dec rec %d\n", gRecCoun
ter); } |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 * draw onto the previous layer using the xfermode from the ori
ginal paint. | 473 * draw onto the previous layer using the xfermode from the ori
ginal paint. |
475 */ | 474 */ |
476 SkPaint tmp; | 475 SkPaint tmp; |
477 tmp.setImageFilter(fPaint->getImageFilter()); | 476 tmp.setImageFilter(fPaint->getImageFilter()); |
478 tmp.setXfermode(fPaint->getXfermode()); | 477 tmp.setXfermode(fPaint->getXfermode()); |
479 SkRect storage; | 478 SkRect storage; |
480 if (rawBounds) { | 479 if (rawBounds) { |
481 // Make rawBounds include all paint outsets except for those due
to image filters. | 480 // Make rawBounds include all paint outsets except for those due
to image filters. |
482 rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *ra
wBounds, &storage); | 481 rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *ra
wBounds, &storage); |
483 } | 482 } |
484 (void)canvas->internalSaveLayer(SkCanvas::SaveLayerRec(rawBounds, &t
mp, 0), | 483 (void)canvas->internalSaveLayer(SkCanvas::SaveLayerRec(rawBounds, &t
mp), |
485 SkCanvas::kFullLayer_SaveLayerStrate
gy); | 484 SkCanvas::kFullLayer_SaveLayerStrate
gy); |
486 fTempLayerForImageFilter = true; | 485 fTempLayerForImageFilter = true; |
487 // we remove the imagefilter/xfermode inside doNext() | 486 // we remove the imagefilter/xfermode inside doNext() |
488 } | 487 } |
489 | 488 |
490 if (SkDrawLooper* looper = paint.getLooper()) { | 489 if (SkDrawLooper* looper = paint.getLooper()) { |
491 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( | 490 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( |
492 looper->contextSize()); | 491 looper->contextSize()); |
493 fLooperContext = looper->createContext(canvas, buffer); | 492 fLooperContext = looper->createContext(canvas, buffer); |
494 fIsSimple = false; | 493 fIsSimple = false; |
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1164 SaveLayerRec rec(origRec); | 1163 SaveLayerRec rec(origRec); |
1165 if (gIgnoreSaveLayerBounds) { | 1164 if (gIgnoreSaveLayerBounds) { |
1166 rec.fBounds = nullptr; | 1165 rec.fBounds = nullptr; |
1167 } | 1166 } |
1168 SaveLayerStrategy strategy = this->getSaveLayerStrategy(rec); | 1167 SaveLayerStrategy strategy = this->getSaveLayerStrategy(rec); |
1169 fSaveCount += 1; | 1168 fSaveCount += 1; |
1170 this->internalSaveLayer(rec, strategy); | 1169 this->internalSaveLayer(rec, strategy); |
1171 return this->getSaveCount() - 1; | 1170 return this->getSaveCount() - 1; |
1172 } | 1171 } |
1173 | 1172 |
1174 static void draw_filter_into_device(SkBaseDevice* src, SkImageFilter* filter, Sk
BaseDevice* dst) { | 1173 static void draw_filter_into_device(SkBaseDevice* src, const SkImageFilter* filt
er, |
| 1174 SkBaseDevice* dst, const SkMatrix& ctm) { |
1175 | 1175 |
1176 SkBitmap srcBM; | 1176 SkBitmap srcBM; |
1177 | 1177 |
1178 #if SK_SUPPORT_GPU | 1178 #if SK_SUPPORT_GPU |
1179 GrRenderTarget* srcRT = src->accessRenderTarget(); | 1179 GrRenderTarget* srcRT = src->accessRenderTarget(); |
1180 if (srcRT && !srcRT->asTexture() && dst->accessRenderTarget()) { | 1180 if (srcRT && !srcRT->asTexture() && dst->accessRenderTarget()) { |
1181 // When both the src & the dst are on the gpu but the src doesn't have a
texture, | 1181 // When both the src & the dst are on the gpu but the src doesn't have a
texture, |
1182 // we create a temporary texture for the draw. | 1182 // we create a temporary texture for the draw. |
1183 // TODO: we should actually only copy the portion of the source needed t
o apply the image | 1183 // TODO: we should actually only copy the portion of the source needed t
o apply the image |
1184 // filter | 1184 // filter |
1185 GrContext* context = srcRT->getContext(); | 1185 GrContext* context = srcRT->getContext(); |
1186 SkAutoTUnref<GrTexture> tex(context->textureProvider()->createTexture(sr
cRT->desc(), true)); | 1186 SkAutoTUnref<GrTexture> tex(context->textureProvider()->createTexture(sr
cRT->desc(), true)); |
1187 | 1187 |
1188 context->copySurface(tex, srcRT); | 1188 context->copySurface(tex, srcRT); |
1189 | 1189 |
1190 GrWrapTextureInBitmap(tex, src->width(), src->height(), src->isOpaque(),
&srcBM); | 1190 GrWrapTextureInBitmap(tex, src->width(), src->height(), src->isOpaque(),
&srcBM); |
1191 } else | 1191 } else |
1192 #endif | 1192 #endif |
1193 { | 1193 { |
1194 srcBM = src->accessBitmap(false); | 1194 srcBM = src->accessBitmap(false); |
1195 } | 1195 } |
1196 | 1196 |
1197 SkCanvas c(dst); | 1197 SkCanvas c(dst); |
1198 | 1198 |
| 1199 SkAutoTUnref<SkImageFilter> localF(filter->newWithLocalMatrix(ctm)); |
1199 SkPaint p; | 1200 SkPaint p; |
1200 p.setImageFilter(filter); | 1201 p.setImageFilter(localF); |
1201 c.drawBitmap(srcBM, 0, 0, &p); | 1202 const SkScalar x = SkIntToScalar(src->getOrigin().x()); |
| 1203 const SkScalar y = SkIntToScalar(src->getOrigin().y()); |
| 1204 c.drawBitmap(srcBM, x, y, &p); |
1202 } | 1205 } |
1203 | 1206 |
1204 void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra
tegy) { | 1207 void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra
tegy) { |
1205 const SkRect* bounds = rec.fBounds; | 1208 const SkRect* bounds = rec.fBounds; |
1206 const SkPaint* paint = rec.fPaint; | 1209 const SkPaint* paint = rec.fPaint; |
1207 SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags; | 1210 SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags; |
1208 | 1211 |
1209 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG | 1212 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
1210 saveLayerFlags &= ~kDontClipToLayer_PrivateSaveLayerFlag; | 1213 saveLayerFlags &= ~kDontClipToLayer_PrivateSaveLayerFlag; |
1211 #endif | 1214 #endif |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); | 1262 newDev = SkBitmapDevice::Create(createInfo.fInfo, surfaceProps); |
1260 if (nullptr == newDev) { | 1263 if (nullptr == newDev) { |
1261 SkErrorInternals::SetError(kInternalError_SkError, | 1264 SkErrorInternals::SetError(kInternalError_SkError, |
1262 "Unable to create device for layer.")
; | 1265 "Unable to create device for layer.")
; |
1263 return; | 1266 return; |
1264 } | 1267 } |
1265 forceSpriteOnRestore = true; | 1268 forceSpriteOnRestore = true; |
1266 } | 1269 } |
1267 device = newDev; | 1270 device = newDev; |
1268 } | 1271 } |
1269 | |
1270 device->setOrigin(ir.fLeft, ir.fTop); | 1272 device->setOrigin(ir.fLeft, ir.fTop); |
1271 | 1273 |
1272 if (0) { | 1274 if (rec.fBackdrop) { |
1273 draw_filter_into_device(fMCRec->fTopLayer->fDevice, nullptr, device); | 1275 draw_filter_into_device(fMCRec->fTopLayer->fDevice, rec.fBackdrop, devic
e, fMCRec->fMatrix); |
1274 } | 1276 } |
1275 | 1277 |
1276 DeviceCM* layer = | 1278 DeviceCM* layer = |
1277 new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
teOnRestore); | 1279 new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
teOnRestore); |
1278 device->unref(); | 1280 device->unref(); |
1279 | 1281 |
1280 layer->fNext = fMCRec->fTopLayer; | 1282 layer->fNext = fMCRec->fTopLayer; |
1281 fMCRec->fLayer = layer; | 1283 fMCRec->fLayer = layer; |
1282 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer | 1284 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer |
1283 } | 1285 } |
(...skipping 1757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3041 } | 3043 } |
3042 | 3044 |
3043 if (matrix) { | 3045 if (matrix) { |
3044 canvas->concat(*matrix); | 3046 canvas->concat(*matrix); |
3045 } | 3047 } |
3046 } | 3048 } |
3047 | 3049 |
3048 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 3050 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { |
3049 fCanvas->restoreToCount(fSaveCount); | 3051 fCanvas->restoreToCount(fSaveCount); |
3050 } | 3052 } |
OLD | NEW |