@@ -42,32 +42,71 @@ SDL_COMPILE_TIME_ASSERT(can_indicate_overflow, SDL_SIZE_MAX > SDL_MAX_SINT32);
42
42
*
43
43
* for FOURCC, use SDL_CalculateYUVSize()
44
44
*/
45
- static size_t
46
- SDL_CalculatePitch (Uint32 format , size_t width , SDL_bool minimal )
45
+ static int
46
+ SDL_CalculateRGBSize (Uint32 format , size_t width , size_t height , size_t * size , size_t * pitch , SDL_bool minimal )
47
47
{
48
- size_t pitch ;
49
-
50
48
if (SDL_BITSPERPIXEL (format ) >= 8 ) {
51
- if (SDL_size_mul_overflow (width , SDL_BYTESPERPIXEL (format ), & pitch )) {
52
- return SDL_SIZE_MAX ;
49
+ if (SDL_size_mul_overflow (width , SDL_BYTESPERPIXEL (format ), pitch )) {
50
+ return -1 ;
53
51
}
54
52
} else {
55
- if (SDL_size_mul_overflow (width , SDL_BITSPERPIXEL (format ), & pitch )) {
56
- return SDL_SIZE_MAX ;
53
+ if (SDL_size_mul_overflow (width , SDL_BITSPERPIXEL (format ), pitch )) {
54
+ return -1 ;
57
55
}
58
- if (SDL_size_add_overflow (pitch , 7 , & pitch )) {
59
- return SDL_SIZE_MAX ;
56
+ if (SDL_size_add_overflow (* pitch , 7 , pitch )) {
57
+ return -1 ;
60
58
}
61
- pitch /= 8 ;
59
+ * pitch /= 8 ;
62
60
}
63
61
if (!minimal ) {
64
62
/* 4-byte aligning for speed */
65
- if (SDL_size_add_overflow (pitch , 3 , & pitch )) {
66
- return SDL_SIZE_MAX ;
63
+ if (SDL_size_add_overflow (* pitch , 3 , pitch )) {
64
+ return -1 ;
67
65
}
68
- pitch &= ~3 ;
66
+ * pitch &= ~3 ;
67
+ }
68
+
69
+ if (SDL_size_mul_overflow (height , * pitch , size )) {
70
+ /* Overflow... */
71
+ return -1 ;
69
72
}
70
- return pitch ;
73
+
74
+ return 0 ;
75
+ }
76
+
77
+ int SDL_CalculateSize (Uint32 format , int width , int height , size_t * size , size_t * pitch , SDL_bool minimalPitch )
78
+ {
79
+ size_t p = 0 , sz = 0 ;
80
+
81
+ if (size ) {
82
+ * size = 0 ;
83
+ }
84
+
85
+ if (pitch ) {
86
+ * pitch = 0 ;
87
+ }
88
+
89
+ if (SDL_ISPIXELFORMAT_FOURCC (format )) {
90
+ if (SDL_CalculateYUVSize (format , width , height , & sz , & p ) < 0 ) {
91
+ /* Overflow... */
92
+ return -1 ;
93
+ }
94
+ } else {
95
+ if (SDL_CalculateRGBSize (format , width , height , & sz , & p , minimalPitch ) < 0 ) {
96
+ /* Overflow... */
97
+ return -1 ;
98
+ }
99
+ }
100
+
101
+ if (size ) {
102
+ * size = sz ;
103
+ }
104
+
105
+ if (pitch ) {
106
+ * pitch = p ;
107
+ }
108
+
109
+ return 0 ;
71
110
}
72
111
73
112
/*
@@ -77,7 +116,7 @@ SDL_CalculatePitch(Uint32 format, size_t width, SDL_bool minimal)
77
116
SDL_Surface *
78
117
SDL_CreateSurface (int width , int height , Uint32 format )
79
118
{
80
- size_t pitch ;
119
+ size_t pitch , size ;
81
120
SDL_Surface * surface ;
82
121
83
122
if (width < 0 ) {
@@ -90,21 +129,10 @@ SDL_CreateSurface(int width, int height, Uint32 format)
90
129
return NULL ;
91
130
}
92
131
93
- if (SDL_ISPIXELFORMAT_FOURCC (format )) {
94
- int p ;
95
- if (SDL_CalculateYUVSize (format , width , height , NULL , & p ) < 0 ) {
96
- /* Overflow... */
97
- SDL_OutOfMemory ();
98
- return NULL ;
99
- }
100
- pitch = p ;
101
- } else {
102
- pitch = SDL_CalculatePitch (format , width , SDL_FALSE );
103
- if (pitch > SDL_MAX_SINT32 ) {
104
- /* Overflow... */
105
- SDL_OutOfMemory ();
106
- return NULL ;
107
- }
132
+ if (SDL_CalculateSize (format , width , height , & size , & pitch , SDL_FALSE /* not minimal pitch */ ) < 0 ) {
133
+ /* Overflow... */
134
+ SDL_OutOfMemory ();
135
+ return NULL ;
108
136
}
109
137
110
138
/* Allocate the surface */
@@ -146,25 +174,6 @@ SDL_CreateSurface(int width, int height, Uint32 format)
146
174
147
175
/* Get the pixels */
148
176
if (surface -> w && surface -> h ) {
149
- size_t size ;
150
- if (SDL_ISPIXELFORMAT_FOURCC (surface -> format -> format )) {
151
- /* Get correct size and pitch for YUV formats */
152
- if (SDL_CalculateYUVSize (surface -> format -> format , surface -> w , surface -> h , & size , & surface -> pitch ) < 0 ) {
153
- /* Overflow... */
154
- SDL_DestroySurface (surface );
155
- SDL_OutOfMemory ();
156
- return NULL ;
157
- }
158
- } else {
159
- /* Assumptions checked in surface_size_assumptions assert above */
160
- if (SDL_size_mul_overflow (surface -> h , surface -> pitch , & size )) {
161
- /* Overflow... */
162
- SDL_DestroySurface (surface );
163
- SDL_OutOfMemory ();
164
- return NULL ;
165
- }
166
- }
167
-
168
177
surface -> pixels = SDL_aligned_alloc (SDL_SIMDGetAlignment (), size );
169
178
if (!surface -> pixels ) {
170
179
SDL_DestroySurface (surface );
@@ -219,15 +228,10 @@ SDL_CreateSurfaceFrom(void *pixels,
219
228
} else {
220
229
size_t minimalPitch ;
221
230
222
- if (SDL_ISPIXELFORMAT_FOURCC (format )) {
223
- int p ;
224
- if (SDL_CalculateYUVSize (format , width , height , NULL , & p ) < 0 ) {
225
- SDL_InvalidParamError ("pitch" );
226
- return NULL ;
227
- }
228
- minimalPitch = p ;
229
- } else {
230
- minimalPitch = SDL_CalculatePitch (format , width , SDL_TRUE );
231
+ if (SDL_CalculateSize (format , width , height , NULL , & minimalPitch , SDL_TRUE /* minimal pitch */ ) < 0 ) {
232
+ /* Overflow... */
233
+ SDL_OutOfMemory ();
234
+ return NULL ;
231
235
}
232
236
233
237
if (pitch < 0 || (size_t )pitch < minimalPitch ) {
0 commit comments