Files
Arquivotheca.SunOS-4.1.4/usr.lib/libcgi/circarcpat.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

263 lines
9.2 KiB
C

#ifndef lint
static char sccsid[] = "@(#)circarcpat.c 1.1 94/10/31 Copyr 1985-9 Sun Micro";
#endif
/*
* Copyright (c) 1985, 1986, 1987, 1988, 1989 by Sun Microsystems, Inc.
* Permission to use, copy, modify, and distribute this software for any
* purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both that copyright
* notice and this permission notice are retained, and that the name
* of Sun Microsystems, Inc., not be used in advertising or publicity
* pertaining to this software without specific, written prior permission.
* Sun Microsystems, Inc., makes no representations about the suitability
* of this software or the interface defined in this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/*
* CGI circular arc functions
*/
/*
_cgi_fill_partial_pattern_circle
_cgi_arc_fill_ret_pts
_cgi_fill_partial_pattern_pie_circle
_cgi_partial_pie_circ_fill_pie_ret_pts
*/
#include "cgipriv.h"
#include <math.h>
View_surface *_cgi_vws; /* current view surface */
Outatt *_cgi_att; /* structure containing current attributes */
int _cgi_pix_mode; /* pixrect equivalent of drawing mode */
double pow();
Pixrect *_cgi_circrect;
#include "cgipriv_arcs.h"
Pixrect *_cgi_pattern();
#define pw_pencil(dpw, x, y, w, h, op, stpr, stx, sty, spr, sy, sx) \
(*(dpw)->pw_ops->pro_stencil) ((dpw)->pw_opshandle, \
x - (dpw)->pw_opsx, y - (dpw)->pw_opsy, \
w, h, op, stpr, stx, sty, spr, sy, sx)
/****************************************************************************/
/* */
/* FUNCTION: _cgi_fill_partial_pattern_circle */
/* */
/* **************************************************************************/
_cgi_fill_partial_pattern_circle(c1, c2, c3, rad, index, flag)
Ccoor *c1, *c2, *c3; /* wds 850221: Pointers to center and
* contact point */
int rad; /* radius */
int index, flag;
{
int x, y, d /* , color */ ;
int x1, y1;
/* geometric info for a circular or elliptical arc */
struct cgi_arc_geom arc_info;
int srad;
float m, b;
int size;
Pixrect *patrect, *outrect;
_cgi_devscalen(rad, srad);
_cgi_devscale(c1->x, c1->y, x1, y1);
_cgi_devscale(c2->x, c2->y, arc_info.x2, arc_info.y2);
_cgi_devscale(c3->x, c3->y, arc_info.x3, arc_info.y3);
size = 1 + srad + srad;
/* translate screen coords to coords of retained pixrect */
#define X_TRANSLATION (x1 - srad)
#define Y_TRANSLATION (y1 - srad)
_cgi_circrect = mem_create(size, size, 1);
/*
* WDS: _cgi_vws->sunview.depth may not be set to this view surfaces'
* depth.
*/
outrect = mem_create(size, size, _cgi_vws->sunview.depth);
patrect = _cgi_pattern(index, flag);
(void) pr_replrop(outrect, 0, 0, size, size, PIX_SRC,
patrect, X_TRANSLATION, Y_TRANSLATION);
if ((arc_info.x3 - arc_info.x2) != 0)
{
m = (arc_info.y3 - arc_info.y2);
m = m / (arc_info.x3 - arc_info.x2);
b = (arc_info.y3 - Y_TRANSLATION)
- m * (arc_info.x3 - X_TRANSLATION);
}
else
{
m = 0;
b = (arc_info.x3 - X_TRANSLATION);
}
arc_info.xc = x1 - X_TRANSLATION, arc_info.yc = y1 - Y_TRANSLATION;
arc_info.x2 -= X_TRANSLATION, arc_info.y2 -= Y_TRANSLATION;
arc_info.x3 -= X_TRANSLATION, arc_info.y3 -= Y_TRANSLATION;
_cgi_setup_arc_geom(&arc_info, srad, srad, 0);
x = 0;
y = srad;
d = 3 - 2 * srad;
while (x < y)
{
_cgi_arc_fill_ret_pts(&arc_info, srad, 1, x, y, m, b);
if (d < 0)
d += 4 * x + 6;
else
{
d += 4 * (x - y) + 10;
y = y - 1;
}
x += 1;
}
if (x = y)
_cgi_arc_fill_ret_pts(&arc_info, srad, 1, x, y, m, b);
/* translate coords of retained pixrect back to screen coords */
pw_pencil(_cgi_vws->sunview.pw, X_TRANSLATION, Y_TRANSLATION, size, size,
_cgi_pix_mode, _cgi_circrect, 0, 0, outrect, 0, 0);
(void) pr_destroy(patrect);
(void) pr_destroy(outrect);
/* (void) pr_destroy (endrect); */
(void) pr_destroy(_cgi_circrect);
#undef X_TRANSLATION (x1 - srad)
#undef Y_TRANSLATION (y1 - srad)
}
/****************************************************************************/
/* */
/****************************************************************************/
_cgi_arc_fill_ret_pts(arc_geom, rad, color, x, y, m, b)
struct cgi_arc_geom *arc_geom; /* pointer to geometric info for arc */
short rad, color, x, y;
float m, b;
{ /* draw symmetry points of circle */
short a1, a2, a3, a4; /* WDS: xrads */
a1 = rad + x;
a2 = rad + y;
a3 = rad - x;
a4 = rad - y;
/* From left to right along a single scanline (yrads) */
_cgi_vector_arc_clip(a2, a4, rad + x, color, arc_geom, m, b, 0);
_cgi_vector_arc_clip(a3, a1, rad + y, color, arc_geom, m, b, 0);
_cgi_vector_arc_clip(a2, a4, rad - x, color, arc_geom, m, b, 0);
_cgi_vector_arc_clip(a3, a1, rad - y, color, arc_geom, m, b, 0);
}
/****************************************************************************/
/* */
/* FUNCTION: _cgi_fill_partial_pattern_pie_circle */
/* */
/* */
/****************************************************************************/
_cgi_fill_partial_pattern_pie_circle(c1, c2, c3, rad, index, flag)
Ccoor *c1, *c2, *c3; /* wds 850221: Pointers to center and
* contact point */
int rad; /* radius */
int index, flag;
{
register short x, y, d, color;
int x1, y1;
int x2, y2;
int x3, y3;
int x1t, y1t;
int x2t, y2t;
int x3t, y3t;
int srad;
int size;
Pixrect *patrect, *outrect;
struct cgi_pie_clip_geom _cgi_pie;
_cgi_devscale(c1->x, c1->y, x1t, y1t);
_cgi_devscale(c2->x, c2->y, x2t, y2t);
_cgi_devscale(c3->x, c3->y, x3t, y3t);
_cgi_devscalen(rad, srad);
/* _cgi_pcirc_box (x1, y1, x2, y2, x3, y3, srad, &x5, &y5, &x6, &y6,0); */
/* translate to pixrect coors and build pie clipping structure */
x1 = srad + 1, y1 = srad + 1;
#define X_OFFSET (x1-x1t)/* xt(screen)+X_OFFSET = x(pixrect) */
#define Y_OFFSET (y1-y1t)/* yt(screen)+Y_OFFSET = y(pixrect) */
x2 = x2t + X_OFFSET, y2 = y2t + Y_OFFSET;
x3 = x3t + X_OFFSET, y3 = y3t + Y_OFFSET;
_cgi_pie.xc = x1, _cgi_pie.yc = y1;
_cgi_pie.x2 = x2, _cgi_pie.y2 = y2;
_cgi_pie.x3 = x3, _cgi_pie.y3 = y3;
/* removed all the prior-to-850425 crap -- now in "setup pie" function */
size = 1 + srad + srad;
_cgi_circrect = mem_create(size, size, 1);
outrect = mem_create(size, size, _cgi_vws->sunview.depth);
patrect = _cgi_pattern(index, flag);
(void) pr_replrop(outrect, 0, 0, size, size, PIX_SRC,
patrect, -X_OFFSET, -Y_OFFSET);
_cgi_setup_pie_geom(&_cgi_pie, srad);
x = 0;
y = srad;
d = 3 - 2 * srad;
color = _cgi_att->fill.color;
while (x < y)
{
_cgi_partial_pie_circ_fill_pie_ret_pts(srad, srad, &_cgi_pie,
color, x, y);
if (d < 0)
d = d + 4 * x + 6;
else
{
d = d + 4 * (x - y) + 10;
y = y - 1;
}
x += 1;
}
if (x = y)
_cgi_partial_pie_circ_fill_pie_ret_pts(srad, srad, &_cgi_pie,
color, x, y);
pw_unlock(_cgi_vws->sunview.pw);
pw_pencil(_cgi_vws->sunview.pw, -X_OFFSET, -Y_OFFSET, size, size,
_cgi_pix_mode, _cgi_circrect, 0, 0, outrect, 0, 0);
(void) pr_destroy(patrect);
(void) pr_destroy(outrect);
(void) pr_destroy(_cgi_circrect);
}
/****************************************************************************/
/* */
/* FUNCTION: _cgi_partial_pie_circ_fill_pie_ret_pts */
/* */
/* */
/****************************************************************************/
/* WDS: this is it */
_cgi_partial_pie_circ_fill_pie_ret_pts(x0, y0, pie_ptr, color, x, y)
short x0, y0, color, x, y;
struct cgi_pie_clip_geom *pie_ptr;
/* wds: it gets slopes directly from the pie structure */
{ /* draw symmetry points of circle */
short a1, a2, a3, a4, b1, b2, b3, b4;
a1 = x0 + x;
a2 = x0 + y;
a3 = x0 - x;
a4 = x0 - y;
b1 = y0 + x;
b2 = y0 + y;
b3 = y0 - x;
b4 = y0 - y;
/* _cgi_vector_pcirc_pie_clip gets slopes directly from the pie structure */
_cgi_vector_pcirc_pie_clip(a4, a2, b1, color, pie_ptr, 0);
_cgi_vector_pcirc_pie_clip(a3, a1, b2, color, pie_ptr, 0);
_cgi_vector_pcirc_pie_clip(a4, a2, b3, color, pie_ptr, 0);
_cgi_vector_pcirc_pie_clip(a3, a1, b4, color, pie_ptr, 0);
}