|
@@ -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);
|
|
|
}
|
|
|
|