Index: src/gpu/gl/GrGLPath.cpp |
diff --git a/src/gpu/gl/GrGLPath.cpp b/src/gpu/gl/GrGLPath.cpp |
index c5a4425dcd5eef136986cc4afdacc844d3d528fd..c85644e311379abc7308264c33936c56632b14c3 100644 |
--- a/src/gpu/gl/GrGLPath.cpp |
+++ b/src/gpu/gl/GrGLPath.cpp |
@@ -8,6 +8,7 @@ |
#include "GrGLPath.h" |
#include "GrGpuGL.h" |
+#include "SkStrokeRec.h" |
#define GPUGL static_cast<GrGpuGL*>(this->getGpu()) |
@@ -15,7 +16,7 @@ |
#define GL_CALL_RET(R, X) GR_GL_CALL_RET(GPUGL->glInterface(), R, X) |
namespace { |
-inline GrGLubyte verb_to_gl_path_cmd(const SkPath::Verb verb) { |
+inline GrGLubyte verb_to_gl_path_cmd(SkPath::Verb verb) { |
static const GrGLubyte gTable[] = { |
GR_GL_MOVE_TO, |
GR_GL_LINE_TO, |
@@ -35,7 +36,7 @@ inline GrGLubyte verb_to_gl_path_cmd(const SkPath::Verb verb) { |
} |
#ifdef SK_DEBUG |
-inline int num_pts(const SkPath::Verb verb) { |
+inline int num_pts(SkPath::Verb verb) { |
static const int gTable[] = { |
1, // move |
1, // line |
@@ -54,11 +55,39 @@ inline int num_pts(const SkPath::Verb verb) { |
return gTable[verb]; |
} |
#endif |
+ |
+inline GrGLenum join_to_gl_join(SkPaint::Join join) { |
+ static GrGLenum gSkJoinsToGrGLJoins[] = { |
+ GR_GL_MITER_REVERT, |
+ GR_GL_ROUND, |
+ GR_GL_BEVEL |
+ }; |
+ return gSkJoinsToGrGLJoins[join]; |
+ GR_STATIC_ASSERT(0 == SkPaint::kMiter_Join); |
+ GR_STATIC_ASSERT(1 == SkPaint::kRound_Join); |
+ GR_STATIC_ASSERT(2 == SkPaint::kBevel_Join); |
+ GR_STATIC_ASSERT(GR_ARRAY_COUNT(gSkJoinsToGrGLJoins) == SkPaint::kJoinCount); |
+} |
+ |
+inline GrGLenum cap_to_gl_cap(SkPaint::Cap cap) { |
+ static GrGLenum gSkCapsToGrGLCaps[] = { |
+ GR_GL_FLAT, |
+ GR_GL_ROUND, |
+ GR_GL_SQUARE |
+ }; |
+ return gSkCapsToGrGLCaps[cap]; |
+ GR_STATIC_ASSERT(0 == SkPaint::kButt_Cap); |
+ GR_STATIC_ASSERT(1 == SkPaint::kRound_Cap); |
+ GR_STATIC_ASSERT(2 == SkPaint::kSquare_Cap); |
+ GR_STATIC_ASSERT(GR_ARRAY_COUNT(gSkCapsToGrGLCaps) == SkPaint::kCapCount); |
+} |
+ |
} |
static const bool kIsWrapped = false; // The constructor creates the GL path object. |
-GrGLPath::GrGLPath(GrGpuGL* gpu, const SkPath& path) : INHERITED(gpu, kIsWrapped) { |
+GrGLPath::GrGLPath(GrGpuGL* gpu, const SkPath& path, const SkStrokeRec& stroke) |
+ : INHERITED(gpu, kIsWrapped, stroke) { |
#ifndef SK_SCALAR_IS_FLOAT |
GrCrash("Assumes scalar is float."); |
#endif |
@@ -90,6 +119,19 @@ GrGLPath::GrGLPath(GrGpuGL* gpu, const SkPath& path) : INHERITED(gpu, kIsWrapped |
verbCnt, &pathCommands[0], |
2 * pointCnt, GR_GL_FLOAT, &pathPoints[0])); |
fBounds = path.getBounds(); |
+ |
+ if (stroke.needToApply()) { |
+ GL_CALL(PathParameterf(fPathID, GR_GL_PATH_STROKE_WIDTH, SkScalarToFloat(stroke.getWidth()))); |
+ GL_CALL(PathParameterf(fPathID, GR_GL_PATH_MITER_LIMIT, SkScalarToFloat(stroke.getMiter()))); |
+ GrGLenum join = join_to_gl_join(stroke.getJoin()); |
+ GL_CALL(PathParameteri(fPathID, GR_GL_PATH_JOIN_STYLE, join)); |
+ GrGLenum cap = cap_to_gl_cap(stroke.getCap()); |
+ GL_CALL(PathParameteri(fPathID, GR_GL_PATH_INITIAL_END_CAP, cap)); |
+ GL_CALL(PathParameteri(fPathID, GR_GL_PATH_TERMINAL_END_CAP, cap)); |
+ |
+ // FIXME: try to account for stroking, without rasterizing the stroke. |
+ fBounds.outset(SkScalarToFloat(stroke.getWidth()), SkScalarToFloat(stroke.getWidth())); |
+ } |
} |
GrGLPath::~GrGLPath() { |