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

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 83153006: HQ filtering for tiled/bleed drawBitmap (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: fix build warning for case where filter mode is unrecognized. Created 7 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 | Annotate | Revision Log
« no previous file with comments | « include/gpu/SkGpuDevice.h ('k') | src/gpu/effects/GrBicubicEffect.h » ('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 2011 Google Inc. 2 * Copyright 2011 Google Inc.
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 "SkGpuDevice.h" 8 #include "SkGpuDevice.h"
9 9
10 #include "effects/GrBicubicEffect.h"
10 #include "effects/GrTextureDomainEffect.h" 11 #include "effects/GrTextureDomainEffect.h"
11 #include "effects/GrSimpleTextureEffect.h" 12 #include "effects/GrSimpleTextureEffect.h"
12 13
13 #include "GrContext.h" 14 #include "GrContext.h"
14 #include "GrBitmapTextContext.h" 15 #include "GrBitmapTextContext.h"
15 #if SK_DISTANCEFIELD_FONTS 16 #if SK_DISTANCEFIELD_FONTS
16 #include "GrDistanceFieldTextContext.h" 17 #include "GrDistanceFieldTextContext.h"
17 #endif 18 #endif
18 19
19 #include "SkGrTexturePixelRef.h" 20 #include "SkGrTexturePixelRef.h"
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 1051
1051 void SkGpuDevice::drawBitmap(const SkDraw& draw, 1052 void SkGpuDevice::drawBitmap(const SkDraw& draw,
1052 const SkBitmap& bitmap, 1053 const SkBitmap& bitmap,
1053 const SkMatrix& m, 1054 const SkMatrix& m,
1054 const SkPaint& paint) { 1055 const SkPaint& paint) {
1055 // We cannot call drawBitmapRect here since 'm' could be anything 1056 // We cannot call drawBitmapRect here since 'm' could be anything
1056 this->drawBitmapCommon(draw, bitmap, NULL, m, paint, 1057 this->drawBitmapCommon(draw, bitmap, NULL, m, paint,
1057 SkCanvas::kNone_DrawBitmapRectFlag); 1058 SkCanvas::kNone_DrawBitmapRectFlag);
1058 } 1059 }
1059 1060
1060 // This method outsets 'iRect' by 1 all around and then clamps its extents to 1061 // This method outsets 'iRect' by 'outset' all around and then clamps its extent s to
1061 // 'clamp'. 'offset' is adjusted to remain positioned over the top-left corner 1062 // 'clamp'. 'offset' is adjusted to remain positioned over the top-left corner
1062 // of 'iRect' for all possible outsets/clamps. 1063 // of 'iRect' for all possible outsets/clamps.
1063 static inline void clamped_unit_outset_with_offset(SkIRect* iRect, SkPoint* offs et, 1064 static inline void clamped_outset_with_offset(SkIRect* iRect,
1064 const SkIRect& clamp) { 1065 int outset,
1065 iRect->outset(1, 1); 1066 SkPoint* offset,
1067 const SkIRect& clamp) {
1068 iRect->outset(outset, outset);
1066 1069
1067 if (iRect->fLeft < clamp.fLeft) { 1070 int leftClampDelta = clamp.fLeft - iRect->fLeft;
1071 if (leftClampDelta > 0) {
1072 offset->fX -= outset - leftClampDelta;
1068 iRect->fLeft = clamp.fLeft; 1073 iRect->fLeft = clamp.fLeft;
1069 } else { 1074 } else {
1070 offset->fX -= SK_Scalar1; 1075 offset->fX -= outset;
1071 } 1076 }
1072 if (iRect->fTop < clamp.fTop) { 1077
1078 int topClampDelta = clamp.fTop - iRect->fTop;
1079 if (topClampDelta > 0) {
1080 offset->fY -= outset - topClampDelta;
1073 iRect->fTop = clamp.fTop; 1081 iRect->fTop = clamp.fTop;
1074 } else { 1082 } else {
1075 offset->fY -= SK_Scalar1; 1083 offset->fY -= outset;
1076 } 1084 }
1077 1085
1078 if (iRect->fRight > clamp.fRight) { 1086 if (iRect->fRight > clamp.fRight) {
1079 iRect->fRight = clamp.fRight; 1087 iRect->fRight = clamp.fRight;
1080 } 1088 }
1081 if (iRect->fBottom > clamp.fBottom) { 1089 if (iRect->fBottom > clamp.fBottom) {
1082 iRect->fBottom = clamp.fBottom; 1090 iRect->fBottom = clamp.fBottom;
1083 } 1091 }
1084 } 1092 }
1085 1093
1086 void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, 1094 void SkGpuDevice::drawBitmapCommon(const SkDraw& draw,
1087 const SkBitmap& bitmap, 1095 const SkBitmap& bitmap,
1088 const SkRect* srcRectPtr, 1096 const SkRect* srcRectPtr,
1089 const SkMatrix& m, 1097 const SkMatrix& m,
1090 const SkPaint& paint, 1098 const SkPaint& paint,
1091 SkCanvas::DrawBitmapRectFlags flags) { 1099 SkCanvas::DrawBitmapRectFlags flags) {
1092 CHECK_SHOULD_DRAW(draw, false); 1100 CHECK_SHOULD_DRAW(draw, false);
1093 1101
1094 SkRect srcRect; 1102 SkRect srcRect;
1103 // If there is no src rect, or the src rect contains the entire bitmap then we're effectively
1104 // in the (easier) bleed case, so update flags.
1095 if (NULL == srcRectPtr) { 1105 if (NULL == srcRectPtr) {
1096 srcRect.set(0, 0, SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.he ight())); 1106 srcRect.set(0, 0, SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.he ight()));
1107 flags = (SkCanvas::DrawBitmapRectFlags) (flags | SkCanvas::kBleed_DrawBi tmapRectFlag);
1097 } else { 1108 } else {
1098 srcRect = *srcRectPtr; 1109 srcRect = *srcRectPtr;
1110 if (srcRect.fLeft <= 0 && srcRect.fTop <= 0 &&
1111 srcRect.fRight >= bitmap.width() && srcRect.fBottom >= bitmap.height ()) {
1112 flags = (SkCanvas::DrawBitmapRectFlags) (flags | SkCanvas::kBleed_Dr awBitmapRectFlag);
1113 }
1099 } 1114 }
1100 1115
1101 if (paint.getMaskFilter()){ 1116 if (paint.getMaskFilter()){
1102 // Convert the bitmap to a shader so that the rect can be drawn 1117 // Convert the bitmap to a shader so that the rect can be drawn
1103 // through drawRect, which supports mask filters. 1118 // through drawRect, which supports mask filters.
1104 SkMatrix newM(m); 1119 SkMatrix newM(m);
1105 SkBitmap tmp; // subset of bitmap, if necessary 1120 SkBitmap tmp; // subset of bitmap, if necessary
1106 const SkBitmap* bitmapPtr = &bitmap; 1121 const SkBitmap* bitmapPtr = &bitmap;
1107 if (NULL != srcRectPtr) { 1122 if (NULL != srcRectPtr) {
1108 // In bleed mode we position and trim the bitmap based on the src re ct which is 1123 // In bleed mode we position and trim the bitmap based on the src re ct which is
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 this->drawRect(transformedDraw, srcRect, paintWithTexture); 1156 this->drawRect(transformedDraw, srcRect, paintWithTexture);
1142 1157
1143 return; 1158 return;
1144 } 1159 }
1145 1160
1146 fContext->concatMatrix(m); 1161 fContext->concatMatrix(m);
1147 1162
1148 GrTextureParams params; 1163 GrTextureParams params;
1149 SkPaint::FilterLevel paintFilterLevel = paint.getFilterLevel(); 1164 SkPaint::FilterLevel paintFilterLevel = paint.getFilterLevel();
1150 GrTextureParams::FilterMode textureFilterMode; 1165 GrTextureParams::FilterMode textureFilterMode;
1166
1167 int tileFilterPad;
1168 bool doBicubic = false;
1169
1151 switch(paintFilterLevel) { 1170 switch(paintFilterLevel) {
1152 case SkPaint::kNone_FilterLevel: 1171 case SkPaint::kNone_FilterLevel:
1172 tileFilterPad = 0;
1153 textureFilterMode = GrTextureParams::kNone_FilterMode; 1173 textureFilterMode = GrTextureParams::kNone_FilterMode;
1154 break; 1174 break;
1155 case SkPaint::kLow_FilterLevel: 1175 case SkPaint::kLow_FilterLevel:
1176 tileFilterPad = 1;
1156 textureFilterMode = GrTextureParams::kBilerp_FilterMode; 1177 textureFilterMode = GrTextureParams::kBilerp_FilterMode;
1157 break; 1178 break;
1158 case SkPaint::kMedium_FilterLevel: 1179 case SkPaint::kMedium_FilterLevel:
1180 tileFilterPad = 1;
1159 textureFilterMode = GrTextureParams::kMipMap_FilterMode; 1181 textureFilterMode = GrTextureParams::kMipMap_FilterMode;
1160 break; 1182 break;
1161 case SkPaint::kHigh_FilterLevel: 1183 case SkPaint::kHigh_FilterLevel:
1162 // Fall back to mips for now 1184 if (flags & SkCanvas::kBleed_DrawBitmapRectFlag) {
1163 textureFilterMode = GrTextureParams::kMipMap_FilterMode; 1185 // We will install an effect that does the filtering in the shad er.
1186 textureFilterMode = GrTextureParams::kNone_FilterMode;
1187 tileFilterPad = GrBicubicEffect::kFilterTexelPad;
1188 doBicubic = true;
1189 } else {
1190 // We don't yet support doing bicubic filtering with an interior clamp. Fall back
1191 // to MIPs
1192 textureFilterMode = GrTextureParams::kMipMap_FilterMode;
1193 tileFilterPad = 1;
1194 }
1164 break; 1195 break;
1165 default: 1196 default:
1166 SkErrorInternals::SetError( kInvalidPaint_SkError, 1197 SkErrorInternals::SetError( kInvalidPaint_SkError,
1167 "Sorry, I don't understand the filtering " 1198 "Sorry, I don't understand the filtering "
1168 "mode you asked for. Falling back to " 1199 "mode you asked for. Falling back to "
1169 "MIPMaps."); 1200 "MIPMaps.");
1201 tileFilterPad = 1;
1170 textureFilterMode = GrTextureParams::kMipMap_FilterMode; 1202 textureFilterMode = GrTextureParams::kMipMap_FilterMode;
1171 break; 1203 break;
1172
1173 } 1204 }
1174 1205
1175 params.setFilterMode(textureFilterMode); 1206 params.setFilterMode(textureFilterMode);
1176 1207
1177 int maxTileSize = fContext->getMaxTextureSize(); 1208 int maxTileSize = fContext->getMaxTextureSize() - 2 * tileFilterPad;
1178 if (SkPaint::kNone_FilterLevel != paint.getFilterLevel()) {
1179 // We may need a skosh more room if we have to bump out the tile
1180 // by 1 pixel all around
1181 maxTileSize -= 2;
1182 }
1183 int tileSize; 1209 int tileSize;
1184 1210
1185 SkIRect clippedSrcRect; 1211 SkIRect clippedSrcRect;
1186 if (this->shouldTileBitmap(bitmap, params, srcRectPtr, maxTileSize, &tileSiz e, 1212 if (this->shouldTileBitmap(bitmap, params, srcRectPtr, maxTileSize, &tileSiz e,
1187 &clippedSrcRect)) { 1213 &clippedSrcRect)) {
1188 this->drawTiledBitmap(bitmap, srcRect, clippedSrcRect, params, paint, fl ags, tileSize); 1214 this->drawTiledBitmap(bitmap, srcRect, clippedSrcRect, params, paint, fl ags, tileSize,
1215 doBicubic);
1189 } else { 1216 } else {
1190 // take the simple case 1217 // take the simple case
1191 this->internalDrawBitmap(bitmap, srcRect, params, paint, flags); 1218 this->internalDrawBitmap(bitmap, srcRect, params, paint, flags, doBicubi c);
1192 } 1219 }
1193 } 1220 }
1194 1221
1195 // Break 'bitmap' into several tiles to draw it since it has already 1222 // Break 'bitmap' into several tiles to draw it since it has already
1196 // been determined to be too large to fit in VRAM 1223 // been determined to be too large to fit in VRAM
1197 void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, 1224 void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap,
1198 const SkRect& srcRect, 1225 const SkRect& srcRect,
1199 const SkIRect& clippedSrcIRect, 1226 const SkIRect& clippedSrcIRect,
1200 const GrTextureParams& params, 1227 const GrTextureParams& params,
1201 const SkPaint& paint, 1228 const SkPaint& paint,
1202 SkCanvas::DrawBitmapRectFlags flags, 1229 SkCanvas::DrawBitmapRectFlags flags,
1203 int tileSize) { 1230 int tileSize,
1231 bool bicubic) {
1204 SkRect clippedSrcRect = SkRect::Make(clippedSrcIRect); 1232 SkRect clippedSrcRect = SkRect::Make(clippedSrcIRect);
1205 1233
1206 int nx = bitmap.width() / tileSize; 1234 int nx = bitmap.width() / tileSize;
1207 int ny = bitmap.height() / tileSize; 1235 int ny = bitmap.height() / tileSize;
1208 for (int x = 0; x <= nx; x++) { 1236 for (int x = 0; x <= nx; x++) {
1209 for (int y = 0; y <= ny; y++) { 1237 for (int y = 0; y <= ny; y++) {
1210 SkRect tileR; 1238 SkRect tileR;
1211 tileR.set(SkIntToScalar(x * tileSize), 1239 tileR.set(SkIntToScalar(x * tileSize),
1212 SkIntToScalar(y * tileSize), 1240 SkIntToScalar(y * tileSize),
1213 SkIntToScalar((x + 1) * tileSize), 1241 SkIntToScalar((x + 1) * tileSize),
1214 SkIntToScalar((y + 1) * tileSize)); 1242 SkIntToScalar((y + 1) * tileSize));
1215 1243
1216 if (!SkRect::Intersects(tileR, clippedSrcRect)) { 1244 if (!SkRect::Intersects(tileR, clippedSrcRect)) {
1217 continue; 1245 continue;
1218 } 1246 }
1219 1247
1220 if (!tileR.intersect(srcRect)) { 1248 if (!tileR.intersect(srcRect)) {
1221 continue; 1249 continue;
1222 } 1250 }
1223 1251
1224 SkBitmap tmpB; 1252 SkBitmap tmpB;
1225 SkIRect iTileR; 1253 SkIRect iTileR;
1226 tileR.roundOut(&iTileR); 1254 tileR.roundOut(&iTileR);
1227 SkPoint offset = SkPoint::Make(SkIntToScalar(iTileR.fLeft), 1255 SkPoint offset = SkPoint::Make(SkIntToScalar(iTileR.fLeft),
1228 SkIntToScalar(iTileR.fTop)); 1256 SkIntToScalar(iTileR.fTop));
1229 1257
1230 if (SkPaint::kNone_FilterLevel != paint.getFilterLevel()) { 1258 if (SkPaint::kNone_FilterLevel != paint.getFilterLevel() || bicubic) {
1231 SkIRect iClampRect; 1259 SkIRect iClampRect;
1232 1260
1233 if (SkCanvas::kBleed_DrawBitmapRectFlag & flags) { 1261 if (SkCanvas::kBleed_DrawBitmapRectFlag & flags) {
1234 // In bleed mode we want to always expand the tile on all ed ges 1262 // In bleed mode we want to always expand the tile on all ed ges
1235 // but stay within the bitmap bounds 1263 // but stay within the bitmap bounds
1236 iClampRect = SkIRect::MakeWH(bitmap.width(), bitmap.height() ); 1264 iClampRect = SkIRect::MakeWH(bitmap.width(), bitmap.height() );
1237 } else { 1265 } else {
1266 SkASSERT(!bicubic); // Bicubic is not supported with non-ble ed yet.
1267
1238 // In texture-domain/clamp mode we only want to expand the 1268 // In texture-domain/clamp mode we only want to expand the
1239 // tile on edges interior to "srcRect" (i.e., we want to 1269 // tile on edges interior to "srcRect" (i.e., we want to
1240 // not bleed across the original clamped edges) 1270 // not bleed across the original clamped edges)
1241 srcRect.roundOut(&iClampRect); 1271 srcRect.roundOut(&iClampRect);
1242 } 1272 }
1243 1273 int outset = bicubic ? GrBicubicEffect::kFilterTexelPad : 1;
1244 clamped_unit_outset_with_offset(&iTileR, &offset, iClampRect); 1274 clamped_outset_with_offset(&iTileR, outset, &offset, iClampRect) ;
1245 } 1275 }
1246 1276
1247 if (bitmap.extractSubset(&tmpB, iTileR)) { 1277 if (bitmap.extractSubset(&tmpB, iTileR)) {
1248 // now offset it to make it "local" to our tmp bitmap 1278 // now offset it to make it "local" to our tmp bitmap
1249 tileR.offset(-offset.fX, -offset.fY); 1279 tileR.offset(-offset.fX, -offset.fY);
1250 SkMatrix tmpM; 1280 SkMatrix tmpM;
1251 tmpM.setTranslate(offset.fX, offset.fY); 1281 tmpM.setTranslate(offset.fX, offset.fY);
1252 GrContext::AutoMatrix am; 1282 GrContext::AutoMatrix am;
1253 am.setPreConcat(fContext, tmpM); 1283 am.setPreConcat(fContext, tmpM);
1254 this->internalDrawBitmap(tmpB, tileR, params, paint, flags); 1284 this->internalDrawBitmap(tmpB, tileR, params, paint, flags, bicu bic);
1255 } 1285 }
1256 } 1286 }
1257 } 1287 }
1258 } 1288 }
1259 1289
1260 static bool has_aligned_samples(const SkRect& srcRect, 1290 static bool has_aligned_samples(const SkRect& srcRect,
1261 const SkRect& transformedRect) { 1291 const SkRect& transformedRect) {
1262 // detect pixel disalignment 1292 // detect pixel disalignment
1263 if (SkScalarAbs(SkScalarRoundToScalar(transformedRect.left()) - 1293 if (SkScalarAbs(SkScalarRoundToScalar(transformedRect.left()) -
1264 transformedRect.left()) < COLOR_BLEED_TOLERANCE && 1294 transformedRect.left()) < COLOR_BLEED_TOLERANCE &&
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 * This is called by drawBitmap(), which has to handle images that may be too 1333 * This is called by drawBitmap(), which has to handle images that may be too
1304 * large to be represented by a single texture. 1334 * large to be represented by a single texture.
1305 * 1335 *
1306 * internalDrawBitmap assumes that the specified bitmap will fit in a texture 1336 * internalDrawBitmap assumes that the specified bitmap will fit in a texture
1307 * and that non-texture portion of the GrPaint has already been setup. 1337 * and that non-texture portion of the GrPaint has already been setup.
1308 */ 1338 */
1309 void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, 1339 void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap,
1310 const SkRect& srcRect, 1340 const SkRect& srcRect,
1311 const GrTextureParams& params, 1341 const GrTextureParams& params,
1312 const SkPaint& paint, 1342 const SkPaint& paint,
1313 SkCanvas::DrawBitmapRectFlags flags) { 1343 SkCanvas::DrawBitmapRectFlags flags,
1344 bool bicubic) {
1314 SkASSERT(bitmap.width() <= fContext->getMaxTextureSize() && 1345 SkASSERT(bitmap.width() <= fContext->getMaxTextureSize() &&
1315 bitmap.height() <= fContext->getMaxTextureSize()); 1346 bitmap.height() <= fContext->getMaxTextureSize());
1316 1347
1317 GrTexture* texture; 1348 GrTexture* texture;
1318 SkAutoCachedTexture act(this, bitmap, &params, &texture); 1349 SkAutoCachedTexture act(this, bitmap, &params, &texture);
1319 if (NULL == texture) { 1350 if (NULL == texture) {
1320 return; 1351 return;
1321 } 1352 }
1322 1353
1323 SkRect dstRect(srcRect); 1354 SkRect dstRect(srcRect);
1324 SkRect paintRect; 1355 SkRect paintRect;
1325 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); 1356 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width()));
1326 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height())); 1357 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height()));
1327 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), 1358 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv),
1328 SkScalarMul(srcRect.fTop, hInv), 1359 SkScalarMul(srcRect.fTop, hInv),
1329 SkScalarMul(srcRect.fRight, wInv), 1360 SkScalarMul(srcRect.fRight, wInv),
1330 SkScalarMul(srcRect.fBottom, hInv)); 1361 SkScalarMul(srcRect.fBottom, hInv));
1331 1362
1332 bool needsTextureDomain = false; 1363 bool needsTextureDomain = false;
1333 if (!(flags & SkCanvas::kBleed_DrawBitmapRectFlag) && 1364 if (!(flags & SkCanvas::kBleed_DrawBitmapRectFlag) &&
1334 params.filterMode() != GrTextureParams::kNone_FilterMode) { 1365 params.filterMode() != GrTextureParams::kNone_FilterMode) {
1366 SkASSERT(!bicubic);
1335 // Need texture domain if drawing a sub rect. 1367 // Need texture domain if drawing a sub rect.
1336 needsTextureDomain = srcRect.width() < bitmap.width() || 1368 needsTextureDomain = srcRect.width() < bitmap.width() ||
1337 srcRect.height() < bitmap.height(); 1369 srcRect.height() < bitmap.height();
1338 if (needsTextureDomain && fContext->getMatrix().rectStaysRect()) { 1370 if (needsTextureDomain && fContext->getMatrix().rectStaysRect()) {
1339 const SkMatrix& matrix = fContext->getMatrix(); 1371 const SkMatrix& matrix = fContext->getMatrix();
1340 // sampling is axis-aligned 1372 // sampling is axis-aligned
1341 SkRect transformedRect; 1373 SkRect transformedRect;
1342 matrix.mapRect(&transformedRect, srcRect); 1374 matrix.mapRect(&transformedRect, srcRect);
1343 1375
1344 if (has_aligned_samples(srcRect, transformedRect)) { 1376 if (has_aligned_samples(srcRect, transformedRect)) {
(...skipping 24 matching lines...) Expand all
1369 bottom = paintRect.bottom() - border; 1401 bottom = paintRect.bottom() - border;
1370 } else { 1402 } else {
1371 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); 1403 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom());
1372 } 1404 }
1373 textureDomain.setLTRB(left, top, right, bottom); 1405 textureDomain.setLTRB(left, top, right, bottom);
1374 effect.reset(GrTextureDomainEffect::Create(texture, 1406 effect.reset(GrTextureDomainEffect::Create(texture,
1375 SkMatrix::I(), 1407 SkMatrix::I(),
1376 textureDomain, 1408 textureDomain,
1377 GrTextureDomainEffect::kClamp _WrapMode, 1409 GrTextureDomainEffect::kClamp _WrapMode,
1378 params.filterMode())); 1410 params.filterMode()));
1411 } else if (bicubic) {
1412 effect.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), params));
1379 } else { 1413 } else {
1380 effect.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), param s)); 1414 effect.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), param s));
1381 } 1415 }
1382 1416
1383 // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring 1417 // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring
1384 // the rest from the SkPaint. 1418 // the rest from the SkPaint.
1385 GrPaint grPaint; 1419 GrPaint grPaint;
1386 grPaint.addColorEffect(effect); 1420 grPaint.addColorEffect(effect);
1387 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); 1421 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config());
1388 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { 1422 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) {
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 GrTexture* texture, 1881 GrTexture* texture,
1848 bool needClear) 1882 bool needClear)
1849 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { 1883 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) {
1850 1884
1851 SkASSERT(texture && texture->asRenderTarget()); 1885 SkASSERT(texture && texture->asRenderTarget());
1852 // This constructor is called from onCreateCompatibleDevice. It has locked t he RT in the texture 1886 // This constructor is called from onCreateCompatibleDevice. It has locked t he RT in the texture
1853 // cache. We pass true for the third argument so that it will get unlocked. 1887 // cache. We pass true for the third argument so that it will get unlocked.
1854 this->initFromRenderTarget(context, texture->asRenderTarget(), true); 1888 this->initFromRenderTarget(context, texture->asRenderTarget(), true);
1855 fNeedClear = needClear; 1889 fNeedClear = needClear;
1856 } 1890 }
OLDNEW
« no previous file with comments | « include/gpu/SkGpuDevice.h ('k') | src/gpu/effects/GrBicubicEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698