| OLD | NEW |
| 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 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 | 823 |
| 824 return this->shouldTileImageID(image->unique(), image->bounds(), viewMatrix,
params, srcRectPtr, | 824 return this->shouldTileImageID(image->unique(), image->bounds(), viewMatrix,
params, srcRectPtr, |
| 825 maxTileSize, &outTileSize, &outClippedSrcRect
); | 825 maxTileSize, &outTileSize, &outClippedSrcRect
); |
| 826 } | 826 } |
| 827 | 827 |
| 828 void SkGpuDevice::drawBitmap(const SkDraw& origDraw, | 828 void SkGpuDevice::drawBitmap(const SkDraw& origDraw, |
| 829 const SkBitmap& bitmap, | 829 const SkBitmap& bitmap, |
| 830 const SkMatrix& m, | 830 const SkMatrix& m, |
| 831 const SkPaint& paint) { | 831 const SkPaint& paint) { |
| 832 CHECK_SHOULD_DRAW(origDraw); | 832 CHECK_SHOULD_DRAW(origDraw); |
| 833 bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); | |
| 834 SkMatrix viewMatrix; | 833 SkMatrix viewMatrix; |
| 835 viewMatrix.setConcat(*origDraw.fMatrix, m); | 834 viewMatrix.setConcat(*origDraw.fMatrix, m); |
| 836 if (bitmap.getTexture()) { | 835 if (bitmap.getTexture()) { |
| 837 GrBitmapTextureAdjuster adjuster(&bitmap); | 836 GrBitmapTextureAdjuster adjuster(&bitmap); |
| 838 // We can use kFast here because we know texture-backed bitmaps don't su
pport extractSubset. | 837 // We can use kFast here because we know texture-backed bitmaps don't su
pport extractSubset. |
| 839 this->drawTextureProducer(&adjuster, alphaOnly, nullptr, nullptr, | 838 this->drawTextureProducer(&adjuster, nullptr, nullptr, SkCanvas::kFast_S
rcRectConstraint, |
| 840 SkCanvas::kFast_SrcRectConstraint, viewMatrix,
fClip, paint); | 839 viewMatrix, fClip, paint); |
| 841 return; | 840 return; |
| 842 } | 841 } |
| 843 int maxTileSize = fContext->caps()->maxTileSize(); | 842 int maxTileSize = fContext->caps()->maxTileSize(); |
| 844 | 843 |
| 845 // The tile code path doesn't currently support AA, so if the paint asked fo
r aa and we could | 844 // The tile code path doesn't currently support AA, so if the paint asked fo
r aa and we could |
| 846 // draw untiled, then we bypass checking for tiling purely for optimization
reasons. | 845 // draw untiled, then we bypass checking for tiling purely for optimization
reasons. |
| 847 bool drawAA = !fRenderTarget->isUnifiedMultisampled() && | 846 bool drawAA = !fRenderTarget->isUnifiedMultisampled() && |
| 848 paint.isAntiAlias() && | 847 paint.isAntiAlias() && |
| 849 bitmap.width() <= maxTileSize && | 848 bitmap.width() <= maxTileSize && |
| 850 bitmap.height() <= maxTileSize; | 849 bitmap.height() <= maxTileSize; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 875 | 874 |
| 876 int maxTileSizeForFilter = fContext->caps()->maxTileSize() - 2 * tileFil
terPad; | 875 int maxTileSizeForFilter = fContext->caps()->maxTileSize() - 2 * tileFil
terPad; |
| 877 if (this->shouldTileBitmap(bitmap, viewMatrix, params, &srcRect, | 876 if (this->shouldTileBitmap(bitmap, viewMatrix, params, &srcRect, |
| 878 maxTileSizeForFilter, &tileSize, &clippedSrcR
ect)) { | 877 maxTileSizeForFilter, &tileSize, &clippedSrcR
ect)) { |
| 879 this->drawTiledBitmap(bitmap, viewMatrix, srcRect, clippedSrcRect, p
arams, paint, | 878 this->drawTiledBitmap(bitmap, viewMatrix, srcRect, clippedSrcRect, p
arams, paint, |
| 880 SkCanvas::kStrict_SrcRectConstraint, tileSize,
doBicubic); | 879 SkCanvas::kStrict_SrcRectConstraint, tileSize,
doBicubic); |
| 881 return; | 880 return; |
| 882 } | 881 } |
| 883 } | 882 } |
| 884 GrBitmapTextureMaker maker(fContext, bitmap); | 883 GrBitmapTextureMaker maker(fContext, bitmap); |
| 885 this->drawTextureProducer(&maker, alphaOnly, nullptr, nullptr, | 884 this->drawTextureProducer(&maker, nullptr, nullptr, SkCanvas::kStrict_SrcRec
tConstraint, |
| 886 SkCanvas::kStrict_SrcRectConstraint, viewMatrix, f
Clip, paint); | 885 viewMatrix, fClip, paint); |
| 887 } | 886 } |
| 888 | 887 |
| 889 // This method outsets 'iRect' by 'outset' all around and then clamps its extent
s to | 888 // This method outsets 'iRect' by 'outset' all around and then clamps its extent
s to |
| 890 // 'clamp'. 'offset' is adjusted to remain positioned over the top-left corner | 889 // 'clamp'. 'offset' is adjusted to remain positioned over the top-left corner |
| 891 // of 'iRect' for all possible outsets/clamps. | 890 // of 'iRect' for all possible outsets/clamps. |
| 892 static inline void clamped_outset_with_offset(SkIRect* iRect, | 891 static inline void clamped_outset_with_offset(SkIRect* iRect, |
| 893 int outset, | 892 int outset, |
| 894 SkPoint* offset, | 893 SkPoint* offset, |
| 895 const SkIRect& clamp) { | 894 const SkIRect& clamp) { |
| 896 iRect->outset(outset, outset); | 895 iRect->outset(outset, outset); |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1208 SkIntToScalar(h)), | 1207 SkIntToScalar(h)), |
| 1209 SkRect::MakeXYWH(0, | 1208 SkRect::MakeXYWH(0, |
| 1210 0, | 1209 0, |
| 1211 SK_Scalar1 * w / texture->widt
h(), | 1210 SK_Scalar1 * w / texture->widt
h(), |
| 1212 SK_Scalar1 * h / texture->heig
ht())); | 1211 SK_Scalar1 * h / texture->heig
ht())); |
| 1213 } | 1212 } |
| 1214 | 1213 |
| 1215 void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, | 1214 void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
| 1216 const SkRect* src, const SkRect& origDst, | 1215 const SkRect* src, const SkRect& origDst, |
| 1217 const SkPaint& paint, SkCanvas::SrcRectConstrai
nt constraint) { | 1216 const SkPaint& paint, SkCanvas::SrcRectConstrai
nt constraint) { |
| 1218 bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); | |
| 1219 if (bitmap.getTexture()) { | 1217 if (bitmap.getTexture()) { |
| 1220 CHECK_SHOULD_DRAW(draw); | 1218 CHECK_SHOULD_DRAW(draw); |
| 1221 GrBitmapTextureAdjuster adjuster(&bitmap); | 1219 GrBitmapTextureAdjuster adjuster(&bitmap); |
| 1222 this->drawTextureProducer(&adjuster, alphaOnly, src, &origDst, constrain
t, *draw.fMatrix, | 1220 this->drawTextureProducer(&adjuster, src, &origDst, constraint, *draw.fM
atrix, fClip, |
| 1223 fClip, paint); | 1221 paint); |
| 1224 return; | 1222 return; |
| 1225 } | 1223 } |
| 1226 // The src rect is inferred to be the bmp bounds if not provided. Otherwise,
the src rect must | 1224 // The src rect is inferred to be the bmp bounds if not provided. Otherwise,
the src rect must |
| 1227 // be clipped to the bmp bounds. To determine tiling parameters we need the
filter mode which | 1225 // be clipped to the bmp bounds. To determine tiling parameters we need the
filter mode which |
| 1228 // in turn requires knowing the src-to-dst mapping. If the src was clipped t
o the bmp bounds | 1226 // in turn requires knowing the src-to-dst mapping. If the src was clipped t
o the bmp bounds |
| 1229 // then we use the src-to-dst mapping to compute a new clipped dst rect. | 1227 // then we use the src-to-dst mapping to compute a new clipped dst rect. |
| 1230 const SkRect* dst = &origDst; | 1228 const SkRect* dst = &origDst; |
| 1231 const SkRect bmpBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height()); | 1229 const SkRect bmpBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height()); |
| 1232 // Compute matrix from the two rectangles | 1230 // Compute matrix from the two rectangles |
| 1233 if (!src) { | 1231 if (!src) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1290 viewMatrix.preTranslate(dst->fLeft, dst->fTop); | 1288 viewMatrix.preTranslate(dst->fLeft, dst->fTop); |
| 1291 viewMatrix.preScale(dst->width()/src->width(), dst->height()/src->height
()); | 1289 viewMatrix.preScale(dst->width()/src->width(), dst->height()/src->height
()); |
| 1292 if (this->shouldTileBitmap(bitmap, viewMatrix, params, src, | 1290 if (this->shouldTileBitmap(bitmap, viewMatrix, params, src, |
| 1293 maxTileSizeForFilter, &tileSize, &clippedSrcR
ect)) { | 1291 maxTileSizeForFilter, &tileSize, &clippedSrcR
ect)) { |
| 1294 this->drawTiledBitmap(bitmap, viewMatrix, *src, clippedSrcRect, para
ms, paint, | 1292 this->drawTiledBitmap(bitmap, viewMatrix, *src, clippedSrcRect, para
ms, paint, |
| 1295 constraint, tileSize, doBicubic); | 1293 constraint, tileSize, doBicubic); |
| 1296 return; | 1294 return; |
| 1297 } | 1295 } |
| 1298 } | 1296 } |
| 1299 GrBitmapTextureMaker maker(fContext, bitmap); | 1297 GrBitmapTextureMaker maker(fContext, bitmap); |
| 1300 this->drawTextureProducer(&maker, alphaOnly, src, dst, constraint, *draw.fMa
trix, fClip, paint); | 1298 this->drawTextureProducer(&maker, src, dst, constraint, *draw.fMatrix, fClip
, paint); |
| 1301 } | 1299 } |
| 1302 | 1300 |
| 1303 void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, | 1301 void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, |
| 1304 int x, int y, const SkPaint& paint) { | 1302 int x, int y, const SkPaint& paint) { |
| 1305 // clear of the source device must occur before CHECK_SHOULD_DRAW | 1303 // clear of the source device must occur before CHECK_SHOULD_DRAW |
| 1306 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawDevice", fContext); | 1304 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawDevice", fContext); |
| 1307 SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); | 1305 SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); |
| 1308 | 1306 |
| 1309 // TODO: If the source device covers the whole of this device, we could | 1307 // TODO: If the source device covers the whole of this device, we could |
| 1310 // omit fNeedsClear -related flushing. | 1308 // omit fNeedsClear -related flushing. |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1405 } | 1403 } |
| 1406 | 1404 |
| 1407 return this->filterTexture(fContext, texture, src.width(), src.height(), | 1405 return this->filterTexture(fContext, texture, src.width(), src.height(), |
| 1408 filter, ctx, result, offset); | 1406 filter, ctx, result, offset); |
| 1409 } | 1407 } |
| 1410 | 1408 |
| 1411 void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x
, SkScalar y, | 1409 void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x
, SkScalar y, |
| 1412 const SkPaint& paint) { | 1410 const SkPaint& paint) { |
| 1413 SkMatrix viewMatrix = *draw.fMatrix; | 1411 SkMatrix viewMatrix = *draw.fMatrix; |
| 1414 viewMatrix.preTranslate(x, y); | 1412 viewMatrix.preTranslate(x, y); |
| 1415 if (GrTexture* tex = as_IB(image)->peekTexture()) { | 1413 if (as_IB(image)->peekTexture()) { |
| 1416 CHECK_SHOULD_DRAW(draw); | 1414 CHECK_SHOULD_DRAW(draw); |
| 1417 bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); | |
| 1418 GrImageTextureAdjuster adjuster(as_IB(image)); | 1415 GrImageTextureAdjuster adjuster(as_IB(image)); |
| 1419 this->drawTextureProducer(&adjuster, alphaOnly, nullptr, nullptr, | 1416 this->drawTextureProducer(&adjuster, nullptr, nullptr, SkCanvas::kFast_S
rcRectConstraint, |
| 1420 SkCanvas::kFast_SrcRectConstraint, viewMatrix,
fClip, paint); | 1417 viewMatrix, fClip, paint); |
| 1421 return; | 1418 return; |
| 1422 } else { | 1419 } else { |
| 1423 SkBitmap bm; | 1420 SkBitmap bm; |
| 1424 if (this->shouldTileImage(image, nullptr, SkCanvas::kFast_SrcRectConstra
int, | 1421 if (this->shouldTileImage(image, nullptr, SkCanvas::kFast_SrcRectConstra
int, |
| 1425 paint.getFilterQuality(), *draw.fMatrix)) { | 1422 paint.getFilterQuality(), *draw.fMatrix)) { |
| 1426 // only support tiling as bitmap at the moment, so force raster-vers
ion | 1423 // only support tiling as bitmap at the moment, so force raster-vers
ion |
| 1427 if (!as_IB(image)->getROPixels(&bm)) { | 1424 if (!as_IB(image)->getROPixels(&bm)) { |
| 1428 return; | 1425 return; |
| 1429 } | 1426 } |
| 1430 this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint); | 1427 this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint); |
| 1431 } else if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { | 1428 } else if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { |
| 1432 CHECK_SHOULD_DRAW(draw); | 1429 CHECK_SHOULD_DRAW(draw); |
| 1433 GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_C
achingHint); | 1430 GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_C
achingHint); |
| 1434 bool alphaOnly = kAlpha_8_SkColorType == cacher->info().colorType(); | 1431 this->drawTextureProducer(&maker, nullptr, nullptr, SkCanvas::kFast_
SrcRectConstraint, |
| 1435 this->drawTextureProducer(&maker, alphaOnly, nullptr, nullptr, | 1432 viewMatrix, fClip, paint); |
| 1436 SkCanvas::kFast_SrcRectConstraint, viewMat
rix, fClip, paint); | |
| 1437 } else if (as_IB(image)->getROPixels(&bm)) { | 1433 } else if (as_IB(image)->getROPixels(&bm)) { |
| 1438 this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint); | 1434 this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint); |
| 1439 } | 1435 } |
| 1440 } | 1436 } |
| 1441 } | 1437 } |
| 1442 | 1438 |
| 1443 void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const
SkRect* src, | 1439 void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const
SkRect* src, |
| 1444 const SkRect& dst, const SkPaint& paint, | 1440 const SkRect& dst, const SkPaint& paint, |
| 1445 SkCanvas::SrcRectConstraint constraint) { | 1441 SkCanvas::SrcRectConstraint constraint) { |
| 1446 if (GrTexture* tex = as_IB(image)->peekTexture()) { | 1442 if (as_IB(image)->peekTexture()) { |
| 1447 CHECK_SHOULD_DRAW(draw); | 1443 CHECK_SHOULD_DRAW(draw); |
| 1448 GrImageTextureAdjuster adjuster(as_IB(image)); | 1444 GrImageTextureAdjuster adjuster(as_IB(image)); |
| 1449 bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); | 1445 this->drawTextureProducer(&adjuster, src, &dst, constraint, *draw.fMatri
x, fClip, paint); |
| 1450 this->drawTextureProducer(&adjuster, alphaOnly, src, &dst, constraint, *
draw.fMatrix, | |
| 1451 fClip, paint); | |
| 1452 return; | 1446 return; |
| 1453 } | 1447 } |
| 1454 SkBitmap bm; | 1448 SkBitmap bm; |
| 1455 SkMatrix totalMatrix = *draw.fMatrix; | 1449 SkMatrix totalMatrix = *draw.fMatrix; |
| 1456 totalMatrix.preScale(dst.width() / (src ? src->width() : image->width()), | 1450 totalMatrix.preScale(dst.width() / (src ? src->width() : image->width()), |
| 1457 dst.height() / (src ? src->height() : image->height()))
; | 1451 dst.height() / (src ? src->height() : image->height()))
; |
| 1458 if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(),
totalMatrix)) { | 1452 if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(),
totalMatrix)) { |
| 1459 // only support tiling as bitmap at the moment, so force raster-version | 1453 // only support tiling as bitmap at the moment, so force raster-version |
| 1460 if (!as_IB(image)->getROPixels(&bm)) { | 1454 if (!as_IB(image)->getROPixels(&bm)) { |
| 1461 return; | 1455 return; |
| 1462 } | 1456 } |
| 1463 this->drawBitmapRect(draw, bm, src, dst, paint, constraint); | 1457 this->drawBitmapRect(draw, bm, src, dst, paint, constraint); |
| 1464 } else if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { | 1458 } else if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { |
| 1465 CHECK_SHOULD_DRAW(draw); | 1459 CHECK_SHOULD_DRAW(draw); |
| 1466 GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_Cachi
ngHint); | 1460 GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_Cachi
ngHint); |
| 1467 bool alphaOnly = kAlpha_8_SkColorType == cacher->info().colorType(); | 1461 this->drawTextureProducer(&maker, src, &dst, constraint, *draw.fMatrix,
fClip, paint); |
| 1468 this->drawTextureProducer(&maker, alphaOnly, src, &dst, constraint, *dra
w.fMatrix, | |
| 1469 fClip, paint); | |
| 1470 } else if (as_IB(image)->getROPixels(&bm)) { | 1462 } else if (as_IB(image)->getROPixels(&bm)) { |
| 1471 this->drawBitmapRect(draw, bm, src, dst, paint, constraint); | 1463 this->drawBitmapRect(draw, bm, src, dst, paint, constraint); |
| 1472 } | 1464 } |
| 1473 } | 1465 } |
| 1474 | 1466 |
| 1475 void SkGpuDevice::drawProducerNine(const SkDraw& draw, GrTextureProducer* produc
er, bool alphaOnly, | 1467 void SkGpuDevice::drawProducerNine(const SkDraw& draw, GrTextureProducer* produc
er, |
| 1476 const SkIRect& center, const SkRect& dst, con
st SkPaint& paint) { | 1468 const SkIRect& center, const SkRect& dst, con
st SkPaint& paint) { |
| 1477 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawProducerNine", fContext); | 1469 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawProducerNine", fContext); |
| 1478 | 1470 |
| 1479 CHECK_FOR_ANNOTATION(paint); | 1471 CHECK_FOR_ANNOTATION(paint); |
| 1480 CHECK_SHOULD_DRAW(draw); | 1472 CHECK_SHOULD_DRAW(draw); |
| 1481 | 1473 |
| 1482 bool useFallback = paint.getMaskFilter() || paint.isAntiAlias() || | 1474 bool useFallback = paint.getMaskFilter() || paint.isAntiAlias() || |
| 1483 fRenderTarget->isUnifiedMultisampled(); | 1475 fRenderTarget->isUnifiedMultisampled(); |
| 1484 bool doBicubic; | 1476 bool doBicubic; |
| 1485 GrTextureParams::FilterMode textureFilterMode = | 1477 GrTextureParams::FilterMode textureFilterMode = |
| 1486 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *draw.fMatrix,
SkMatrix::I(), | 1478 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *draw.fMatrix,
SkMatrix::I(), |
| 1487 &doBicubic); | 1479 &doBicubic); |
| 1488 if (useFallback || doBicubic || GrTextureParams::kNone_FilterMode != texture
FilterMode) { | 1480 if (useFallback || doBicubic || GrTextureParams::kNone_FilterMode != texture
FilterMode) { |
| 1489 SkNinePatchIter iter(producer->width(), producer->height(), center, dst)
; | 1481 SkNinePatchIter iter(producer->width(), producer->height(), center, dst)
; |
| 1490 | 1482 |
| 1491 SkRect srcR, dstR; | 1483 SkRect srcR, dstR; |
| 1492 while (iter.next(&srcR, &dstR)) { | 1484 while (iter.next(&srcR, &dstR)) { |
| 1493 this->drawTextureProducer(producer, alphaOnly, &srcR, &dstR, | 1485 this->drawTextureProducer(producer, &srcR, &dstR, SkCanvas::kStrict_
SrcRectConstraint, |
| 1494 SkCanvas::kStrict_SrcRectConstraint, *dra
w.fMatrix, fClip, | 1486 *draw.fMatrix, fClip, paint); |
| 1495 paint); | |
| 1496 } | 1487 } |
| 1497 return; | 1488 return; |
| 1498 } | 1489 } |
| 1499 | 1490 |
| 1500 static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_Filt
erMode; | 1491 static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_Filt
erMode; |
| 1501 SkAutoTUnref<const GrFragmentProcessor> fp( | 1492 SkAutoTUnref<const GrFragmentProcessor> fp( |
| 1502 producer->createFragmentProcessor(SkMatrix::I(), | 1493 producer->createFragmentProcessor(SkMatrix::I(), |
| 1503 SkRect::MakeIWH(producer->width(), pro
ducer->height()), | 1494 SkRect::MakeIWH(producer->width(), pro
ducer->height()), |
| 1504 GrTextureProducer::kNo_FilterConstrain
t, true, | 1495 GrTextureProducer::kNo_FilterConstrain
t, true, |
| 1505 &kMode)); | 1496 &kMode)); |
| 1506 GrPaint grPaint; | 1497 GrPaint grPaint; |
| 1507 if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp, | 1498 if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp, |
| 1508 alphaOnly, &grPaint)) { | 1499 producer->isAlphaOnly(), &grPaint)) { |
| 1509 return; | 1500 return; |
| 1510 } | 1501 } |
| 1511 | 1502 |
| 1512 fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, producer->width()
, | 1503 fDrawContext->drawImageNine(fClip, grPaint, *draw.fMatrix, producer->width()
, |
| 1513 producer->height(), center, dst); | 1504 producer->height(), center, dst); |
| 1514 } | 1505 } |
| 1515 | 1506 |
| 1516 void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, | 1507 void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, |
| 1517 const SkIRect& center, const SkRect& dst, const
SkPaint& paint) { | 1508 const SkIRect& center, const SkRect& dst, const
SkPaint& paint) { |
| 1518 if (GrTexture* tex = as_IB(image)->peekTexture()) { | 1509 if (as_IB(image)->peekTexture()) { |
| 1519 bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); | |
| 1520 GrImageTextureAdjuster adjuster(as_IB(image)); | 1510 GrImageTextureAdjuster adjuster(as_IB(image)); |
| 1521 this->drawProducerNine(draw, &adjuster, alphaOnly, center, dst, paint); | 1511 this->drawProducerNine(draw, &adjuster, center, dst, paint); |
| 1522 } else { | 1512 } else { |
| 1523 SkBitmap bm; | 1513 SkBitmap bm; |
| 1524 if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { | 1514 if (SkImageCacherator* cacher = as_IB(image)->peekCacherator()) { |
| 1525 GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_C
achingHint); | 1515 GrImageTextureMaker maker(fContext, cacher, image, SkImage::kAllow_C
achingHint); |
| 1526 bool alphaOnly = kAlpha_8_SkColorType == cacher->info().colorType(); | 1516 this->drawProducerNine(draw, &maker, center, dst, paint); |
| 1527 this->drawProducerNine(draw, &maker, alphaOnly, center, dst, paint); | |
| 1528 } else if (as_IB(image)->getROPixels(&bm)) { | 1517 } else if (as_IB(image)->getROPixels(&bm)) { |
| 1529 this->drawBitmapNine(draw, bm, center, dst, paint); | 1518 this->drawBitmapNine(draw, bm, center, dst, paint); |
| 1530 } | 1519 } |
| 1531 } | 1520 } |
| 1532 } | 1521 } |
| 1533 | 1522 |
| 1534 void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, con
st SkIRect& center, | 1523 void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, con
st SkIRect& center, |
| 1535 const SkRect& dst, const SkPaint& paint) { | 1524 const SkRect& dst, const SkPaint& paint) { |
| 1536 bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); | |
| 1537 if (bitmap.getTexture()) { | 1525 if (bitmap.getTexture()) { |
| 1538 GrBitmapTextureAdjuster adjuster(&bitmap); | 1526 GrBitmapTextureAdjuster adjuster(&bitmap); |
| 1539 this->drawProducerNine(draw, &adjuster, alphaOnly, center, dst, paint); | 1527 this->drawProducerNine(draw, &adjuster, center, dst, paint); |
| 1540 } else { | 1528 } else { |
| 1541 GrBitmapTextureMaker maker(fContext, bitmap); | 1529 GrBitmapTextureMaker maker(fContext, bitmap); |
| 1542 this->drawProducerNine(draw, &maker, alphaOnly, center, dst, paint); | 1530 this->drawProducerNine(draw, &maker, center, dst, paint); |
| 1543 } | 1531 } |
| 1544 } | 1532 } |
| 1545 | 1533 |
| 1546 /////////////////////////////////////////////////////////////////////////////// | 1534 /////////////////////////////////////////////////////////////////////////////// |
| 1547 | 1535 |
| 1548 // must be in SkCanvas::VertexMode order | 1536 // must be in SkCanvas::VertexMode order |
| 1549 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 1537 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { |
| 1550 kTriangles_GrPrimitiveType, | 1538 kTriangles_GrPrimitiveType, |
| 1551 kTriangleStrip_GrPrimitiveType, | 1539 kTriangleStrip_GrPrimitiveType, |
| 1552 kTriangleFan_GrPrimitiveType, | 1540 kTriangleFan_GrPrimitiveType, |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1886 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1874 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
| 1887 } | 1875 } |
| 1888 | 1876 |
| 1889 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1877 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
| 1890 // We always return a transient cache, so it is freed after each | 1878 // We always return a transient cache, so it is freed after each |
| 1891 // filter traversal. | 1879 // filter traversal. |
| 1892 return SkGpuDevice::NewImageFilterCache(); | 1880 return SkGpuDevice::NewImageFilterCache(); |
| 1893 } | 1881 } |
| 1894 | 1882 |
| 1895 #endif | 1883 #endif |
| OLD | NEW |