Mercurial > sdl-ios-xcode
comparison src/video/SDL_rect.c @ 2997:e4f025078c1c
indent
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 04 Jan 2009 23:41:09 +0000 |
parents | 7563b99e9a49 |
children | f3d7226a8dfd |
comparison
equal
deleted
inserted
replaced
2996:972a69e47cd9 | 2997:e4f025078c1c |
---|---|
182 *Y2 = recty2; | 182 *Y2 = recty2; |
183 } | 183 } |
184 return SDL_TRUE; | 184 return SDL_TRUE; |
185 } | 185 } |
186 | 186 |
187 else | 187 else { |
188 { | 188 /* The task of clipping a line with finite slope ratios in a fixed- |
189 /* The task of clipping a line with finite slope ratios in a fixed- | 189 * precision coordinate space is not as immediately simple as it is |
190 * precision coordinate space is not as immediately simple as it is | 190 * with coordinates of arbitrary precision. If the ratio of slopes |
191 * with coordinates of arbitrary precision. If the ratio of slopes | 191 * between the input line segment and the result line segment is not |
192 * between the input line segment and the result line segment is not | 192 * a whole number, you have in fact *moved* the line segment a bit, |
193 * a whole number, you have in fact *moved* the line segment a bit, | 193 * and there can be no avoiding it without more precision |
194 * and there can be no avoiding it without more precision | 194 */ |
195 */ | 195 int *x_result_[] = { X1, X2, NULL }, **x_result = x_result_; |
196 int *x_result_[] = {X1, X2, NULL}, **x_result = x_result_; | 196 int *y_result_[] = { Y1, Y2, NULL }, **y_result = y_result_; |
197 int *y_result_[] = {Y1, Y2, NULL}, **y_result = y_result_; | |
198 SDL_bool intersection = SDL_FALSE; | 197 SDL_bool intersection = SDL_FALSE; |
199 double b, m, left, right, bottom, top; | 198 double b, m, left, right, bottom, top; |
200 int xl, xh, yl, yh; | 199 int xl, xh, yl, yh; |
201 | 200 |
202 /* solve mx+b line formula */ | 201 /* solve mx+b line formula */ |
203 m = (double)(y1-y2) / (double)(x1-x2); | 202 m = (double) (y1 - y2) / (double) (x1 - x2); |
204 b = y2 - m * (double) x2; | 203 b = y2 - m * (double) x2; |
205 | 204 |
206 /* find some linear intersections */ | 205 /* find some linear intersections */ |
207 left = (m * (double) rectx1) + b; | 206 left = (m * (double) rectx1) + b; |
208 right = (m * (double) rectx2) + b; | 207 right = (m * (double) rectx2) + b; |
230 /* check for a point that's entirely inside the rect */ | 229 /* check for a point that's entirely inside the rect */ |
231 if (RISING(rectx1, x1, rectx2) && RISING(recty1, y1, recty2)) { | 230 if (RISING(rectx1, x1, rectx2) && RISING(recty1, y1, recty2)) { |
232 x_result++; | 231 x_result++; |
233 y_result++; | 232 y_result++; |
234 intersection = SDL_TRUE; | 233 intersection = SDL_TRUE; |
235 } else /* it was determined earlier that *both* end-points are not contained */ | 234 } else |
236 | 235 /* it was determined earlier that *both* end-points are not contained */ |
237 if (RISING(rectx1, x2, rectx2) && RISING(recty1, y2, recty2)) { | 236 if (RISING(rectx1, x2, rectx2) && RISING(recty1, y2, recty2)) { |
238 **(x_result++) = x2; | 237 **(x_result++) = x2; |
239 **(y_result++) = y2; | 238 **(y_result++) = y2; |
240 intersection = SDL_TRUE; | 239 intersection = SDL_TRUE; |
241 } | 240 } |
244 **(x_result++) = rectx1; | 243 **(x_result++) = rectx1; |
245 **(y_result++) = (int) left; | 244 **(y_result++) = (int) left; |
246 intersection = SDL_TRUE; | 245 intersection = SDL_TRUE; |
247 } | 246 } |
248 | 247 |
249 if (*x_result == NULL) return intersection; | 248 if (*x_result == NULL) |
249 return intersection; | |
250 if (RISING(recty1, right, recty2) && RISING(xl, rectx2, xh)) { | 250 if (RISING(recty1, right, recty2) && RISING(xl, rectx2, xh)) { |
251 **(x_result++) = rectx2; | 251 **(x_result++) = rectx2; |
252 **(y_result++) = (int) right; | 252 **(y_result++) = (int) right; |
253 intersection = SDL_TRUE; | 253 intersection = SDL_TRUE; |
254 } | 254 } |
255 | 255 |
256 if (*x_result == NULL) return intersection; | 256 if (*x_result == NULL) |
257 return intersection; | |
257 if (RISING(rectx1, top, rectx2) && RISING(yl, recty1, yh)) { | 258 if (RISING(rectx1, top, rectx2) && RISING(yl, recty1, yh)) { |
258 **(x_result++) = (int) top; | 259 **(x_result++) = (int) top; |
259 **(y_result++) = recty1; | 260 **(y_result++) = recty1; |
260 intersection = SDL_TRUE; | 261 intersection = SDL_TRUE; |
261 } | 262 } |
262 | 263 |
263 if (*x_result == NULL) return intersection; | 264 if (*x_result == NULL) |
265 return intersection; | |
264 if (RISING(rectx1, bottom, rectx2) && RISING(yl, recty2, yh)) { | 266 if (RISING(rectx1, bottom, rectx2) && RISING(yl, recty2, yh)) { |
265 **(x_result++) = (int) bottom; | 267 **(x_result++) = (int) bottom; |
266 **(y_result++) = recty2; | 268 **(y_result++) = recty2; |
267 intersection = SDL_TRUE; | 269 intersection = SDL_TRUE; |
268 } | 270 } |