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

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

Issue 99203011: Use GrTextureDomain in GrBicubicEffect to perform non-bleeding HQ filter drawBitmap. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: add initializer list for dummy rectangle to fix warnings 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 | « no previous file | 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/GrBicubicEffect.h"
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 case SkPaint::kLow_FilterLevel: 1189 case SkPaint::kLow_FilterLevel:
1190 tileFilterPad = 1; 1190 tileFilterPad = 1;
1191 textureFilterMode = GrTextureParams::kBilerp_FilterMode; 1191 textureFilterMode = GrTextureParams::kBilerp_FilterMode;
1192 break; 1192 break;
1193 case SkPaint::kMedium_FilterLevel: 1193 case SkPaint::kMedium_FilterLevel:
1194 tileFilterPad = 1; 1194 tileFilterPad = 1;
1195 textureFilterMode = GrTextureParams::kMipMap_FilterMode; 1195 textureFilterMode = GrTextureParams::kMipMap_FilterMode;
1196 break; 1196 break;
1197 case SkPaint::kHigh_FilterLevel: { 1197 case SkPaint::kHigh_FilterLevel: {
1198 // Minification can look bad with the bicubic effect. 1198 // Minification can look bad with the bicubic effect.
1199 if (fContext->getMatrix().getMinStretch() >= SK_Scalar1 && 1199 if (fContext->getMatrix().getMinStretch() >= SK_Scalar1) {
1200 (flags & SkCanvas::kBleed_DrawBitmapRectFlag)) {
1201 // We will install an effect that does the filtering in the shad er. 1200 // We will install an effect that does the filtering in the shad er.
1202 textureFilterMode = GrTextureParams::kNone_FilterMode; 1201 textureFilterMode = GrTextureParams::kNone_FilterMode;
1203 tileFilterPad = GrBicubicEffect::kFilterTexelPad; 1202 tileFilterPad = GrBicubicEffect::kFilterTexelPad;
1204 doBicubic = true; 1203 doBicubic = true;
1205 } else { 1204 } else {
1206 // We don't yet support doing bicubic filtering with an interior clamp. Fall back 1205 // We don't yet support doing bicubic filtering with an interior clamp. Fall back
1207 // to MIPs 1206 // to MIPs
1208 textureFilterMode = GrTextureParams::kMipMap_FilterMode; 1207 textureFilterMode = GrTextureParams::kMipMap_FilterMode;
1209 tileFilterPad = 1; 1208 tileFilterPad = 1;
1210 } 1209 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 SkIntToScalar(iTileR.fTop)); 1272 SkIntToScalar(iTileR.fTop));
1274 1273
1275 if (SkPaint::kNone_FilterLevel != paint.getFilterLevel() || bicubic) { 1274 if (SkPaint::kNone_FilterLevel != paint.getFilterLevel() || bicubic) {
1276 SkIRect iClampRect; 1275 SkIRect iClampRect;
1277 1276
1278 if (SkCanvas::kBleed_DrawBitmapRectFlag & flags) { 1277 if (SkCanvas::kBleed_DrawBitmapRectFlag & flags) {
1279 // In bleed mode we want to always expand the tile on all ed ges 1278 // In bleed mode we want to always expand the tile on all ed ges
1280 // but stay within the bitmap bounds 1279 // but stay within the bitmap bounds
1281 iClampRect = SkIRect::MakeWH(bitmap.width(), bitmap.height() ); 1280 iClampRect = SkIRect::MakeWH(bitmap.width(), bitmap.height() );
1282 } else { 1281 } else {
1283 SkASSERT(!bicubic); // Bicubic is not supported with non-ble ed yet.
1284
1285 // In texture-domain/clamp mode we only want to expand the 1282 // In texture-domain/clamp mode we only want to expand the
1286 // tile on edges interior to "srcRect" (i.e., we want to 1283 // tile on edges interior to "srcRect" (i.e., we want to
1287 // not bleed across the original clamped edges) 1284 // not bleed across the original clamped edges)
1288 srcRect.roundOut(&iClampRect); 1285 srcRect.roundOut(&iClampRect);
1289 } 1286 }
1290 int outset = bicubic ? GrBicubicEffect::kFilterTexelPad : 1; 1287 int outset = bicubic ? GrBicubicEffect::kFilterTexelPad : 1;
1291 clamped_outset_with_offset(&iTileR, outset, &offset, iClampRect) ; 1288 clamped_outset_with_offset(&iTileR, outset, &offset, iClampRect) ;
1292 } 1289 }
1293 1290
1294 if (bitmap.extractSubset(&tmpB, iTileR)) { 1291 if (bitmap.extractSubset(&tmpB, iTileR)) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 SkRect paintRect; 1369 SkRect paintRect;
1373 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); 1370 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width()));
1374 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height())); 1371 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height()));
1375 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), 1372 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv),
1376 SkScalarMul(srcRect.fTop, hInv), 1373 SkScalarMul(srcRect.fTop, hInv),
1377 SkScalarMul(srcRect.fRight, wInv), 1374 SkScalarMul(srcRect.fRight, wInv),
1378 SkScalarMul(srcRect.fBottom, hInv)); 1375 SkScalarMul(srcRect.fBottom, hInv));
1379 1376
1380 bool needsTextureDomain = false; 1377 bool needsTextureDomain = false;
1381 if (!(flags & SkCanvas::kBleed_DrawBitmapRectFlag) && 1378 if (!(flags & SkCanvas::kBleed_DrawBitmapRectFlag) &&
1382 params.filterMode() != GrTextureParams::kNone_FilterMode) { 1379 (bicubic || params.filterMode() != GrTextureParams::kNone_FilterMode)) {
1383 SkASSERT(!bicubic); 1380 // Need texture domain if drawing a sub rect
1384 // Need texture domain if drawing a sub rect.
1385 needsTextureDomain = srcRect.width() < bitmap.width() || 1381 needsTextureDomain = srcRect.width() < bitmap.width() ||
1386 srcRect.height() < bitmap.height(); 1382 srcRect.height() < bitmap.height();
1387 if (needsTextureDomain && fContext->getMatrix().rectStaysRect()) { 1383 if (!bicubic && needsTextureDomain && fContext->getMatrix().rectStaysRec t()) {
1388 const SkMatrix& matrix = fContext->getMatrix(); 1384 const SkMatrix& matrix = fContext->getMatrix();
1389 // sampling is axis-aligned 1385 // sampling is axis-aligned
1390 SkRect transformedRect; 1386 SkRect transformedRect;
1391 matrix.mapRect(&transformedRect, srcRect); 1387 matrix.mapRect(&transformedRect, srcRect);
1392 1388
1393 if (has_aligned_samples(srcRect, transformedRect)) { 1389 if (has_aligned_samples(srcRect, transformedRect)) {
1394 // We could also turn off filtering here (but we already did a c ache lookup with 1390 // We could also turn off filtering here (but we already did a c ache lookup with
1395 // params). 1391 // params).
1396 needsTextureDomain = false; 1392 needsTextureDomain = false;
1397 } else { 1393 } else {
(...skipping 15 matching lines...) Expand all
1413 left = right = SkScalarHalf(paintRect.left() + paintRect.right()); 1409 left = right = SkScalarHalf(paintRect.left() + paintRect.right());
1414 } 1410 }
1415 if (srcRect.height() > SK_Scalar1) { 1411 if (srcRect.height() > SK_Scalar1) {
1416 SkScalar border = SK_ScalarHalf / texture->height(); 1412 SkScalar border = SK_ScalarHalf / texture->height();
1417 top = paintRect.top() + border; 1413 top = paintRect.top() + border;
1418 bottom = paintRect.bottom() - border; 1414 bottom = paintRect.bottom() - border;
1419 } else { 1415 } else {
1420 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); 1416 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom());
1421 } 1417 }
1422 textureDomain.setLTRB(left, top, right, bottom); 1418 textureDomain.setLTRB(left, top, right, bottom);
1423 effect.reset(GrTextureDomainEffect::Create(texture, 1419 if (bicubic) {
1424 SkMatrix::I(), 1420 effect.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), texture Domain));
1425 textureDomain, 1421 } else {
1426 GrTextureDomain::kClamp_Mode, 1422 effect.reset(GrTextureDomainEffect::Create(texture,
1427 params.filterMode())); 1423 SkMatrix::I(),
1424 textureDomain,
1425 GrTextureDomain::kClamp_M ode,
1426 params.filterMode()));
1427 }
1428 } else if (bicubic) { 1428 } else if (bicubic) {
1429 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); 1429 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode());
1430 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil eModeY() }; 1430 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil eModeY() };
1431 effect.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), tileModes)) ; 1431 effect.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), tileModes)) ;
1432 } else { 1432 } else {
1433 effect.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), param s)); 1433 effect.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), param s));
1434 } 1434 }
1435 1435
1436 // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring 1436 // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring
1437 // the rest from the SkPaint. 1437 // the rest from the SkPaint.
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
1900 GrTexture* texture, 1900 GrTexture* texture,
1901 bool needClear) 1901 bool needClear)
1902 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { 1902 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) {
1903 1903
1904 SkASSERT(texture && texture->asRenderTarget()); 1904 SkASSERT(texture && texture->asRenderTarget());
1905 // This constructor is called from onCreateCompatibleDevice. It has locked t he RT in the texture 1905 // This constructor is called from onCreateCompatibleDevice. It has locked t he RT in the texture
1906 // cache. We pass true for the third argument so that it will get unlocked. 1906 // cache. We pass true for the third argument so that it will get unlocked.
1907 this->initFromRenderTarget(context, texture->asRenderTarget(), true); 1907 this->initFromRenderTarget(context, texture->asRenderTarget(), true);
1908 fNeedClear = needClear; 1908 fNeedClear = needClear;
1909 } 1909 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/effects/GrBicubicEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698