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/GrBicubicEffect.h" | 10 #include "effects/GrBicubicEffect.h" |
(...skipping 1317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1328 bool alphaOnly = !(kAlpha_8_SkColorType == bitmap.colorType()); | 1328 bool alphaOnly = !(kAlpha_8_SkColorType == bitmap.colorType()); |
1329 GrColor paintColor = (alphaOnly) ? SkColor2GrColorJustAlpha(paint.getColor()
) : | 1329 GrColor paintColor = (alphaOnly) ? SkColor2GrColorJustAlpha(paint.getColor()
) : |
1330 SkColor2GrColor(paint.getColor()); | 1330 SkColor2GrColor(paint.getColor()); |
1331 SkPaint2GrPaintNoShader(this->context(), paint, paintColor, false, &grPaint)
; | 1331 SkPaint2GrPaintNoShader(this->context(), paint, paintColor, false, &grPaint)
; |
1332 | 1332 |
1333 fContext->drawRectToRect(grPaint, dstRect, paintRect); | 1333 fContext->drawRectToRect(grPaint, dstRect, paintRect); |
1334 } | 1334 } |
1335 | 1335 |
1336 static bool filter_texture(SkBaseDevice* device, GrContext* context, | 1336 static bool filter_texture(SkBaseDevice* device, GrContext* context, |
1337 GrTexture* texture, const SkImageFilter* filter, | 1337 GrTexture* texture, const SkImageFilter* filter, |
1338 int w, int h, const SkImageFilter::Context& ctx, | 1338 const SkImageFilter::Context& ctx, |
1339 SkBitmap* result, SkIPoint* offset) { | 1339 SkBitmap* result, SkIPoint* offset) { |
1340 SkASSERT(filter); | 1340 SkASSERT(filter); |
1341 SkDeviceImageFilterProxy proxy(device); | 1341 SkDeviceImageFilterProxy proxy(device); |
1342 | 1342 |
1343 if (filter->canFilterImageGPU()) { | 1343 if (filter->canFilterImageGPU()) { |
1344 // Save the render target and set it to NULL, so we don't accidentally d
raw to it in the | 1344 // Save the render target and set it to NULL, so we don't accidentally d
raw to it in the |
1345 // filter. Also set the clip wide open and the matrix to identity. | 1345 // filter. Also set the clip wide open and the matrix to identity. |
1346 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); | 1346 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); |
1347 return filter->filterImageGPU(&proxy, wrap_texture(texture), ctx, result
, offset); | 1347 return filter->filterImageGPU(&proxy, wrap_texture(texture), ctx, result
, offset); |
1348 } else { | 1348 } else { |
(...skipping 24 matching lines...) Expand all Loading... |
1373 | 1373 |
1374 if (filter) { | 1374 if (filter) { |
1375 SkIPoint offset = SkIPoint::Make(0, 0); | 1375 SkIPoint offset = SkIPoint::Make(0, 0); |
1376 SkMatrix matrix(*draw.fMatrix); | 1376 SkMatrix matrix(*draw.fMatrix); |
1377 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top)); | 1377 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top)); |
1378 SkIRect clipBounds = SkIRect::MakeWH(bitmap.width(), bitmap.height()); | 1378 SkIRect clipBounds = SkIRect::MakeWH(bitmap.width(), bitmap.height()); |
1379 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); | 1379 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); |
1380 // This cache is transient, and is freed (along with all its contained | 1380 // This cache is transient, and is freed (along with all its contained |
1381 // textures) when it goes out of scope. | 1381 // textures) when it goes out of scope. |
1382 SkImageFilter::Context ctx(matrix, clipBounds, cache); | 1382 SkImageFilter::Context ctx(matrix, clipBounds, cache); |
1383 if (filter_texture(this, fContext, texture, filter, w, h, ctx, &filtered
Bitmap, | 1383 if (filter_texture(this, fContext, texture, filter, ctx, &filteredBitmap
, |
1384 &offset)) { | 1384 &offset)) { |
1385 texture = (GrTexture*) filteredBitmap.getTexture(); | 1385 texture = (GrTexture*) filteredBitmap.getTexture(); |
1386 w = filteredBitmap.width(); | 1386 w = filteredBitmap.width(); |
1387 h = filteredBitmap.height(); | 1387 h = filteredBitmap.height(); |
1388 left += offset.x(); | 1388 left += offset.x(); |
1389 top += offset.y(); | 1389 top += offset.y(); |
1390 } else { | 1390 } else { |
1391 return; | 1391 return; |
1392 } | 1392 } |
1393 } | 1393 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1484 | 1484 |
1485 if (filter) { | 1485 if (filter) { |
1486 SkIPoint offset = SkIPoint::Make(0, 0); | 1486 SkIPoint offset = SkIPoint::Make(0, 0); |
1487 SkMatrix matrix(*draw.fMatrix); | 1487 SkMatrix matrix(*draw.fMatrix); |
1488 matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); | 1488 matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); |
1489 SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height()); | 1489 SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height()); |
1490 // This cache is transient, and is freed (along with all its contained | 1490 // This cache is transient, and is freed (along with all its contained |
1491 // textures) when it goes out of scope. | 1491 // textures) when it goes out of scope. |
1492 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); | 1492 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); |
1493 SkImageFilter::Context ctx(matrix, clipBounds, cache); | 1493 SkImageFilter::Context ctx(matrix, clipBounds, cache); |
1494 if (filter_texture(this, fContext, devTex, filter, w, h, ctx, &filteredB
itmap, | 1494 if (filter_texture(this, fContext, devTex, filter, ctx, &filteredBitmap, |
1495 &offset)) { | 1495 &offset)) { |
1496 devTex = filteredBitmap.getTexture(); | 1496 devTex = filteredBitmap.getTexture(); |
1497 w = filteredBitmap.width(); | 1497 w = filteredBitmap.width(); |
1498 h = filteredBitmap.height(); | 1498 h = filteredBitmap.height(); |
1499 x += offset.fX; | 1499 x += offset.fX; |
1500 y += offset.fY; | 1500 y += offset.fY; |
1501 } else { | 1501 } else { |
1502 return; | 1502 return; |
1503 } | 1503 } |
1504 } | 1504 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1537 SkAutoLockPixels alp(src, !src.getTexture()); | 1537 SkAutoLockPixels alp(src, !src.getTexture()); |
1538 if (!src.getTexture() && !src.readyToDraw()) { | 1538 if (!src.getTexture() && !src.readyToDraw()) { |
1539 return false; | 1539 return false; |
1540 } | 1540 } |
1541 | 1541 |
1542 GrTexture* texture; | 1542 GrTexture* texture; |
1543 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup | 1543 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup |
1544 // must be pushed upstack. | 1544 // must be pushed upstack. |
1545 AutoBitmapTexture abt(fContext, src, NULL, &texture); | 1545 AutoBitmapTexture abt(fContext, src, NULL, &texture); |
1546 | 1546 |
1547 return filter_texture(this, fContext, texture, filter, src.width(), src.heig
ht(), ctx, | 1547 return filter_texture(this, fContext, texture, filter, ctx, result, offset); |
1548 result, offset); | |
1549 } | 1548 } |
1550 | 1549 |
1551 /////////////////////////////////////////////////////////////////////////////// | 1550 /////////////////////////////////////////////////////////////////////////////// |
1552 | 1551 |
1553 // must be in SkCanvas::VertexMode order | 1552 // must be in SkCanvas::VertexMode order |
1554 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 1553 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { |
1555 kTriangles_GrPrimitiveType, | 1554 kTriangles_GrPrimitiveType, |
1556 kTriangleStrip_GrPrimitiveType, | 1555 kTriangleStrip_GrPrimitiveType, |
1557 kTriangleFan_GrPrimitiveType, | 1556 kTriangleFan_GrPrimitiveType, |
1558 }; | 1557 }; |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1825 GrLayerHoister::UnlockLayers(fContext, atlased, nonAtlased, recycled); | 1824 GrLayerHoister::UnlockLayers(fContext, atlased, nonAtlased, recycled); |
1826 | 1825 |
1827 return true; | 1826 return true; |
1828 } | 1827 } |
1829 | 1828 |
1830 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1829 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
1831 // We always return a transient cache, so it is freed after each | 1830 // We always return a transient cache, so it is freed after each |
1832 // filter traversal. | 1831 // filter traversal. |
1833 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1832 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
1834 } | 1833 } |
OLD | NEW |