| 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() {
|
|
|