Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 920513003: Make filters use SkImage instead of SkBitmap Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/SkGpuDevice.h ('k') | src/image/SkImage.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "GrBitmapTextContext.h" 10 #include "GrBitmapTextContext.h"
(...skipping 1560 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 SkColor2GrColor(paint.getColor()); 1571 SkColor2GrColor(paint.getColor());
1572 SkPaint2GrPaintNoShader(this->context(), fRenderTarget, paint, paintColor, f alse, &grPaint); 1572 SkPaint2GrPaintNoShader(this->context(), fRenderTarget, paint, paintColor, f alse, &grPaint);
1573 1573
1574 fContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, viewMatrix, dst Rect, 1574 fContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, viewMatrix, dst Rect,
1575 paintRect); 1575 paintRect);
1576 } 1576 }
1577 1577
1578 bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture, 1578 bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture,
1579 const SkImageFilter* filter, 1579 const SkImageFilter* filter,
1580 const SkImageFilter::Context& ctx, 1580 const SkImageFilter::Context& ctx,
1581 SkBitmap* result, SkIPoint* offset) { 1581 SkAutoTUnref<const SkImage>& result, SkIPoint* o ffset) {
1582 SkASSERT(filter); 1582 SkASSERT(filter);
1583 1583
1584 // FIXME: plumb actual surface props such that we don't have to lie about th e flags here 1584 // FIXME: plumb actual surface props such that we don't have to lie about th e flags here
1585 // (https://code.google.com/p/skia/issues/detail?id=3148). 1585 // (https://code.google.com/p/skia/issues/detail?id=3148).
1586 SkDeviceImageFilterProxy proxy(this, SkSurfaceProps(0, getLeakyProperties(). pixelGeometry())); 1586 SkDeviceImageFilterProxy proxy(this, SkSurfaceProps(0, getLeakyProperties(). pixelGeometry()));
1587 1587
1588 if (filter->canFilterImageGPU()) { 1588 if (filter->canFilterImageGPU()) {
1589 SkBitmap filterInput; 1589 SkBitmap filterInput;
1590 wrap_surface(texture, &filterInput); 1590 wrap_surface(texture, &filterInput);
1591 return filter->filterImageGPU(&proxy, filterInput, ctx, result, offset); 1591 SkAutoTUnref<const SkImage> src(SkNewImageFromBitmapTexture(filterInput,
1592 texture->des c().fSampleCnt,
1593 SkSurface::k Yes_Budgeted));
1594 return filter->filterImageGPU(&proxy, src, ctx, result, offset);
1592 } else { 1595 } else {
1593 return false; 1596 return false;
1594 } 1597 }
1595 } 1598 }
1596 1599
1597 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, 1600 void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
1598 int left, int top, const SkPaint& paint) { 1601 int left, int top, const SkPaint& paint) {
1599 // drawSprite is defined to be in device coords. 1602 // drawSprite is defined to be in device coords.
1600 CHECK_SHOULD_DRAW(draw); 1603 CHECK_SHOULD_DRAW(draw);
1601 1604
(...skipping 24 matching lines...) Expand all
1626 this->internalDrawSprite(draw, texture, left, top, image.width(), image.heig ht(), paint); 1629 this->internalDrawSprite(draw, texture, left, top, image.width(), image.heig ht(), paint);
1627 } 1630 }
1628 1631
1629 void SkGpuDevice::internalDrawSprite(const SkDraw& draw, GrTexture* texture, 1632 void SkGpuDevice::internalDrawSprite(const SkDraw& draw, GrTexture* texture,
1630 int left, int top, int width, int height, 1633 int left, int top, int width, int height,
1631 const SkPaint& paint) { 1634 const SkPaint& paint) {
1632 1635
1633 SkAutoTUnref<GrTexture> src(SkRef(texture)); 1636 SkAutoTUnref<GrTexture> src(SkRef(texture));
1634 if (SkImageFilter* filter = paint.getImageFilter()) { 1637 if (SkImageFilter* filter = paint.getImageFilter()) {
1635 // This bitmap will own the filtered result as a texture. 1638 // This bitmap will own the filtered result as a texture.
1636 SkBitmap filteredBitmap; 1639 SkAutoTUnref<const SkImage> filteredImage;
1637 SkIPoint offset = SkIPoint::Make(0, 0); 1640 SkIPoint offset = SkIPoint::Make(0, 0);
1638 SkMatrix matrix(*draw.fMatrix); 1641 SkMatrix matrix(*draw.fMatrix);
1639 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top)); 1642 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top));
1640 SkIRect clipBounds = SkIRect::MakeWH(width, height); 1643 SkIRect clipBounds = SkIRect::MakeWH(width, height);
1641 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); 1644 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache());
1642 // This cache is transient, and is freed (along with all its contained 1645 // This cache is transient, and is freed (along with all its contained
1643 // textures) when it goes out of scope. 1646 // textures) when it goes out of scope.
1644 SkImageFilter::Context ctx(matrix, clipBounds, cache); 1647 SkImageFilter::Context ctx(matrix, clipBounds, cache);
1645 if (this->filterTexture(fContext, texture, filter, ctx, &filteredBitmap, 1648 if (this->filterTexture(fContext, texture, filter, ctx, filteredImage,
1646 &offset)) { 1649 &offset)) {
1647 src.reset(SkRef(filteredBitmap.getTexture())); 1650 src.reset(SkRef(filteredImage->getTexture()));
1648 width = filteredBitmap.width(); 1651 width = filteredImage->width();
1649 height = filteredBitmap.height(); 1652 height = filteredImage->height();
1650 left += offset.x(); 1653 left += offset.x();
1651 top += offset.y(); 1654 top += offset.y();
1652 } else { 1655 } else {
1653 return; 1656 return;
1654 } 1657 }
1655 } 1658 }
1656 1659
1657 GrPaint grPaint; 1660 GrPaint grPaint;
1658 grPaint.addColorTextureProcessor(src, SkMatrix::I()); 1661 grPaint.addColorTextureProcessor(src, SkMatrix::I());
1659 1662
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1735 } 1738 }
1736 GrTexture* devTex = devImage->getTexture(); 1739 GrTexture* devTex = devImage->getTexture();
1737 if (NULL == devTex) { 1740 if (NULL == devTex) {
1738 return; 1741 return;
1739 } 1742 }
1740 1743
1741 int w = devImage->width(); 1744 int w = devImage->width();
1742 int h = devImage->height(); 1745 int h = devImage->height();
1743 1746
1744 SkImageFilter* filter = paint.getImageFilter(); 1747 SkImageFilter* filter = paint.getImageFilter();
1745 // This bitmap will own the filtered result as a texture. 1748 SkAutoTUnref<const SkImage> filteredImage;
1746 SkBitmap filteredBitmap;
1747 1749
1748 if (filter) { 1750 if (filter) {
1749 SkIPoint offset = SkIPoint::Make(0, 0); 1751 SkIPoint offset = SkIPoint::Make(0, 0);
1750 SkMatrix matrix(*draw.fMatrix); 1752 SkMatrix matrix(*draw.fMatrix);
1751 matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); 1753 matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y));
1752 SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height()); 1754 SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height());
1753 // This cache is transient, and is freed (along with all its contained 1755 // This cache is transient, and is freed (along with all its contained
1754 // textures) when it goes out of scope. 1756 // textures) when it goes out of scope.
1755 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache()); 1757 SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache());
1756 SkImageFilter::Context ctx(matrix, clipBounds, cache); 1758 SkImageFilter::Context ctx(matrix, clipBounds, cache);
1757 if (this->filterTexture(fContext, devTex, filter, ctx, &filteredBitmap, 1759 if (this->filterTexture(fContext, devTex, filter, ctx, filteredImage,
1758 &offset)) { 1760 &offset)) {
1759 devTex = filteredBitmap.getTexture(); 1761 devTex = filteredImage->getTexture();
1760 w = filteredBitmap.width(); 1762 w = filteredImage->width();
1761 h = filteredBitmap.height(); 1763 h = filteredImage->height();
1762 x += offset.fX; 1764 x += offset.fX;
1763 y += offset.fY; 1765 y += offset.fY;
1764 } else { 1766 } else {
1765 return; 1767 return;
1766 } 1768 }
1767 } 1769 }
1768 // drawDevice is defined to be in device coords. 1770 // drawDevice is defined to be in device coords.
1769 CHECK_SHOULD_DRAW(draw); 1771 CHECK_SHOULD_DRAW(draw);
1770 1772
1771 GrPaint grPaint; 1773 GrPaint grPaint;
(...skipping 13 matching lines...) Expand all
1785 SK_Scalar1 * h / devTex->height()); 1787 SK_Scalar1 * h / devTex->height());
1786 1788
1787 fContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, SkMatrix::I(), dstRect, 1789 fContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, SkMatrix::I(), dstRect,
1788 srcRect); 1790 srcRect);
1789 } 1791 }
1790 1792
1791 bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) { 1793 bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) {
1792 return filter->canFilterImageGPU(); 1794 return filter->canFilterImageGPU();
1793 } 1795 }
1794 1796
1795 bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, 1797 bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkImage* src,
1796 const SkImageFilter::Context& ctx, 1798 const SkImageFilter::Context& ctx,
1797 SkBitmap* result, SkIPoint* offset) { 1799 SkAutoTUnref<const SkImage>& result, SkIPoint* off set) {
1798 // want explicitly our impl, so guard against a subclass of us overriding it 1800 // want explicitly our impl, so guard against a subclass of us overriding it
1799 if (!this->SkGpuDevice::canHandleImageFilter(filter)) { 1801 if (!this->SkGpuDevice::canHandleImageFilter(filter)) {
1800 return false; 1802 return false;
1801 } 1803 }
1802 1804
1803 SkAutoLockPixels alp(src, !src.getTexture()); 1805 //TODO: SkAutoLockPixels alp(src, !src.getTexture());
1804 if (!src.getTexture() && !src.readyToDraw()) { 1806 //TODO: if !src->readyToDraw()
1805 return false;
1806 }
1807 1807
1808 GrTexture* texture; 1808 GrTexture* texture;
1809 // We assume here that the filter will not attempt to tile the src. Otherwis e, this cache lookup 1809 // We assume here that the filter will not attempt to tile the src. Otherwis e, this cache lookup
1810 // must be pushed upstack. 1810 // must be pushed upstack.
1811 AutoBitmapTexture abt(fContext, src, NULL, &texture); 1811 AutoBitmapTexture abt(fContext, src, NULL, &texture);
1812 if (!texture) {
1813 return false;
1814 }
1812 1815
1813 return this->filterTexture(fContext, texture, filter, ctx, result, offset); 1816 return this->filterTexture(fContext, texture, filter, ctx, result, offset);
1814 } 1817 }
1815 1818
1816 /////////////////////////////////////////////////////////////////////////////// 1819 ///////////////////////////////////////////////////////////////////////////////
1817 1820
1818 // must be in SkCanvas::VertexMode order 1821 // must be in SkCanvas::VertexMode order
1819 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { 1822 static const GrPrimitiveType gVertexMode2PrimitiveType[] = {
1820 kTriangles_GrPrimitiveType, 1823 kTriangles_GrPrimitiveType,
1821 kTriangleStrip_GrPrimitiveType, 1824 kTriangleStrip_GrPrimitiveType,
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
2113 #endif 2116 #endif
2114 } 2117 }
2115 2118
2116 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { 2119 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
2117 // We always return a transient cache, so it is freed after each 2120 // We always return a transient cache, so it is freed after each
2118 // filter traversal. 2121 // filter traversal.
2119 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); 2122 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize);
2120 } 2123 }
2121 2124
2122 #endif 2125 #endif
OLDNEW
« no previous file with comments | « src/gpu/SkGpuDevice.h ('k') | src/image/SkImage.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698