|
@@ -1048,17 +1048,15 @@ GL_RenderDrawPoints(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); |
|
|
|
|
|
data->glDrawArrays(GL_POINTS, 0, count); |
|
|
|
|
|
data->glDisableClientState(GL_VERTEX_ARRAY); |
|
|
data->glTranslatef(-0.5f, -0.5f, 0.0f); |
|
|
data->glBegin(GL_POINTS); |
|
|
for (i = 0; i < count; ++i) { |
|
|
data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y); |
|
|
} |
|
|
data->glEnd(); |
|
|
|
|
|
return 0; |
|
|
} |
|
@@ -1068,28 +1066,62 @@ 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 */ |
|
|
data->glDrawArrays(GL_LINE_LOOP, 0, count-1); |
|
|
--count; |
|
|
for (i = 0; i < count; ++i) { |
|
|
data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y); |
|
|
} |
|
|
data->glEnd(); |
|
|
} else { |
|
|
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); |
|
|
#if defined(__MACOSX__) || 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(__MACOSX__) || defined(__WIN32__) |
|
|
/* Mac OS X and Windows seem to always leave the last 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); |
|
|
} |
|
|
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(); |
|
|
} |
|
|
return GL_CheckError("", renderer); |
|
|
} |
|
|
|
|
|