int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture) { SDL_Rect viewport; if (!SDL_RenderTargetSupported(renderer)) { SDL_Unsupported(); return -1; } if (texture == renderer->target) { /* Nothing to do! */ return 0; } /* texture == NULL is valid and means reset the target to the window */ if (texture) { CHECK_TEXTURE_MAGIC(texture, -1); if (renderer != texture->renderer) { SDL_SetError("Texture was not created with this renderer"); return -1; } if (!(texture->access & SDL_TEXTUREACCESS_TARGET)) { SDL_SetError("Texture not created with SDL_TEXTUREACCESS_TARGET"); return -1; } if (texture->native) { /* Always render to the native texture */ texture = texture->native; } } if (texture && !renderer->target) { /* Make a backup of the viewport */ renderer->viewport_backup = renderer->viewport; } renderer->target = texture; if (renderer->SetRenderTarget(renderer, texture) < 0) { return -1; } if (texture) { viewport.x = 0; viewport.y = 0; viewport.w = texture->w; viewport.h = texture->h; } else { viewport = renderer->viewport_backup; } if (SDL_RenderSetViewport(renderer, &viewport) < 0) { return -1; } /* All set! */ return 0; }
int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture) { if (!SDL_RenderTargetSupported(renderer)) { return SDL_Unsupported(); } if (texture == renderer->target) { /* Nothing to do! */ return 0; } /* texture == NULL is valid and means reset the target to the window */ if (texture) { CHECK_TEXTURE_MAGIC(texture, -1); if (renderer != texture->renderer) { return SDL_SetError("Texture was not created with this renderer"); } if (texture->access != SDL_TEXTUREACCESS_TARGET) { return SDL_SetError("Texture not created with SDL_TEXTUREACCESS_TARGET"); } if (texture->native) { /* Always render to the native texture */ texture = texture->native; } } if (texture && !renderer->target) { /* Make a backup of the viewport */ renderer->viewport_backup = renderer->viewport; renderer->clip_rect_backup = renderer->clip_rect; renderer->scale_backup = renderer->scale; renderer->logical_w_backup = renderer->logical_w; renderer->logical_h_backup = renderer->logical_h; } renderer->target = texture; if (renderer->SetRenderTarget(renderer, texture) < 0) { return -1; } if (texture) { renderer->viewport.x = 0; renderer->viewport.y = 0; renderer->viewport.w = texture->w; renderer->viewport.h = texture->h; renderer->scale.x = 1.0f; renderer->scale.y = 1.0f; renderer->logical_w = texture->w; renderer->logical_h = texture->h; } else { renderer->viewport = renderer->viewport_backup; renderer->clip_rect = renderer->clip_rect_backup; renderer->scale = renderer->scale_backup; renderer->logical_w = renderer->logical_w_backup; renderer->logical_h = renderer->logical_h_backup; } if (renderer->UpdateViewport(renderer) < 0) { return -1; } if (renderer->UpdateClipRect(renderer) < 0) { return -1; } /* All set! */ return 0; }