816 lines
29 KiB
C
816 lines
29 KiB
C
/*
|
|
* Copyright (c) 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.
|
|
*/
|
|
#ifndef lint
|
|
static char sccsid[] = "@(#)textmark.c 1.1 94/10/31 Copyr 1986 Sun Micro";
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1986 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#include "coretypes.h"
|
|
#include "corevars.h"
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: text */
|
|
/* */
|
|
/* PURPOSE: THE CHARACTER STRING IS DRAWN IN THE WORLD COORDINATE */
|
|
/* SYSTEM. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
static pt_type sp, up, path;
|
|
static ipt_type isp, iup, ipath;
|
|
static short charbuf[64];
|
|
static int stdmarkr = 43;
|
|
|
|
text(string) char *string;
|
|
{
|
|
char *funcname, *chptr, *sptr;
|
|
viewsurf *surfp;
|
|
int (*surfdd)();
|
|
short ptype, errnum, strlength, numchars, n;
|
|
ipt_type ip1, ip2, ip3;
|
|
pt_type p1, p2;
|
|
ddargtype ddstruct;
|
|
|
|
funcname = "text";
|
|
if (!_core_osexists)
|
|
{
|
|
_core_errhand(funcname, 21);
|
|
return(1);
|
|
}
|
|
if(strchk(string) == 2) {
|
|
errnum = 23;
|
|
_core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
|
|
_core_critflag++;
|
|
if (_core_xformvs)
|
|
{
|
|
_core_tranpt(&_core_cp.x, &p1.x);
|
|
_core_pt3cnvrt(&p1.x, &_core_ndccp.x);
|
|
}
|
|
ip1 = _core_ndccp; /* get current point in NDC space */
|
|
|
|
/*---- View transform character orientation parameters --------*/
|
|
/* compute three scaled direction vectors in NDC space */
|
|
|
|
if (_core_upflag || _core_pathflag || _core_spaceflag) {
|
|
p2 = _core_current.chrup;
|
|
_core_scalept( _core_current.charsize.height, &p2);/* size up vector */
|
|
_core_sizept( &p2.x, &up.x); /* transform up vector */
|
|
_core_pt3cnvrt( &up.x, &iup.x);
|
|
_core_vwptxtscale( &iup);
|
|
|
|
|
|
p2 = _core_current.chrpath;
|
|
_core_scalept( _core_current.charsize.width, &p2);/* size path vector */
|
|
_core_sizept( &p2.x, &path.x); /* transform path vector */
|
|
_core_pt3cnvrt( &path.x, &ipath.x);
|
|
_core_vwptxtscale( &ipath);
|
|
|
|
p2 = _core_current.chrpath;
|
|
_core_scalept( _core_current.chrspace.x, &p2); /* size space vector */
|
|
_core_sizept( &p2.x, &sp.x); /* transform space vector */
|
|
_core_pt3cnvrt( &sp.x, &isp.x);
|
|
_core_vwptxtscale( &isp);
|
|
}
|
|
_core_vwpscale( &ip1); /* scale and translate to viewport */
|
|
|
|
/*---------------- Write text stuff out to PDF --------------*/
|
|
|
|
if (_core_openseg->type >= RETAIN) {
|
|
ptype = PDFPICKID;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.pickid);
|
|
n = 4;
|
|
(void)_core_pdfwrite(SHORT,&n);
|
|
if (_core_current.chqualty >= CHARACTER) {
|
|
inquire_text_extent_3( string, &p2.x, &p2.y, &p2.z);
|
|
p2.w = 1.0;
|
|
_core_sizept( &p2.x, &p1.x);
|
|
_core_pt3cnvrt( &p1.x, &ip2.x); /* text extent NDC */
|
|
_core_vwptxtscale( &ip2); /* scale and translate to viewport */
|
|
ip2.x += ip1.x; ip2.y += ip1.y; ip2.z += ip1.z;
|
|
}
|
|
else { /* hard coded for current raster fonts */
|
|
numchars = length( string);
|
|
ip2.x = numchars * 288 + ip1.x; ip2.y = ip1.y; ip2.z = 0;
|
|
iup.y = 384; iup.x = 0;
|
|
}
|
|
ip3.w = 1;
|
|
ip3.x = ip1.x + iup.x; ip3.y = ip1.y + iup.y; ip3.z = ip1.z;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
ip3.x = ip2.x + iup.x; ip3.y = ip2.y + iup.y; ip3.z = ip2.z;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
ip3.x = ip2.x - iup.x; ip3.y = ip2.y - iup.y; ip3.z = ip2.z;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
ip3.x = ip1.x - iup.x; ip3.y = ip1.y - iup.y; ip3.z = ip1.z;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
if (_core_ropflag) { /* rasterop changed */
|
|
ptype = PDFROP; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.rasterop);
|
|
}
|
|
if (_core_textcflag) { /* color changed */
|
|
ptype = PDFTCOLOR; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.textindx);
|
|
}
|
|
if (_core_penflag) { /* pen properties changed */
|
|
ptype = PDFPEN; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.pen);
|
|
}
|
|
if (_core_fntflag) { /* font properties changed */
|
|
ptype = PDFFONT; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.font);
|
|
}
|
|
if (_core_upflag) { /* up direction changed */
|
|
ptype = PDFUP; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT*3,(short *)&iup);
|
|
}
|
|
if (_core_pathflag) { /* path direction changed */
|
|
ptype = PDFPATH; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT*3,(short *)&ipath);
|
|
}
|
|
if (_core_spaceflag) { /* inter-char spacing vector changed */
|
|
ptype = PDFSPACE; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT*3,(short *)&isp);
|
|
}
|
|
if (_core_justflag) { /* character justify changed */
|
|
ptype = PDFCHARJUST; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.chjust);
|
|
}
|
|
if (_core_qualflag) { /* character quality changed */
|
|
ptype = PDFCHARQUALITY; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.chqualty);
|
|
}
|
|
if (_core_cpchang) { /* cp changed since last put in pdf */
|
|
ptype = PDFMOVE; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT*3,(short *)&ip1);
|
|
}
|
|
ptype = PDFTEXT;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
strlength = length(string); /* number of shorts */
|
|
(void)_core_pdfwrite(SHORT,&strlength);
|
|
sptr = string; chptr = (char*)charbuf;
|
|
while (*chptr++ = *sptr++);
|
|
(void)_core_pdfwrite((strlength+1)>>1, charbuf); /* number of shorts required */
|
|
}
|
|
|
|
/*********************************************************************/
|
|
/* NOTE: STRING IS BEING PLACED IN PDF AS A WHOLE NO MATTER WHAT */
|
|
/* THE CHARACTER QUALITY TO SAVE SPACE AND ACCESSES TO */
|
|
/* FILE EVEN THOUGH CALCULATIONS FOR CHARACTER QUALITY TEXT */
|
|
/* WILL HAVE TO BE PERFORMED AGAIN UPON READING IN STRING */
|
|
/* FROM PDF DURING A REPAINT. (CONSIDERED LESS EXPENSIVE) */
|
|
/*********************************************************************/
|
|
|
|
/* before sending to devices must use image transformation on primitives */
|
|
|
|
if(! _core_openseg->idenflag) {
|
|
if(_core_openseg->type == XLATE2) {
|
|
ip1.x += _core_openseg->imxform[3][0]; /* PERFORM A TRANSLATION ONLY */
|
|
ip1.y += _core_openseg->imxform[3][1];
|
|
ip1.z += _core_openseg->imxform[3][2];
|
|
}
|
|
else if(_core_openseg->type == XFORM2) {
|
|
_core_imxfrm3( _core_openseg, &ip1, &ip2); ip1 = ip2;/* image xform current point */
|
|
ip2 = iup;
|
|
_core_imszpt3( _core_openseg, &ip2, &iup); /* image xform up vector */
|
|
ip2 = isp;
|
|
_core_imszpt3( _core_openseg, &ip2, &isp); /* image xform space vector */
|
|
ip2 = ipath;
|
|
_core_imszpt3( _core_openseg, &ip2, &ipath); /* image xform path vector */
|
|
}
|
|
}
|
|
|
|
/*--------- Write text on all selected surfaces ------------*/
|
|
|
|
for (n = 0; n < _core_openseg->vsurfnum; n++) {
|
|
surfp = _core_openseg->vsurfptr[n];
|
|
ddstruct.instance = surfp->vsurf.instance;
|
|
surfdd = surfp->vsurf.dd;
|
|
if (_core_textcflag || _core_ropflag || _core_texatt){
|
|
ddstruct.opcode = SETTCOL; /* color changed */
|
|
ddstruct.int1 = _core_current.textindx;
|
|
ddstruct.int2 = (_core_xorflag)?XORROP:_core_current.rasterop;
|
|
ddstruct.int3 = FALSE;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_fntflag || _core_texatt){ /* FONT PROPERTY CHANGED? */
|
|
ddstruct.opcode = SETFONT;
|
|
ddstruct.int1 = _core_current.font;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_penflag || _core_texatt){ /* PEN PROPERTY CHANGED? */
|
|
ddstruct.opcode = SETPEN;
|
|
ddstruct.int1 = _core_current.pen;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_upflag || _core_texatt) { /* UP PROPERTY CHANGED?*/
|
|
ddstruct.opcode = SETUP;
|
|
ddstruct.ptr1 = (char*)(&iup);
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_pathflag || _core_texatt){ /* PATH PROPERTY CHANGED?*/
|
|
ddstruct.opcode = SETPATH;
|
|
ddstruct.ptr1 = (char*)(&ipath);
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_spaceflag || _core_texatt){ /* SPACING PROPERTY CHANGED?*/
|
|
ddstruct.opcode = SETSPACE;
|
|
ddstruct.ptr1 = (char*)(&isp);
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if (_core_cpchang){ /* cp change since last sent to DD */
|
|
ddstruct.opcode = MOVE;
|
|
ddstruct.int1 = ip1.x;
|
|
ddstruct.int2 = ip1.y;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if (_core_openseg->segats.visbilty) {
|
|
if (_core_current.chqualty == STRING) {
|
|
ddstruct.opcode = TEXT;
|
|
ddstruct.ptr1 = string;
|
|
ddstruct.ptr2 = (char*)(&_core_vwstate.viewport);
|
|
ddstruct.int1 = _core_current.font;
|
|
ddstruct.int2 = 0; /* string posit from cp */
|
|
ddstruct.logical = TRUE;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
else { /* use vector font text */
|
|
ddstruct.opcode = VTEXT;
|
|
ddstruct.ptr1 = string;
|
|
ddstruct.ptr2 = (char*)(&_core_vwstate.viewport);
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
}
|
|
}
|
|
|
|
_core_textcflag = FALSE;
|
|
_core_fntflag = FALSE;
|
|
_core_penflag = FALSE;
|
|
_core_upflag = FALSE;
|
|
_core_pathflag = FALSE;
|
|
_core_spaceflag = FALSE;
|
|
_core_justflag = FALSE;
|
|
_core_qualflag = FALSE;
|
|
_core_ropflag = FALSE;
|
|
_core_texatt = FALSE;
|
|
_core_cpchang = FALSE;
|
|
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0);
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: marker_abs_2 */
|
|
/* */
|
|
/* PURPOSE: THE CP IS UPDATED TO (x,y) AND THEN THE SYSTEM-DEFINED */
|
|
/* MARKER 'n',CENTERED AT THE TRANSFORMED POSITION OF THE CP, */
|
|
/* IS CREATED. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
static ipt_type mup = { 0,256,0,1}; /* fix this to use defaults MJS */
|
|
static ipt_type mpath = { 256,0,0,1};
|
|
|
|
marker_abs_2(mx,my) float mx,my;
|
|
{
|
|
char *funcname, sstr[2];
|
|
int cm;
|
|
viewsurf *surfp;
|
|
int (*surfdd)();
|
|
short ptype, n;
|
|
pt_type p1;
|
|
ipt_type ip1, ip2, ip3;
|
|
ddargtype ddstruct;
|
|
|
|
funcname = "marker_abs_2";
|
|
if (! _core_osexists) {
|
|
_core_errhand(funcname,21);
|
|
return(1);
|
|
}
|
|
cm = _core_current.marker;
|
|
if ( (cm > MAXASCII) || (cm < MINASCII)) {
|
|
_core_errhand(funcname,25); /* report and replace with a question mark */
|
|
cm = QUESTION;
|
|
}
|
|
|
|
_core_critflag++;
|
|
_core_cp.x = mx; _core_cp.y = my; /* update cp and _core_ndccp */
|
|
_core_cp.z = 0.; _core_cp.w = 1.0;
|
|
_core_tranpt2( &_core_cp.x ,&p1.x);
|
|
_core_pt2cnvrt( &p1.x, &ip1.x);
|
|
_core_ndccp = ip1;
|
|
_core_cpchang = TRUE;
|
|
|
|
if(_core_wndwclip) {
|
|
if( !_core_clippt2( ip1.x, ip1.y)){ /* if point outside window */
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0);
|
|
}
|
|
}
|
|
_core_vwpscale( &ip1); /* scale and translate to viewport */
|
|
|
|
if (_core_openseg->type >= RETAIN) {
|
|
ptype = PDFPICKID;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.pickid);
|
|
n = 4;
|
|
(void)_core_pdfwrite(SHORT,&n);
|
|
|
|
ip3.x = ip1.x - mpath.x; ip3.y = ip1.y + mup.y; ip3.z = 0; ip3.w = 1;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
ip3.x = ip1.x + mpath.x; ip3.y = ip1.y + mup.y;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
ip3.x = ip1.x + mpath.x; ip3.y = ip1.y - mup.y;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
ip3.x = ip1.x - mpath.x; ip3.y = ip1.y - mup.y;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip3);
|
|
_core_update_segbndbox(_core_openseg, &ip3);
|
|
if (_core_ropflag) { /* rasterop changed */
|
|
ptype = PDFROP; (void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.rasterop);
|
|
}
|
|
if (_core_textcflag) { /* color changed */
|
|
ptype = PDFTCOLOR;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.textindx);
|
|
}
|
|
if (_core_cpchang) { /* if cp changed */
|
|
ptype = PDFMOVE;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT*3,(short *)&ip1);
|
|
}
|
|
ptype = PDFMARKER;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&cm);
|
|
}
|
|
|
|
/* perform an image transformation on the point before sending to DD */
|
|
|
|
if(! _core_openseg->idenflag) {
|
|
if(_core_openseg->type == XLATE2) { /* PERFORM TRANSLATION ONLY. */
|
|
ip1.x += _core_openseg->imxform[3][0];
|
|
ip1.y += _core_openseg->imxform[3][1];
|
|
}
|
|
else if(_core_openseg->type == XFORM2) { /* ROTATE,SCALE, TRANSLATE */
|
|
_core_imxfrm2( _core_openseg, &ip1, &ip2);
|
|
ip1 = ip2;
|
|
}
|
|
}
|
|
if(_core_outpclip) {
|
|
if( !_core_oclippt2( ip1.x, ip1.y, &_core_vwstate.viewport)){
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0); /* if pt outside viewport */
|
|
}
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/** from here on this function is essentially the same as TEXT except that***/
|
|
/** even if the DD supports text, it is only expected to generate ASCII ***/
|
|
/** characters, not special characters. Others are done by software. ***/
|
|
/** The DD is issued a MARK opcode rather than a TEXT so that it will use ***/
|
|
/** default character sizes and orientations and the cp is the center of ***/
|
|
/** the character. ***/
|
|
/****************************************************************************/
|
|
|
|
for (n = 0; n < _core_openseg->vsurfnum; n++) {
|
|
surfp = _core_openseg->vsurfptr[n];
|
|
ddstruct.instance = surfp->vsurf.instance;
|
|
surfdd = surfp->vsurf.dd;
|
|
if (_core_textcflag || _core_ropflag || _core_texatt){
|
|
ddstruct.opcode = SETTCOL; /* color changed */
|
|
ddstruct.int1 = _core_current.textindx;
|
|
ddstruct.int2 = (_core_xorflag)?XORROP:_core_current.rasterop;
|
|
ddstruct.int3 = FALSE;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_cpchang){ /* current point changed */
|
|
ddstruct.opcode = MOVE;
|
|
ddstruct.int1 = ip1.x;
|
|
ddstruct.int2 = ip1.y;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
sstr[0] = cm; sstr[1] = '\0'; /* one char long string */
|
|
|
|
if (_core_openseg->segats.visbilty) {
|
|
ddstruct.opcode = MARKER;
|
|
ddstruct.ptr1 = sstr;
|
|
ddstruct.ptr2 = (char*)(&_core_vwstate.viewport);
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
}
|
|
|
|
_core_textcflag = FALSE;
|
|
_core_ropflag = FALSE;
|
|
_core_cpchang = FALSE;
|
|
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0);
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: marker_rel_2 */
|
|
/* */
|
|
/* PURPOSE: THE CP IS UPDATED TO A RELATIVE (x,y) AND THEN THE */
|
|
/* SYSTEM-DEFINED MARKER 'n',CENTERED AT THE TRANSFORMED */
|
|
/* POSITION OF THE CP, IS CREATED. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
marker_rel_2(dx,dy) float dx,dy;
|
|
{
|
|
char *funcname;
|
|
|
|
funcname = "marker_rel_2";
|
|
if (! _core_osexists) {
|
|
_core_errhand(funcname,21);
|
|
return(1);
|
|
}
|
|
|
|
return( marker_abs_2(_core_cp.x + dx,_core_cp.y + dy));
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: polymarker_abs_2 */
|
|
/* */
|
|
/* PURPOSE: DESCRIBE A SEQUENCE OF MARKERS IN WORLD COORDINATES. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
polymarker_abs_2(xcoord,ycoord,n) float xcoord[],ycoord[]; short n;
|
|
{
|
|
char *funcname;
|
|
int errnum;
|
|
register int index;
|
|
|
|
funcname = "polymarker_abs_2";
|
|
if (! _core_osexists) {
|
|
errnum = 21; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
if (n <= 0) {
|
|
errnum = 22; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
|
|
for (index = 0; index < n; index++) {
|
|
(void)marker_abs_2(xcoord[index],ycoord[index]);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: polymarker_rel_2 */
|
|
/* */
|
|
/* PURPOSE: DESCRIBE A SEQUENCE OF MARKERS IN WORLD COORDINATES. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
polymarker_rel_2(xcoord,ycoord,n) float xcoord[],ycoord[]; int n;
|
|
{
|
|
char *funcname;
|
|
int errnum;
|
|
register int index;
|
|
|
|
funcname = "polymarker_rel_2";
|
|
if (! _core_osexists) {
|
|
errnum = 21; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
if (n <= 0) {
|
|
errnum = 22; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
|
|
for (index = 0; index < n; index++) {
|
|
(void)marker_rel_2(xcoord[index],ycoord[index]);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: marker_abs_3 */
|
|
/* */
|
|
/* PURPOSE: THE CP IS UPDATED TO (x,y,z) AND THEN THE SYSTEM-DEFINED */
|
|
/* MARKER 'n',CENTERED AT THE TRANSFORMED POSITION OF THE CP, */
|
|
/* IS CREATED. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
marker_abs_3(mx,my,mz) float mx,my,mz;
|
|
{
|
|
char *funcname, sstr[2];
|
|
int cm;
|
|
viewsurf *surfp;
|
|
int (*surfdd)();
|
|
short ptype, n;
|
|
pt_type p1;
|
|
ipt_type ip1, ip2;
|
|
ddargtype ddstruct;
|
|
|
|
funcname = "marker_abs_3";
|
|
if (! _core_osexists) {
|
|
_core_errhand(funcname,21);
|
|
return(1);
|
|
}
|
|
cm = _core_current.marker;
|
|
if (cm < 1) {
|
|
_core_errhand(funcname,25); return(2);
|
|
}
|
|
if ((cm > stdmarkr) && (cm < MINASCII) || (cm > MAXASCII)) {
|
|
cm = QUESTION;
|
|
}
|
|
|
|
_core_critflag++;
|
|
_core_cp.x = mx; _core_cp.y = my; _core_cp.z = mz; _core_cp.w = 1.0;
|
|
_core_tranpt( &_core_cp.x ,&p1.x);
|
|
_core_pt3cnvrt( &p1.x, &ip1.x);
|
|
_core_ndccp = ip1;
|
|
_core_cpchang = TRUE;
|
|
|
|
if(_core_wclipplanes) {
|
|
if( !_core_clippt3( ip1.x, ip1.y, 0)){ /* if point outside window */
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0);
|
|
}
|
|
}
|
|
_core_vwpscale( &ip1); /* scale and translate to viewport */
|
|
|
|
if (_core_openseg->type >= RETAIN) {
|
|
ptype = PDFPICKID;
|
|
(void)_core_pdfwrite(SHORT, (short *)&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.pickid);
|
|
n = 4;
|
|
(void)_core_pdfwrite(SHORT,&n);
|
|
|
|
ip2.x = ip1.x - mpath.x; ip2.y = ip1.y + mup.y;
|
|
ip2.z = ip1.z; ip2.w = ip1.w;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip2);
|
|
_core_update_segbndbox(_core_openseg, &ip2);
|
|
ip2.x = ip1.x + mpath.x; ip2.y = ip1.y + mup.y;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip2);
|
|
_core_update_segbndbox(_core_openseg, &ip2);
|
|
ip2.x = ip1.x + mpath.x; ip2.y = ip1.y - mup.y;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip2);
|
|
_core_update_segbndbox(_core_openseg, &ip2);
|
|
ip2.x = ip1.x - mpath.x; ip2.y = ip1.y - mup.y;
|
|
(void)_core_pdfwrite(FLOAT*3, (short *)&ip2);
|
|
_core_update_segbndbox(_core_openseg, &ip2);
|
|
if (_core_ropflag) { /* rop properties changed */
|
|
ptype = PDFROP;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.rasterop);
|
|
}
|
|
if (_core_textcflag) { /* color changed */
|
|
ptype = PDFTCOLOR;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&_core_current.textindx);
|
|
}
|
|
if (_core_cpchang ) { /* current point changed */
|
|
ptype = PDFMOVE;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT*3,(short *)&ip1);
|
|
}
|
|
ptype = PDFMARKER;
|
|
(void)_core_pdfwrite(SHORT,&ptype);
|
|
(void)_core_pdfwrite(FLOAT,(short *)&cm);
|
|
}
|
|
/* perform an image transformation on the point before sending to DD */
|
|
|
|
if(! _core_openseg->idenflag) {
|
|
if(_core_openseg->type == XLATE3) { /* PERFORM A TRANSLATION ONLY. */
|
|
ip1.x += _core_openseg->imxform[3][0];
|
|
ip1.y += _core_openseg->imxform[3][1];
|
|
ip1.z += _core_openseg->imxform[3][2];
|
|
}
|
|
else if(_core_openseg->type == XFORM3) { /* ROTATE,SCALE, TRANSLATE */
|
|
_core_imxfrm3( _core_openseg, &ip1, &ip2);
|
|
ip1 = ip2;
|
|
}
|
|
}
|
|
if(_core_outpclip) { /* for clipping after imxforming */
|
|
if( !_core_oclippt2( ip1.x, ip1.y, &_core_vwstate.viewport)){
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0); /* if point outside window */
|
|
}
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* from here on this function is essentially the same as TEXT except that */
|
|
/* even if the DD supports text, it is only expected to generate ASCII */
|
|
/* characters, not special characters. Others are done by software. */
|
|
/* The DD is issued a MARK opcode rather than a TEXT so that it will use */
|
|
/* default character sizes and orientations and the cp is the center of */
|
|
/* the character. */
|
|
/****************************************************************************/
|
|
|
|
for (n = 0; n < _core_openseg->vsurfnum; n++) {
|
|
surfp = _core_openseg->vsurfptr[n];
|
|
ddstruct.instance = surfp->vsurf.instance;
|
|
surfdd = surfp->vsurf.dd;
|
|
if (_core_textcflag || _core_ropflag || _core_texatt) {
|
|
ddstruct.opcode = SETTCOL; /* color changed */
|
|
ddstruct.int1 = _core_current.textindx;
|
|
ddstruct.int2 = (_core_xorflag)?XORROP:_core_current.rasterop;
|
|
ddstruct.int3 = FALSE;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
if(_core_cpchang) { /* current point changed */
|
|
ddstruct.opcode = MOVE;
|
|
ddstruct.int1 = ip1.x;
|
|
ddstruct.int2 = ip1.y;
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
sstr[0] = cm; sstr[1] = '\0'; /* one char long string */
|
|
|
|
if (_core_openseg->segats.visbilty) {
|
|
ddstruct.opcode = MARKER;
|
|
ddstruct.ptr1 = sstr;
|
|
ddstruct.ptr2 = (char*)(&_core_vwstate.viewport);
|
|
(*surfdd)(&ddstruct);
|
|
}
|
|
}
|
|
|
|
_core_textcflag = FALSE;
|
|
_core_ropflag = FALSE;
|
|
_core_cpchang = FALSE;
|
|
|
|
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
|
|
(*_core_sighandle)();
|
|
return(0);
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: marker_rel_3 */
|
|
/* */
|
|
/* PURPOSE: THE CP IS UPDATED TO A RELATIVE (x,y,z) AND THEN THE */
|
|
/* SYSTEM-DEFINED MARKER 'n',CENTERED AT THE TRANSFORMED */
|
|
/* POSITION OF THE CP, IS CREATED. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
marker_rel_3(dx,dy,dz) float dx,dy,dz;
|
|
{
|
|
char *funcname;
|
|
int errnum;
|
|
int n;
|
|
|
|
funcname = "marker_rel_3";
|
|
if (! _core_osexists) {
|
|
_core_errhand(funcname,21);
|
|
return(1);
|
|
}
|
|
n = _core_current.marker;
|
|
if (n < 1) {
|
|
errnum = 25;
|
|
_core_errhand(funcname,errnum);
|
|
return(2);
|
|
}
|
|
if ((n > stdmarkr) && (n < MINASCII)) {
|
|
errnum = 25;
|
|
_core_errhand(funcname,errnum);
|
|
/*** do not return, merely report and replace with a question mark ***/
|
|
n = QUESTION;
|
|
}
|
|
if (n > MAXASCII) {
|
|
errnum = 25;
|
|
_core_errhand(funcname,errnum);
|
|
/*** do not return, merely report and replace with a question mark ***/
|
|
n = QUESTION;
|
|
}
|
|
|
|
return( marker_abs_3(_core_cp.x + dx, _core_cp.y + dy, _core_cp.z + dz) );
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: polymarker_abs_3 */
|
|
/* */
|
|
/* PURPOSE: DESCRIBE A SEQUENCE OF MARKERS IN WORLD COORDINATES. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
polymarker_abs_3(xcoord,ycoord,zcoord,n)
|
|
float xcoord[],ycoord[],zcoord[]; int n;
|
|
{
|
|
char *funcname;
|
|
int errnum;
|
|
register int index;
|
|
|
|
funcname = "polymarker_abs_3";
|
|
if (! _core_osexists) {
|
|
errnum = 21; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
if (n <= 0) {
|
|
errnum = 22; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
|
|
for (index = 0; index < n; index++) {
|
|
(void)marker_abs_3(xcoord[index],ycoord[index],zcoord[index]);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* FUNCTION: polymarker_rel_3 */
|
|
/* */
|
|
/* PURPOSE: DESCRIBE A SEQUENCE OF MARKERS IN WORLD COORDINATES. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
polymarker_rel_3(xcoord,ycoord,zcoord,n)
|
|
float xcoord[],ycoord[],zcoord[]; int n;
|
|
{
|
|
char *funcname;
|
|
register int index;
|
|
int errnum;
|
|
|
|
funcname = "polymarker_rel_3";
|
|
if (! _core_osexists) {
|
|
errnum = 21; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
if (n <= 0) {
|
|
errnum = 22; _core_errhand(funcname,errnum);
|
|
return(errnum);
|
|
}
|
|
for (index = 0; index < n; index++) {
|
|
(void)marker_rel_3(xcoord[index],ycoord[index],zcoord[index]);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* FUNCTION: length */
|
|
/* */
|
|
/* PURPOSE: COMPUTE THE LENGTH ( NUMBER OF CHARACTERS) OF A STRING. */
|
|
/****************************************************************************/
|
|
|
|
static int length(string) char *string;
|
|
{
|
|
register int counter;
|
|
|
|
for(counter = 0;*string != '\0';string++,counter++) ;
|
|
return(counter);
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* FUNCTION: strchk */
|
|
/* PURPOSE: CHECK A STRING FOR AN ILLEGAL CHARACTER. */
|
|
/****************************************************************************/
|
|
|
|
static int strchk(string) char *string;
|
|
{
|
|
for( ;*string != '\0';string++) {
|
|
if((*string < MINASCII) || (*string > MAXASCII)) {
|
|
*string = QUESTION;
|
|
return(2);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|