Mercurial > hg > dmlib
diff dmlineclip.h @ 265:51ba74f7668c
Make line clipping floating point only.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 10 Oct 2012 13:28:31 +0300 |
parents | 200329bb7688 |
children | 4ad2b9739c4a |
line wrap: on
line diff
--- a/dmlineclip.h Wed Oct 10 13:02:35 2012 +0300 +++ b/dmlineclip.h Wed Oct 10 13:28:31 2012 +0300 @@ -17,10 +17,10 @@ if (QY > clipY1) QB |= CLIP_BOTTOM; \ } while (0) -#define xA (*x0) -#define xB (*x1) -#define yA (*y0) -#define yB (*y1) +#define xA (fx0) +#define xB (fx1) +#define yA (fy0) +#define yB (fy1) #endif #ifdef DM_CLIP_DEBUG @@ -39,61 +39,79 @@ clipY0 = screen->clip_rect.y, clipX1 = clipX0 + screen->clip_rect.w - 1, clipY1 = clipY0 + screen->clip_rect.h - 1; - + double fx0 = *x0, fy0 = *y0, fx1 = *x1, fy1 = *y1; int clipA, clipB; DM_CLIP_BITS(clipA, xA, yA); DM_CLIP_BITS(clipB, xB, yB); - CLIPDEB("-- clip [%d, %d - %d, %d] --\n", xA, yA, xB, yB); + CLIPDEB("-- clip [%1.3f, %1.3f - %1.3f, %1.3f] --\n", xA, yA, xB, yB); #if 1 - // The segment is inside? - if ((clipA | clipB) == 0) - return 0; - - // The line segment is outside of the clip region - if (clipA & clipB) - return -1; - // Cohen-Sutherland clipping method do { const int c = clipA ? clipA : clipB; DM_COORD_TYPE x, y; + // The segment is inside? + if ((clipA | clipB) == 0) + { + *x0 = fx0; + *y0 = fy0; + *x1 = fx1; + *y1 = fy1; + return 0; + } + + // The line segment is outside of the clip region + if (clipA & clipB) + return -1; + #ifdef DM_CLIP_DEBUG CLIPDEB "CLIP : "); if (c == clipA) - CLIPDEB("A [%d, %d]\n", xA, yA); + CLIPDEB("A [%1.3f, %1.3f]\n", xA, yA); else - CLIPDEB("B [%d, %d]\n", xB, yB); + CLIPDEB("B [%1.3f, %1.3f]\n", xB, yB); #endif if (c & CLIP_TOP) { - x = xA + ((clipY0 - yA) * (xB - xA)) / (yB - yA); + if (yB - yA != 0) + x = xA + ((clipY0 - yA) * (xB - xA)) / (yB - yA); + else + x = xA; y = clipY0; - CLIPDEB("TOP : %d, %d\n", x, y); + CLIPDEB("TOP : %1.3f, %1.3f\n", x, y); } else if (c & CLIP_BOTTOM) { - x = xA + ((clipY1 - yA) * (xB - xA)) / (yB - yA); + if (yB - yA != 0) + x = xA + ((clipY1 - yA) * (xB - xA)) / (yB - yA); + else + x = xA; y = clipY1; - CLIPDEB("BOTTOM : %d, %d\n", x, y); + CLIPDEB("BOTTOM : %1.3f, %1.3f\n", x, y); } else if (c & CLIP_RIGHT) { - y = yA + ((clipX1 - xA) * (yB - yA)) / (xB - xA); + if (xB - xA != 0) + y = yA + ((clipX1 - xA) * (yB - yA)) / (xB - xA); + else + y = yA; x = clipX1; - CLIPDEB("RIGHT : %d, %d\n", x, y); + CLIPDEB("RIGHT : %1.3f, %1.3f\n", x, y); } else { - y = yA + ((clipX0 - xA) * (yB - yA)) / xB - xA; + if (xB - xA != 0) + y = yA + ((clipX0 - xA) * (yB - yA)) / xB - xA; + else + y = yA; x = clipX0; - CLIPDEB("LEFT : %d, %d\n", x, y); + CLIPDEB("LEFT : %1.3f, %1.3f\n", x, y); } if (c == clipA) @@ -109,7 +127,7 @@ DM_CLIP_BITS(clipB, xB, yB); } - } while (clipA | clipB); + } while (1); #else // Buyu-Skala clipping method const DM_COORD_TYPE dx = xB - xA;