| 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 "effects/GrTextureDomainEffect.h" | 10 #include "effects/GrTextureDomainEffect.h" |
| 11 #include "effects/GrSimpleTextureEffect.h" | 11 #include "effects/GrSimpleTextureEffect.h" |
| 12 | 12 |
| 13 #include "GrContext.h" | 13 #include "GrContext.h" |
| 14 #include "GrTextContext.h" | 14 #include "GrTextContext.h" |
| 15 | 15 |
| 16 #include "SkGrTexturePixelRef.h" | 16 #include "SkGrTexturePixelRef.h" |
| 17 | 17 |
| 18 #include "SkColorFilter.h" | 18 #include "SkColorFilter.h" |
| 19 #include "SkDeviceImageFilterProxy.h" | 19 #include "SkDeviceImageFilterProxy.h" |
| 20 #include "SkDrawProcs.h" | 20 #include "SkDrawProcs.h" |
| 21 #include "SkGlyphCache.h" | 21 #include "SkGlyphCache.h" |
| 22 #include "SkImageFilter.h" | 22 #include "SkImageFilter.h" |
| 23 #include "SkPathEffect.h" | 23 #include "SkPathEffect.h" |
| 24 #include "SkRRect.h" | 24 #include "SkRRect.h" |
| 25 #include "SkStroke.h" | 25 #include "SkStroke.h" |
| 26 #include "SkUtils.h" | 26 #include "SkUtils.h" |
| 27 #include "SkErrorInternals.h" |
| 27 | 28 |
| 28 #define CACHE_COMPATIBLE_DEVICE_TEXTURES 1 | 29 #define CACHE_COMPATIBLE_DEVICE_TEXTURES 1 |
| 29 | 30 |
| 30 #if 0 | 31 #if 0 |
| 31 extern bool (*gShouldDrawProc)(); | 32 extern bool (*gShouldDrawProc)(); |
| 32 #define CHECK_SHOULD_DRAW(draw, forceI) \ | 33 #define CHECK_SHOULD_DRAW(draw, forceI) \ |
| 33 do { \ | 34 do { \ |
| 34 if (gShouldDrawProc && !gShouldDrawProc()) return; \ | 35 if (gShouldDrawProc && !gShouldDrawProc()) return; \ |
| 35 this->prepareDraw(draw, forceI); \ | 36 this->prepareDraw(draw, forceI); \ |
| 36 } while (0) | 37 } while (0) |
| (...skipping 1090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 drawMatrix.setConcat(fContext->getMatrix(), newM); | 1128 drawMatrix.setConcat(fContext->getMatrix(), newM); |
| 1128 SkDraw transformedDraw(draw); | 1129 SkDraw transformedDraw(draw); |
| 1129 transformedDraw.fMatrix = &drawMatrix; | 1130 transformedDraw.fMatrix = &drawMatrix; |
| 1130 | 1131 |
| 1131 this->drawRect(transformedDraw, srcRect, paintWithTexture); | 1132 this->drawRect(transformedDraw, srcRect, paintWithTexture); |
| 1132 | 1133 |
| 1133 return; | 1134 return; |
| 1134 } | 1135 } |
| 1135 | 1136 |
| 1136 GrTextureParams params; | 1137 GrTextureParams params; |
| 1137 params.setBilerp(paint.isFilterBitmap()); | 1138 SkPaint::FilterLevel paintFilterLevel = paint.getFilterLevel(); |
| 1139 GrTextureParams::FilterMode textureFilterMode; |
| 1140 switch(paintFilterLevel) { |
| 1141 case SkPaint::kNone_FilterLevel: |
| 1142 textureFilterMode = GrTextureParams::kNone_FilterMode; |
| 1143 break; |
| 1144 case SkPaint::kLow_FilterLevel: |
| 1145 textureFilterMode = GrTextureParams::kBilerp_FilterMode; |
| 1146 break; |
| 1147 case SkPaint::kMedium_FilterLevel: |
| 1148 textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
| 1149 break; |
| 1150 case SkPaint::kHigh_FilterLevel: |
| 1151 SkErrorInternals::SetError( kInvalidPaint_SkError, |
| 1152 "Sorry, I don't yet support high quality
" |
| 1153 "filtering on the GPU. Falling back to
" |
| 1154 "MIPMaps."); |
| 1155 textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
| 1156 break; |
| 1157 } |
| 1158 |
| 1159 params.setFilterMode(textureFilterMode); |
| 1138 | 1160 |
| 1139 if (!this->shouldTileBitmap(bitmap, params, srcRectPtr)) { | 1161 if (!this->shouldTileBitmap(bitmap, params, srcRectPtr)) { |
| 1140 // take the simple case | 1162 // take the simple case |
| 1141 this->internalDrawBitmap(bitmap, srcRect, m, params, paint); | 1163 this->internalDrawBitmap(bitmap, srcRect, m, params, paint); |
| 1142 } else { | 1164 } else { |
| 1143 this->drawTiledBitmap(bitmap, srcRect, m, params, paint); | 1165 this->drawTiledBitmap(bitmap, srcRect, m, params, paint); |
| 1144 } | 1166 } |
| 1145 } | 1167 } |
| 1146 | 1168 |
| 1147 // Break 'bitmap' into several tiles to draw it since it has already | 1169 // Break 'bitmap' into several tiles to draw it since it has already |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1271 SkRect dstRect(srcRect); | 1293 SkRect dstRect(srcRect); |
| 1272 SkRect paintRect; | 1294 SkRect paintRect; |
| 1273 SkScalar wInv = SkScalarInvert(SkIntToScalar(bitmap.width())); | 1295 SkScalar wInv = SkScalarInvert(SkIntToScalar(bitmap.width())); |
| 1274 SkScalar hInv = SkScalarInvert(SkIntToScalar(bitmap.height())); | 1296 SkScalar hInv = SkScalarInvert(SkIntToScalar(bitmap.height())); |
| 1275 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), | 1297 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), |
| 1276 SkScalarMul(srcRect.fTop, hInv), | 1298 SkScalarMul(srcRect.fTop, hInv), |
| 1277 SkScalarMul(srcRect.fRight, wInv), | 1299 SkScalarMul(srcRect.fRight, wInv), |
| 1278 SkScalarMul(srcRect.fBottom, hInv)); | 1300 SkScalarMul(srcRect.fBottom, hInv)); |
| 1279 | 1301 |
| 1280 bool needsTextureDomain = false; | 1302 bool needsTextureDomain = false; |
| 1281 if (params.isBilerp()) { | 1303 if (params.filterMode() != GrTextureParams::kNone_FilterMode) { |
| 1282 // Need texture domain if drawing a sub rect. | 1304 // Need texture domain if drawing a sub rect. |
| 1283 needsTextureDomain = srcRect.width() < bitmap.width() || | 1305 needsTextureDomain = srcRect.width() < bitmap.width() || |
| 1284 srcRect.height() < bitmap.height(); | 1306 srcRect.height() < bitmap.height(); |
| 1285 if (needsTextureDomain && m.rectStaysRect() && fContext->getMatrix().rec
tStaysRect()) { | 1307 if (needsTextureDomain && m.rectStaysRect() && fContext->getMatrix().rec
tStaysRect()) { |
| 1286 // sampling is axis-aligned | 1308 // sampling is axis-aligned |
| 1287 SkRect transformedRect; | 1309 SkRect transformedRect; |
| 1288 SkMatrix srcToDeviceMatrix(m); | 1310 SkMatrix srcToDeviceMatrix(m); |
| 1289 srcToDeviceMatrix.postConcat(fContext->getMatrix()); | 1311 srcToDeviceMatrix.postConcat(fContext->getMatrix()); |
| 1290 srcToDeviceMatrix.mapRect(&transformedRect, srcRect); | 1312 srcToDeviceMatrix.mapRect(&transformedRect, srcRect); |
| 1291 | 1313 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1316 top = paintRect.top() + border; | 1338 top = paintRect.top() + border; |
| 1317 bottom = paintRect.bottom() - border; | 1339 bottom = paintRect.bottom() - border; |
| 1318 } else { | 1340 } else { |
| 1319 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); | 1341 top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); |
| 1320 } | 1342 } |
| 1321 textureDomain.setLTRB(left, top, right, bottom); | 1343 textureDomain.setLTRB(left, top, right, bottom); |
| 1322 effect.reset(GrTextureDomainEffect::Create(texture, | 1344 effect.reset(GrTextureDomainEffect::Create(texture, |
| 1323 SkMatrix::I(), | 1345 SkMatrix::I(), |
| 1324 textureDomain, | 1346 textureDomain, |
| 1325 GrTextureDomainEffect::kClamp
_WrapMode, | 1347 GrTextureDomainEffect::kClamp
_WrapMode, |
| 1326 params.isBilerp())); | 1348 params.filterMode())); |
| 1327 } else { | 1349 } else { |
| 1328 effect.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), param
s)); | 1350 effect.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), param
s)); |
| 1329 } | 1351 } |
| 1330 | 1352 |
| 1331 // Construct a GrPaint by setting the bitmap texture as the first effect and
then configuring | 1353 // Construct a GrPaint by setting the bitmap texture as the first effect and
then configuring |
| 1332 // the rest from the SkPaint. | 1354 // the rest from the SkPaint. |
| 1333 GrPaint grPaint; | 1355 GrPaint grPaint; |
| 1334 grPaint.addColorEffect(effect); | 1356 grPaint.addColorEffect(effect); |
| 1335 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); | 1357 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); |
| 1336 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { | 1358 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1754 GrTexture* texture, | 1776 GrTexture* texture, |
| 1755 bool needClear) | 1777 bool needClear) |
| 1756 : SkDevice(make_bitmap(context, texture->asRenderTarget())) { | 1778 : SkDevice(make_bitmap(context, texture->asRenderTarget())) { |
| 1757 | 1779 |
| 1758 GrAssert(texture && texture->asRenderTarget()); | 1780 GrAssert(texture && texture->asRenderTarget()); |
| 1759 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture | 1781 // This constructor is called from onCreateCompatibleDevice. It has locked t
he RT in the texture |
| 1760 // cache. We pass true for the third argument so that it will get unlocked. | 1782 // cache. We pass true for the third argument so that it will get unlocked. |
| 1761 this->initFromRenderTarget(context, texture->asRenderTarget(), true); | 1783 this->initFromRenderTarget(context, texture->asRenderTarget(), true); |
| 1762 fNeedClear = needClear; | 1784 fNeedClear = needClear; |
| 1763 } | 1785 } |
| OLD | NEW |