int SDL_UpdateTexture(SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { SDL_Renderer *renderer; SDL_Rect full_rect; CHECK_TEXTURE_MAGIC(texture, -1); if (!rect) { full_rect.x = 0; full_rect.y = 0; full_rect.w = texture->w; full_rect.h = texture->h; rect = &full_rect; } if (texture->yuv) { return SDL_UpdateTextureYUV(texture, rect, pixels, pitch); } else if (texture->native) { return SDL_UpdateTextureNative(texture, rect, pixels, pitch); } else { renderer = texture->renderer; return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch); } }
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event) { SDL_Renderer *renderer = (SDL_Renderer *)userdata; if (event->type == SDL_WINDOWEVENT) { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); if (window == renderer->window) { if (renderer->WindowEvent) { renderer->WindowEvent(renderer, &event->window); } if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { /* Try to keep the previous viewport centered */ int w, h; SDL_Rect viewport; SDL_GetWindowSize(window, &w, &h); viewport.x = (w - renderer->viewport.w) / 2; viewport.y = (h - renderer->viewport.h) / 2; viewport.w = renderer->viewport.w; viewport.h = renderer->viewport.h; SDL_RenderSetViewport(renderer, &viewport); } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) { renderer->minimized = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { renderer->minimized = SDL_FALSE; } } } return 0; }
int SDL_LockTexture(SDL_Texture * texture, const SDL_Rect * rect, void **pixels, int *pitch) { SDL_Renderer *renderer; SDL_Rect full_rect; CHECK_TEXTURE_MAGIC(texture, -1); if (texture->access != SDL_TEXTUREACCESS_STREAMING) { SDL_SetError("SDL_LockTexture(): texture must be streaming"); return -1; } if (!rect) { full_rect.x = 0; full_rect.y = 0; full_rect.w = texture->w; full_rect.h = texture->h; rect = &full_rect; } if (texture->yuv) { return SDL_LockTextureYUV(texture, rect, pixels, pitch); } else if (texture->native) { return SDL_LockTextureNative(texture, rect, pixels, pitch); } else { renderer = texture->renderer; return renderer->LockTexture(renderer, texture, rect, pixels, pitch); } }
int SDL_SetTextureBlendMode(SDL_Texture * texture, SDL_BlendMode blendMode) { SDL_Renderer *renderer; CHECK_TEXTURE_MAGIC(texture, -1); renderer = texture->renderer; texture->blendMode = blendMode; if (texture->native) { return SDL_SetTextureBlendMode(texture->native, blendMode); } else if (renderer->SetTextureBlendMode) { return renderer->SetTextureBlendMode(renderer, texture); } else { return 0; } }
void SDL_UnlockTexture(SDL_Texture * texture) { SDL_Renderer *renderer; CHECK_TEXTURE_MAGIC(texture, ); if (texture->access != SDL_TEXTUREACCESS_STREAMING) { return; } if (texture->yuv) { SDL_UnlockTextureYUV(texture); } else if (texture->native) { SDL_UnlockTextureNative(texture); } else { renderer = texture->renderer; renderer->UnlockTexture(renderer, texture); } }
int SDL_SetTextureAlphaMod(SDL_Texture * texture, Uint8 alpha) { SDL_Renderer *renderer; CHECK_TEXTURE_MAGIC(texture, -1); renderer = texture->renderer; if (alpha < 255) { texture->modMode |= SDL_TEXTUREMODULATE_ALPHA; } else { texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA; } texture->a = alpha; if (texture->native) { return SDL_SetTextureAlphaMod(texture->native, alpha); } else if (renderer->SetTextureAlphaMod) { return renderer->SetTextureAlphaMod(renderer, texture); } else { return 0; } }
int SDL_SetTextureColorMod(SDL_Texture * texture, Uint8 r, Uint8 g, Uint8 b) { SDL_Renderer *renderer; CHECK_TEXTURE_MAGIC(texture, -1); renderer = texture->renderer; if (r < 255 || g < 255 || b < 255) { texture->modMode |= SDL_TEXTUREMODULATE_COLOR; } else { texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR; } texture->r = r; texture->g = g; texture->b = b; if (texture->native) { return SDL_SetTextureColorMod(texture->native, r, g, b); } else if (renderer->SetTextureColorMod) { return renderer->SetTextureColorMod(renderer, texture); } else { return 0; } }
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event) { SDL_Renderer *renderer = (SDL_Renderer *)userdata; if (event->type == SDL_WINDOWEVENT) { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); if (window == renderer->window) { if (renderer->WindowEvent) { renderer->WindowEvent(renderer, &event->window); } if (event->window.event == SDL_WINDOWEVENT_RESIZED) { /* Try to keep the previous viewport centered */ int w, h; SDL_Rect viewport; SDL_GetWindowSize(window, &w, &h); if (renderer->target) { renderer->viewport_backup.x = (w - renderer->viewport_backup.w) / 2; renderer->viewport_backup.y = (h - renderer->viewport_backup.h) / 2; } else { viewport.x = (w - renderer->viewport.w) / 2; viewport.y = (h - renderer->viewport.h) / 2; viewport.w = renderer->viewport.w; viewport.h = renderer->viewport.h; SDL_RenderSetViewport(renderer, &viewport); } renderer->resized = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { int w, h; SDL_Rect viewport; if (!renderer->resized) { /* Window was programmatically resized, reset viewport */ SDL_GetWindowSize(window, &w, &h); if (renderer->target) { renderer->viewport_backup.x = 0; renderer->viewport_backup.y = 0; renderer->viewport_backup.w = w; renderer->viewport_backup.h = h; } else { viewport.x = 0; viewport.y = 0; viewport.w = w; viewport.h = h; SDL_RenderSetViewport(renderer, &viewport); } renderer->resized = SDL_FALSE; } } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) { renderer->hidden = SDL_FALSE; } } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) { renderer->hidden = SDL_FALSE; } } } } return 0; }
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event) { SDL_Renderer *renderer = (SDL_Renderer *)userdata; if (event->type == SDL_WINDOWEVENT) { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); if (window == renderer->window) { if (renderer->WindowEvent) { renderer->WindowEvent(renderer, &event->window); } if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (renderer->logical_w) { UpdateLogicalSize(renderer); } else { /* Window was resized, reset viewport */ int w, h; SDL_GetWindowSize(window, &w, &h); if (renderer->target) { renderer->viewport_backup.x = 0; renderer->viewport_backup.y = 0; renderer->viewport_backup.w = w; renderer->viewport_backup.h = h; } else { renderer->viewport.x = 0; renderer->viewport.y = 0; renderer->viewport.w = w; renderer->viewport.h = h; renderer->UpdateViewport(renderer); } } } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) { renderer->hidden = SDL_FALSE; } } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) { renderer->hidden = SDL_FALSE; } } } } else if (event->type == SDL_MOUSEMOTION) { if (renderer->logical_w) { event->motion.x -= renderer->viewport.x; event->motion.y -= renderer->viewport.y; event->motion.x = (int)(event->motion.x / renderer->scale.x); event->motion.y = (int)(event->motion.y / renderer->scale.y); } } else if (event->type == SDL_MOUSEBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) { if (renderer->logical_w) { event->button.x -= renderer->viewport.x; event->button.y -= renderer->viewport.y; event->button.x = (int)(event->button.x / renderer->scale.x); event->button.y = (int)(event->button.y / renderer->scale.y); } } return 0; }