summaryrefslogtreecommitdiff
path: root/clip.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2024-05-03 15:29:15 +0000
committerrodri <rgl@antares-labs.eu>2024-05-03 15:29:15 +0000
commitc1a0f17d5272255456af4be4e0aa5a7e697fcf11 (patch)
tree9d4d183e6c0c78c3bb6e869de2163e5e12e2d10e /clip.c
parentafc811ce9e8b8a1a3d83b3855f4a9e63ba5a2c7b (diff)
downloadlibgraphics-c1a0f17d5272255456af4be4e0aa5a7e697fcf11.tar.gz
libgraphics-c1a0f17d5272255456af4be4e0aa5a7e697fcf11.tar.bz2
libgraphics-c1a0f17d5272255456af4be4e0aa5a7e697fcf11.zip
clip: fix rectclipline.
mixed up CLIP[TB] and the slope was being computed as an integer division, which caused artifacts.
Diffstat (limited to 'clip.c')
-rw-r--r--clip.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/clip.c b/clip.c
index 82b15ea..18019fc 100644
--- a/clip.c
+++ b/clip.c
@@ -179,22 +179,25 @@ outcode(Point p, Rectangle r)
/*
* Cohen-Sutherland rectangle-line clipping
*/
-void
+int
rectclipline(Rectangle r, Point *p0, Point *p1)
{
int code0, code1;
- int Δx;
+ int Δx, Δy;
double m;
Δx = p1->x - p0->x;
- m = Δx == 0? 0: (p1->y - p0->y)/Δx;
+ Δy = p1->y - p0->y;
+ m = Δx == 0? 0: (double)Δy/Δx;
for(;;){
code0 = outcode(*p0, r);
code1 = outcode(*p1, r);
- if(lineisinside(code0, code1) || lineisoutside(code0, code1))
- break;
+ if(lineisinside(code0, code1))
+ return 0;
+ else if(lineisoutside(code0, code1))
+ return -1;
if(ptisinside(code0)){
swappt(p0, p1);
@@ -207,11 +210,11 @@ rectclipline(Rectangle r, Point *p0, Point *p1)
}else if(code0 & CLIPR){
p0->y += (r.max.x - p0->x)*m;
p0->x = r.max.x;
- }else if(code0 & CLIPB){
+ }else if(code0 & CLIPT){
if(p0->x != p1->x && m != 0)
p0->x += (r.min.y - p0->y)/m;
p0->y = r.min.y;
- }else if(code0 & CLIPT){
+ }else if(code0 & CLIPB){
if(p0->x != p1->x && m != 0)
p0->x += (r.max.y - p0->y)/m;
p0->y = r.max.y;