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

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

Issue 2145343005: Recast draw_filter_into_device as drawDevice (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 5 months 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
« no previous file with comments | « include/core/SkCanvas.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | 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 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 SaveLayerRec rec(origRec); 1141 SaveLayerRec rec(origRec);
1142 if (gIgnoreSaveLayerBounds) { 1142 if (gIgnoreSaveLayerBounds) {
1143 rec.fBounds = nullptr; 1143 rec.fBounds = nullptr;
1144 } 1144 }
1145 SaveLayerStrategy strategy = this->getSaveLayerStrategy(rec); 1145 SaveLayerStrategy strategy = this->getSaveLayerStrategy(rec);
1146 fSaveCount += 1; 1146 fSaveCount += 1;
1147 this->internalSaveLayer(rec, strategy); 1147 this->internalSaveLayer(rec, strategy);
1148 return this->getSaveCount() - 1; 1148 return this->getSaveCount() - 1;
1149 } 1149 }
1150 1150
1151 static void draw_filter_into_device(SkBaseDevice* src, const SkImageFilter* filt er, 1151 void SkCanvas::DrawDeviceWithFilter(SkBaseDevice* src, const SkImageFilter* filt er,
1152 SkBaseDevice* dst, const SkMatrix& ctm) { 1152 SkBaseDevice* dst, const SkMatrix& ctm,
1153 1153 const SkClipStack* clipStack) {
1154 SkBitmap srcBM; 1154 SkDraw draw;
1155 1155 SkRasterClip rc;
1156 #if SK_SUPPORT_GPU 1156 rc.setRect(SkIRect::MakeWH(dst->width(), dst->height()));
1157 // TODO: remove this virtual usage of accessRenderTarget! It is preventing 1157 draw.fMatrix = &SkMatrix::I();
1158 // removal of the virtual on SkBaseDevice. 1158 draw.fRC = &rc;
1159 GrRenderTarget* srcRT = src->accessRenderTarget(); 1159 draw.fClipStack = clipStack;
1160 if (srcRT && !srcRT->asTexture() && dst->accessRenderTarget()) { 1160 draw.fDevice = dst;
1161 // When both the src & the dst are on the gpu but the src doesn't have a texture,
1162 // we create a temporary texture for the draw.
1163 // TODO: we should actually only copy the portion of the source needed t o apply the image
1164 // filter
1165 GrContext* context = srcRT->getContext();
1166 SkAutoTUnref<GrTexture> tex(context->textureProvider()->createTexture(sr cRT->desc(),
1167 Sk Budgeted::kYes));
1168
1169 context->copySurface(tex, srcRT);
1170
1171 GrWrapTextureInBitmap(tex, src->width(), src->height(), src->isOpaque(), &srcBM);
1172 } else
1173 #endif
1174 {
1175 srcBM = src->accessBitmap(false);
1176 }
1177
1178 SkCanvas c(dst);
1179 1161
1180 SkPaint p; 1162 SkPaint p;
1181 p.setImageFilter(filter->makeWithLocalMatrix(ctm)); 1163 p.setImageFilter(filter->makeWithLocalMatrix(ctm));
1182 const SkScalar x = SkIntToScalar(src->getOrigin().x()); 1164
1183 const SkScalar y = SkIntToScalar(src->getOrigin().y()); 1165 dst->drawDevice(draw, src,
1184 c.drawBitmap(srcBM, x, y, &p); 1166 src->getOrigin().x() - dst->getOrigin().x(),
1167 src->getOrigin().y() - dst->getOrigin().y(),
1168 p);
1185 } 1169 }
1186 1170
1187 static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, bool i sOpaque, 1171 static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, bool i sOpaque,
1188 const SkPaint* paint) { 1172 const SkPaint* paint) {
1189 // need to force L32 for now if we have an image filter. Once filters suppor t other colortypes 1173 // need to force L32 for now if we have an image filter. Once filters suppor t other colortypes
1190 // e.g. sRGB or F16, we can remove this check 1174 // e.g. sRGB or F16, we can remove this check
1191 // SRGBTODO: Can we remove this check now? 1175 // SRGBTODO: Can we remove this check now?
1192 const bool hasImageFilter = paint && paint->getImageFilter(); 1176 const bool hasImageFilter = paint && paint->getImageFilter();
1193 1177
1194 SkAlphaType alphaType = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType ; 1178 SkAlphaType alphaType = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType ;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 SkErrorInternals::SetError(kInternalError_SkError, 1280 SkErrorInternals::SetError(kInternalError_SkError,
1297 "Unable to create device for layer.") ; 1281 "Unable to create device for layer.") ;
1298 return; 1282 return;
1299 } 1283 }
1300 forceSpriteOnRestore = true; 1284 forceSpriteOnRestore = true;
1301 } 1285 }
1302 device = newDev; 1286 device = newDev;
1303 } 1287 }
1304 device->setOrigin(ir.fLeft, ir.fTop); 1288 device->setOrigin(ir.fLeft, ir.fTop);
1305 1289
1290 DeviceCM* layer = new DeviceCM(device, paint, this, fConservativeRasterClip,
1291 forceSpriteOnRestore, stashedMatrix);
1292
1306 if (rec.fBackdrop) { 1293 if (rec.fBackdrop) {
1307 draw_filter_into_device(fMCRec->fTopLayer->fDevice, rec.fBackdrop, devic e, fMCRec->fMatrix); 1294 DrawDeviceWithFilter(this->getTopDevice(), rec.fBackdrop, device,
1295 fMCRec->fMatrix, this->getClipStack());
1308 } 1296 }
1309 1297
1310 DeviceCM* layer = new DeviceCM(device, paint, this, fConservativeRasterClip,
1311 forceSpriteOnRestore, stashedMatrix);
1312 device->unref(); 1298 device->unref();
1313 1299
1314 layer->fNext = fMCRec->fTopLayer; 1300 layer->fNext = fMCRec->fTopLayer;
1315 fMCRec->fLayer = layer; 1301 fMCRec->fLayer = layer;
1316 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer 1302 fMCRec->fTopLayer = layer; // this field is NOT an owner of layer
1317 } 1303 }
reed1 2016/07/15 16:00:56 Can we move the "seed-the-new-top-device-pixels" c
robertphillips 2016/07/18 16:39:40 Done.
1318 1304
1319 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { 1305 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) {
1320 if (0xFF == alpha) { 1306 if (0xFF == alpha) {
1321 return this->saveLayer(bounds, nullptr); 1307 return this->saveLayer(bounds, nullptr);
1322 } else { 1308 } else {
1323 SkPaint tmpPaint; 1309 SkPaint tmpPaint;
1324 tmpPaint.setAlpha(alpha); 1310 tmpPaint.setAlpha(alpha);
1325 return this->saveLayer(bounds, &tmpPaint); 1311 return this->saveLayer(bounds, &tmpPaint);
1326 } 1312 }
1327 } 1313 }
(...skipping 1806 matching lines...) Expand 10 before | Expand all | Expand 10 after
3134 3120
3135 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 3121 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
3136 fCanvas->restoreToCount(fSaveCount); 3122 fCanvas->restoreToCount(fSaveCount);
3137 } 3123 }
3138 3124
3139 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API 3125 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API
3140 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p rops) { 3126 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p rops) {
3141 return this->makeSurface(info, props).release(); 3127 return this->makeSurface(info, props).release();
3142 } 3128 }
3143 #endif 3129 #endif
OLDNEW
« no previous file with comments | « include/core/SkCanvas.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698