Chromium Code Reviews| 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 do { \ | 60 do { \ |
| 61 if (gShouldDrawProc && !gShouldDrawProc()) return; \ | 61 if (gShouldDrawProc && !gShouldDrawProc()) return; \ |
| 62 this->prepareDraw(draw); \ | 62 this->prepareDraw(draw); \ |
| 63 } while (0) | 63 } while (0) |
| 64 #else | 64 #else |
| 65 #define CHECK_SHOULD_DRAW(draw) this->prepareDraw(draw) | 65 #define CHECK_SHOULD_DRAW(draw) this->prepareDraw(draw) |
| 66 #endif | 66 #endif |
| 67 | 67 |
| 68 /////////////////////////////////////////////////////////////////////////////// | 68 /////////////////////////////////////////////////////////////////////////////// |
| 69 | 69 |
| 70 // Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed this | |
| 71 // just accesses the backing GrTexture. Otherwise, it creates a cached texture | |
| 72 // representation and releases it in the destructor. | |
| 73 class AutoBitmapTexture : public SkNoncopyable { | |
| 74 public: | |
| 75 AutoBitmapTexture() {} | |
| 76 | |
| 77 AutoBitmapTexture(GrContext* context, | |
| 78 const SkBitmap& bitmap, | |
| 79 const GrTextureParams& params, | |
| 80 SkSourceGammaTreatment gammaTreatment, | |
| 81 GrTexture** texture) { | |
| 82 SkASSERT(texture); | |
| 83 *texture = this->set(context, bitmap, params, gammaTreatment); | |
| 84 } | |
| 85 | |
| 86 GrTexture* set(GrContext* context, | |
| 87 const SkBitmap& bitmap, | |
| 88 const GrTextureParams& params, | |
| 89 SkSourceGammaTreatment gammaTreatment) { | |
| 90 // Either get the texture directly from the bitmap, or else use the cach e and | |
| 91 // remember to unref it. | |
| 92 if (GrTexture* bmpTexture = bitmap.getTexture()) { | |
| 93 fTexture.reset(nullptr); | |
| 94 return bmpTexture; | |
| 95 } else { | |
| 96 fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params, gam maTreatment)); | |
| 97 return fTexture.get(); | |
| 98 } | |
| 99 } | |
| 100 | |
| 101 private: | |
| 102 SkAutoTUnref<GrTexture> fTexture; | |
| 103 }; | |
| 104 | |
| 105 /////////////////////////////////////////////////////////////////////////////// | |
| 106 | |
| 107 /** Checks that the alpha type is legal and gets constructor flags. Returns fals e if device creation | 70 /** Checks that the alpha type is legal and gets constructor flags. Returns fals e if device creation |
| 108 should fail. */ | 71 should fail. */ |
| 109 bool SkGpuDevice::CheckAlphaTypeAndGetFlags( | 72 bool SkGpuDevice::CheckAlphaTypeAndGetFlags( |
| 110 const SkImageInfo* info, SkGpuDevice::InitContents init, unsigned* flags) { | 73 const SkImageInfo* info, SkGpuDevice::InitContents init, unsigned* flags) { |
| 111 *flags = 0; | 74 *flags = 0; |
| 112 if (info) { | 75 if (info) { |
| 113 switch (info->alphaType()) { | 76 switch (info->alphaType()) { |
| 114 case kPremul_SkAlphaType: | 77 case kPremul_SkAlphaType: |
| 115 break; | 78 break; |
| 116 case kOpaque_SkAlphaType: | 79 case kOpaque_SkAlphaType: |
| (...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 829 } | 792 } |
| 830 | 793 |
| 831 bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap, | 794 bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap, |
| 832 const SkMatrix& viewMatrix, | 795 const SkMatrix& viewMatrix, |
| 833 const GrTextureParams& params, | 796 const GrTextureParams& params, |
| 834 const SkRect* srcRectPtr, | 797 const SkRect* srcRectPtr, |
| 835 int maxTileSize, | 798 int maxTileSize, |
| 836 int* tileSize, | 799 int* tileSize, |
| 837 SkIRect* clippedSrcRect) const { | 800 SkIRect* clippedSrcRect) const { |
| 838 ASSERT_SINGLE_OWNER | 801 ASSERT_SINGLE_OWNER |
| 839 // if bitmap is explictly texture backed then just use the texture | |
| 840 if (bitmap.getTexture()) { | |
| 841 return false; | |
| 842 } | |
| 843 | |
| 844 return this->shouldTileImageID(bitmap.getGenerationID(), bitmap.getSubset(), viewMatrix, params, | 802 return this->shouldTileImageID(bitmap.getGenerationID(), bitmap.getSubset(), viewMatrix, params, |
| 845 srcRectPtr, maxTileSize, tileSize, clippedSrc Rect); | 803 srcRectPtr, maxTileSize, tileSize, clippedSrc Rect); |
| 846 } | 804 } |
| 847 | 805 |
| 848 bool SkGpuDevice::shouldTileImage(const SkImage* image, const SkRect* srcRectPtr , | 806 bool SkGpuDevice::shouldTileImage(const SkImage* image, const SkRect* srcRectPtr , |
| 849 SkCanvas::SrcRectConstraint constraint, SkFilt erQuality quality, | 807 SkCanvas::SrcRectConstraint constraint, SkFilt erQuality quality, |
| 850 const SkMatrix& viewMatrix) const { | 808 const SkMatrix& viewMatrix) const { |
| 851 ASSERT_SINGLE_OWNER | 809 ASSERT_SINGLE_OWNER |
| 852 // if image is explictly texture backed then just use the texture | 810 // if image is explictly texture backed then just use the texture |
| 853 if (as_IB(image)->peekTexture()) { | 811 if (as_IB(image)->peekTexture()) { |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 880 } | 838 } |
| 881 | 839 |
| 882 void SkGpuDevice::drawBitmap(const SkDraw& origDraw, | 840 void SkGpuDevice::drawBitmap(const SkDraw& origDraw, |
| 883 const SkBitmap& bitmap, | 841 const SkBitmap& bitmap, |
| 884 const SkMatrix& m, | 842 const SkMatrix& m, |
| 885 const SkPaint& paint) { | 843 const SkPaint& paint) { |
| 886 ASSERT_SINGLE_OWNER | 844 ASSERT_SINGLE_OWNER |
| 887 CHECK_SHOULD_DRAW(origDraw); | 845 CHECK_SHOULD_DRAW(origDraw); |
| 888 SkMatrix viewMatrix; | 846 SkMatrix viewMatrix; |
| 889 viewMatrix.setConcat(*origDraw.fMatrix, m); | 847 viewMatrix.setConcat(*origDraw.fMatrix, m); |
| 890 if (bitmap.getTexture()) { | 848 |
| 891 GrBitmapTextureAdjuster adjuster(&bitmap); | |
| 892 // We can use kFast here because we know texture-backed bitmaps don't su pport extractSubset. | |
| 893 this->drawTextureProducer(&adjuster, nullptr, nullptr, SkCanvas::kFast_S rcRectConstraint, | |
| 894 viewMatrix, fClip, paint); | |
| 895 return; | |
| 896 } | |
| 897 int maxTileSize = fContext->caps()->maxTileSize(); | 849 int maxTileSize = fContext->caps()->maxTileSize(); |
| 898 | 850 |
| 899 // The tile code path doesn't currently support AA, so if the paint asked fo r aa and we could | 851 // The tile code path doesn't currently support AA, so if the paint asked fo r aa and we could |
| 900 // draw untiled, then we bypass checking for tiling purely for optimization reasons. | 852 // draw untiled, then we bypass checking for tiling purely for optimization reasons. |
| 901 bool drawAA = !fDrawContext->isUnifiedMultisampled() && | 853 bool drawAA = !fDrawContext->isUnifiedMultisampled() && |
| 902 paint.isAntiAlias() && | 854 paint.isAntiAlias() && |
| 903 bitmap.width() <= maxTileSize && | 855 bitmap.width() <= maxTileSize && |
| 904 bitmap.height() <= maxTileSize; | 856 bitmap.height() <= maxTileSize; |
| 905 | 857 |
| 906 bool skipTileCheck = drawAA || paint.getMaskFilter(); | 858 bool skipTileCheck = drawAA || paint.getMaskFilter(); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1083 const SkMatrix& viewMatrix, | 1035 const SkMatrix& viewMatrix, |
| 1084 const SkRect& srcRect, | 1036 const SkRect& srcRect, |
| 1085 const GrTextureParams& params, | 1037 const GrTextureParams& params, |
| 1086 const SkPaint& paint, | 1038 const SkPaint& paint, |
| 1087 SkCanvas::SrcRectConstraint constraint, | 1039 SkCanvas::SrcRectConstraint constraint, |
| 1088 bool bicubic, | 1040 bool bicubic, |
| 1089 bool needsTextureDomain) { | 1041 bool needsTextureDomain) { |
| 1090 // We should have already handled bitmaps larger than the max texture size. | 1042 // We should have already handled bitmaps larger than the max texture size. |
| 1091 SkASSERT(bitmap.width() <= fContext->caps()->maxTextureSize() && | 1043 SkASSERT(bitmap.width() <= fContext->caps()->maxTextureSize() && |
| 1092 bitmap.height() <= fContext->caps()->maxTextureSize()); | 1044 bitmap.height() <= fContext->caps()->maxTextureSize()); |
| 1093 // Unless the bitmap is inherently texture-backed, we should be respecting t he max tile size | 1045 // We should be respecting the max tile size by the time we get here. |
| 1094 // by the time we get here. | 1046 SkASSERT(bitmap.width() <= fContext->caps()->maxTileSize() && |
| 1095 SkASSERT(bitmap.getTexture() || | 1047 bitmap.height() <= fContext->caps()->maxTileSize()); |
| 1096 (bitmap.width() <= fContext->caps()->maxTileSize() && | |
| 1097 bitmap.height() <= fContext->caps()->maxTileSize())); | |
| 1098 | 1048 |
| 1099 GrTexture* texture; | |
| 1100 SkSourceGammaTreatment gammaTreatment = this->surfaceProps().isGammaCorrect( ) | 1049 SkSourceGammaTreatment gammaTreatment = this->surfaceProps().isGammaCorrect( ) |
| 1101 ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore; | 1050 ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore; |
| 1102 AutoBitmapTexture abt(fContext, bitmap, params, gammaTreatment, &texture); | 1051 sk_sp<GrTexture> texture = GrMakeCachedBitmapTexture(fContext, bitmap, param s, gammaTreatment); |
| 1103 if (nullptr == texture) { | 1052 if (nullptr == texture) { |
| 1104 return; | 1053 return; |
| 1105 } | 1054 } |
| 1106 | 1055 |
| 1107 SkColorSpace* dstColorSpace = nullptr; // XFORMTODO | 1056 SkColorSpace* dstColorSpace = nullptr; // XFORMTODO |
| 1108 sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(bitmap.co lorSpace(), | 1057 sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(bitmap.co lorSpace(), |
| 1109 dstColorS pace); | 1058 dstColorS pace); |
| 1110 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() }; | 1059 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() }; |
| 1111 SkRect paintRect; | 1060 SkRect paintRect; |
| 1112 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); | 1061 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1144 } | 1093 } |
| 1145 if (srcRect.height() > SK_Scalar1) { | 1094 if (srcRect.height() > SK_Scalar1) { |
| 1146 SkScalar border = SK_ScalarHalf / texture->height(); | 1095 SkScalar border = SK_ScalarHalf / texture->height(); |
| 1147 top = paintRect.top() + border; | 1096 top = paintRect.top() + border; |
| 1148 bottom = paintRect.bottom() - border; | 1097 bottom = paintRect.bottom() - border; |
| 1149 } else { | 1098 } else { |
| 1150 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); | 1099 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); |
| 1151 } | 1100 } |
| 1152 textureDomain.setLTRB(left, top, right, bottom); | 1101 textureDomain.setLTRB(left, top, right, bottom); |
| 1153 if (bicubic) { | 1102 if (bicubic) { |
| 1154 fp = GrBicubicEffect::Make(texture, std::move(colorSpaceXform), texM atrix, | 1103 fp = GrBicubicEffect::Make(texture.get(), std::move(colorSpaceXform) , texMatrix, |
|
f(malita)
2016/07/25 12:58:15
std::move(texture)?
| |
| 1155 textureDomain); | 1104 textureDomain); |
| 1156 } else { | 1105 } else { |
| 1157 fp = GrTextureDomainEffect::Make(texture, std::move(colorSpaceXform) , texMatrix, | 1106 fp = GrTextureDomainEffect::Make(texture.get(), std::move(colorSpace Xform), texMatrix, |
|
f(malita)
2016/07/25 12:58:15
ditto
| |
| 1158 textureDomain, GrTextureDomain::kCl amp_Mode, | 1107 textureDomain, GrTextureDomain::kCl amp_Mode, |
| 1159 params.filterMode()); | 1108 params.filterMode()); |
| 1160 } | 1109 } |
| 1161 } else if (bicubic) { | 1110 } else if (bicubic) { |
| 1162 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); | 1111 SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); |
| 1163 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil eModeY() }; | 1112 SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTil eModeY() }; |
| 1164 fp = GrBicubicEffect::Make(texture, std::move(colorSpaceXform), texMatri x, tileModes); | 1113 fp = GrBicubicEffect::Make(texture.get(), std::move(colorSpaceXform), te xMatrix, tileModes); |
|
f(malita)
2016/07/25 12:58:15
ditto
| |
| 1165 } else { | 1114 } else { |
| 1166 fp = GrSimpleTextureEffect::Make(texture, std::move(colorSpaceXform), te xMatrix, params); | 1115 fp = GrSimpleTextureEffect::Make(texture.get(), std::move(colorSpaceXfor m), texMatrix, params); |
|
f(malita)
2016/07/25 12:58:15
ditto
bsalomon
2016/07/25 13:50:07
We aren't widely using sk_sp for GrResource types
| |
| 1167 } | 1116 } |
| 1168 | 1117 |
| 1169 GrPaint grPaint; | 1118 GrPaint grPaint; |
| 1170 if (!SkPaintToGrPaintWithTexture(this->context(), paint, viewMatrix, std::mo ve(fp), | 1119 if (!SkPaintToGrPaintWithTexture(this->context(), paint, viewMatrix, std::mo ve(fp), |
| 1171 kAlpha_8_SkColorType == bitmap.colorType(), | 1120 kAlpha_8_SkColorType == bitmap.colorType(), |
| 1172 this->surfaceProps().isGammaCorrect(), &grP aint)) { | 1121 this->surfaceProps().isGammaCorrect(), &grP aint)) { |
| 1173 return; | 1122 return; |
| 1174 } | 1123 } |
| 1175 | 1124 |
| 1176 if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) { | 1125 if (kAlpha_8_SkColorType == bitmap.colorType() && paint.getShader()) { |
| 1177 // We don't have local coords in this case and have previously set the t ransform | 1126 // We don't have local coords in this case and have previously set the t ransform |
| 1178 // matrices directly on the texture processor. | 1127 // matrices directly on the texture processor. |
| 1179 fDrawContext->drawRect(fClip, grPaint, viewMatrix, dstRect); | 1128 fDrawContext->drawRect(fClip, grPaint, viewMatrix, dstRect); |
| 1180 } else { | 1129 } else { |
| 1181 fDrawContext->fillRectToRect(fClip, grPaint, viewMatrix, dstRect, paintR ect); | 1130 fDrawContext->fillRectToRect(fClip, grPaint, viewMatrix, dstRect, paintR ect); |
| 1182 } | 1131 } |
| 1183 } | 1132 } |
| 1184 | 1133 |
| 1185 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 1134 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
| 1186 int left, int top, const SkPaint& paint) { | 1135 int left, int top, const SkPaint& paint) { |
| 1187 ASSERT_SINGLE_OWNER | 1136 ASSERT_SINGLE_OWNER |
| 1188 CHECK_SHOULD_DRAW(draw); | 1137 CHECK_SHOULD_DRAW(draw); |
| 1189 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawSprite", fContext); | 1138 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawSprite", fContext); |
| 1190 | 1139 |
| 1191 if (fContext->abandoned()) { | 1140 if (fContext->abandoned()) { |
| 1192 return; | 1141 return; |
| 1193 } | 1142 } |
| 1194 | 1143 |
| 1195 sk_sp<GrTexture> texture = sk_ref_sp(bitmap.getTexture()); | 1144 sk_sp<GrTexture> texture; |
| 1196 if (!texture) { | 1145 { |
| 1197 SkAutoLockPixels alp(bitmap, true); | 1146 SkAutoLockPixels alp(bitmap, true); |
| 1198 if (!bitmap.readyToDraw()) { | 1147 if (!bitmap.readyToDraw()) { |
| 1199 return; | 1148 return; |
| 1200 } | 1149 } |
| 1201 | 1150 |
| 1202 // draw sprite neither filters nor tiles. | 1151 // draw sprite neither filters nor tiles. |
| 1203 texture.reset(GrRefCachedBitmapTexture(fContext, bitmap, | 1152 texture.reset(GrRefCachedBitmapTexture(fContext, bitmap, |
| 1204 GrTextureParams::ClampNoFilter(), | 1153 GrTextureParams::ClampNoFilter(), |
| 1205 SkSourceGammaTreatment::kRespect) ); | 1154 SkSourceGammaTreatment::kRespect) ); |
| 1206 if (!texture) { | 1155 if (!texture) { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1275 SkIntToScalar(subset.fTop) / t exture->height(), | 1224 SkIntToScalar(subset.fTop) / t exture->height(), |
| 1276 SkIntToScalar(subset.width()) / texture->width(), | 1225 SkIntToScalar(subset.width()) / texture->width(), |
| 1277 SkIntToScalar(subset.height()) / texture->height())); | 1226 SkIntToScalar(subset.height()) / texture->height())); |
| 1278 } | 1227 } |
| 1279 | 1228 |
| 1280 void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, | 1229 void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
| 1281 const SkRect* src, const SkRect& origDst, | 1230 const SkRect* src, const SkRect& origDst, |
| 1282 const SkPaint& paint, SkCanvas::SrcRectConstrai nt constraint) { | 1231 const SkPaint& paint, SkCanvas::SrcRectConstrai nt constraint) { |
| 1283 ASSERT_SINGLE_OWNER | 1232 ASSERT_SINGLE_OWNER |
| 1284 CHECK_SHOULD_DRAW(draw); | 1233 CHECK_SHOULD_DRAW(draw); |
| 1285 if (bitmap.getTexture()) { | 1234 |
| 1286 GrBitmapTextureAdjuster adjuster(&bitmap); | |
| 1287 this->drawTextureProducer(&adjuster, src, &origDst, constraint, *draw.fM atrix, fClip, | |
| 1288 paint); | |
| 1289 return; | |
| 1290 } | |
| 1291 // The src rect is inferred to be the bmp bounds if not provided. Otherwise, the src rect must | 1235 // The src rect is inferred to be the bmp bounds if not provided. Otherwise, the src rect must |
| 1292 // be clipped to the bmp bounds. To determine tiling parameters we need the filter mode which | 1236 // be clipped to the bmp bounds. To determine tiling parameters we need the filter mode which |
| 1293 // in turn requires knowing the src-to-dst mapping. If the src was clipped t o the bmp bounds | 1237 // in turn requires knowing the src-to-dst mapping. If the src was clipped t o the bmp bounds |
| 1294 // then we use the src-to-dst mapping to compute a new clipped dst rect. | 1238 // then we use the src-to-dst mapping to compute a new clipped dst rect. |
| 1295 const SkRect* dst = &origDst; | 1239 const SkRect* dst = &origDst; |
| 1296 const SkRect bmpBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height()); | 1240 const SkRect bmpBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height()); |
| 1297 // Compute matrix from the two rectangles | 1241 // Compute matrix from the two rectangles |
| 1298 if (!src) { | 1242 if (!src) { |
| 1299 src = &bmpBounds; | 1243 src = &bmpBounds; |
| 1300 } | 1244 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1359 this->drawTiledBitmap(bitmap, viewMatrix, *src, clippedSrcRect, para ms, paint, | 1303 this->drawTiledBitmap(bitmap, viewMatrix, *src, clippedSrcRect, para ms, paint, |
| 1360 constraint, tileSize, doBicubic); | 1304 constraint, tileSize, doBicubic); |
| 1361 return; | 1305 return; |
| 1362 } | 1306 } |
| 1363 } | 1307 } |
| 1364 GrBitmapTextureMaker maker(fContext, bitmap); | 1308 GrBitmapTextureMaker maker(fContext, bitmap); |
| 1365 this->drawTextureProducer(&maker, src, dst, constraint, *draw.fMatrix, fClip , paint); | 1309 this->drawTextureProducer(&maker, src, dst, constraint, *draw.fMatrix, fClip , paint); |
| 1366 } | 1310 } |
| 1367 | 1311 |
| 1368 sk_sp<SkSpecialImage> SkGpuDevice::makeSpecial(const SkBitmap& bitmap) { | 1312 sk_sp<SkSpecialImage> SkGpuDevice::makeSpecial(const SkBitmap& bitmap) { |
| 1369 SkASSERT(!bitmap.getTexture()); | |
| 1370 | |
| 1371 SkAutoLockPixels alp(bitmap, true); | 1313 SkAutoLockPixels alp(bitmap, true); |
| 1372 if (!bitmap.readyToDraw()) { | 1314 if (!bitmap.readyToDraw()) { |
| 1373 return nullptr; | 1315 return nullptr; |
| 1374 } | 1316 } |
| 1375 | 1317 |
| 1376 GrTexture* texture; | 1318 sk_sp<GrTexture> texture = GrMakeCachedBitmapTexture(fContext, bitmap, |
| 1377 AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(),» | 1319 GrTextureParams::ClampN oFilter(), |
| 1378 SkSourceGammaTreatment::kRespect, &texture); | 1320 SkSourceGammaTreatment: :kRespect); |
| 1379 if (!texture) { | 1321 if (!texture) { |
| 1380 return nullptr; | 1322 return nullptr; |
| 1381 } | 1323 } |
| 1382 | 1324 |
| 1383 return SkSpecialImage::MakeFromGpu(bitmap.bounds(), | 1325 return SkSpecialImage::MakeFromGpu(bitmap.bounds(), |
| 1384 bitmap.getGenerationID(), | 1326 bitmap.getGenerationID(), |
|
robertphillips
2016/07/25 12:08:28
std::move ?
| |
| 1385 sk_ref_sp(texture), | 1327 texture, |
| 1386 sk_ref_sp(bitmap.colorSpace()), | 1328 sk_ref_sp(bitmap.colorSpace()), |
| 1387 &this->surfaceProps()); | 1329 &this->surfaceProps()); |
| 1388 } | 1330 } |
| 1389 | 1331 |
| 1390 sk_sp<SkSpecialImage> SkGpuDevice::makeSpecial(const SkImage* image) { | 1332 sk_sp<SkSpecialImage> SkGpuDevice::makeSpecial(const SkImage* image) { |
| 1391 SkPixmap pm; | 1333 SkPixmap pm; |
| 1392 if (image->isTextureBacked()) { | 1334 if (image->isTextureBacked()) { |
| 1393 GrTexture* texture = as_IB(image)->peekTexture(); | 1335 GrTexture* texture = as_IB(image)->peekTexture(); |
| 1394 | 1336 |
| 1395 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(image->width(), image ->height()), | 1337 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(image->width(), image ->height()), |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1569 this->drawProducerNine(draw, &maker, center, dst, paint); | 1511 this->drawProducerNine(draw, &maker, center, dst, paint); |
| 1570 } else if (as_IB(image)->getROPixels(&bm)) { | 1512 } else if (as_IB(image)->getROPixels(&bm)) { |
| 1571 this->drawBitmapNine(draw, bm, center, dst, paint); | 1513 this->drawBitmapNine(draw, bm, center, dst, paint); |
| 1572 } | 1514 } |
| 1573 } | 1515 } |
| 1574 } | 1516 } |
| 1575 | 1517 |
| 1576 void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, con st SkIRect& center, | 1518 void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, con st SkIRect& center, |
| 1577 const SkRect& dst, const SkPaint& paint) { | 1519 const SkRect& dst, const SkPaint& paint) { |
| 1578 ASSERT_SINGLE_OWNER | 1520 ASSERT_SINGLE_OWNER |
| 1579 if (bitmap.getTexture()) { | 1521 GrBitmapTextureMaker maker(fContext, bitmap); |
| 1580 GrBitmapTextureAdjuster adjuster(&bitmap); | 1522 this->drawProducerNine(draw, &maker, center, dst, paint); |
| 1581 this->drawProducerNine(draw, &adjuster, center, dst, paint); | |
| 1582 } else { | |
| 1583 GrBitmapTextureMaker maker(fContext, bitmap); | |
| 1584 this->drawProducerNine(draw, &maker, center, dst, paint); | |
| 1585 } | |
| 1586 } | 1523 } |
| 1587 | 1524 |
| 1588 /////////////////////////////////////////////////////////////////////////////// | 1525 /////////////////////////////////////////////////////////////////////////////// |
| 1589 | 1526 |
| 1590 // must be in SkCanvas::VertexMode order | 1527 // must be in SkCanvas::VertexMode order |
| 1591 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 1528 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { |
| 1592 kTriangles_GrPrimitiveType, | 1529 kTriangles_GrPrimitiveType, |
| 1593 kTriangleStrip_GrPrimitiveType, | 1530 kTriangleStrip_GrPrimitiveType, |
| 1594 kTriangleFan_GrPrimitiveType, | 1531 kTriangleFan_GrPrimitiveType, |
| 1595 }; | 1532 }; |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1871 } | 1808 } |
| 1872 | 1809 |
| 1873 SkImageFilterCache* SkGpuDevice::getImageFilterCache() { | 1810 SkImageFilterCache* SkGpuDevice::getImageFilterCache() { |
| 1874 ASSERT_SINGLE_OWNER | 1811 ASSERT_SINGLE_OWNER |
| 1875 // We always return a transient cache, so it is freed after each | 1812 // We always return a transient cache, so it is freed after each |
| 1876 // filter traversal. | 1813 // filter traversal. |
| 1877 return SkImageFilterCache::Create(kDefaultImageFilterCacheSize); | 1814 return SkImageFilterCache::Create(kDefaultImageFilterCacheSize); |
| 1878 } | 1815 } |
| 1879 | 1816 |
| 1880 #endif | 1817 #endif |
| OLD | NEW |