| 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" |
| 11 #include "effects/GrTextureDomain.h" | 11 #include "effects/GrTextureDomain.h" |
| 12 #include "effects/GrSimpleTextureEffect.h" | 12 #include "effects/GrSimpleTextureEffect.h" |
| 13 | 13 |
| 14 #include "GrContext.h" | 14 #include "GrContext.h" |
| 15 #include "GrBitmapTextContext.h" | 15 #include "GrBitmapTextContext.h" |
| 16 #if SK_DISTANCEFIELD_FONTS | 16 #if SK_DISTANCEFIELD_FONTS |
| 17 #include "GrDistanceFieldTextContext.h" | 17 #include "GrDistanceFieldTextContext.h" |
| 18 #endif | 18 #endif |
| 19 | 19 |
| 20 #include "SkGrTexturePixelRef.h" | 20 #include "SkGrTexturePixelRef.h" |
| 21 | 21 |
| 22 #include "SkBounder.h" |
| 22 #include "SkColorFilter.h" | 23 #include "SkColorFilter.h" |
| 23 #include "SkDeviceImageFilterProxy.h" | 24 #include "SkDeviceImageFilterProxy.h" |
| 24 #include "SkDrawProcs.h" | 25 #include "SkDrawProcs.h" |
| 25 #include "SkGlyphCache.h" | 26 #include "SkGlyphCache.h" |
| 26 #include "SkImageFilter.h" | 27 #include "SkImageFilter.h" |
| 28 #include "SkMaskFilter.h" |
| 27 #include "SkPathEffect.h" | 29 #include "SkPathEffect.h" |
| 28 #include "SkRRect.h" | 30 #include "SkRRect.h" |
| 29 #include "SkStroke.h" | 31 #include "SkStroke.h" |
| 30 #include "SkSurface.h" | 32 #include "SkSurface.h" |
| 31 #include "SkTLazy.h" | 33 #include "SkTLazy.h" |
| 32 #include "SkUtils.h" | 34 #include "SkUtils.h" |
| 33 #include "SkErrorInternals.h" | 35 #include "SkErrorInternals.h" |
| 34 | 36 |
| 35 #define CACHE_COMPATIBLE_DEVICE_TEXTURES 1 | 37 #define CACHE_COMPATIBLE_DEVICE_TEXTURES 1 |
| 36 | 38 |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 } | 734 } |
| 733 } | 735 } |
| 734 | 736 |
| 735 /////////////////////////////////////////////////////////////////////////////// | 737 /////////////////////////////////////////////////////////////////////////////// |
| 736 | 738 |
| 737 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, | 739 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, |
| 738 const SkPaint& paint) { | 740 const SkPaint& paint) { |
| 739 CHECK_FOR_ANNOTATION(paint); | 741 CHECK_FOR_ANNOTATION(paint); |
| 740 CHECK_SHOULD_DRAW(draw, false); | 742 CHECK_SHOULD_DRAW(draw, false); |
| 741 | 743 |
| 744 GrPaint grPaint; |
| 745 if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) { |
| 746 return; |
| 747 } |
| 748 |
| 749 SkStrokeRec stroke(paint); |
| 750 if (paint.getMaskFilter()) { |
| 751 // try to hit the fast path for drawing filtered round rects |
| 752 |
| 753 SkRRect devRRect; |
| 754 if (rect.transform(fContext->getMatrix(), &devRRect)) { |
| 755 if (devRRect.allCornersCircular()) { |
| 756 SkRect maskRect; |
| 757 if (paint.getMaskFilter()->canFilterMaskGPU(devRRect.rect(), |
| 758 draw.fClip->getBounds(), |
| 759 fContext->getMatrix(), |
| 760 &maskRect)) { |
| 761 SkIRect finalIRect; |
| 762 maskRect.roundOut(&finalIRect); |
| 763 if (draw.fClip->quickReject(finalIRect)) { |
| 764 // clipped out |
| 765 return; |
| 766 } |
| 767 if (NULL != draw.fBounder && !draw.fBounder->doIRect(finalIR
ect)) { |
| 768 // nothing to draw |
| 769 return; |
| 770 } |
| 771 if (paint.getMaskFilter()->directFilterRRectMaskGPU(fContext
, &grPaint, |
| 772 stroke,
devRRect)) { |
| 773 return; |
| 774 } |
| 775 } |
| 776 |
| 777 } |
| 778 } |
| 779 |
| 780 } |
| 781 |
| 742 bool usePath = !rect.isSimple(); | 782 bool usePath = !rect.isSimple(); |
| 743 // another two reasons we might need to call drawPath... | 783 // another two reasons we might need to call drawPath... |
| 744 if (paint.getMaskFilter() || paint.getPathEffect()) { | 784 if (paint.getMaskFilter() || paint.getPathEffect()) { |
| 745 usePath = true; | 785 usePath = true; |
| 746 } | 786 } |
| 747 // until we can rotate rrects... | 787 // until we can rotate rrects... |
| 748 if (!usePath && !fContext->getMatrix().rectStaysRect()) { | 788 if (!usePath && !fContext->getMatrix().rectStaysRect()) { |
| 749 usePath = true; | 789 usePath = true; |
| 750 } | 790 } |
| 751 | 791 |
| 752 if (usePath) { | 792 if (usePath) { |
| 753 SkPath path; | 793 SkPath path; |
| 754 path.addRRect(rect); | 794 path.addRRect(rect); |
| 755 this->drawPath(draw, path, paint, NULL, true); | 795 this->drawPath(draw, path, paint, NULL, true); |
| 756 return; | 796 return; |
| 757 } | 797 } |
| 758 | 798 |
| 759 GrPaint grPaint; | |
| 760 if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) { | |
| 761 return; | |
| 762 } | |
| 763 | |
| 764 SkStrokeRec stroke(paint); | |
| 765 fContext->drawRRect(grPaint, rect, stroke); | 799 fContext->drawRRect(grPaint, rect, stroke); |
| 766 } | 800 } |
| 767 | 801 |
| 768 /////////////////////////////////////////////////////////////////////////////// | 802 ///////////////////////////////////////////////////////////////////////////// |
| 769 | 803 |
| 770 void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, | 804 void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, |
| 771 const SkPaint& paint) { | 805 const SkPaint& paint) { |
| 772 CHECK_FOR_ANNOTATION(paint); | 806 CHECK_FOR_ANNOTATION(paint); |
| 773 CHECK_SHOULD_DRAW(draw, false); | 807 CHECK_SHOULD_DRAW(draw, false); |
| 774 | 808 |
| 775 bool usePath = false; | 809 bool usePath = false; |
| 776 // some basic reasons we might need to call drawPath... | 810 // some basic reasons we might need to call drawPath... |
| 777 if (paint.getMaskFilter() || paint.getPathEffect()) { | 811 if (paint.getMaskFilter() || paint.getPathEffect()) { |
| 778 usePath = true; | 812 usePath = true; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 if (draw.fClip->quickReject(finalIRect)) { | 1038 if (draw.fClip->quickReject(finalIRect)) { |
| 1005 // clipped out | 1039 // clipped out |
| 1006 return; | 1040 return; |
| 1007 } | 1041 } |
| 1008 if (NULL != draw.fBounder && !draw.fBounder->doIRect(finalIRect)) { | 1042 if (NULL != draw.fBounder && !draw.fBounder->doIRect(finalIRect)) { |
| 1009 // nothing to draw | 1043 // nothing to draw |
| 1010 return; | 1044 return; |
| 1011 } | 1045 } |
| 1012 | 1046 |
| 1013 if (paint.getMaskFilter()->directFilterMaskGPU(fContext, &grPaint, | 1047 if (paint.getMaskFilter()->directFilterMaskGPU(fContext, &grPaint, |
| 1014 SkStrokeRec(paint), *
devPathPtr)) { | 1048 stroke, *devPathPtr))
{ |
| 1015 // the mask filter was able to draw itself directly, so there's
nothing | 1049 // the mask filter was able to draw itself directly, so there's
nothing |
| 1016 // left to do. | 1050 // left to do. |
| 1017 return; | 1051 return; |
| 1018 } | 1052 } |
| 1019 | 1053 |
| 1020 GrAutoScratchTexture mask; | 1054 GrAutoScratchTexture mask; |
| 1021 | 1055 |
| 1022 if (create_mask_GPU(fContext, maskRect, *devPathPtr, stroke, | 1056 if (create_mask_GPU(fContext, maskRect, *devPathPtr, stroke, |
| 1023 grPaint.isAntiAlias(), &mask)) { | 1057 grPaint.isAntiAlias(), &mask)) { |
| 1024 GrTexture* filtered; | 1058 GrTexture* filtered; |
| (...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1970 GrTexture* texture, | 2004 GrTexture* texture, |
| 1971 bool needClear) | 2005 bool needClear) |
| 1972 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { | 2006 : SkBitmapDevice(make_bitmap(context, texture->asRenderTarget())) { |
| 1973 | 2007 |
| 1974 SkASSERT(texture && texture->asRenderTarget()); | 2008 SkASSERT(texture && texture->asRenderTarget()); |
| 1975 // This constructor is called from onCreateDevice. It has locked the RT in t
he texture | 2009 // This constructor is called from onCreateDevice. It has locked the RT in t
he texture |
| 1976 // cache. We pass true for the third argument so that it will get unlocked. | 2010 // cache. We pass true for the third argument so that it will get unlocked. |
| 1977 this->initFromRenderTarget(context, texture->asRenderTarget(), true); | 2011 this->initFromRenderTarget(context, texture->asRenderTarget(), true); |
| 1978 fNeedClear = needClear; | 2012 fNeedClear = needClear; |
| 1979 } | 2013 } |
| OLD | NEW |