| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 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 #include "GrGLPath.h" | 9 #include "GrGLPath.h" |
| 10 #include "GrGLPathRendering.h" | 10 #include "GrGLPathRendering.h" |
| 11 #include "GrGpuGL.h" | 11 #include "GrGpuGL.h" |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 inline GrGLubyte verb_to_gl_path_cmd(SkPath::Verb verb) { | 14 inline GrGLubyte verb_to_gl_path_cmd(SkPath::Verb verb) { |
| 15 static const GrGLubyte gTable[] = { | 15 static const GrGLubyte gTable[] = { |
| 16 GR_GL_MOVE_TO, | 16 GR_GL_MOVE_TO, |
| 17 GR_GL_LINE_TO, | 17 GR_GL_LINE_TO, |
| 18 GR_GL_QUADRATIC_CURVE_TO, | 18 GR_GL_QUADRATIC_CURVE_TO, |
| 19 0xFF, // conic | 19 GR_GL_CONIC_CURVE_TO, |
| 20 GR_GL_CUBIC_CURVE_TO, | 20 GR_GL_CUBIC_CURVE_TO, |
| 21 GR_GL_CLOSE_PATH, | 21 GR_GL_CLOSE_PATH, |
| 22 }; | 22 }; |
| 23 GR_STATIC_ASSERT(0 == SkPath::kMove_Verb); | 23 GR_STATIC_ASSERT(0 == SkPath::kMove_Verb); |
| 24 GR_STATIC_ASSERT(1 == SkPath::kLine_Verb); | 24 GR_STATIC_ASSERT(1 == SkPath::kLine_Verb); |
| 25 GR_STATIC_ASSERT(2 == SkPath::kQuad_Verb); | 25 GR_STATIC_ASSERT(2 == SkPath::kQuad_Verb); |
| 26 GR_STATIC_ASSERT(3 == SkPath::kConic_Verb); |
| 26 GR_STATIC_ASSERT(4 == SkPath::kCubic_Verb); | 27 GR_STATIC_ASSERT(4 == SkPath::kCubic_Verb); |
| 27 GR_STATIC_ASSERT(5 == SkPath::kClose_Verb); | 28 GR_STATIC_ASSERT(5 == SkPath::kClose_Verb); |
| 28 | 29 |
| 29 SkASSERT(verb >= 0 && (size_t)verb < SK_ARRAY_COUNT(gTable)); | 30 SkASSERT(verb >= 0 && (size_t)verb < SK_ARRAY_COUNT(gTable)); |
| 30 return gTable[verb]; | 31 return gTable[verb]; |
| 31 } | 32 } |
| 32 | 33 |
| 33 #ifdef SK_DEBUG | |
| 34 inline int num_pts(SkPath::Verb verb) { | 34 inline int num_pts(SkPath::Verb verb) { |
| 35 static const int gTable[] = { | 35 static const int gTable[] = { |
| 36 1, // move | 36 1, // move |
| 37 1, // line | 37 1, // line |
| 38 2, // quad | 38 2, // quad |
| 39 2, // conic | 39 2, // conic |
| 40 3, // cubic | 40 3, // cubic |
| 41 0, // close | 41 0, // close |
| 42 }; | 42 }; |
| 43 GR_STATIC_ASSERT(0 == SkPath::kMove_Verb); | 43 GR_STATIC_ASSERT(0 == SkPath::kMove_Verb); |
| 44 GR_STATIC_ASSERT(1 == SkPath::kLine_Verb); | 44 GR_STATIC_ASSERT(1 == SkPath::kLine_Verb); |
| 45 GR_STATIC_ASSERT(2 == SkPath::kQuad_Verb); | 45 GR_STATIC_ASSERT(2 == SkPath::kQuad_Verb); |
| 46 GR_STATIC_ASSERT(3 == SkPath::kConic_Verb); |
| 46 GR_STATIC_ASSERT(4 == SkPath::kCubic_Verb); | 47 GR_STATIC_ASSERT(4 == SkPath::kCubic_Verb); |
| 47 GR_STATIC_ASSERT(5 == SkPath::kClose_Verb); | 48 GR_STATIC_ASSERT(5 == SkPath::kClose_Verb); |
| 48 | 49 |
| 49 SkASSERT(verb >= 0 && (size_t)verb < SK_ARRAY_COUNT(gTable)); | 50 SkASSERT(verb >= 0 && (size_t)verb < SK_ARRAY_COUNT(gTable)); |
| 50 return gTable[verb]; | 51 return gTable[verb]; |
| 51 } | 52 } |
| 52 #endif | |
| 53 | 53 |
| 54 inline GrGLenum join_to_gl_join(SkPaint::Join join) { | 54 inline GrGLenum join_to_gl_join(SkPaint::Join join) { |
| 55 static GrGLenum gSkJoinsToGrGLJoins[] = { | 55 static GrGLenum gSkJoinsToGrGLJoins[] = { |
| 56 GR_GL_MITER_REVERT, | 56 GR_GL_MITER_REVERT, |
| 57 GR_GL_ROUND, | 57 GR_GL_ROUND, |
| 58 GR_GL_BEVEL | 58 GR_GL_BEVEL |
| 59 }; | 59 }; |
| 60 return gSkJoinsToGrGLJoins[join]; | 60 return gSkJoinsToGrGLJoins[join]; |
| 61 GR_STATIC_ASSERT(0 == SkPaint::kMiter_Join); | 61 GR_STATIC_ASSERT(0 == SkPaint::kMiter_Join); |
| 62 GR_STATIC_ASSERT(1 == SkPaint::kRound_Join); | 62 GR_STATIC_ASSERT(1 == SkPaint::kRound_Join); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 80 } | 80 } |
| 81 | 81 |
| 82 static const bool kIsWrapped = false; // The constructor creates the GL path obj
ect. | 82 static const bool kIsWrapped = false; // The constructor creates the GL path obj
ect. |
| 83 | 83 |
| 84 void GrGLPath::InitPathObject(GrGpuGL* gpu, | 84 void GrGLPath::InitPathObject(GrGpuGL* gpu, |
| 85 GrGLuint pathID, | 85 GrGLuint pathID, |
| 86 const SkPath& skPath, | 86 const SkPath& skPath, |
| 87 const SkStrokeRec& stroke) { | 87 const SkStrokeRec& stroke) { |
| 88 if (!skPath.isEmpty()) { | 88 if (!skPath.isEmpty()) { |
| 89 SkSTArray<16, GrGLubyte, true> pathCommands; | 89 SkSTArray<16, GrGLubyte, true> pathCommands; |
| 90 SkSTArray<16, SkPoint, true> pathPoints; | 90 SkSTArray<16, GrGLfloat, true> pathCoords; |
| 91 SK_COMPILE_ASSERT(sizeof(SkPoint) == 2 * sizeof(GrGLfloat), sk_point_not
_two_floats); |
| 91 | 92 |
| 92 int verbCnt = skPath.countVerbs(); | 93 int verbCnt = skPath.countVerbs(); |
| 93 int pointCnt = skPath.countPoints(); | 94 int pointCnt = skPath.countPoints(); |
| 95 int conicWeightCnt = skPath.countConicWeights(); |
| 96 int coordCnt = 2 * pointCnt + conicWeightCnt; |
| 97 |
| 94 pathCommands.resize_back(verbCnt); | 98 pathCommands.resize_back(verbCnt); |
| 95 pathPoints.resize_back(pointCnt); | 99 pathCoords.resize_back(coordCnt); |
| 100 |
| 101 |
| 102 skPath.getVerbs(&pathCommands[0], verbCnt); |
| 96 | 103 |
| 97 // TODO: Direct access to path points since we could pass them on direct
ly. | 104 // TODO: Direct access to path points since we could pass them on direct
ly. |
| 98 skPath.getPoints(&pathPoints[0], pointCnt); | 105 if (0 == conicWeightCnt) { |
| 99 skPath.getVerbs(&pathCommands[0], verbCnt); | 106 skPath.getPoints(reinterpret_cast<SkPoint*>(&pathCoords[0]), pointCn
t); |
| 100 | 107 SkDEBUGCODE(int numPts = 0); |
| 101 SkDEBUGCODE(int numPts = 0); | 108 for (int i = 0; i < verbCnt; ++i) { |
| 102 for (int i = 0; i < verbCnt; ++i) { | 109 SkPath::Verb v = static_cast<SkPath::Verb>(pathCommands[i]); |
| 103 SkPath::Verb v = static_cast<SkPath::Verb>(pathCommands[i]); | 110 pathCommands[i] = verb_to_gl_path_cmd(v); |
| 104 pathCommands[i] = verb_to_gl_path_cmd(v); | 111 SkDEBUGCODE(numPts += num_pts(v)); |
| 105 SkDEBUGCODE(numPts += num_pts(v)); | 112 } |
| 113 SkASSERT(coordCnt == numPts * 2); |
| 114 } else { |
| 115 int pointIndex = 0; |
| 116 int conicIndex = 0; |
| 117 int coordIndex = 0; |
| 118 for (int i = 0; i < verbCnt; ++i) { |
| 119 SkPath::Verb v = static_cast<SkPath::Verb>(pathCommands[i]); |
| 120 pathCommands[i] = verb_to_gl_path_cmd(v); |
| 121 int pointsForVerb = num_pts(v); |
| 122 while (pointsForVerb--) { |
| 123 SkPoint p = skPath.getPoint(pointIndex++); |
| 124 pathCoords[coordIndex++] = p.fX; |
| 125 pathCoords[coordIndex++] = p.fY; |
| 126 } |
| 127 if (SkPath::kConic_Verb == v) { |
| 128 pathCoords[coordIndex++] = skPath.getConicWeight(conicIndex+
+); |
| 129 } |
| 130 } |
| 131 SkASSERT(pointCnt == pointIndex); |
| 132 SkASSERT(conicWeightCnt == conicIndex); |
| 133 SkASSERT(coordCnt == coordIndex); |
| 106 } | 134 } |
| 107 SkASSERT(pathPoints.count() == numPts); | |
| 108 | 135 |
| 109 GR_GL_CALL(gpu->glInterface(), | 136 GR_GL_CALL(gpu->glInterface(), |
| 110 PathCommands(pathID, verbCnt, &pathCommands[0], | 137 PathCommands(pathID, verbCnt, &pathCommands[0], |
| 111 2 * pointCnt, GR_GL_FLOAT, &pathPoints[0])); | 138 coordCnt, GR_GL_FLOAT, &pathCoords[0])); |
| 112 } else { | 139 } else { |
| 113 GR_GL_CALL(gpu->glInterface(), PathCommands(pathID, 0, NULL, 0, GR_GL_FL
OAT, NULL)); | 140 GR_GL_CALL(gpu->glInterface(), PathCommands(pathID, 0, NULL, 0, GR_GL_FL
OAT, NULL)); |
| 114 } | 141 } |
| 115 | 142 |
| 116 if (stroke.needToApply()) { | 143 if (stroke.needToApply()) { |
| 117 SkASSERT(!stroke.isHairlineStyle()); | 144 SkASSERT(!stroke.isHairlineStyle()); |
| 118 GR_GL_CALL(gpu->glInterface(), | 145 GR_GL_CALL(gpu->glInterface(), |
| 119 PathParameterf(pathID, GR_GL_PATH_STROKE_WIDTH, SkScalarToFloat(stro
ke.getWidth()))); | 146 PathParameterf(pathID, GR_GL_PATH_STROKE_WIDTH, SkScalarToFloat(stro
ke.getWidth()))); |
| 120 GR_GL_CALL(gpu->glInterface(), | 147 GR_GL_CALL(gpu->glInterface(), |
| 121 PathParameterf(pathID, GR_GL_PATH_MITER_LIMIT, SkScalarToFloat(strok
e.getMiter()))); | 148 PathParameterf(pathID, GR_GL_PATH_MITER_LIMIT, SkScalarToFloat(strok
e.getMiter()))); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 } | 181 } |
| 155 | 182 |
| 156 INHERITED::onRelease(); | 183 INHERITED::onRelease(); |
| 157 } | 184 } |
| 158 | 185 |
| 159 void GrGLPath::onAbandon() { | 186 void GrGLPath::onAbandon() { |
| 160 fPathID = 0; | 187 fPathID = 0; |
| 161 | 188 |
| 162 INHERITED::onAbandon(); | 189 INHERITED::onAbandon(); |
| 163 } | 190 } |
| OLD | NEW |