@@ -958,10 +958,8 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
958
958
#ifndef SDL_RENDER_DISABLED
959
959
SDL_Window * window = (SDL_Window * )SDL_GetPointerProperty (props , SDL_PROP_RENDERER_CREATE_WINDOW_POINTER , NULL );
960
960
SDL_Surface * surface = (SDL_Surface * )SDL_GetPointerProperty (props , SDL_PROP_RENDERER_CREATE_SURFACE_POINTER , NULL );
961
- const char * name = SDL_GetStringProperty (props , SDL_PROP_RENDERER_CREATE_NAME_STRING , NULL );
962
- const int n = SDL_GetNumRenderDrivers ();
961
+ const char * driver_name = SDL_GetStringProperty (props , SDL_PROP_RENDERER_CREATE_NAME_STRING , NULL );
963
962
const char * hint ;
964
- int i , attempted = 0 ;
965
963
SDL_PropertiesID new_props ;
966
964
967
965
#ifdef SDL_PLATFORM_ANDROID
@@ -1008,36 +1006,44 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
1008
1006
}
1009
1007
} else {
1010
1008
bool rc = false;
1011
- if (!name ) {
1012
- name = SDL_GetHint (SDL_HINT_RENDER_DRIVER );
1013
- }
1014
-
1015
- if (name ) {
1016
- for (i = 0 ; i < n ; i ++ ) {
1017
- const SDL_RenderDriver * driver = render_drivers [i ];
1018
- if (SDL_strcasecmp (name , driver -> name ) == 0 ) {
1019
- // Create a new renderer instance
1020
- ++ attempted ;
1021
- rc = driver -> CreateRenderer (renderer , window , props );
1022
- break ;
1009
+ if (!driver_name ) {
1010
+ driver_name = SDL_GetHint (SDL_HINT_RENDER_DRIVER );
1011
+ }
1012
+
1013
+ if (driver_name && * driver_name != 0 ) {
1014
+ const char * driver_attempt = driver_name ;
1015
+ while (driver_attempt && * driver_attempt != 0 && !rc ) {
1016
+ const char * driver_attempt_end = SDL_strchr (driver_attempt , ',' );
1017
+ const size_t driver_attempt_len = (driver_attempt_end ) ? (driver_attempt_end - driver_attempt ) : SDL_strlen (driver_attempt );
1018
+
1019
+ for (int i = 0 ; render_drivers [i ]; i ++ ) {
1020
+ const SDL_RenderDriver * driver = render_drivers [i ];
1021
+ if ((driver_attempt_len == SDL_strlen (driver -> name )) && (SDL_strncasecmp (driver -> name , driver_attempt , driver_attempt_len ) == 0 )) {
1022
+ rc = driver -> CreateRenderer (renderer , window , props );
1023
+ if (rc ) {
1024
+ break ;
1025
+ }
1026
+ }
1023
1027
}
1028
+
1029
+ driver_attempt = (driver_attempt_end ) ? (driver_attempt_end + 1 ) : NULL ;
1024
1030
}
1025
1031
} else {
1026
- for (i = 0 ; i < n ; i ++ ) {
1032
+ for (int i = 0 ; render_drivers [ i ] ; i ++ ) {
1027
1033
const SDL_RenderDriver * driver = render_drivers [i ];
1028
- // Create a new renderer instance
1029
- ++ attempted ;
1030
1034
rc = driver -> CreateRenderer (renderer , window , props );
1031
1035
if (rc ) {
1032
- break ; // Yay, we got one!
1036
+ break ;
1033
1037
}
1034
1038
SDL_DestroyRendererWithoutFreeing (renderer );
1035
1039
SDL_zerop (renderer ); // make sure we don't leave function pointers from a previous CreateRenderer() in this struct.
1036
1040
}
1037
1041
}
1038
1042
1039
1043
if (!rc ) {
1040
- if (!name || !attempted ) {
1044
+ if (driver_name ) {
1045
+ SDL_SetError ("%s not available" , driver_name );
1046
+ } else {
1041
1047
SDL_SetError ("Couldn't find matching render driver" );
1042
1048
}
1043
1049
goto error ;
0 commit comments