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 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); | 1581 bool alphaOnly = !(SkBitmap::kA8_Config == bitmap.config()); |
1582 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { | 1582 if (!skPaint2GrPaintNoShader(this, paint, alphaOnly, false, &grPaint)) { |
1583 return; | 1583 return; |
1584 } | 1584 } |
1585 | 1585 |
1586 fContext->drawRectToRect(grPaint, dstRect, paintRect, NULL); | 1586 fContext->drawRectToRect(grPaint, dstRect, paintRect, NULL); |
1587 } | 1587 } |
1588 | 1588 |
1589 static bool filter_texture(SkBaseDevice* device, GrContext* context, | 1589 static bool filter_texture(SkBaseDevice* device, GrContext* context, |
1590 GrTexture* texture, const SkImageFilter* filter, | 1590 GrTexture* texture, const SkImageFilter* filter, |
1591 int w, int h, const SkMatrix& ctm, SkBitmap* result, | 1591 int w, int h, const SkImageFilter::Context& ctx, |
1592 SkIPoint* offset) { | 1592 SkBitmap* result, SkIPoint* offset) { |
1593 SkASSERT(filter); | 1593 SkASSERT(filter); |
1594 SkDeviceImageFilterProxy proxy(device); | 1594 SkDeviceImageFilterProxy proxy(device); |
1595 | 1595 |
1596 if (filter->canFilterImageGPU()) { | 1596 if (filter->canFilterImageGPU()) { |
1597 // Save the render target and set it to NULL, so we don't accidentally d
raw to it in the | 1597 // Save the render target and set it to NULL, so we don't accidentally d
raw to it in the |
1598 // filter. Also set the clip wide open and the matrix to identity. | 1598 // filter. Also set the clip wide open and the matrix to identity. |
1599 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); | 1599 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); |
1600 return filter->filterImageGPU(&proxy, wrap_texture(texture), ctm, result
, offset); | 1600 return filter->filterImageGPU(&proxy, wrap_texture(texture), ctx, result
, offset); |
1601 } else { | 1601 } else { |
1602 return false; | 1602 return false; |
1603 } | 1603 } |
1604 } | 1604 } |
1605 | 1605 |
1606 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 1606 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
1607 int left, int top, const SkPaint& paint) { | 1607 int left, int top, const SkPaint& paint) { |
1608 // drawSprite is defined to be in device coords. | 1608 // drawSprite is defined to be in device coords. |
1609 CHECK_SHOULD_DRAW(draw, true); | 1609 CHECK_SHOULD_DRAW(draw, true); |
1610 | 1610 |
(...skipping 10 matching lines...) Expand all Loading... |
1621 SkAutoCachedTexture act(this, bitmap, NULL, &texture); | 1621 SkAutoCachedTexture act(this, bitmap, NULL, &texture); |
1622 | 1622 |
1623 SkImageFilter* filter = paint.getImageFilter(); | 1623 SkImageFilter* filter = paint.getImageFilter(); |
1624 // This bitmap will own the filtered result as a texture. | 1624 // This bitmap will own the filtered result as a texture. |
1625 SkBitmap filteredBitmap; | 1625 SkBitmap filteredBitmap; |
1626 | 1626 |
1627 if (NULL != filter) { | 1627 if (NULL != filter) { |
1628 SkIPoint offset = SkIPoint::Make(0, 0); | 1628 SkIPoint offset = SkIPoint::Make(0, 0); |
1629 SkMatrix matrix(*draw.fMatrix); | 1629 SkMatrix matrix(*draw.fMatrix); |
1630 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top)); | 1630 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top)); |
1631 if (filter_texture(this, fContext, texture, filter, w, h, matrix, &filte
redBitmap, | 1631 SkIRect clipBounds = SkIRect::MakeWH(bitmap.width(), bitmap.height()); |
| 1632 SkImageFilter::Context ctx(matrix, clipBounds); |
| 1633 if (filter_texture(this, fContext, texture, filter, w, h, ctx, &filtered
Bitmap, |
1632 &offset)) { | 1634 &offset)) { |
1633 texture = (GrTexture*) filteredBitmap.getTexture(); | 1635 texture = (GrTexture*) filteredBitmap.getTexture(); |
1634 w = filteredBitmap.width(); | 1636 w = filteredBitmap.width(); |
1635 h = filteredBitmap.height(); | 1637 h = filteredBitmap.height(); |
1636 left += offset.x(); | 1638 left += offset.x(); |
1637 top += offset.y(); | 1639 top += offset.y(); |
1638 } else { | 1640 } else { |
1639 return; | 1641 return; |
1640 } | 1642 } |
1641 } | 1643 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1727 int h = bm.height(); | 1729 int h = bm.height(); |
1728 | 1730 |
1729 SkImageFilter* filter = paint.getImageFilter(); | 1731 SkImageFilter* filter = paint.getImageFilter(); |
1730 // This bitmap will own the filtered result as a texture. | 1732 // This bitmap will own the filtered result as a texture. |
1731 SkBitmap filteredBitmap; | 1733 SkBitmap filteredBitmap; |
1732 | 1734 |
1733 if (NULL != filter) { | 1735 if (NULL != filter) { |
1734 SkIPoint offset = SkIPoint::Make(0, 0); | 1736 SkIPoint offset = SkIPoint::Make(0, 0); |
1735 SkMatrix matrix(*draw.fMatrix); | 1737 SkMatrix matrix(*draw.fMatrix); |
1736 matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); | 1738 matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); |
1737 if (filter_texture(this, fContext, devTex, filter, w, h, matrix, &filter
edBitmap, | 1739 SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height()); |
| 1740 SkImageFilter::Context ctx(matrix, clipBounds); |
| 1741 if (filter_texture(this, fContext, devTex, filter, w, h, ctx, &filteredB
itmap, |
1738 &offset)) { | 1742 &offset)) { |
1739 devTex = filteredBitmap.getTexture(); | 1743 devTex = filteredBitmap.getTexture(); |
1740 w = filteredBitmap.width(); | 1744 w = filteredBitmap.width(); |
1741 h = filteredBitmap.height(); | 1745 h = filteredBitmap.height(); |
1742 x += offset.fX; | 1746 x += offset.fX; |
1743 y += offset.fY; | 1747 y += offset.fY; |
1744 } else { | 1748 } else { |
1745 return; | 1749 return; |
1746 } | 1750 } |
1747 } | 1751 } |
(...skipping 16 matching lines...) Expand all Loading... |
1764 SK_Scalar1 * h / devTex->height()); | 1768 SK_Scalar1 * h / devTex->height()); |
1765 | 1769 |
1766 fContext->drawRectToRect(grPaint, dstRect, srcRect); | 1770 fContext->drawRectToRect(grPaint, dstRect, srcRect); |
1767 } | 1771 } |
1768 | 1772 |
1769 bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) { | 1773 bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) { |
1770 return filter->canFilterImageGPU(); | 1774 return filter->canFilterImageGPU(); |
1771 } | 1775 } |
1772 | 1776 |
1773 bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, | 1777 bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, |
1774 const SkMatrix& ctm, | 1778 const SkImageFilter::Context& ctx, |
1775 SkBitmap* result, SkIPoint* offset) { | 1779 SkBitmap* result, SkIPoint* offset) { |
1776 // want explicitly our impl, so guard against a subclass of us overriding it | 1780 // want explicitly our impl, so guard against a subclass of us overriding it |
1777 if (!this->SkGpuDevice::canHandleImageFilter(filter)) { | 1781 if (!this->SkGpuDevice::canHandleImageFilter(filter)) { |
1778 return false; | 1782 return false; |
1779 } | 1783 } |
1780 | 1784 |
1781 SkAutoLockPixels alp(src, !src.getTexture()); | 1785 SkAutoLockPixels alp(src, !src.getTexture()); |
1782 if (!src.getTexture() && !src.readyToDraw()) { | 1786 if (!src.getTexture() && !src.readyToDraw()) { |
1783 return false; | 1787 return false; |
1784 } | 1788 } |
1785 | 1789 |
1786 GrTexture* texture; | 1790 GrTexture* texture; |
1787 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup | 1791 // We assume here that the filter will not attempt to tile the src. Otherwis
e, this cache lookup |
1788 // must be pushed upstack. | 1792 // must be pushed upstack. |
1789 SkAutoCachedTexture act(this, src, NULL, &texture); | 1793 SkAutoCachedTexture act(this, src, NULL, &texture); |
1790 | 1794 |
1791 return filter_texture(this, fContext, texture, filter, src.width(), src.heig
ht(), ctm, result, | 1795 return filter_texture(this, fContext, texture, filter, src.width(), src.heig
ht(), ctx, |
1792 offset); | 1796 result, offset); |
1793 } | 1797 } |
1794 | 1798 |
1795 /////////////////////////////////////////////////////////////////////////////// | 1799 /////////////////////////////////////////////////////////////////////////////// |
1796 | 1800 |
1797 // must be in SkCanvas::VertexMode order | 1801 // must be in SkCanvas::VertexMode order |
1798 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { | 1802 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { |
1799 kTriangles_GrPrimitiveType, | 1803 kTriangles_GrPrimitiveType, |
1800 kTriangleStrip_GrPrimitiveType, | 1804 kTriangleStrip_GrPrimitiveType, |
1801 kTriangleFan_GrPrimitiveType, | 1805 kTriangleFan_GrPrimitiveType, |
1802 }; | 1806 }; |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1992 GrTexture* texture, | 1996 GrTexture* texture, |
1993 bool needClear) | 1997 bool needClear) |
1994 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { | 1998 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { |
1995 | 1999 |
1996 SkASSERT(texture && texture->asRenderTarget()); | 2000 SkASSERT(texture && texture->asRenderTarget()); |
1997 // This constructor is called from onCreateDevice. It has locked the RT in t
he texture | 2001 // This constructor is called from onCreateDevice. It has locked the RT in t
he texture |
1998 // cache. We pass true for the third argument so that it will get unlocked. | 2002 // cache. We pass true for the third argument so that it will get unlocked. |
1999 this->initFromRenderTarget(context, texture->asRenderTarget(), true); | 2003 this->initFromRenderTarget(context, texture->asRenderTarget(), true); |
2000 fNeedClear = needClear; | 2004 fNeedClear = needClear; |
2001 } | 2005 } |
OLD | NEW |