OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
11 | 11 |
12 #include "effects/GrSingleTextureEffect.h" | 12 #include "effects/GrSingleTextureEffect.h" |
13 #include "effects/GrConfigConversionEffect.h" | 13 #include "effects/GrConfigConversionEffect.h" |
14 | 14 |
15 #include "GrAARectRenderer.h" | 15 #include "GrAARectRenderer.h" |
16 #include "GrBufferAllocPool.h" | 16 #include "GrBufferAllocPool.h" |
17 #include "GrGpu.h" | 17 #include "GrGpu.h" |
18 #include "GrDrawTargetCaps.h" | 18 #include "GrDrawTargetCaps.h" |
19 #include "GrIndexBuffer.h" | 19 #include "GrIndexBuffer.h" |
20 #include "GrInOrderDrawBuffer.h" | 20 #include "GrInOrderDrawBuffer.h" |
21 #include "GrOvalRenderer.h" | 21 #include "GrOvalRenderer.h" |
22 #include "GrPathRenderer.h" | 22 #include "GrPathRenderer.h" |
23 #include "GrPathUtils.h" | 23 #include "GrPathUtils.h" |
24 #include "GrResourceCache.h" | 24 #include "GrResourceCache.h" |
25 #include "GrSoftwarePathRenderer.h" | 25 #include "GrSoftwarePathRenderer.h" |
26 #include "GrStencilBuffer.h" | 26 #include "GrStencilBuffer.h" |
27 #include "GrTextStrike.h" | 27 #include "GrTextStrike.h" |
28 #include "SkDrawProcs.h" | |
29 #include "SkRTConf.h" | 28 #include "SkRTConf.h" |
30 #include "SkRRect.h" | 29 #include "SkRRect.h" |
31 #include "SkStrokeRec.h" | 30 #include "SkStrokeRec.h" |
32 #include "SkTLazy.h" | 31 #include "SkTLazy.h" |
33 #include "SkTLS.h" | 32 #include "SkTLS.h" |
34 #include "SkTrace.h" | 33 #include "SkTrace.h" |
35 | 34 |
36 SK_DEFINE_INST_COUNT(GrContext) | 35 SK_DEFINE_INST_COUNT(GrContext) |
37 SK_DEFINE_INST_COUNT(GrDrawState) | 36 SK_DEFINE_INST_COUNT(GrDrawState) |
38 | 37 |
39 // It can be useful to set this to false to test whether a bug is caused by usin
g the | 38 // It can be useful to set this to false to test whether a bug is caused by usin
g the |
40 // InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffe
r, or to make | 39 // InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffe
r, or to make |
41 // debugging simpler. | 40 // debugging simpler. |
42 SK_CONF_DECLARE(bool, c_Defer, "gpu.deferContext", true, | 41 SK_CONF_DECLARE(bool, c_Defer, "gpu.deferContext", true, |
43 "Defers rendering in GrContext via GrInOrderDrawBuffer."); | 42 "Defers rendering in GrContext via GrInOrderDrawBuffer."); |
44 | 43 |
45 #define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw) | 44 #define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw) |
46 | 45 |
| 46 // When we're using coverage AA but the blend is incompatible (given gpu |
| 47 // limitations) should we disable AA or draw wrong? |
| 48 #define DISABLE_COVERAGE_AA_FOR_BLEND 1 |
| 49 |
47 #ifdef SK_DEBUG | 50 #ifdef SK_DEBUG |
48 // change this to a 1 to see notifications when partial coverage fails | 51 // change this to a 1 to see notifications when partial coverage fails |
49 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0 | 52 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0 |
50 #else | 53 #else |
51 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0 | 54 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0 |
52 #endif | 55 #endif |
53 | 56 |
54 static const size_t MAX_RESOURCE_CACHE_COUNT = GR_DEFAULT_RESOURCE_CACHE_COUNT_L
IMIT; | 57 static const size_t MAX_RESOURCE_CACHE_COUNT = GR_DEFAULT_RESOURCE_CACHE_COUNT_L
IMIT; |
55 static const size_t MAX_RESOURCE_CACHE_BYTES = GR_DEFAULT_RESOURCE_CACHE_MB_LIMI
T * 1024 * 1024; | 58 static const size_t MAX_RESOURCE_CACHE_BYTES = GR_DEFAULT_RESOURCE_CACHE_MB_LIMI
T * 1024 * 1024; |
56 | 59 |
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 } | 688 } |
686 | 689 |
687 #ifdef SK_DEVELOPER | 690 #ifdef SK_DEVELOPER |
688 void GrContext::dumpFontCache() const { | 691 void GrContext::dumpFontCache() const { |
689 fFontCache->dump(); | 692 fFontCache->dump(); |
690 } | 693 } |
691 #endif | 694 #endif |
692 | 695 |
693 //////////////////////////////////////////////////////////////////////////////// | 696 //////////////////////////////////////////////////////////////////////////////// |
694 | 697 |
| 698 namespace { |
| 699 inline bool disable_coverage_aa_for_blend(GrDrawTarget* target) { |
| 700 return DISABLE_COVERAGE_AA_FOR_BLEND && !target->canApplyCoverage(); |
| 701 } |
| 702 } |
| 703 |
| 704 //////////////////////////////////////////////////////////////////////////////// |
| 705 |
695 /* create a triangle strip that strokes the specified triangle. There are 8 | 706 /* create a triangle strip that strokes the specified triangle. There are 8 |
696 unique vertices, but we repreat the last 2 to close up. Alternatively we | 707 unique vertices, but we repreat the last 2 to close up. Alternatively we |
697 could use an indices array, and then only send 8 verts, but not sure that | 708 could use an indices array, and then only send 8 verts, but not sure that |
698 would be faster. | 709 would be faster. |
699 */ | 710 */ |
700 static void setStrokeRectStrip(GrPoint verts[10], SkRect rect, | 711 static void setStrokeRectStrip(GrPoint verts[10], SkRect rect, |
701 SkScalar width) { | 712 SkScalar width) { |
702 const SkScalar rad = SkScalarHalf(width); | 713 const SkScalar rad = SkScalarHalf(width); |
703 rect.sort(); | 714 rect.sort(); |
704 | 715 |
(...skipping 23 matching lines...) Expand all Loading... |
728 // we use a simple coverage ramp to do aa on axis-aligned rects | 739 // we use a simple coverage ramp to do aa on axis-aligned rects |
729 // we check if the rect will be axis-aligned, and the rect won't land on | 740 // we check if the rect will be axis-aligned, and the rect won't land on |
730 // integer coords. | 741 // integer coords. |
731 | 742 |
732 // we are keeping around the "tweak the alpha" trick because | 743 // we are keeping around the "tweak the alpha" trick because |
733 // it is our only hope for the fixed-pipe implementation. | 744 // it is our only hope for the fixed-pipe implementation. |
734 // In a shader implementation we can give a separate coverage input | 745 // In a shader implementation we can give a separate coverage input |
735 // TODO: remove this ugliness when we drop the fixed-pipe impl | 746 // TODO: remove this ugliness when we drop the fixed-pipe impl |
736 *useVertexCoverage = false; | 747 *useVertexCoverage = false; |
737 if (!target->getDrawState().canTweakAlphaForCoverage()) { | 748 if (!target->getDrawState().canTweakAlphaForCoverage()) { |
738 if (target->shouldDisableCoverageAAForBlend()) { | 749 if (disable_coverage_aa_for_blend(target)) { |
739 #ifdef SK_DEBUG | 750 #ifdef SK_DEBUG |
740 //GrPrintf("Turning off AA to correctly apply blend.\n"); | 751 //GrPrintf("Turning off AA to correctly apply blend.\n"); |
741 #endif | 752 #endif |
742 return false; | 753 return false; |
743 } else { | 754 } else { |
744 *useVertexCoverage = true; | 755 *useVertexCoverage = true; |
745 } | 756 } |
746 } | 757 } |
747 const GrDrawState& drawState = target->getDrawState(); | 758 const GrDrawState& drawState = target->getDrawState(); |
748 if (drawState.getRenderTarget()->isMultisampled()) { | 759 if (drawState.getRenderTarget()->isMultisampled()) { |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 const SkRRect& rect, | 1027 const SkRRect& rect, |
1017 const SkStrokeRec& stroke) { | 1028 const SkStrokeRec& stroke) { |
1018 if (rect.isEmpty()) { | 1029 if (rect.isEmpty()) { |
1019 return; | 1030 return; |
1020 } | 1031 } |
1021 | 1032 |
1022 AutoRestoreEffects are; | 1033 AutoRestoreEffects are; |
1023 AutoCheckFlush acf(this); | 1034 AutoCheckFlush acf(this); |
1024 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); | 1035 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
1025 | 1036 |
1026 if (!fOvalRenderer->drawSimpleRRect(target, this, paint.isAntiAlias(), rect,
stroke)) { | 1037 bool useAA = paint.isAntiAlias() && |
| 1038 !target->getDrawState().getRenderTarget()->isMultisampled() && |
| 1039 !disable_coverage_aa_for_blend(target); |
| 1040 |
| 1041 if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) { |
1027 SkPath path; | 1042 SkPath path; |
1028 path.addRRect(rect); | 1043 path.addRRect(rect); |
1029 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); | 1044 this->internalDrawPath(target, useAA, path, stroke); |
1030 } | 1045 } |
1031 } | 1046 } |
1032 | 1047 |
1033 /////////////////////////////////////////////////////////////////////////////// | 1048 /////////////////////////////////////////////////////////////////////////////// |
1034 | 1049 |
1035 void GrContext::drawOval(const GrPaint& paint, | 1050 void GrContext::drawOval(const GrPaint& paint, |
1036 const SkRect& oval, | 1051 const SkRect& oval, |
1037 const SkStrokeRec& stroke) { | 1052 const SkStrokeRec& stroke) { |
1038 if (oval.isEmpty()) { | 1053 if (oval.isEmpty()) { |
1039 return; | 1054 return; |
1040 } | 1055 } |
1041 | 1056 |
1042 AutoRestoreEffects are; | 1057 AutoRestoreEffects are; |
1043 AutoCheckFlush acf(this); | 1058 AutoCheckFlush acf(this); |
1044 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); | 1059 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
1045 | 1060 |
1046 if (!fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), oval, stroke
)) { | 1061 bool useAA = paint.isAntiAlias() && |
| 1062 !target->getDrawState().getRenderTarget()->isMultisampled() && |
| 1063 !disable_coverage_aa_for_blend(target); |
| 1064 |
| 1065 if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) { |
1047 SkPath path; | 1066 SkPath path; |
1048 path.addOval(oval); | 1067 path.addOval(oval); |
1049 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); | 1068 this->internalDrawPath(target, useAA, path, stroke); |
1050 } | 1069 } |
1051 } | 1070 } |
1052 | 1071 |
1053 // Can 'path' be drawn as a pair of filled nested rectangles? | 1072 // Can 'path' be drawn as a pair of filled nested rectangles? |
1054 static bool is_nested_rects(GrDrawTarget* target, | 1073 static bool is_nested_rects(GrDrawTarget* target, |
1055 const SkPath& path, | 1074 const SkPath& path, |
1056 const SkStrokeRec& stroke, | 1075 const SkStrokeRec& stroke, |
1057 SkRect rects[2], | 1076 SkRect rects[2], |
1058 bool* useVertexCoverage) { | 1077 bool* useVertexCoverage) { |
1059 SkASSERT(stroke.isFillStyle()); | 1078 SkASSERT(stroke.isFillStyle()); |
1060 | 1079 |
1061 if (path.isInverseFillType()) { | 1080 if (path.isInverseFillType()) { |
1062 return false; | 1081 return false; |
1063 } | 1082 } |
1064 | 1083 |
1065 const GrDrawState& drawState = target->getDrawState(); | 1084 const GrDrawState& drawState = target->getDrawState(); |
1066 | 1085 |
1067 // TODO: this restriction could be lifted if we were willing to apply | 1086 // TODO: this restriction could be lifted if we were willing to apply |
1068 // the matrix to all the points individually rather than just to the rect | 1087 // the matrix to all the points individually rather than just to the rect |
1069 if (!drawState.getViewMatrix().preservesAxisAlignment()) { | 1088 if (!drawState.getViewMatrix().preservesAxisAlignment()) { |
1070 return false; | 1089 return false; |
1071 } | 1090 } |
1072 | 1091 |
1073 *useVertexCoverage = false; | 1092 *useVertexCoverage = false; |
1074 if (!target->getDrawState().canTweakAlphaForCoverage()) { | 1093 if (!target->getDrawState().canTweakAlphaForCoverage()) { |
1075 if (target->shouldDisableCoverageAAForBlend()) { | 1094 if (disable_coverage_aa_for_blend(target)) { |
1076 return false; | 1095 return false; |
1077 } else { | 1096 } else { |
1078 *useVertexCoverage = true; | 1097 *useVertexCoverage = true; |
1079 } | 1098 } |
1080 } | 1099 } |
1081 | 1100 |
1082 SkPath::Direction dirs[2]; | 1101 SkPath::Direction dirs[2]; |
1083 if (!path.isNestedRects(rects, dirs)) { | 1102 if (!path.isNestedRects(rects, dirs)) { |
1084 return false; | 1103 return false; |
1085 } | 1104 } |
(...skipping 29 matching lines...) Expand all Loading... |
1115 } | 1134 } |
1116 | 1135 |
1117 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 1136 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
1118 // Scratch textures can be recycled after they are returned to the texture | 1137 // Scratch textures can be recycled after they are returned to the texture |
1119 // cache. This presents a potential hazard for buffered drawing. However, | 1138 // cache. This presents a potential hazard for buffered drawing. However, |
1120 // the writePixels that uploads to the scratch will perform a flush so we're | 1139 // the writePixels that uploads to the scratch will perform a flush so we're |
1121 // OK. | 1140 // OK. |
1122 AutoRestoreEffects are; | 1141 AutoRestoreEffects are; |
1123 AutoCheckFlush acf(this); | 1142 AutoCheckFlush acf(this); |
1124 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); | 1143 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
1125 GrDrawState* drawState = target->drawState(); | |
1126 | 1144 |
1127 bool useCoverageAA = paint.isAntiAlias() && !drawState->getRenderTarget()->i
sMultisampled(); | 1145 bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget(
)->isMultisampled(); |
1128 | 1146 if (useAA && stroke.getWidth() < 0 && !path.isConvex()) { |
1129 if (useCoverageAA && stroke.getWidth() < 0 && !path.isConvex()) { | |
1130 // Concave AA paths are expensive - try to avoid them for special cases | 1147 // Concave AA paths are expensive - try to avoid them for special cases |
1131 bool useVertexCoverage; | 1148 bool useVertexCoverage; |
1132 SkRect rects[2]; | 1149 SkRect rects[2]; |
1133 | 1150 |
1134 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { | 1151 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { |
1135 SkMatrix origViewMatrix = drawState->getViewMatrix(); | 1152 SkMatrix origViewMatrix = target->getDrawState().getViewMatrix(); |
1136 GrDrawState::AutoViewMatrixRestore avmr; | 1153 GrDrawState::AutoViewMatrixRestore avmr; |
1137 if (!avmr.setIdentity(target->drawState())) { | 1154 if (!avmr.setIdentity(target->drawState())) { |
1138 return; | 1155 return; |
1139 } | 1156 } |
1140 | 1157 |
1141 fAARectRenderer->fillAANestedRects(this->getGpu(), target, | 1158 fAARectRenderer->fillAANestedRects(this->getGpu(), target, |
1142 rects, | 1159 rects, |
1143 origViewMatrix, | 1160 origViewMatrix, |
1144 useVertexCoverage); | 1161 useVertexCoverage); |
1145 return; | 1162 return; |
1146 } | 1163 } |
1147 } | 1164 } |
1148 | 1165 |
1149 SkRect ovalRect; | 1166 SkRect ovalRect; |
1150 bool isOval = path.isOval(&ovalRect); | 1167 bool isOval = path.isOval(&ovalRect); |
1151 | 1168 |
1152 if (!isOval || path.isInverseFillType() | 1169 if (!isOval || path.isInverseFillType() |
1153 || !fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), ovalRect,
stroke)) { | 1170 || !fOvalRenderer->drawOval(target, this, useAA, ovalRect, stroke)) { |
1154 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); | 1171 this->internalDrawPath(target, useAA, path, stroke); |
1155 } | 1172 } |
1156 } | 1173 } |
1157 | 1174 |
1158 namespace { | 1175 void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath&
path, |
1159 // See also: SkDrawTreatAsHairline. | 1176 const SkStrokeRec& stroke) { |
1160 static inline bool should_convert_to_hairline(bool useAA, const SkStrokeRec& str
oke, | |
1161 const SkMatrix& matrix, SkScalar*
coverage) { | |
1162 | |
1163 if (stroke.getStyle() != SkStrokeRec::kStroke_Style) { | |
1164 return false; | |
1165 } | |
1166 | |
1167 SkASSERT(0 != stroke.getWidth()); | |
1168 | |
1169 if (!useAA) { | |
1170 return false; | |
1171 } | |
1172 | |
1173 return SkDrawTreatAAStrokeAsHairline(stroke.getWidth(), matrix, coverage); | |
1174 } | |
1175 } | |
1176 | |
1177 | |
1178 void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, | |
1179 const SkPath& path, const SkStrokeRec& origStro
ke) { | |
1180 SkASSERT(!path.isEmpty()); | 1177 SkASSERT(!path.isEmpty()); |
1181 | 1178 |
1182 // An Assumption here is that path renderer would use some form of tweaking | 1179 // An Assumption here is that path renderer would use some form of tweaking |
1183 // the src color (either the input alpha or in the frag shader) to implement | 1180 // the src color (either the input alpha or in the frag shader) to implement |
1184 // aa. If we have some future driver-mojo path AA that can do the right | 1181 // aa. If we have some future driver-mojo path AA that can do the right |
1185 // thing WRT to the blend then we'll need some query on the PR. | 1182 // thing WRT to the blend then we'll need some query on the PR. |
1186 bool useCoverageAA = useAA && | 1183 if (disable_coverage_aa_for_blend(target)) { |
1187 !target->getDrawState().getRenderTarget()->isMultisampled() && | 1184 #ifdef SK_DEBUG |
1188 !target->shouldDisableCoverageAAForBlend(); | 1185 //GrPrintf("Turning off AA to correctly apply blend.\n"); |
1189 | 1186 #endif |
1190 SkTCopyOnFirstWrite<SkStrokeRec> stroke(origStroke); | 1187 useAA = false; |
1191 // Can we treat a thin stroke as a hairline w/ coverage? If we can, we draw
lots faster (raster | |
1192 // device does this same test). | |
1193 | |
1194 // Do not do this if gpu supports path rendering natively and we might be us
ing the support | |
1195 // (useCoverageAA == false). Hairline renderer is likely to be slow due to p
rogram switches. | |
1196 if (!useCoverageAA || !fGpu->caps()->pathRenderingSupport()) { | |
1197 SkScalar hairlineCoverage; | |
1198 if (should_convert_to_hairline(useAA, *stroke, this->getMatrix(), &hairl
ineCoverage)) { | |
1199 target->drawState()->setCoverage(SkScalarRoundToInt(hairlineCoverage
* target->getDrawState().getCoverage())); | |
1200 stroke.writable()->setHairlineStyle(); | |
1201 } | |
1202 } | 1188 } |
1203 | 1189 |
1204 GrPathRendererChain::DrawType type = | 1190 GrPathRendererChain::DrawType type = useAA ? GrPathRendererChain::kColorAnti
Alias_DrawType : |
1205 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : | 1191 GrPathRendererChain::kColor_Dra
wType; |
1206 GrPathRendererChain::kColor_DrawType; | |
1207 | 1192 |
1208 const SkPath* pathPtr = &path; | 1193 const SkPath* pathPtr = &path; |
1209 SkPath tmpPath; | 1194 SkPath tmpPath; |
| 1195 SkStrokeRec strokeRec(stroke); |
1210 | 1196 |
1211 // Try a 1st time without stroking the path and without allowing the SW rend
erer | 1197 // Try a 1st time without stroking the path and without allowing the SW rend
erer |
1212 GrPathRenderer* pr = this->getPathRenderer(*pathPtr, *stroke, target, false,
type); | 1198 GrPathRenderer* pr = this->getPathRenderer(*pathPtr, strokeRec, target, fals
e, type); |
1213 | 1199 |
1214 if (NULL == pr) { | 1200 if (NULL == pr) { |
1215 if (!stroke->isHairlineStyle()) { | 1201 if (!strokeRec.isHairlineStyle()) { |
1216 // It didn't work the 1st time, so try again with the stroked path | 1202 // It didn't work the 1st time, so try again with the stroked path |
1217 if (stroke->applyToPath(&tmpPath, *pathPtr)) { | 1203 if (strokeRec.applyToPath(&tmpPath, *pathPtr)) { |
1218 pathPtr = &tmpPath; | 1204 pathPtr = &tmpPath; |
1219 stroke.writable()->setFillStyle(); | 1205 strokeRec.setFillStyle(); |
1220 } | 1206 } |
1221 } | 1207 } |
1222 if (pathPtr->isEmpty()) { | 1208 if (pathPtr->isEmpty()) { |
1223 return; | 1209 return; |
1224 } | 1210 } |
1225 | 1211 |
1226 // This time, allow SW renderer | 1212 // This time, allow SW renderer |
1227 pr = this->getPathRenderer(*pathPtr, *stroke, target, true, type); | 1213 pr = this->getPathRenderer(*pathPtr, strokeRec, target, true, type); |
1228 } | 1214 } |
1229 | 1215 |
1230 if (NULL == pr) { | 1216 if (NULL == pr) { |
1231 #ifdef SK_DEBUG | 1217 #ifdef SK_DEBUG |
1232 GrPrintf("Unable to find path renderer compatible with path.\n"); | 1218 GrPrintf("Unable to find path renderer compatible with path.\n"); |
1233 #endif | 1219 #endif |
1234 return; | 1220 return; |
1235 } | 1221 } |
1236 | 1222 |
1237 pr->drawPath(*pathPtr, *stroke, target, useCoverageAA); | 1223 pr->drawPath(*pathPtr, strokeRec, target, useAA); |
1238 } | 1224 } |
1239 | 1225 |
1240 //////////////////////////////////////////////////////////////////////////////// | 1226 //////////////////////////////////////////////////////////////////////////////// |
1241 | 1227 |
1242 void GrContext::flush(int flagsBitfield) { | 1228 void GrContext::flush(int flagsBitfield) { |
1243 if (NULL == fDrawBuffer) { | 1229 if (NULL == fDrawBuffer) { |
1244 return; | 1230 return; |
1245 } | 1231 } |
1246 | 1232 |
1247 if (kDiscard_FlushBit & flagsBitfield) { | 1233 if (kDiscard_FlushBit & flagsBitfield) { |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1843 } | 1829 } |
1844 return path; | 1830 return path; |
1845 } | 1831 } |
1846 | 1832 |
1847 /////////////////////////////////////////////////////////////////////////////// | 1833 /////////////////////////////////////////////////////////////////////////////// |
1848 #if GR_CACHE_STATS | 1834 #if GR_CACHE_STATS |
1849 void GrContext::printCacheStats() const { | 1835 void GrContext::printCacheStats() const { |
1850 fTextureCache->printStats(); | 1836 fTextureCache->printStats(); |
1851 } | 1837 } |
1852 #endif | 1838 #endif |
OLD | NEW |