Fixed bug 2158 - Pixel missing in SDL_RenderDrawLines
Sean McKean I am running Ubuntu 12.04 (GL version 1.4 Mesa 8.0.4) , and on drawing a set of lines through the renderer through SDL_RenderDrawLines() (looped or not) or SDL_RenderDrawRect() I notice a pixel missing. For RenderDrawLines() it seems to be the second point in the sequence; for RenderDrawRect() it is the lower-right. This can be fixed by specifying SDL_RenderDrawPoint(s), but wouldn't it be easier to specify each pixel in a GL_POINTS glBegin/End loop in the OpenGL code, just to make sure? I also ran the same program on Android; the rendering seemed to be correct, which uses glDrawArrays.main
parent
a25b51923a
commit
82b8e6df87
|
@ -89,8 +89,8 @@ SDL_PROC_UNUSED(void, glDepthFunc, (GLenum func))
|
|||
SDL_PROC_UNUSED(void, glDepthMask, (GLboolean flag))
|
||||
SDL_PROC_UNUSED(void, glDepthRange, (GLclampd zNear, GLclampd zFar))
|
||||
SDL_PROC(void, glDisable, (GLenum cap))
|
||||
SDL_PROC_UNUSED(void, glDisableClientState, (GLenum array))
|
||||
SDL_PROC_UNUSED(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count))
|
||||
SDL_PROC(void, glDisableClientState, (GLenum array))
|
||||
SDL_PROC(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count))
|
||||
SDL_PROC_UNUSED(void, glDrawBuffer, (GLenum mode))
|
||||
SDL_PROC_UNUSED(void, glDrawElements,
|
||||
(GLenum mode, GLsizei count, GLenum type,
|
||||
|
@ -103,7 +103,7 @@ SDL_PROC_UNUSED(void, glEdgeFlagPointer,
|
|||
(GLsizei stride, const GLvoid * pointer))
|
||||
SDL_PROC_UNUSED(void, glEdgeFlagv, (const GLboolean * flag))
|
||||
SDL_PROC(void, glEnable, (GLenum cap))
|
||||
SDL_PROC_UNUSED(void, glEnableClientState, (GLenum array))
|
||||
SDL_PROC(void, glEnableClientState, (GLenum array))
|
||||
SDL_PROC(void, glEnd, (void))
|
||||
SDL_PROC_UNUSED(void, glEndList, (void))
|
||||
SDL_PROC_UNUSED(void, glEvalCoord1d, (GLdouble u))
|
||||
|
@ -448,7 +448,7 @@ SDL_PROC_UNUSED(void, glVertex4iv, (const GLint * v))
|
|||
SDL_PROC_UNUSED(void, glVertex4s,
|
||||
(GLshort x, GLshort y, GLshort z, GLshort w))
|
||||
SDL_PROC_UNUSED(void, glVertex4sv, (const GLshort * v))
|
||||
SDL_PROC_UNUSED(void, glVertexPointer,
|
||||
SDL_PROC(void, glVertexPointer,
|
||||
(GLint size, GLenum type, GLsizei stride,
|
||||
const GLvoid * pointer))
|
||||
SDL_PROC(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height))
|
||||
|
|
|
@ -1066,61 +1066,28 @@ GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,
|
|||
int count)
|
||||
{
|
||||
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
||||
int i;
|
||||
|
||||
GL_SetDrawingState(renderer);
|
||||
|
||||
data->glTranslatef(0.5f, 0.5f, 0.0f);
|
||||
data->glVertexPointer(2, GL_FLOAT, 0, points);
|
||||
data->glEnableClientState(GL_VERTEX_ARRAY);
|
||||
|
||||
if (count > 2 &&
|
||||
points[0].x == points[count-1].x && points[0].y == points[count-1].y) {
|
||||
data->glBegin(GL_LINE_LOOP);
|
||||
/* GL_LINE_LOOP takes care of the final segment */
|
||||
--count;
|
||||
for (i = 0; i < count; ++i) {
|
||||
data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);
|
||||
}
|
||||
data->glEnd();
|
||||
data->glDrawArrays(GL_LINE_LOOP, 0, count-1);
|
||||
} else {
|
||||
#if defined(__APPLE__) || defined(__WIN32__)
|
||||
#else
|
||||
int x1, y1, x2, y2;
|
||||
#endif
|
||||
|
||||
data->glBegin(GL_LINE_STRIP);
|
||||
for (i = 0; i < count; ++i) {
|
||||
data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);
|
||||
}
|
||||
data->glEnd();
|
||||
|
||||
/* The line is half open, so we need one more point to complete it.
|
||||
* http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node47.html
|
||||
* If we have to, we can use vertical line and horizontal line textures
|
||||
* for vertical and horizontal lines, and then create custom textures
|
||||
* for diagonal lines and software render those. It's terrible, but at
|
||||
* least it would be pixel perfect.
|
||||
*/
|
||||
data->glBegin(GL_POINTS);
|
||||
#if defined(__APPLE__) || defined(__WIN32__)
|
||||
/* Mac OS X and Windows seem to always leave the second point open */
|
||||
data->glVertex2f(0.5f + points[count-1].x, 0.5f + points[count-1].y);
|
||||
#else
|
||||
/* Linux seems to leave the right-most or bottom-most point open */
|
||||
x1 = points[0].x;
|
||||
y1 = points[0].y;
|
||||
x2 = points[count-1].x;
|
||||
y2 = points[count-1].y;
|
||||
|
||||
if (x1 > x2) {
|
||||
data->glVertex2f(0.5f + x1, 0.5f + y1);
|
||||
} else if (x2 > x1) {
|
||||
data->glVertex2f(0.5f + x2, 0.5f + y2);
|
||||
} else if (y1 > y2) {
|
||||
data->glVertex2f(0.5f + x1, 0.5f + y1);
|
||||
} else if (y2 > y1) {
|
||||
data->glVertex2f(0.5f + x2, 0.5f + y2);
|
||||
}
|
||||
#endif
|
||||
data->glEnd();
|
||||
data->glDrawArrays(GL_LINE_STRIP, 0, count);
|
||||
}
|
||||
/* Make sure all the line endpoints are closed.
|
||||
* http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node47.html
|
||||
* Which points need to be drawn varies by driver, so just draw all of them.
|
||||
*/
|
||||
data->glDrawArrays(GL_POINTS, 0, count);
|
||||
data->glDisableClientState(GL_VERTEX_ARRAY);
|
||||
data->glTranslatef(-0.5f, -0.5f, 0.0f);
|
||||
|
||||
return GL_CheckError("", renderer);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue