@@ -584,7 +584,8 @@ static SDL_RenderCommand *PrepQueueCmdDraw(SDL_Renderer *renderer, const SDL_Ren
584
584
if (texture ) {
585
585
cmd -> data .draw .texture_scale_mode = texture -> scaleMode ;
586
586
}
587
- cmd -> data .draw .texture_address_mode = SDL_TEXTURE_ADDRESS_CLAMP ;
587
+ cmd -> data .draw .texture_address_mode_u = SDL_TEXTURE_ADDRESS_CLAMP ;
588
+ cmd -> data .draw .texture_address_mode_v = SDL_TEXTURE_ADDRESS_CLAMP ;
588
589
cmd -> data .draw .gpu_render_state = renderer -> gpu_render_state ;
589
590
if (renderer -> gpu_render_state ) {
590
591
renderer -> gpu_render_state -> last_command_generation = renderer -> render_command_generation ;
@@ -727,13 +728,15 @@ static bool QueueCmdGeometry(SDL_Renderer *renderer, SDL_Texture *texture,
727
728
const float * uv , int uv_stride ,
728
729
int num_vertices ,
729
730
const void * indices , int num_indices , int size_indices ,
730
- float scale_x , float scale_y , SDL_TextureAddressMode texture_address_mode )
731
+ float scale_x , float scale_y ,
732
+ SDL_TextureAddressMode texture_address_mode_u , SDL_TextureAddressMode texture_address_mode_v )
731
733
{
732
734
SDL_RenderCommand * cmd ;
733
735
bool result = false;
734
736
cmd = PrepQueueCmdDraw (renderer , SDL_RENDERCMD_GEOMETRY , texture );
735
737
if (cmd ) {
736
- cmd -> data .draw .texture_address_mode = texture_address_mode ;
738
+ cmd -> data .draw .texture_address_mode_u = texture_address_mode_u ;
739
+ cmd -> data .draw .texture_address_mode_v = texture_address_mode_v ;
737
740
result = renderer -> QueueGeometry (renderer , cmd , texture ,
738
741
xy , xy_stride ,
739
742
color , color_stride , uv , uv_stride ,
@@ -3739,7 +3742,7 @@ bool SDL_RenderLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count
3739
3742
result = QueueCmdGeometry (renderer , NULL ,
3740
3743
xy , xy_stride , & renderer -> color , 0 /* color_stride */ , NULL , 0 ,
3741
3744
num_vertices , indices , num_indices , size_indices ,
3742
- 1.0f , 1.0f , SDL_TEXTURE_ADDRESS_CLAMP );
3745
+ 1.0f , 1.0f , SDL_TEXTURE_ADDRESS_CLAMP , SDL_TEXTURE_ADDRESS_CLAMP );
3743
3746
}
3744
3747
3745
3748
SDL_small_free (xy , isstack1 );
@@ -3920,7 +3923,7 @@ static bool SDL_RenderTextureInternal(SDL_Renderer *renderer, SDL_Texture *textu
3920
3923
result = QueueCmdGeometry (renderer , texture ,
3921
3924
xy , xy_stride , & texture -> color , 0 /* color_stride */ , uv , uv_stride ,
3922
3925
num_vertices , indices , num_indices , size_indices ,
3923
- scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP );
3926
+ scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP , SDL_TEXTURE_ADDRESS_CLAMP );
3924
3927
} else {
3925
3928
const SDL_FRect rect = { dstrect -> x * scale_x , dstrect -> y * scale_y , dstrect -> w * scale_x , dstrect -> h * scale_y };
3926
3929
result = QueueCmdCopy (renderer , texture , srcrect , & rect );
@@ -4083,7 +4086,7 @@ bool SDL_RenderTextureAffine(SDL_Renderer *renderer, SDL_Texture *texture,
4083
4086
& texture -> color , 0 /* color_stride */ ,
4084
4087
uv , uv_stride ,
4085
4088
num_vertices , indices , num_indices , size_indices ,
4086
- scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP
4089
+ scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP , SDL_TEXTURE_ADDRESS_CLAMP
4087
4090
);
4088
4091
}
4089
4092
return result ;
@@ -4233,7 +4236,7 @@ bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture,
4233
4236
result = QueueCmdGeometry (renderer , texture ,
4234
4237
xy , xy_stride , & texture -> color , 0 /* color_stride */ , uv , uv_stride ,
4235
4238
num_vertices , indices , num_indices , size_indices ,
4236
- scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP );
4239
+ scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP , SDL_TEXTURE_ADDRESS_CLAMP );
4237
4240
} else {
4238
4241
result = QueueCmdCopyEx (renderer , texture , & real_srcrect , dstrect , angle , & real_center , flip , scale_x , scale_y );
4239
4242
}
@@ -4285,7 +4288,8 @@ static bool SDL_RenderTextureTiled_Wrap(SDL_Renderer *renderer, SDL_Texture *tex
4285
4288
return QueueCmdGeometry (renderer , texture ,
4286
4289
xy , xy_stride , & texture -> color , 0 /* color_stride */ , uv , uv_stride ,
4287
4290
num_vertices , indices , num_indices , size_indices ,
4288
- view -> current_scale .x , view -> current_scale .y , SDL_TEXTURE_ADDRESS_WRAP );
4291
+ view -> current_scale .x , view -> current_scale .y ,
4292
+ SDL_TEXTURE_ADDRESS_WRAP , SDL_TEXTURE_ADDRESS_WRAP );
4289
4293
}
4290
4294
4291
4295
static bool SDL_RenderTextureTiled_Iterate (SDL_Renderer * renderer , SDL_Texture * texture , const SDL_FRect * srcrect , float scale , const SDL_FRect * dstrect )
@@ -5032,7 +5036,7 @@ static bool SDLCALL SDL_SW_RenderGeometryRaw(SDL_Renderer *renderer,
5032
5036
result = QueueCmdGeometry (renderer , texture ,
5033
5037
xy , xy_stride , color , color_stride , uv , uv_stride ,
5034
5038
num_vertices , prev , 3 , 4 ,
5035
- scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP );
5039
+ scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP , SDL_TEXTURE_ADDRESS_CLAMP );
5036
5040
if (!result ) {
5037
5041
goto end ;
5038
5042
}
@@ -5052,7 +5056,7 @@ static bool SDLCALL SDL_SW_RenderGeometryRaw(SDL_Renderer *renderer,
5052
5056
result = QueueCmdGeometry (renderer , texture ,
5053
5057
xy , xy_stride , color , color_stride , uv , uv_stride ,
5054
5058
num_vertices , prev , 3 , 4 ,
5055
- scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP );
5059
+ scale_x , scale_y , SDL_TEXTURE_ADDRESS_CLAMP , SDL_TEXTURE_ADDRESS_CLAMP );
5056
5060
if (!result ) {
5057
5061
goto end ;
5058
5062
}
@@ -5077,7 +5081,8 @@ bool SDL_RenderGeometryRaw(SDL_Renderer *renderer,
5077
5081
{
5078
5082
int i ;
5079
5083
int count = indices ? num_indices : num_vertices ;
5080
- SDL_TextureAddressMode texture_address_mode ;
5084
+ SDL_TextureAddressMode texture_address_mode_u ;
5085
+ SDL_TextureAddressMode texture_address_mode_v ;
5081
5086
5082
5087
CHECK_RENDERER_MAGIC (renderer , false);
5083
5088
@@ -5132,18 +5137,38 @@ bool SDL_RenderGeometryRaw(SDL_Renderer *renderer,
5132
5137
texture = texture -> native ;
5133
5138
}
5134
5139
5135
- texture_address_mode = renderer -> texture_address_mode ;
5136
- if (texture_address_mode == SDL_TEXTURE_ADDRESS_AUTO && texture ) {
5137
- texture_address_mode = SDL_TEXTURE_ADDRESS_CLAMP ;
5140
+ texture_address_mode_u = renderer -> texture_address_mode_u ;
5141
+ texture_address_mode_v = renderer -> texture_address_mode_v ;
5142
+ if (texture &&
5143
+ (texture_address_mode_u == SDL_TEXTURE_ADDRESS_AUTO ||
5144
+ texture_address_mode_u == SDL_TEXTURE_ADDRESS_AUTO )) {
5138
5145
for (i = 0 ; i < num_vertices ; ++ i ) {
5139
5146
const float * uv_ = (const float * )((const char * )uv + i * uv_stride );
5140
5147
float u = uv_ [0 ];
5141
5148
float v = uv_ [1 ];
5142
- if (u < 0.0f || v < 0.0f || u > 1.0f || v > 1.0f ) {
5143
- texture_address_mode = SDL_TEXTURE_ADDRESS_WRAP ;
5144
- break ;
5149
+ if (u < 0.0f || u > 1.0f ) {
5150
+ if (texture_address_mode_u == SDL_TEXTURE_ADDRESS_AUTO ) {
5151
+ texture_address_mode_u = SDL_TEXTURE_ADDRESS_WRAP ;
5152
+ if (texture_address_mode_v != SDL_TEXTURE_ADDRESS_AUTO ) {
5153
+ break ;
5154
+ }
5155
+ }
5156
+ }
5157
+ if (v < 0.0f || v > 1.0f ) {
5158
+ if (texture_address_mode_v == SDL_TEXTURE_ADDRESS_AUTO ) {
5159
+ texture_address_mode_v = SDL_TEXTURE_ADDRESS_WRAP ;
5160
+ if (texture_address_mode_u != SDL_TEXTURE_ADDRESS_AUTO ) {
5161
+ break ;
5162
+ }
5163
+ }
5145
5164
}
5146
5165
}
5166
+ if (texture_address_mode_u == SDL_TEXTURE_ADDRESS_AUTO ) {
5167
+ texture_address_mode_u = SDL_TEXTURE_ADDRESS_CLAMP ;
5168
+ }
5169
+ if (texture_address_mode_v == SDL_TEXTURE_ADDRESS_AUTO ) {
5170
+ texture_address_mode_v = SDL_TEXTURE_ADDRESS_CLAMP ;
5171
+ }
5147
5172
}
5148
5173
5149
5174
if (indices ) {
@@ -5168,7 +5193,9 @@ bool SDL_RenderGeometryRaw(SDL_Renderer *renderer,
5168
5193
5169
5194
// For the software renderer, try to reinterpret triangles as SDL_Rect
5170
5195
#ifdef SDL_VIDEO_RENDER_SW
5171
- if (renderer -> software && texture_address_mode == SDL_TEXTURE_ADDRESS_CLAMP ) {
5196
+ if (renderer -> software &&
5197
+ texture_address_mode_u == SDL_TEXTURE_ADDRESS_CLAMP &&
5198
+ texture_address_mode_v == SDL_TEXTURE_ADDRESS_CLAMP ) {
5172
5199
return SDL_SW_RenderGeometryRaw (renderer , texture ,
5173
5200
xy , xy_stride , color , color_stride , uv , uv_stride , num_vertices ,
5174
5201
indices , num_indices , size_indices );
@@ -5180,7 +5207,36 @@ bool SDL_RenderGeometryRaw(SDL_Renderer *renderer,
5180
5207
xy , xy_stride , color , color_stride , uv , uv_stride ,
5181
5208
num_vertices , indices , num_indices , size_indices ,
5182
5209
view -> current_scale .x , view -> current_scale .y ,
5183
- texture_address_mode );
5210
+ texture_address_mode_u , texture_address_mode_v );
5211
+ }
5212
+
5213
+ bool SDL_SetRenderTextureAddressMode (SDL_Renderer * renderer , SDL_TextureAddressMode mode_u , SDL_TextureAddressMode mode_v )
5214
+ {
5215
+ CHECK_RENDERER_MAGIC (renderer , false);
5216
+
5217
+ renderer -> texture_address_mode_u = mode_u ;
5218
+ renderer -> texture_address_mode_v = mode_v ;
5219
+ return true;
5220
+ }
5221
+
5222
+ bool SDL_GetRenderTextureAddressMode (SDL_Renderer * renderer , SDL_TextureAddressMode * mode_u , SDL_TextureAddressMode * mode_v )
5223
+ {
5224
+ if (mode_u ) {
5225
+ * mode_u = SDL_TEXTURE_ADDRESS_INVALID ;
5226
+ }
5227
+ if (mode_v ) {
5228
+ * mode_v = SDL_TEXTURE_ADDRESS_INVALID ;
5229
+ }
5230
+
5231
+ CHECK_RENDERER_MAGIC (renderer , false);
5232
+
5233
+ if (mode_u ) {
5234
+ * mode_u = renderer -> texture_address_mode_u ;
5235
+ }
5236
+ if (mode_v ) {
5237
+ * mode_v = renderer -> texture_address_mode_v ;
5238
+ }
5239
+ return true;
5184
5240
}
5185
5241
5186
5242
SDL_Surface * SDL_RenderReadPixels (SDL_Renderer * renderer , const SDL_Rect * rect )
0 commit comments