rem: assert(x0 >= 0 && x0 <= image->width); assert(x1 >= 0 && x1 <= image->width); assert(y0 >= 0 && y0 <= image->height); assert(y1 >= 0 && y1 <= image->height);
add: if (!clipLineInRectangle(0, 0, image->width-1, image->height-1, &x0, &y0, &x1, &y1)) return True;
context: genericLine(RImage *image, int x0, int y0, int x1, int y1, RColor *color,            int operation, int polyline){    int i, err, du, dv, du2, dv2, uofs, vofs, last;    assert(image!=NULL);    assert(x0 >= 0 && x0 <= image->width);    assert(x1 >= 0 && x1 <= image->width);    assert(y0 >= 0 && y0 <= image->height);    assert(y1 >= 0 && y1 <= image->height);    if (x0 < x1) {        du = x1 - x0;        uofs = 1;    } else {        du = x0 - x1;        uofs = -1;    }    if (y0 < y1) {        dv = y1 -y0;        vofs = image->width;    } else {        dv = y0 - y1;        vofs = -image->width;    }    if (du < dv) {        /* Swap coordinates between them, so that always du>dv */        i = du; du = dv; dv = i;        i = uofs; uofs = vofs; vofs = i;    }    err = 0;    du2 = du<<1;    dv2 = dv<<1;    last = (polyline) ? du-1 : du;    if (color->alpha==255 || operation==RCopyOperation) {	unsigned char *sr, *sg, *sb, *sa;	i = y0*image->width + x0;	sr = image->data[0] + i;	sg = image->data[1] + i;	sb = image->data[2] + i;	sa = image->data[3] + i;	for (i=0; i<=last; i++) {	    /* Draw the pixel */	    *sr = color->red;	    *sg = color->green;	    *sb = color->blue;	    if (image->data[3])		*sa = 255;	    /* Compute error for NeXT Step */	    err += dv2;	    if (err >= du) {		sr += vofs; sg += vofs;		sb += vofs; sa += vofs;		err -= du2;	    }	    sr += uofs; sg += uofs;	    sb += uofs; sa += uofs;	}    } else {	register int ofs = y0*image->width + x0;		for (i=0; i<=last; i++) {	    /* Draw the pixel */	    operatePixel(image, ofs, operation, color);	    	    /* Compute error for NeXT Step */	    err += dv2;	    if (err >= du) {		ofs += vofs;		err -= du2;	    }	    ofs += uofs;	}    }	#if 0    if (mode == RALTER_PIXELS) {        RColorOffset *cdelta = (RColorOffset*)cdata;        register short r, g, b, a;        for (i=0; i<=last; i++) {            /* Change the pixel with offset */            r = (short)*sr + cdelta->red;            g = (short)*sg + cdelta->green;            b = (short)*sb + cdelta->blue;            if (r>255) r = 255; else if (r<0) r = 0;            if (g>255) g = 255; else if (g<0) g = 0;            if (b>255) b = 255; else if (b<0) b = 0;            *sr = (unsigned char) r;            *sg = (unsigned char) g;            *sb = (unsigned char) b;            if (image->data[3]) {                a = (short)*sa + cdelta->alpha;                if (a>255) a = 255; else if (a<0) a = 0;                *sa = (unsigned char) a;            }            /* Compute error for NeXT Step */            err += dv2;            if (err >= du) {                sr += vofs; sg += vofs;                sb += vofs; sa += vofs;                err -= du2;            }            sr += uofs; sg += uofs;            sb += uofs; sa += uofs;        }    } else {        RColor *color = (RColor*)cdata;        if (color->alpha==255) {            for (i=0; i<=last; i++) {                /* Draw the pixel */                *sr = color->red;                *sg = color->green;                *sb = color->blue;                if (image->data[3])                    *sa = 255;                /* Compute error for NeXT Step */                err += dv2;                if (err >= du) {                    sr += vofs; sg += vofs;                    sb += vofs; sa += vofs;                    err -= du2;                }                sr += uofs; sg += uofs;                sb += uofs; sa += uofs;            }        } else {            register short alpha, nalpha, r, g ,b;            alpha = color->alpha;            nalpha = 255 - alpha;            r = color->red;            g = color->green;            b = color->blue;            for (i=0; i<=last; i++) {                /* Draw the pixel */                *sr = (((int)*sr * nalpha) + (r * alpha))/256;                *sg = (((int)*sg * nalpha) + (g * alpha))/256;                *sb = (((int)*sb * nalpha) + (b * alpha))/256;                if (image->data[3])                    *sa = alpha + ((int)*sa * nalpha)/256;                /* Compute error for NeXT Step */                err += dv2;                if (err >= du) {                    sr += vofs; sg += vofs;                    sb += vofs; sa += vofs;                    err -= du2;                }                sr += uofs; sg += uofs;                sb += uofs; sa += uofs;            }        }    }#endif    return True;}