src/video/SDL_rect.c
changeset 2997 e4f025078c1c
parent 2994 7563b99e9a49
child 3004 f3d7226a8dfd
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         }