Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: src/core/SkCanvas.cpp

Issue 1523053003: add backdrop option to SaveLayerRec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: updated gm to exercise ctm scaling Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« samplecode/SampleLayers.cpp ('K') | « samplecode/SampleLayers.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« samplecode/SampleLayers.cpp ('K') | « samplecode/SampleLayers.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698