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 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
966 SkDEBUGCODE(prePathMatrix = (const SkMatrix*)0x50FF8001;) | 1000 SkDEBUGCODE(prePathMatrix = (const SkMatrix*)0x50FF8001;) |
967 | 1001 |
968 SkStrokeRec stroke(paint); | 1002 SkStrokeRec stroke(paint); |
969 SkPathEffect* pathEffect = paint.getPathEffect(); | 1003 SkPathEffect* pathEffect = paint.getPathEffect(); |
970 const SkRect* cullRect = NULL; // TODO: what is our bounds? | 1004 const SkRect* cullRect = NULL; // TODO: what is our bounds? |
971 if (pathEffect && pathEffect->filterPath(effectPath.init(), *pathPtr, &strok e, | 1005 if (pathEffect && pathEffect->filterPath(effectPath.init(), *pathPtr, &strok e, |
972 cullRect)) { | 1006 cullRect)) { |
973 pathPtr = effectPath.get(); | 1007 pathPtr = effectPath.get(); |
974 pathIsMutable = true; | 1008 pathIsMutable = true; |
975 } | 1009 } |
976 | 1010 if |
bsalomon
2014/03/10 20:41:48
?
| |
977 if (paint.getMaskFilter()) { | 1011 (paint.getMaskFilter()) { |
978 if (!stroke.isHairlineStyle()) { | 1012 if (!stroke.isHairlineStyle()) { |
979 SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init(); | 1013 SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init(); |
980 if (stroke.applyToPath(strokedPath, *pathPtr)) { | 1014 if (stroke.applyToPath(strokedPath, *pathPtr)) { |
981 pathPtr = strokedPath; | 1015 pathPtr = strokedPath; |
982 pathIsMutable = true; | 1016 pathIsMutable = true; |
983 stroke.setFillStyle(); | 1017 stroke.setFillStyle(); |
984 } | 1018 } |
985 } | 1019 } |
986 | 1020 |
987 // avoid possibly allocating a new path in transform if we can | 1021 // avoid possibly allocating a new path in transform if we can |
(...skipping 16 matching lines...) Expand all 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 |