static int GL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; int i; GL_SetDrawingState(renderer); 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; }
static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata; int minx, miny, maxx, maxy; GLfloat minu, maxu, minv, maxv; GL_ActivateRenderer(renderer); data->glEnable(texturedata->type); if (texturedata->yuv) { data->glActiveTextureARB(GL_TEXTURE2_ARB); data->glBindTexture(texturedata->type, texturedata->vtexture); if (texturedata->scaleMode != data->current.scaleMode) { data->glTexParameteri(texturedata->type, GL_TEXTURE_MIN_FILTER, texturedata->scaleMode); data->glTexParameteri(texturedata->type, GL_TEXTURE_MAG_FILTER, texturedata->scaleMode); } data->glActiveTextureARB(GL_TEXTURE1_ARB); data->glBindTexture(texturedata->type, texturedata->utexture); if (texturedata->scaleMode != data->current.scaleMode) { data->glTexParameteri(texturedata->type, GL_TEXTURE_MIN_FILTER, texturedata->scaleMode); data->glTexParameteri(texturedata->type, GL_TEXTURE_MAG_FILTER, texturedata->scaleMode); } data->glActiveTextureARB(GL_TEXTURE0_ARB); } data->glBindTexture(texturedata->type, texturedata->texture); if (texturedata->scaleMode != data->current.scaleMode) { data->glTexParameteri(texturedata->type, GL_TEXTURE_MIN_FILTER, texturedata->scaleMode); data->glTexParameteri(texturedata->type, GL_TEXTURE_MAG_FILTER, texturedata->scaleMode); data->current.scaleMode = texturedata->scaleMode; } if (texture->modMode) { GL_SetColor(data, texture->r, texture->g, texture->b, texture->a); } else { GL_SetColor(data, 255, 255, 255, 255); } GL_SetBlendMode(data, texture->blendMode); if (texturedata->yuv) { GL_SetShader(data, SHADER_YV12); } else { GL_SetShader(data, SHADER_RGB); } minx = dstrect->x; miny = dstrect->y; maxx = dstrect->x + dstrect->w; maxy = dstrect->y + dstrect->h; minu = (GLfloat) srcrect->x / texture->w; minu *= texturedata->texw; maxu = (GLfloat) (srcrect->x + srcrect->w) / texture->w; maxu *= texturedata->texw; minv = (GLfloat) srcrect->y / texture->h; minv *= texturedata->texh; maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h; maxv *= texturedata->texh; data->glBegin(GL_TRIANGLE_STRIP); data->glTexCoord2f(minu, minv); data->glVertex2f((GLfloat) minx, (GLfloat) miny); data->glTexCoord2f(maxu, minv); data->glVertex2f((GLfloat) maxx, (GLfloat) miny); data->glTexCoord2f(minu, maxv); data->glVertex2f((GLfloat) minx, (GLfloat) maxy); data->glTexCoord2f(maxu, maxv); data->glVertex2f((GLfloat) maxx, (GLfloat) maxy); data->glEnd(); data->glDisable(texturedata->type); return 0; }
static int GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, int count) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; int i; GL_SetDrawingState(renderer); 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(); } 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(); } return 0; }