Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Added a multi-window version of testsprite using the new API.
  • Loading branch information
slouken committed Jun 24, 2006
1 parent 733dca5 commit d0a8e40
Show file tree
Hide file tree
Showing 9 changed files with 340 additions and 42 deletions.
2 changes: 1 addition & 1 deletion include/SDL_video.h
Expand Up @@ -763,7 +763,7 @@ extern DECLSPEC int SDLCALL SDL_SelectRenderer(SDL_WindowID windowID);
/**
* \fn SDL_TextureID SDL_CreateTexture(Uint32 format, int access, int w, int h)
*
* \brief Create a texture
* \brief Create a texture for the current rendering context.
*
* \param format The format of the texture
* \param access One of the enumerated values in SDL_TextureAccess
Expand Down
1 change: 0 additions & 1 deletion src/video/SDL_bmp.c
Expand Up @@ -232,7 +232,6 @@ SDL_LoadBMP_RW(SDL_RWops * src, int freesrc)
SDL_RWread(src, &palette->colors[i].unused, 1, 1);
}
}
palette->ncolors = biClrUsed;
}

/* Read the surface pixels. Note that the bmp image is upside down */
Expand Down
7 changes: 5 additions & 2 deletions src/video/SDL_pixels.c
Expand Up @@ -642,8 +642,11 @@ Map1to1(SDL_Palette * src, SDL_Palette * dst, int *identical)
if (identical) {
if (src->ncolors <= dst->ncolors) {
/* If an identical palette, no need to map */
if (SDL_memcmp(src->colors, dst->colors, src->ncolors *
sizeof(SDL_Color)) == 0) {
if (src == dst
||
(SDL_memcmp
(src->colors, dst->colors,
src->ncolors * sizeof(SDL_Color)) == 0)) {
*identical = 1;
return (NULL);
}
Expand Down
20 changes: 11 additions & 9 deletions src/video/SDL_renderer_sw.c
Expand Up @@ -111,7 +111,8 @@ typedef struct
SDL_Renderer *
SDL_SW_CreateRenderer(SDL_Window * window, Uint32 flags)
{
SDL_DisplayMode *displayMode = &window->display->current_mode;
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_DisplayMode *displayMode = &display->current_mode;
SDL_Renderer *renderer;
SDL_SW_RenderData *data;
int i, n;
Expand Down Expand Up @@ -156,7 +157,7 @@ SDL_SW_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->DestroyTexture = SDL_SW_DestroyTexture;
renderer->DestroyRenderer = SDL_SW_DestroyRenderer;
renderer->info = SDL_SW_RenderDriver.info;
renderer->window = window;
renderer->window = window->id;
renderer->driverdata = data;

renderer->info.flags = SDL_Renderer_RenderTarget;
Expand All @@ -179,14 +180,14 @@ SDL_SW_CreateRenderer(SDL_Window * window, Uint32 flags)
SDL_SW_DestroyRenderer(renderer);
return NULL;
}
SDL_SetSurfacePalette(data->screens[i], window->display->palette);
SDL_SetSurfacePalette(data->screens[i], display->palette);
}
data->current_screen = 0;
data->target = data->screens[0];

/* Find a render driver that we can use to display data */
for (i = 0; i < window->display->num_render_drivers; ++i) {
SDL_RenderDriver *driver = &window->display->render_drivers[i];
for (i = 0; i < display->num_render_drivers; ++i) {
SDL_RenderDriver *driver = &display->render_drivers[i];
if (driver->info.name != SDL_SW_RenderDriver.info.name) {
data->renderer =
driver->CreateRenderer(window, SDL_Renderer_PresentDiscard);
Expand All @@ -195,7 +196,7 @@ SDL_SW_CreateRenderer(SDL_Window * window, Uint32 flags)
}
}
}
if (i == window->display->num_render_drivers) {
if (i == display->num_render_drivers) {
SDL_SW_DestroyRenderer(renderer);
SDL_SetError("Couldn't find display render driver");
return NULL;
Expand Down Expand Up @@ -377,16 +378,17 @@ SDL_SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
int blendMode, int scaleMode)
{
SDL_SW_RenderData *data = (SDL_SW_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);

if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
SDL_Surface *target = data->target;
void *pixels =
(Uint8 *) target->pixels + dstrect->y * target->pitch +
dstrect->x * target->format->BytesPerPixel;
return SDL_SW_CopyYUVToRGB((SDL_SW_YUVTexture *) texture->driverdata,
srcrect,
renderer->window->display->current_mode.
format, dstrect->w, dstrect->h, pixels,
srcrect, display->current_mode.format,
dstrect->w, dstrect->h, pixels,
target->pitch);
} else {
SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
Expand Down
7 changes: 5 additions & 2 deletions src/video/SDL_sysvideo.h
Expand Up @@ -104,7 +104,7 @@ struct SDL_Renderer
SDL_RendererInfo info;

/* The window associated with the renderer */
SDL_Window *window;
SDL_WindowID window;

void *driverdata;
};
Expand All @@ -130,7 +130,7 @@ struct SDL_Window

Uint16 *gamma;

SDL_VideoDisplay *display;
int display;
SDL_Renderer *renderer;

void *userdata;
Expand Down Expand Up @@ -445,6 +445,9 @@ extern void SDL_AddDisplayMode(int displayIndex,
extern void SDL_AddRenderDriver(int displayIndex,
const SDL_RenderDriver * driver);

extern SDL_Window *SDL_GetWindowFromID(SDL_WindowID windowID);
extern SDL_VideoDisplay *SDL_GetDisplayFromWindow(SDL_Window * window);

#endif /* _SDL_sysvideo_h */

/* vi: set ts=4 sw=4 expandtab: */
74 changes: 52 additions & 22 deletions src/video/SDL_video.c
Expand Up @@ -507,6 +507,16 @@ SDL_GetClosestDisplayMode(const SDL_DisplayMode * mode,
} else {
closest->refresh_rate = mode->refresh_rate;
}
/* Pick some reasonable defaults if the app and driver don't care */
if (!closest->format) {
closest->format = SDL_PixelFormat_RGB888;
}
if (!closest->w) {
closest->w = 640;
}
if (!closest->h) {
closest->h = 480;
}
return closest;
}
return NULL;
Expand Down Expand Up @@ -577,6 +587,8 @@ SDL_SetDisplayMode(const SDL_DisplayMode * mode)
if (!display->palette) {
return -1;
}
SDL_DitherColors(display->palette->colors,
SDL_BITSPERPIXEL(display_mode.format));
}
}

Expand Down Expand Up @@ -664,7 +676,7 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
window.w = w;
window.h = h;
window.flags = (flags & allowed_flags);
window.display = &SDL_CurrentDisplay;
window.display = _this->current_display;

if (_this->CreateWindow && _this->CreateWindow(_this, &window) < 0) {
if (window.title) {
Expand Down Expand Up @@ -707,7 +719,7 @@ SDL_CreateWindowFrom(const void *data)

SDL_zero(window);
window.id = _this->next_object_id++;
window.display = &SDL_CurrentDisplay;
window.display = _this->current_display;

if (!_this->CreateWindowFrom ||
_this->CreateWindowFrom(_this, &window, data) < 0) {
Expand All @@ -734,7 +746,7 @@ SDL_CreateWindowFrom(const void *data)
return window.id;
}

static __inline__ SDL_Window *
SDL_Window *
SDL_GetWindowFromID(SDL_WindowID windowID)
{
int i, j;
Expand All @@ -755,6 +767,15 @@ SDL_GetWindowFromID(SDL_WindowID windowID)
return NULL;
}

SDL_VideoDisplay *
SDL_GetDisplayFromWindow(SDL_Window * window)
{
if (!_this) {
return NULL;
}
return &_this->displays[window->display];
}

Uint32
SDL_GetWindowFlags(SDL_WindowID windowID)
{
Expand Down Expand Up @@ -1221,11 +1242,20 @@ SDL_CreateTextureFromSurface(Uint32 format, int access, SDL_Surface * surface)
return 0;
}
} else {
bpp = fmt->BitsPerPixel;
Rmask = fmt->Rmask;
Gmask = fmt->Gmask;
Bmask = fmt->Bmask;
Amask = fmt->Amask;
if (fmt->Amask || !(surface_flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA))) {
bpp = fmt->BitsPerPixel;
Rmask = fmt->Rmask;
Gmask = fmt->Gmask;
Bmask = fmt->Bmask;
Amask = fmt->Amask;
} else {
/* Need a format with alpha */
bpp = 32;
Rmask = 0x00FF0000;
Gmask = 0x0000FF00;
Bmask = 0x000000FF;
Amask = 0xFF000000;
}
format = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask);
if (!format) {
SDL_SetError("Unknown pixel format");
Expand Down Expand Up @@ -1261,14 +1291,10 @@ SDL_CreateTextureFromSurface(Uint32 format, int access, SDL_Surface * surface)
}

/* Copy the palette if any */
if (fmt->palette && dst.format->palette) {
if (fmt->palette) {
SDL_SetTexturePalette(textureID, fmt->palette->colors, 0,
fmt->palette->ncolors);

SDL_memcpy(dst.format->palette->colors,
fmt->palette->colors,
fmt->palette->ncolors * sizeof(SDL_Color));
dst.format->palette->ncolors = fmt->palette->ncolors;
SDL_SetSurfacePalette(&dst, fmt->palette);
}

/* Make the texture transparent if the surface has colorkey */
Expand Down Expand Up @@ -1552,10 +1578,11 @@ SDL_RenderFill(const SDL_Rect * rect, Uint32 color)
}

if (!rect) {
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
full_rect.x = 0;
full_rect.y = 0;
full_rect.w = renderer->window->w;
full_rect.h = renderer->window->h;
full_rect.w = window->w;
full_rect.h = window->h;
rect = &full_rect;
}

Expand Down Expand Up @@ -1588,10 +1615,11 @@ SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect,
srcrect = &full_srcrect;
}
if (!dstrect) {
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
full_dstrect.x = 0;
full_dstrect.y = 0;
full_dstrect.w = renderer->window->w;
full_dstrect.h = renderer->window->h;
full_dstrect.w = window->w;
full_dstrect.h = window->h;
dstrect = &full_dstrect;
}

Expand All @@ -1615,10 +1643,11 @@ SDL_RenderReadPixels(const SDL_Rect * rect, void *pixels, int pitch)
}

if (!rect) {
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
full_rect.x = 0;
full_rect.y = 0;
full_rect.w = renderer->window->w;
full_rect.h = renderer->window->h;
full_rect.w = window->w;
full_rect.h = window->h;
rect = &full_rect;
}

Expand All @@ -1641,10 +1670,11 @@ SDL_RenderWritePixels(const SDL_Rect * rect, const void *pixels, int pitch)
}

if (!rect) {
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
full_rect.x = 0;
full_rect.y = 0;
full_rect.w = renderer->window->w;
full_rect.h = renderer->window->h;
full_rect.w = window->w;
full_rect.h = window->h;
rect = &full_rect;
}

Expand Down
9 changes: 5 additions & 4 deletions src/video/dummy/SDL_nullrender.c
Expand Up @@ -63,7 +63,8 @@ typedef struct
SDL_Renderer *
SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
{
SDL_DisplayMode *displayMode = &window->display->current_mode;
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_DisplayMode *displayMode = &display->current_mode;
SDL_Renderer *renderer;
SDL_DUMMY_RenderData *data;
int i, n;
Expand Down Expand Up @@ -96,7 +97,7 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->RenderPresent = SDL_DUMMY_RenderPresent;
renderer->DestroyRenderer = SDL_DUMMY_DestroyRenderer;
renderer->info = SDL_DUMMY_RenderDriver.info;
renderer->window = window;
renderer->window = window->id;
renderer->driverdata = data;

data->surface =
Expand All @@ -106,7 +107,7 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
SDL_DUMMY_DestroyRenderer(renderer);
return NULL;
}
SDL_SetSurfacePalette(data->surface, window->display->palette);
SDL_SetSurfacePalette(data->surface, display->palette);

return renderer;
}
Expand Down Expand Up @@ -170,7 +171,7 @@ SDL_DUMMY_RenderPresent(SDL_Renderer * renderer)
if (SDL_getenv("SDL_VIDEO_DUMMY_SAVE_FRAMES")) {
char file[128];
SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
renderer->window->id, ++frame_number);
renderer->window, ++frame_number);
SDL_SaveBMP(surface, file);
}
}
Expand Down
5 changes: 4 additions & 1 deletion test/Makefile.in
Expand Up @@ -7,7 +7,7 @@ EXE = @EXE@
CFLAGS = @CFLAGS@
LIBS = @LIBS@

TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcdrom$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testsem$(EXE) testsprite$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE)
TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcdrom$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testsem$(EXE) testsprite$(EXE) testsprite2$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE)

all: $(TARGETS)

Expand Down Expand Up @@ -80,6 +80,9 @@ testsem$(EXE): $(srcdir)/testsem.c
testsprite$(EXE): $(srcdir)/testsprite.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@

testsprite2$(EXE): $(srcdir)/testsprite2.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@

testtimer$(EXE): $(srcdir)/testtimer.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS)

Expand Down

0 comments on commit d0a8e40

Please sign in to comment.