static int SW_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points, int count) { SDL_Surface *surface = SW_ActivateRenderer(renderer); SDL_Point *final_points; int i, status; if (!surface) { return -1; } final_points = SDL_stack_alloc(SDL_Point, count); if (!final_points) { return SDL_OutOfMemory(); } if (renderer->viewport.x || renderer->viewport.y) { int x = renderer->viewport.x; int y = renderer->viewport.y; for (i = 0; i < count; ++i) { final_points[i].x = (int)(x + points[i].x); final_points[i].y = (int)(y + points[i].y); } } else { for (i = 0; i < count; ++i) { final_points[i].x = (int)points[i].x; final_points[i].y = (int)points[i].y; } } /* Draw the points! */ if (renderer->blendMode == SDL_BLENDMODE_NONE) { Uint32 color = SDL_MapRGBA(surface->format, renderer->r, renderer->g, renderer->b, renderer->a); status = SDL_DrawPoints(surface, final_points, count, color); } else { status = SDL_BlendPoints(surface, final_points, count, renderer->blendMode, renderer->r, renderer->g, renderer->b, renderer->a); } SDL_stack_free(final_points); return status; }
static int SW_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) { SDL_Surface *surface = SW_ActivateRenderer(renderer); SDL_Point *temp = NULL; int status; if (!surface) { return -1; } if (renderer->viewport.x || renderer->viewport.y) { int i; int x = renderer->viewport.x; int y = renderer->viewport.y; temp = SDL_stack_alloc(SDL_Point, count); for (i = 0; i < count; ++i) { temp[i].x = x + points[i].x; temp[i].y = y + points[i].x; } points = temp; } /* Draw the points! */ if (renderer->blendMode == SDL_BLENDMODE_NONE) { Uint32 color = SDL_MapRGBA(surface->format, renderer->r, renderer->g, renderer->b, renderer->a); status = SDL_DrawPoints(surface, points, count, color); } else { status = SDL_BlendPoints(surface, points, count, renderer->blendMode, renderer->r, renderer->g, renderer->b, renderer->a); } if (temp) { SDL_stack_free(temp); } return status; }
static int SDL_DUMMY_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) { SDL_DUMMY_RenderData *data = (SDL_DUMMY_RenderData *) renderer->driverdata; SDL_Surface *target = data->screens[data->current_screen]; if (renderer->blendMode == SDL_BLENDMODE_NONE || renderer->blendMode == SDL_BLENDMODE_MASK) { Uint32 color = SDL_MapRGBA(target->format, renderer->r, renderer->g, renderer->b, renderer->a); return SDL_DrawPoints(target, points, count, color); } else { return SDL_BlendPoints(target, points, count, renderer->blendMode, renderer->r, renderer->g, renderer->b, renderer->a); } }
static int SW_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) { SDL_Surface *surface = SW_ActivateRenderer(renderer); if (!surface) { return -1; } /* Draw the points! */ if (renderer->blendMode == SDL_BLENDMODE_NONE) { Uint32 color = SDL_MapRGBA(surface->format, renderer->r, renderer->g, renderer->b, renderer->a); return SDL_DrawPoints(surface, points, count, color); } else { return SDL_BlendPoints(surface, points, count, renderer->blendMode, renderer->r, renderer->g, renderer->b, renderer->a); } }
static int SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize) { SW_RenderData *data = (SW_RenderData *) renderer->driverdata; SDL_Surface *surface = SW_ActivateRenderer(renderer); const SDL_Rect *viewport = NULL; const SDL_Rect *cliprect = NULL; if (!surface) { return -1; } while (cmd) { switch (cmd->command) { case SDL_RENDERCMD_SETDRAWCOLOR: { break; /* Not used in this backend. */ } case SDL_RENDERCMD_SETVIEWPORT: { viewport = &cmd->data.viewport.rect; SDL_SetClipRect(data->surface, viewport); break; } case SDL_RENDERCMD_SETCLIPRECT: { SDL_assert(viewport != NULL); cliprect = cmd->data.cliprect.enabled ? &cmd->data.cliprect.rect : NULL; if (cliprect) { SDL_Rect clip_rect; clip_rect.x = cliprect->x + viewport->x; clip_rect.y = cliprect->y + viewport->y; clip_rect.w = cliprect->w; clip_rect.h = cliprect->h; SDL_IntersectRect(viewport, &clip_rect, &clip_rect); SDL_SetClipRect(surface, &clip_rect); } else { SDL_SetClipRect(surface, viewport); } break; } case SDL_RENDERCMD_CLEAR: { const Uint8 r = cmd->data.color.r; const Uint8 g = cmd->data.color.g; const Uint8 b = cmd->data.color.b; const Uint8 a = cmd->data.color.a; const SDL_Rect clip_rect = surface->clip_rect; /* By definition the clear ignores the clip rect */ SDL_SetClipRect(surface, NULL); SDL_FillRect(surface, NULL, SDL_MapRGBA(surface->format, r, g, b, a)); SDL_SetClipRect(surface, &clip_rect); break; } case SDL_RENDERCMD_DRAW_POINTS: { const Uint8 r = cmd->data.draw.r; const Uint8 g = cmd->data.draw.g; const Uint8 b = cmd->data.draw.b; const Uint8 a = cmd->data.draw.a; const int count = (int) cmd->data.draw.count; const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first); const SDL_BlendMode blend = cmd->data.draw.blend; if (blend == SDL_BLENDMODE_NONE) { SDL_DrawPoints(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a)); } else { SDL_BlendPoints(surface, verts, count, blend, r, g, b, a); } break; } case SDL_RENDERCMD_DRAW_LINES: { const Uint8 r = cmd->data.draw.r; const Uint8 g = cmd->data.draw.g; const Uint8 b = cmd->data.draw.b; const Uint8 a = cmd->data.draw.a; const int count = (int) cmd->data.draw.count; const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first); const SDL_BlendMode blend = cmd->data.draw.blend; if (blend == SDL_BLENDMODE_NONE) { SDL_DrawLines(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a)); } else { SDL_BlendLines(surface, verts, count, blend, r, g, b, a); } break; } case SDL_RENDERCMD_FILL_RECTS: { const Uint8 r = cmd->data.draw.r; const Uint8 g = cmd->data.draw.g; const Uint8 b = cmd->data.draw.b; const Uint8 a = cmd->data.draw.a; const int count = (int) cmd->data.draw.count; const SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first); const SDL_BlendMode blend = cmd->data.draw.blend; if (blend == SDL_BLENDMODE_NONE) { SDL_FillRects(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a)); } else { SDL_BlendFillRects(surface, verts, count, blend, r, g, b, a); } break; } case SDL_RENDERCMD_COPY: { SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first); const SDL_Rect *srcrect = verts; SDL_Rect *dstrect = verts + 1; SDL_Texture *texture = cmd->data.draw.texture; SDL_Surface *src = (SDL_Surface *) texture->driverdata; PrepTextureForCopy(cmd); if ( srcrect->w == dstrect->w && srcrect->h == dstrect->h ) { SDL_BlitSurface(src, srcrect, surface, dstrect); } else { /* If scaling is ever done, permanently disable RLE (which doesn't support scaling) * to avoid potentially frequent RLE encoding/decoding. */ SDL_SetSurfaceRLE(surface, 0); SDL_BlitScaled(src, srcrect, surface, dstrect); } break; } case SDL_RENDERCMD_COPY_EX: { const CopyExData *copydata = (CopyExData *) (((Uint8 *) vertices) + cmd->data.draw.first); PrepTextureForCopy(cmd); SW_RenderCopyEx(renderer, surface, cmd->data.draw.texture, ©data->srcrect, ©data->dstrect, copydata->angle, ©data->center, copydata->flip); break; } case SDL_RENDERCMD_NO_OP: break; } cmd = cmd->next; } return 0; }