@@ -418,15 +418,34 @@ static buffer_texture* get_saved_texture_info(int texture_id) {
418
418
return (it != data.texture_buffers .end () ? it : nullptr );
419
419
}
420
420
421
- int graphics_renderer_interface::save_texture_from_screen (int texture_id, int x, int y , int width, int height) {
421
+ int graphics_renderer_interface::save_texture_from_screen (int texture_id, vec2i pos , int width, int height) {
422
422
auto &data = g_renderer_data;
423
423
SDL_Texture* former_target = SDL_GetRenderTarget (data.renderer );
424
424
if (!former_target) {
425
425
return 0 ;
426
426
}
427
427
428
428
buffer_texture texture_info;
429
- texture_info.texture = SDL_CreateTexture (data.renderer , SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, width, height);
429
+ buffer_texture *exist_texture_info = get_saved_texture_info (texture_id);
430
+ if (exist_texture_info) {
431
+ int w, h;
432
+ uint32_t format;
433
+ SDL_QueryTexture (exist_texture_info->texture , &format, nullptr , &w, &h);
434
+ if (w == width && h == height) {
435
+ texture_info = *exist_texture_info;
436
+ }
437
+ }
438
+
439
+ if (!texture_info.texture ) {
440
+ texture_info.texture = SDL_CreateTexture (data.renderer , SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, width, height);
441
+
442
+ texture_info.id = ++data.texture_buffer_id ;
443
+ texture_info.width = width;
444
+ texture_info.height = height;
445
+
446
+ data.texture_buffers .push_back (texture_info);
447
+ }
448
+
430
449
if (!texture_info.texture ) {
431
450
return 0 ;
432
451
}
@@ -439,19 +458,13 @@ int graphics_renderer_interface::save_texture_from_screen(int texture_id, int x,
439
458
440
459
SDL_Rect former_viewport;
441
460
SDL_RenderGetViewport (data.renderer , &former_viewport);
442
- SDL_Rect src_rect = {x + former_viewport.x , y + former_viewport.y , width, height};
461
+ SDL_Rect src_rect = {pos. x + former_viewport.x , pos. y + former_viewport.y , width, height};
443
462
SDL_Rect dst_rect = {0 , 0 , width, height};
444
463
SDL_SetRenderTarget (data.renderer , texture_info.texture );
445
464
SDL_RenderCopy (data.renderer , former_target, &src_rect, &dst_rect);
446
465
SDL_SetRenderTarget (data.renderer , former_target);
447
466
SDL_RenderSetViewport (data.renderer , &former_viewport);
448
467
449
- texture_info.id = ++data.texture_buffer_id ;
450
- texture_info.width = width;
451
- texture_info.height = height;
452
-
453
- data.texture_buffers .push_back (texture_info);
454
-
455
468
return texture_info.id ;
456
469
}
457
470
@@ -478,6 +491,32 @@ void graphics_renderer_interface::draw_saved_texture_to_screen(int texture_id, i
478
491
SDL_RenderCopy (data.renderer , texture_info->texture , &src_coords, &dst_coords);
479
492
}
480
493
494
+ void graphics_renderer_interface::clear_saved_texture (int texture_id, color clr) {
495
+ auto &data = g_renderer_data;
496
+ SDL_Texture *former_target = SDL_GetRenderTarget (data.renderer );
497
+ if (!former_target) {
498
+ return ;
499
+ }
500
+
501
+ buffer_texture *texture_info = get_saved_texture_info (texture_id);
502
+ if (!texture_info) {
503
+ return ;
504
+ }
505
+
506
+ SDL_Rect former_viewport;
507
+ SDL_RenderGetViewport (data.renderer , &former_viewport);
508
+ SDL_Rect dst_rect = { 0 , 0 , texture_info->width , texture_info->height };
509
+ SDL_SetRenderTarget (data.renderer , texture_info->texture );
510
+ SDL_SetRenderDrawColor (data.renderer ,
511
+ (clr & COLOR_CHANNEL_ALPHA) >> COLOR_BITSHIFT_ALPHA,
512
+ (clr & COLOR_CHANNEL_RED) >> COLOR_BITSHIFT_RED,
513
+ (clr & COLOR_CHANNEL_GREEN) >> COLOR_BITSHIFT_GREEN,
514
+ (clr & COLOR_CHANNEL_BLUE) >> COLOR_BITSHIFT_BLUE);
515
+
516
+ SDL_SetRenderTarget (data.renderer , former_target);
517
+ SDL_RenderSetViewport (data.renderer , &former_viewport);
518
+ }
519
+
481
520
static void create_blend_texture (int type) {
482
521
auto &data = g_renderer_data;
483
522
SDL_Texture* texture = SDL_CreateTexture (data.renderer , SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, 58 , 30 );
0 commit comments