21 #include "../../SDL_internal.h"
23 #if !SDL_RENDER_DISABLED
25 #include "../SDL_sysrender.h"
173 renderer->
info = SW_RenderDriver.
info;
218 SDL_SetError(
"Software renderer doesn't have an output surface");
227 Uint32 Rmask, Gmask, Bmask, Amask;
230 (texture->
format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
262 if ((texture->
r & texture->
g & texture->
b) != 255) {
306 src = (
Uint8 *) pixels;
308 rect->
y * surface->
pitch +
330 *pitch = surface->
pitch;
399 renderer->
r, renderer->
g, renderer->
b, renderer->
a);
429 for (i = 0; i <
count; ++
i) {
430 final_points[
i].
x = (int)(x + points[i].x);
431 final_points[
i].
y = (int)(y + points[i].y);
434 for (i = 0; i <
count; ++
i) {
435 final_points[
i].
x = (int)points[i].
x;
436 final_points[
i].
y = (int)points[i].
y;
443 renderer->
r, renderer->
g, renderer->
b,
450 renderer->
r, renderer->
g, renderer->
b,
478 for (i = 0; i <
count; ++
i) {
479 final_points[
i].
x = (int)(x + points[i].x);
480 final_points[
i].
y = (int)(y + points[i].y);
483 for (i = 0; i <
count; ++
i) {
484 final_points[
i].
x = (int)points[i].
x;
485 final_points[
i].
y = (int)points[i].
y;
492 renderer->
r, renderer->
g, renderer->
b,
499 renderer->
r, renderer->
g, renderer->
b,
526 for (i = 0; i <
count; ++
i) {
527 final_rects[
i].
x = (int)(x + rects[i].x);
528 final_rects[
i].
y = (int)(y + rects[i].y);
529 final_rects[
i].
w =
SDL_max((
int)rects[i].
w, 1);
530 final_rects[
i].
h =
SDL_max((
int)rects[i].
h, 1);
533 for (i = 0; i <
count; ++
i) {
534 final_rects[
i].
x = (int)rects[i].
x;
535 final_rects[
i].
y = (int)rects[i].
y;
536 final_rects[
i].
w =
SDL_max((
int)rects[i].
w, 1);
537 final_rects[
i].
h =
SDL_max((
int)rects[i].
h, 1);
543 renderer->
r, renderer->
g, renderer->
b,
549 renderer->
r, renderer->
g, renderer->
b,
570 final_rect.
x = (int)(renderer->
viewport.
x + dstrect->
x);
571 final_rect.y = (int)(renderer->
viewport.
y + dstrect->
y);
573 final_rect.x = (int)dstrect->
x;
574 final_rect.y = (
int)dstrect->
y;
576 final_rect.w = (int)dstrect->
w;
577 final_rect.h = (
int)dstrect->
h;
579 if ( srcrect->
w == final_rect.w && srcrect->
h == final_rect.h ) {
600 int retval = 0, dstwidth, dstheight, abscenterx, abscentery;
601 double cangle, sangle, px, py, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;
603 Uint8 alphaMod, rMod, gMod, bMod;
613 final_rect.
x = (int)(renderer->
viewport.
x + dstrect->
x);
614 final_rect.
y = (int)(renderer->
viewport.
y + dstrect->
y);
616 final_rect.
x = (int)dstrect->
x;
617 final_rect.
y = (
int)dstrect->
y;
619 final_rect.
w = (int)dstrect->
w;
620 final_rect.
h = (
int)dstrect->
h;
622 tmp_rect = final_rect;
639 if (src_clone ==
NULL) {
656 if (!(srcrect->
w == final_rect.
w && srcrect->
h == final_rect.
h && srcrect->
x == 0 && srcrect->
y == 0)) {
661 if (!(srcrect->
w == src->
w && srcrect->
h == src->
h && srcrect->
x == 0 && srcrect->
y == 0)) {
682 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
693 if (!
retval && (blitRequired || applyModulation)) {
696 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
697 if (src_scaled ==
NULL) {
703 src_clone = src_scaled;
713 src_rotated =
SDLgfx_rotateSurface(src_clone, angle, dstwidth/2, dstheight/2, (texture->
scaleMode ==
SDL_ScaleModeNearest) ? 0 : 1, flip &
SDL_FLIP_HORIZONTAL, flip &
SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle);
714 if (src_rotated ==
NULL) {
719 mask_rotated =
SDLgfx_rotateSurface(
mask, angle, dstwidth/2, dstheight/2,
SDL_FALSE, 0, 0, dstwidth, dstheight, cangle, sangle);
720 if (mask_rotated ==
NULL) {
726 abscenterx = final_rect.
x + (int)center->
x;
727 abscentery = final_rect.
y + (
int)center->
y;
732 px = final_rect.
x - abscenterx;
733 py = final_rect.
y - abscentery;
734 p1x = px * cangle - py * sangle + abscenterx;
735 p1y = px * sangle + py * cangle + abscentery;
738 px = final_rect.
x + final_rect.
w - abscenterx;
739 py = final_rect.
y - abscentery;
740 p2x = px * cangle - py * sangle + abscenterx;
741 p2y = px * sangle + py * cangle + abscentery;
744 px = final_rect.
x - abscenterx;
745 py = final_rect.
y + final_rect.
h - abscentery;
746 p3x = px * cangle - py * sangle + abscenterx;
747 p3y = px * sangle + py * cangle + abscentery;
750 px = final_rect.
x + final_rect.
w - abscenterx;
751 py = final_rect.
y + final_rect.
h - abscentery;
752 p4x = px * cangle - py * sangle + abscenterx;
753 p4y = px * sangle + py * cangle + abscentery;
755 tmp_rect.x = (int)
MIN(
MIN(p1x, p2x),
MIN(p3x, p4x));
756 tmp_rect.y = (int)
MIN(
MIN(p1y, p2y),
MIN(p3y, p4y));
757 tmp_rect.w = dstwidth;
758 tmp_rect.h = dstheight;
785 mask_rect = tmp_rect;
795 src_rotated->format->BitsPerPixel, src_rotated->pitch,
796 src_rotated->format->Rmask, src_rotated->format->Gmask,
797 src_rotated->format->Bmask, 0);
798 if (src_rotated_rgb ==
NULL) {
809 if (src_rotated !=
NULL) {
821 if (src_clone !=
NULL) {
843 if (rect->
x < 0 || rect->
x+rect->
w > surface->
w ||
844 rect->
y < 0 || rect->
y+rect->
h > surface->
h) {
845 return SDL_SetError(
"Tried to read outside of surface bounds");
850 rect->
y * surface->
pitch +
854 src_format, src_pixels, surface->
pitch,
855 format, pixels, pitch);