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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 | 83 |
84 // Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed
this | 84 // Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed
this |
85 // just accesses the backing GrTexture. Otherwise, it creates a cached texture | 85 // just accesses the backing GrTexture. Otherwise, it creates a cached texture |
86 // representation and releases it in the destructor. | 86 // representation and releases it in the destructor. |
87 class AutoBitmapTexture : public SkNoncopyable { | 87 class AutoBitmapTexture : public SkNoncopyable { |
88 public: | 88 public: |
89 AutoBitmapTexture() {} | 89 AutoBitmapTexture() {} |
90 | 90 |
91 AutoBitmapTexture(GrContext* context, | 91 AutoBitmapTexture(GrContext* context, |
92 const SkBitmap& bitmap, | 92 const SkBitmap& bitmap, |
93 const GrTextureParams* params, | 93 const GrTextureParams& params, |
94 GrTexture** texture) { | 94 GrTexture** texture) { |
95 SkASSERT(texture); | 95 SkASSERT(texture); |
96 *texture = this->set(context, bitmap, params); | 96 *texture = this->set(context, bitmap, params); |
97 } | 97 } |
98 | 98 |
99 GrTexture* set(GrContext* context, | 99 GrTexture* set(GrContext* context, |
100 const SkBitmap& bitmap, | 100 const SkBitmap& bitmap, |
101 const GrTextureParams* params) { | 101 const GrTextureParams& params) { |
102 // Either get the texture directly from the bitmap, or else use the cach
e and | 102 // Either get the texture directly from the bitmap, or else use the cach
e and |
103 // remember to unref it. | 103 // remember to unref it. |
104 if (GrTexture* bmpTexture = bitmap.getTexture()) { | 104 if (GrTexture* bmpTexture = bitmap.getTexture()) { |
105 fTexture.reset(nullptr); | 105 fTexture.reset(nullptr); |
106 return bmpTexture; | 106 return bmpTexture; |
107 } else { | 107 } else { |
108 fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params)); | 108 fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params)); |
109 return fTexture.get(); | 109 return fTexture.get(); |
110 } | 110 } |
111 } | 111 } |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 *tileSize = determine_tile_size(*clippedSubset, maxTileSize); | 758 *tileSize = determine_tile_size(*clippedSubset, maxTileSize); |
759 return true; | 759 return true; |
760 } | 760 } |
761 | 761 |
762 const size_t area = imageRect.width() * imageRect.height(); | 762 const size_t area = imageRect.width() * imageRect.height(); |
763 if (area < 4 * kBmpSmallTileSize * kBmpSmallTileSize) { | 763 if (area < 4 * kBmpSmallTileSize * kBmpSmallTileSize) { |
764 return false; | 764 return false; |
765 } | 765 } |
766 | 766 |
767 // if the entire image/bitmap is already in our cache then no reason to tile
it | 767 // if the entire image/bitmap is already in our cache then no reason to tile
it |
768 if (GrIsImageInCache(fContext, imageID, imageRect, nullptr, ¶ms)) { | 768 if (GrIsImageInCache(fContext, imageID, imageRect, nullptr, params)) { |
769 return false; | 769 return false; |
770 } | 770 } |
771 | 771 |
772 // At this point we know we could do the draw by uploading the entire bitmap | 772 // At this point we know we could do the draw by uploading the entire bitmap |
773 // as a texture. However, if the texture would be large compared to the | 773 // as a texture. However, if the texture would be large compared to the |
774 // cache size and we don't require most of it for this draw then tile to | 774 // cache size and we don't require most of it for this draw then tile to |
775 // reduce the amount of upload and cache spill. | 775 // reduce the amount of upload and cache spill. |
776 | 776 |
777 // assumption here is that sw bitmap size is a good proxy for its size as | 777 // assumption here is that sw bitmap size is a good proxy for its size as |
778 // a texture | 778 // a texture |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 }; | 976 }; |
977 | 977 |
978 bool doBicubic; | 978 bool doBicubic; |
979 GrTextureParams::FilterMode textureFilterMode = | 979 GrTextureParams::FilterMode textureFilterMode = |
980 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), viewMatrix
, | 980 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), viewMatrix
, |
981 srcRectToDstRect, | 981 srcRectToDstRect, |
982 &doBicubic); | 982 &doBicubic); |
983 | 983 |
984 // Setup texture to wrap bitmap | 984 // Setup texture to wrap bitmap |
985 GrTextureParams params(tm, textureFilterMode); | 985 GrTextureParams params(tm, textureFilterMode); |
986 SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, *bitmapPtr
, ¶ms)); | 986 SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, *bitmapPtr
, params)); |
987 | 987 |
988 if (!texture) { | 988 if (!texture) { |
989 SkErrorInternals::SetError(kInternalError_SkError, | 989 SkErrorInternals::SetError(kInternalError_SkError, |
990 "Couldn't convert bitmap to texture."); | 990 "Couldn't convert bitmap to texture."); |
991 return; | 991 return; |
992 } | 992 } |
993 | 993 |
994 | 994 |
995 GrPaint grPaint; | 995 GrPaint grPaint; |
996 | 996 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1281 const SkRect& srcRect, | 1281 const SkRect& srcRect, |
1282 const GrTextureParams& params, | 1282 const GrTextureParams& params, |
1283 const SkPaint& paint, | 1283 const SkPaint& paint, |
1284 SkCanvas::SrcRectConstraint constraint, | 1284 SkCanvas::SrcRectConstraint constraint, |
1285 bool bicubic, | 1285 bool bicubic, |
1286 bool needsTextureDomain) { | 1286 bool needsTextureDomain) { |
1287 SkASSERT(bitmap.width() <= fContext->caps()->maxTextureSize() && | 1287 SkASSERT(bitmap.width() <= fContext->caps()->maxTextureSize() && |
1288 bitmap.height() <= fContext->caps()->maxTextureSize()); | 1288 bitmap.height() <= fContext->caps()->maxTextureSize()); |
1289 | 1289 |
1290 GrTexture* texture; | 1290 GrTexture* texture; |
1291 AutoBitmapTexture abt(fContext, bitmap, ¶ms, &texture); | 1291 AutoBitmapTexture abt(fContext, bitmap, params, &texture); |
1292 if (nullptr == texture) { | 1292 if (nullptr == texture) { |
1293 return; | 1293 return; |
1294 } | 1294 } |
1295 | 1295 |
1296 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() }; | 1296 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() }; |
1297 SkRect paintRect; | 1297 SkRect paintRect; |
1298 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); | 1298 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); |
1299 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height())); | 1299 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height())); |
1300 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), | 1300 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), |
1301 SkScalarMul(srcRect.fTop, hInv), | 1301 SkScalarMul(srcRect.fTop, hInv), |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1412 | 1412 |
1413 SkAutoLockPixels alp(bitmap, !bitmap.getTexture()); | 1413 SkAutoLockPixels alp(bitmap, !bitmap.getTexture()); |
1414 if (!bitmap.getTexture() && !bitmap.readyToDraw()) { | 1414 if (!bitmap.getTexture() && !bitmap.readyToDraw()) { |
1415 return; | 1415 return; |
1416 } | 1416 } |
1417 | 1417 |
1418 int w = bitmap.width(); | 1418 int w = bitmap.width(); |
1419 int h = bitmap.height(); | 1419 int h = bitmap.height(); |
1420 | 1420 |
1421 GrTexture* texture; | 1421 GrTexture* texture; |
1422 // draw sprite uses the default texture params | 1422 // draw sprite neither filters nor tiles. |
1423 AutoBitmapTexture abt(fContext, bitmap, nullptr, &texture); | 1423 AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(), &t
exture); |
1424 if (!texture) { | 1424 if (!texture) { |
1425 return; | 1425 return; |
1426 } | 1426 } |
1427 | 1427 |
1428 bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); | 1428 bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); |
1429 | 1429 |
1430 SkImageFilter* filter = paint.getImageFilter(); | 1430 SkImageFilter* filter = paint.getImageFilter(); |
1431 // This bitmap will own the filtered result as a texture. | 1431 // This bitmap will own the filtered result as a texture. |
1432 SkBitmap filteredBitmap; | 1432 SkBitmap filteredBitmap; |
1433 | 1433 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1614 } | 1614 } |
1615 | 1615 |
1616 SkAutoLockPixels alp(src, !src.getTexture()); | 1616 SkAutoLockPixels alp(src, !src.getTexture()); |
1617 if (!src.getTexture() && !src.readyToDraw()) { | 1617 if (!src.getTexture() && !src.readyToDraw()) { |
1618 return false; | 1618 return false; |
1619 } | 1619 } |
1620 | 1620 |
1621 GrTexture* texture; | 1621 GrTexture* texture; |
1622 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup | 1622 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup |
1623 // must be pushed upstack. | 1623 // must be pushed upstack. |
1624 AutoBitmapTexture abt(fContext, src, nullptr, &texture); | 1624 AutoBitmapTexture abt(fContext, src, GrTextureParams::ClampNoFilter(), &text
ure); |
1625 if (!texture) { | 1625 if (!texture) { |
1626 return false; | 1626 return false; |
1627 } | 1627 } |
1628 | 1628 |
1629 return this->filterTexture(fContext, texture, src.width(), src.height(), | 1629 return this->filterTexture(fContext, texture, src.width(), src.height(), |
1630 filter, ctx, result, offset); | 1630 filter, ctx, result, offset); |
1631 } | 1631 } |
1632 | 1632 |
1633 static bool wrap_as_bm(GrContext* ctx, const SkImage* image, SkBitmap* bm) { | 1633 static bool wrap_as_bm(GrContext* ctx, const SkImage* image, SkBitmap* bm) { |
1634 SkAutoTUnref<GrTexture> tex(as_IB(image)->asTextureRef(ctx, kUntiled_SkImage
UsageType)); | 1634 // TODO: It is wrong to assume these texture params here. |
| 1635 SkAutoTUnref<GrTexture> tex(as_IB(image)->asTextureRef(ctx, GrTextureParams:
:ClampNoFilter())); |
1635 if (tex) { | 1636 if (tex) { |
1636 GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpa
que(), bm); | 1637 GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpa
que(), bm); |
1637 return true; | 1638 return true; |
1638 } else { | 1639 } else { |
1639 return as_IB(image)->getROPixels(bm); | 1640 return as_IB(image)->getROPixels(bm); |
1640 } | 1641 } |
1641 } | 1642 } |
1642 | 1643 |
1643 void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x
, SkScalar y, | 1644 void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x
, SkScalar y, |
1644 const SkPaint& paint) { | 1645 const SkPaint& paint) { |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2025 #endif | 2026 #endif |
2026 } | 2027 } |
2027 | 2028 |
2028 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 2029 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
2029 // We always return a transient cache, so it is freed after each | 2030 // We always return a transient cache, so it is freed after each |
2030 // filter traversal. | 2031 // filter traversal. |
2031 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 2032 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
2032 } | 2033 } |
2033 | 2034 |
2034 #endif | 2035 #endif |
OLD | NEW |