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

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

Issue 920513003: Make filters use SkImage instead of SkBitmap Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 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/effects/SkXfermodeImageFilter.h ('k') | src/core/SkDevice.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 "SkCanvas.h" 8 #include "SkCanvas.h"
9 #include "SkCanvasPriv.h" 9 #include "SkCanvasPriv.h"
10 #include "SkBitmapDevice.h" 10 #include "SkBitmapDevice.h"
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 } 1104 }
1105 1105
1106 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) 1106 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type)
1107 while (iter.next()) { 1107 while (iter.next()) {
1108 SkBaseDevice* dstDev = iter.fDevice; 1108 SkBaseDevice* dstDev = iter.fDevice;
1109 paint = &looper.paint(); 1109 paint = &looper.paint();
1110 SkImageFilter* filter = paint->getImageFilter(); 1110 SkImageFilter* filter = paint->getImageFilter();
1111 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; 1111 SkIPoint pos = { x - iter.getX(), y - iter.getY() };
1112 if (filter && !dstDev->canHandleImageFilter(filter)) { 1112 if (filter && !dstDev->canHandleImageFilter(filter)) {
1113 SkDeviceImageFilterProxy proxy(dstDev, fProps); 1113 SkDeviceImageFilterProxy proxy(dstDev, fProps);
1114 SkBitmap dst; 1114 SkAutoTUnref<const SkImage> dst;
1115 SkIPoint offset = SkIPoint::Make(0, 0); 1115 SkIPoint offset = SkIPoint::Make(0, 0);
1116 SkAutoTUnref<SkImage> src(srcDev->newImageSnapshot()); 1116 SkAutoTUnref<SkImage> src(srcDev->newImageSnapshot());
1117 SkMatrix matrix = *iter.fMatrix; 1117 SkMatrix matrix = *iter.fMatrix;
1118 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y() )); 1118 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y() ));
1119 SkIRect clipBounds = SkIRect::MakeWH(srcDev->width(), srcDev->height ()); 1119 SkIRect clipBounds = SkIRect::MakeWH(src->width(), src->height());
1120 SkAutoTUnref<SkImageFilter::Cache> cache(dstDev->getImageFilterCache ()); 1120 SkAutoTUnref<SkImageFilter::Cache> cache(dstDev->getImageFilterCache ());
1121 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); 1121 SkImageFilter::Context ctx(matrix, clipBounds, cache.get());
1122 SkBitmap srcBitmap; // TODO: remove once filters accept SkImage 1122 if (filter->filterImage(&proxy, src, ctx, dst, &offset)) {
1123 #if SK_SUPPORT_GPU 1123 SkPaint tmpUnfiltered(*paint);
1124 // TODO: Gpu devices need bitmap that came from gpu, not through 1124 tmpUnfiltered.setImageFilter(NULL);
1125 // getROPixels. Remove once filters accept SkImage. 1125 dstDev->drawImageAsSprite(iter, *dst, pos.x() + offset.x(), pos. y() + offset.y(),
1126 if (NULL != src->getTexture()) { 1126 tmpUnfiltered);
1127 SkImageFilter::WrapTexture(src->getTexture(), src->width(), src- >height(),
1128 &srcBitmap);
1129 } else
1130 #endif
1131 {
1132 as_IB(src)->getROPixels(&srcBitmap);
1133 }
1134 if (!srcBitmap.empty()) {
1135 if (filter->filterImage(&proxy, srcBitmap, ctx, &dst, &offset)) {
1136 SkPaint tmpUnfiltered(*paint);
1137 tmpUnfiltered.setImageFilter(NULL);
1138 dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + offset.y(),
1139 tmpUnfiltered);
1140 }
1141 } 1127 }
1142 } else { 1128 } else {
1143 dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint); 1129 dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint);
1144 } 1130 }
1145 } 1131 }
1146 LOOPER_END 1132 LOOPER_END
1147 } 1133 }
1148 1134
1149 void SkCanvas::onDrawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint* paint) { 1135 void SkCanvas::onDrawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint* paint) {
1150 if (gTreatSpriteAsBitmap) { 1136 if (gTreatSpriteAsBitmap) {
(...skipping 16 matching lines...) Expand all
1167 } 1153 }
1168 1154
1169 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) 1155 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type)
1170 1156
1171 while (iter.next()) { 1157 while (iter.next()) {
1172 paint = &looper.paint(); 1158 paint = &looper.paint();
1173 SkImageFilter* filter = paint->getImageFilter(); 1159 SkImageFilter* filter = paint->getImageFilter();
1174 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; 1160 SkIPoint pos = { x - iter.getX(), y - iter.getY() };
1175 if (filter && !iter.fDevice->canHandleImageFilter(filter)) { 1161 if (filter && !iter.fDevice->canHandleImageFilter(filter)) {
1176 SkDeviceImageFilterProxy proxy(iter.fDevice, fProps); 1162 SkDeviceImageFilterProxy proxy(iter.fDevice, fProps);
1177 SkBitmap dst; 1163 SkAutoTUnref<SkImage> src(SkNewImageFromBitmap(bitmap, NULL));
1164 SkAutoTUnref<const SkImage> dst;
1178 SkIPoint offset = SkIPoint::Make(0, 0); 1165 SkIPoint offset = SkIPoint::Make(0, 0);
1179 SkMatrix matrix = *iter.fMatrix; 1166 SkMatrix matrix = *iter.fMatrix;
1180 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y() )); 1167 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y() ));
1181 const SkIRect clipBounds = bitmap.bounds(); 1168 const SkIRect clipBounds = bitmap.bounds();
1182 SkAutoTUnref<SkImageFilter::Cache> cache(iter.fDevice->getImageFilte rCache()); 1169 SkAutoTUnref<SkImageFilter::Cache> cache(iter.fDevice->getImageFilte rCache());
1183 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); 1170 SkImageFilter::Context ctx(matrix, clipBounds, cache.get());
1184 if (filter->filterImage(&proxy, bitmap, ctx, &dst, &offset)) { 1171 if (filter->filterImage(&proxy, src, ctx, dst, &offset)) {
1185 SkPaint tmpUnfiltered(*paint); 1172 SkPaint tmpUnfiltered(*paint);
1186 tmpUnfiltered.setImageFilter(NULL); 1173 tmpUnfiltered.setImageFilter(NULL);
1187 iter.fDevice->drawSprite(iter, dst, pos.x() + offset.x(), pos.y( ) + offset.y(), 1174 iter.fDevice->drawImageAsSprite(iter, *dst, pos.x() + offset.x() ,
1188 tmpUnfiltered); 1175 pos.y() + offset.y(), tmpUnfilte red);
1189 } 1176 }
1190 } else { 1177 } else {
1191 iter.fDevice->drawSprite(iter, bitmap, pos.x(), pos.y(), *paint); 1178 iter.fDevice->drawSprite(iter, bitmap, pos.x(), pos.y(), *paint);
1192 } 1179 }
1193 } 1180 }
1194 LOOPER_END 1181 LOOPER_END
1195 } 1182 }
1196 1183
1197 void SkCanvas::onDrawImageAsSprite(const SkImage& image, int x, int y, const SkP aint* paint) { 1184 void SkCanvas::onDrawImageAsSprite(const SkImage& image, int x, int y, const SkP aint* paint) {
1198 if (gTreatSpriteAsBitmap) { 1185 if (gTreatSpriteAsBitmap) {
1199 this->save(); 1186 this->save();
1200 this->resetMatrix(); 1187 this->resetMatrix();
1201 this->drawImage(&image, SkIntToScalar(x), SkIntToScalar(y), paint); 1188 this->drawImage(&image, SkIntToScalar(x), SkIntToScalar(y), paint);
1202 this->restore(); 1189 this->restore();
1203 return; 1190 return;
1204 } 1191 }
1205 1192
1206 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageAsSprite()"); 1193 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageAsSprite()");
1207 1194
1208 SkBitmap src;
1209 if (!as_IB(&image)->getROPixels(&src)) {
1210 return;
1211 }
1212
1213 SkPaint tmp; 1195 SkPaint tmp;
1214 if (NULL == paint) { 1196 if (NULL == paint) {
1215 paint = &tmp; 1197 paint = &tmp;
1216 } 1198 }
1217 1199
1218 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kImage_Type) 1200 LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kImage_Type)
1219 1201
1220 while (iter.next()) { 1202 while (iter.next()) {
1221 paint = &looper.paint(); 1203 paint = &looper.paint();
1222 SkImageFilter* filter = paint->getImageFilter(); 1204 SkImageFilter* filter = paint->getImageFilter();
1223 SkIPoint pos = { x - iter.getX(), y - iter.getY() }; 1205 SkIPoint pos = { x - iter.getX(), y - iter.getY() };
1224 if (filter && !iter.fDevice->canHandleImageFilter(filter)) { 1206 if (filter && !iter.fDevice->canHandleImageFilter(filter)) {
1225 SkDeviceImageFilterProxy proxy(iter.fDevice, fProps); 1207 SkDeviceImageFilterProxy proxy(iter.fDevice, fProps);
1226 SkBitmap dst; 1208 SkAutoTUnref<const SkImage> dst;
1227 SkIPoint offset = SkIPoint::Make(0, 0); 1209 SkIPoint offset = SkIPoint::Make(0, 0);
1228 SkMatrix matrix = *iter.fMatrix; 1210 SkMatrix matrix = *iter.fMatrix;
1229 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y() )); 1211 matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y() ));
1230 const SkIRect clipBounds = SkIRect::MakeWH(image.width(), image.heig ht()); 1212 const SkIRect clipBounds = SkIRect::MakeWH(image.width(), image.heig ht());
1231 SkAutoTUnref<SkImageFilter::Cache> cache(iter.fDevice->getImageFilte rCache()); 1213 SkAutoTUnref<SkImageFilter::Cache> cache(iter.fDevice->getImageFilte rCache());
1232 SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); 1214 SkImageFilter::Context ctx(matrix, clipBounds, cache.get());
1233 if (filter->filterImage(&proxy, src, ctx, &dst, &offset)) { 1215 if (filter->filterImage(&proxy, &image, ctx, dst, &offset)) {
1234 SkPaint tmpUnfiltered(*paint); 1216 SkPaint tmpUnfiltered(*paint);
1235 tmpUnfiltered.setImageFilter(NULL); 1217 tmpUnfiltered.setImageFilter(NULL);
1236 SkAutoTUnref<SkImage> dstImage(SkNewImageFromBitmap(dst, NULL)); 1218 iter.fDevice->drawImageAsSprite(iter, *dst, pos.x() + offset.x() ,
1237 iter.fDevice->drawImageAsSprite(iter, *dstImage, pos.x() + offse t.x(),
1238 pos.y() + offset.y(), tmpUnfilte red); 1219 pos.y() + offset.y(), tmpUnfilte red);
1239 } 1220 }
1240 } else { 1221 } else {
1241 iter.fDevice->drawImageAsSprite(iter, image, pos.x(), pos.y(), *pain t); 1222 iter.fDevice->drawImageAsSprite(iter, image, pos.x(), pos.y(), *pain t);
1242 } 1223 }
1243 } 1224 }
1244 LOOPER_END 1225 LOOPER_END
1245 } 1226 }
1246 1227
1247 ///////////////////////////////////////////////////////////////////////////// 1228 /////////////////////////////////////////////////////////////////////////////
(...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after
2624 } 2605 }
2625 2606
2626 if (matrix) { 2607 if (matrix) {
2627 canvas->concat(*matrix); 2608 canvas->concat(*matrix);
2628 } 2609 }
2629 } 2610 }
2630 2611
2631 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 2612 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
2632 fCanvas->restoreToCount(fSaveCount); 2613 fCanvas->restoreToCount(fSaveCount);
2633 } 2614 }
OLDNEW
« no previous file with comments | « include/effects/SkXfermodeImageFilter.h ('k') | src/core/SkDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698