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

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

Issue 1399763002: Fix gpu drawBitmap to work when BM is A8 and we have a shader (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 2 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 | « no previous file | no next file » | 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 "GrBlurUtils.h" 10 #include "GrBlurUtils.h"
(...skipping 1283 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 1294
1295 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() }; 1295 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() };
1296 SkRect paintRect; 1296 SkRect paintRect;
1297 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); 1297 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width()));
1298 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height())); 1298 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height()));
1299 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), 1299 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv),
1300 SkScalarMul(srcRect.fTop, hInv), 1300 SkScalarMul(srcRect.fTop, hInv),
1301 SkScalarMul(srcRect.fRight, wInv), 1301 SkScalarMul(srcRect.fRight, wInv),
1302 SkScalarMul(srcRect.fBottom, hInv)); 1302 SkScalarMul(srcRect.fBottom, hInv));
1303 1303
1304 SkMatrix texMatrix;
1305 texMatrix.reset();
1306 if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) {
bsalomon 2015/10/09 17:07:09 Could use a comment here
egdaniel 2015/10/09 17:20:26 Done.
1307 texMatrix.setScale(wInv, hInv);
1308 }
1309
1304 SkRect textureDomain = SkRect::MakeEmpty(); 1310 SkRect textureDomain = SkRect::MakeEmpty();
1305 1311
1306 // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring 1312 // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring
1307 // the rest from the SkPaint. 1313 // the rest from the SkPaint.
1308 GrPaint grPaint; 1314 GrPaint grPaint;
1309 SkAutoTUnref<const GrFragmentProcessor> fp; 1315 SkAutoTUnref<const GrFragmentProcessor> fp;
1310 1316
1311 if (needsTextureDomain && (SkCanvas::kStrict_SrcRectConstraint == constraint )) { 1317 if (needsTextureDomain && (SkCanvas::kStrict_SrcRectConstraint == constraint )) {
1312 // Use a constrained texture domain to avoid color bleeding 1318 // Use a constrained texture domain to avoid color bleeding
1313 SkScalar left, top, right, bottom; 1319 SkScalar left, top, right, bottom;
1314 if (srcRect.width() > SK_Scalar1) { 1320 if (srcRect.width() > SK_Scalar1) {
1315 SkScalar border = SK_ScalarHalf / texture->width(); 1321 SkScalar border = SK_ScalarHalf / texture->width();
1316 left = paintRect.left() + border; 1322 left = paintRect.left() + border;
1317 right = paintRect.right() - border; 1323 right = paintRect.right() - border;
1318 } else { 1324 } else {
1319 left = right = SkScalarHalf(paintRect.left() + paintRect.right()); 1325 left = right = SkScalarHalf(paintRect.left() + paintRect.right());
1320 } 1326 }
1321 if (srcRect.height() > SK_Scalar1) { 1327 if (srcRect.height() > SK_Scalar1) {
1322 SkScalar border = SK_ScalarHalf / texture->height(); 1328 SkScalar border = SK_ScalarHalf / texture->height();
1323 top = paintRect.top() + border; 1329 top = paintRect.top() + border;
1324 bottom = paintRect.bottom() - border; 1330 bottom = paintRect.bottom() - border;
1325 } else { 1331 } else {
1326 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); 1332 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom());
1327 } 1333 }
1328 textureDomain.setLTRB(left, top, right, bottom); 1334 textureDomain.setLTRB(left, top, right, bottom);
1329 if (bicubic) { 1335 if (bicubic) {
1330 fp.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), textureDoma in)); 1336 fp.reset(GrBicubicEffect::Create(texture, texMatrix, textureDomain)) ;
1331 } else { 1337 } else {
1332 fp.reset(GrTextureDomainEffect::Create(texture, 1338 fp.reset(GrTextureDomainEffect::Create(texture,
1333 SkMatrix::I(), 1339 texMatrix,
1334 textureDomain, 1340 textureDomain,
1335 GrTextureDomain::kClamp_Mode, 1341 GrTextureDomain::kClamp_Mode,
1336 params.filterMode())); 1342 params.filterMode()));
1337 } 1343 }
1338 } else if (bicubic) { 1344 } else if (bicubic) {
1339 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); 1345 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode());
1340 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil eModeY() }; 1346 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil eModeY() };
1341 fp.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), tileModes)); 1347 fp.reset(GrBicubicEffect::Create(texture, texMatrix, tileModes));
1342 } else { 1348 } else {
1343 fp.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), params)); 1349 fp.reset(GrSimpleTextureEffect::Create(texture, texMatrix, params));
1344 } 1350 }
1345 1351
1352 SkAutoTUnref<const GrFragmentProcessor> shaderFP;
1353
1346 if (kAlpha_8_SkColorType == bitmap.colorType()) { 1354 if (kAlpha_8_SkColorType == bitmap.colorType()) {
1347 fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); 1355 if (const SkShader* shader = paint.getShader()) {
1356 shaderFP.reset(shader->asFragmentProcessor(this->context(),
1357 viewMatrix,
1358 nullptr,
1359 paint.getFilterQuality()) );
1360 const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp.get() } ;
bsalomon 2015/10/09 17:07:09 if (!shaderFP) { return }
egdaniel 2015/10/09 17:20:26 Done.
1361 fp.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2));
1362 } else {
1363 fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp));
1364 }
1348 } else { 1365 } else {
1349 fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); 1366 fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp));
1350 } 1367 }
1351 1368
1352 if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) { 1369 if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) {
1353 return; 1370 return;
1354 } 1371 }
1355 1372
1356 fDrawContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, viewMatrix, dstRect, 1373 if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) {
1357 paintRect); 1374 fDrawContext->drawRect(fRenderTarget, fClip, grPaint, viewMatrix, dstRec t);
1375 } else {
1376 fDrawContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, viewMat rix, dstRect,
1377 paintRect);
1378 }
1358 } 1379 }
1359 1380
1360 bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture, 1381 bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture,
1361 int width, int height, 1382 int width, int height,
1362 const SkImageFilter* filter, 1383 const SkImageFilter* filter,
1363 const SkImageFilter::Context& ctx, 1384 const SkImageFilter::Context& ctx,
1364 SkBitmap* result, SkIPoint* offset) { 1385 SkBitmap* result, SkIPoint* offset) {
1365 SkASSERT(filter); 1386 SkASSERT(filter);
1366 1387
1367 SkImageFilter::Proxy proxy(this); 1388 SkImageFilter::Proxy proxy(this);
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 #endif 2015 #endif
1995 } 2016 }
1996 2017
1997 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { 2018 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
1998 // We always return a transient cache, so it is freed after each 2019 // We always return a transient cache, so it is freed after each
1999 // filter traversal. 2020 // filter traversal.
2000 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); 2021 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize);
2001 } 2022 }
2002 2023
2003 #endif 2024 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698