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

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

Issue 1685203002: lots of sRGB and F16 blits (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: xfermodes gm now works in srgb and f16 using saveLayer Created 4 years, 10 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
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 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 SkCanvas c(dst); 1160 SkCanvas c(dst);
1161 1161
1162 SkAutoTUnref<SkImageFilter> localF(filter->newWithLocalMatrix(ctm)); 1162 SkAutoTUnref<SkImageFilter> localF(filter->newWithLocalMatrix(ctm));
1163 SkPaint p; 1163 SkPaint p;
1164 p.setImageFilter(localF); 1164 p.setImageFilter(localF);
1165 const SkScalar x = SkIntToScalar(src->getOrigin().x()); 1165 const SkScalar x = SkIntToScalar(src->getOrigin().x());
1166 const SkScalar y = SkIntToScalar(src->getOrigin().y()); 1166 const SkScalar y = SkIntToScalar(src->getOrigin().y());
1167 c.drawBitmap(srcBM, x, y, &p); 1167 c.drawBitmap(srcBM, x, y, &p);
1168 } 1168 }
1169 1169
1170 static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, bool i sOpaque) {
1171 SkAlphaType alphaType = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType ;
1172 if (prev.bytesPerPixel() < 4) {
1173 // promote to 32bits
1174 return SkImageInfo::MakeN32(w, h, alphaType);
1175 } else {
1176 // keep the same characteristics as the prev
1177 return SkImageInfo::Make(w, h, prev.colorType(), alphaType, prev.profile Type());
1178 }
1179 }
1180
1170 void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra tegy) { 1181 void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra tegy) {
1171 const SkRect* bounds = rec.fBounds; 1182 const SkRect* bounds = rec.fBounds;
1172 const SkPaint* paint = rec.fPaint; 1183 const SkPaint* paint = rec.fPaint;
1173 SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags; 1184 SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags;
1174 1185
1175 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 1186 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
1176 saveLayerFlags &= ~kDontClipToLayer_PrivateSaveLayerFlag; 1187 saveLayerFlags &= ~kDontClipToLayer_PrivateSaveLayerFlag;
1177 #endif 1188 #endif
1178 1189
1179 // do this before we create the layer. We don't call the public save() since 1190 // do this before we create the layer. We don't call the public save() since
(...skipping 15 matching lines...) Expand all
1195 1206
1196 bool isOpaque = SkToBool(saveLayerFlags & kIsOpaque_SaveLayerFlag); 1207 bool isOpaque = SkToBool(saveLayerFlags & kIsOpaque_SaveLayerFlag);
1197 SkPixelGeometry geo = fProps.pixelGeometry(); 1208 SkPixelGeometry geo = fProps.pixelGeometry();
1198 if (paint) { 1209 if (paint) {
1199 // TODO: perhaps add a query to filters so we might preserve opaqueness. .. 1210 // TODO: perhaps add a query to filters so we might preserve opaqueness. ..
1200 if (paint->getImageFilter() || paint->getColorFilter()) { 1211 if (paint->getImageFilter() || paint->getColorFilter()) {
1201 isOpaque = false; 1212 isOpaque = false;
1202 geo = kUnknown_SkPixelGeometry; 1213 geo = kUnknown_SkPixelGeometry;
1203 } 1214 }
1204 } 1215 }
1205 SkImageInfo info = SkImageInfo::MakeN32(ir.width(), ir.height(),
1206 isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
1207 1216
1208 SkBaseDevice* device = this->getTopDevice(); 1217 SkBaseDevice* device = this->getTopDevice();
1209 if (nullptr == device) { 1218 if (nullptr == device) {
1210 SkDebugf("Unable to find device for layer."); 1219 SkDebugf("Unable to find device for layer.");
1211 return; 1220 return;
1212 } 1221 }
1213 1222
1223 SkImageInfo info = make_layer_info(device->imageInfo(), ir.width(), ir.heigh t(), isOpaque);
1224
1214 bool forceSpriteOnRestore = false; 1225 bool forceSpriteOnRestore = false;
1215 { 1226 {
1216 const bool preserveLCDText = kOpaque_SkAlphaType == info.alphaType() || 1227 const bool preserveLCDText = kOpaque_SkAlphaType == info.alphaType() ||
1217 (saveLayerFlags & kPreserveLCDText_SaveLaye rFlag); 1228 (saveLayerFlags & kPreserveLCDText_SaveLaye rFlag);
1218 const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage; 1229 const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage;
1219 const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(inf o, usage, geo, 1230 const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(inf o, usage, geo,
1220 pres erveLCDText, false); 1231 pres erveLCDText, false);
1221 SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint); 1232 SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint);
1222 if (nullptr == newDev) { 1233 if (nullptr == newDev) {
1223 // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't h andle the paint) 1234 // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't h andle the paint)
(...skipping 1740 matching lines...) Expand 10 before | Expand all | Expand 10 after
2964 } 2975 }
2965 2976
2966 if (matrix) { 2977 if (matrix) {
2967 canvas->concat(*matrix); 2978 canvas->concat(*matrix);
2968 } 2979 }
2969 } 2980 }
2970 2981
2971 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 2982 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
2972 fCanvas->restoreToCount(fSaveCount); 2983 fCanvas->restoreToCount(fSaveCount);
2973 } 2984 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698