int SDL_SetSurfacePalette(SDL_Surface * surface, SDL_Palette * palette) { if (!surface) { return SDL_SetError("SDL_SetSurfacePalette() passed a NULL surface"); } return SDL_SetPixelFormatPalette(surface->format, palette); }
int SDL_SetSurfacePalette(SDL_Surface * surface, SDL_Palette * palette) { if (!surface) { return SDL_SetError("SDL_SetSurfacePalette() passed a NULL surface"); } if (SDL_SetPixelFormatPalette(surface->format, palette) < 0) { return -1; } SDL_InvalidateMap(surface->map); return 0; }
void SurfaceSDL::createPalette() { ASSERT_LOG(surface_ != nullptr, "No internal surface for createPalette."); ASSERT_LOG(surface_->format != nullptr, "No internal format field."); if(surface_->format->palette) { auto p = surface_->format->palette; palette_.resize(p->ncolors); for(int n = 0; n != p->ncolors; ++n) { palette_[n] = Color(p->colors[n].r, p->colors[n].g, p->colors[n].b, p->colors[n].a); } auto pf = std::dynamic_pointer_cast<SDLPixelFormat>(getPixelFormat()); ASSERT_LOG(pf != nullptr, "Couldn't cast pixelformat -- this is an error."); SDL_SetPixelFormatPalette(pf->get(), surface_->format->palette); } }
bool sdl_set_video_mode(struct graphics_data *graphics, int width, int height, int depth, bool fullscreen, bool resize) { struct sdl_render_data *render_data = graphics->render_data; #if SDL_VERSION_ATLEAST(2,0,0) bool matched = false; Uint32 fmt; render_data->window = SDL_CreateWindow("MegaZeux", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, sdl_flags(depth, fullscreen, resize)); if(!render_data->window) { warn("Failed to create window: %s\n", SDL_GetError()); goto err_out; } render_data->renderer = SDL_CreateRenderer(render_data->window, -1, SDL_RENDERER_SOFTWARE); if(!render_data->renderer) { warn("Failed to create renderer: %s\n", SDL_GetError()); goto err_destroy_window; } render_data->screen = SDL_GetWindowSurface(render_data->window); if(!render_data->screen) { warn("Failed to get window surface: %s\n", SDL_GetError()); goto err_destroy_renderer; } /* SDL 2.0 allows the window system to offer up buffers of a specific * format, and expects the application to perform a blit if the format * doesn't match what the app wanted. To accomodate this, allocate a * shadow screen that we render to in the case the formats do not match, * and blit it at present time. */ fmt = SDL_GetWindowPixelFormat(render_data->window); switch(depth) { case 8: matched = fmt == SDL_PIXELFORMAT_INDEX8; fmt = SDL_PIXELFORMAT_INDEX8; break; case 16: switch(fmt) { case SDL_PIXELFORMAT_RGB565: case SDL_PIXELFORMAT_BGR565: matched = true; break; default: fmt = SDL_PIXELFORMAT_RGB565; break; } break; case 32: switch(fmt) { case SDL_PIXELFORMAT_RGB888: case SDL_PIXELFORMAT_RGBX8888: case SDL_PIXELFORMAT_RGBA8888: case SDL_PIXELFORMAT_BGRX8888: case SDL_PIXELFORMAT_BGRA8888: case SDL_PIXELFORMAT_ARGB8888: case SDL_PIXELFORMAT_ABGR8888: matched = true; break; default: fmt = SDL_PIXELFORMAT_RGBA8888; break; } break; } if(!matched) { Uint32 Rmask, Gmask, Bmask, Amask; int bpp; SDL_PixelFormatEnumToMasks(fmt, &bpp, &Rmask, &Gmask, &Bmask, &Amask); render_data->shadow = SDL_CreateRGBSurface(0, width, height, bpp, Rmask, Gmask, Bmask, Amask); debug("Blitting enabled. Rendering performance will be reduced.\n"); } else { render_data->shadow = NULL; } if(fmt == SDL_PIXELFORMAT_INDEX8) { SDL_PixelFormat *format = render_data->shadow ? render_data->shadow->format : render_data->screen->format; render_data->palette = SDL_AllocPalette(SMZX_PAL_SIZE); if(!render_data->palette) { warn("Failed to allocate palette: %s\n", SDL_GetError()); goto err_destroy_renderer; } if(SDL_SetPixelFormatPalette(format, render_data->palette)) { warn("Failed to set pixel format palette: %s\n", SDL_GetError()); goto err_free_palette; } } else { render_data->palette = NULL; } sdl_window_id = SDL_GetWindowID(render_data->window); #else // !SDL_VERSION_ATLEAST(2,0,0) render_data->screen = SDL_SetVideoMode(width, height, depth, sdl_flags(depth, fullscreen, resize)); if(!render_data->screen) return false; render_data->shadow = NULL; #endif // !SDL_VERSION_ATLEAST(2,0,0) return true; #if SDL_VERSION_ATLEAST(2,0,0) err_free_palette: SDL_FreePalette(render_data->palette); render_data->palette = NULL; err_destroy_renderer: SDL_DestroyRenderer(render_data->renderer); render_data->renderer = NULL; err_destroy_window: SDL_DestroyWindow(render_data->window); render_data->window = NULL; err_out: return false; #endif // SDL_VERSION_ATLEAST(2,0,0) }