diff options
Diffstat (limited to 'src/gpu/gl/GrGLPath.cpp')
-rw-r--r-- | src/gpu/gl/GrGLPath.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/src/gpu/gl/GrGLPath.cpp b/src/gpu/gl/GrGLPath.cpp index c5a4425dcd..c85644e311 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() { |