📄 arcs0.c
字号:
/*************************************************************************/
/* */
/* Copyright (c) 1997 - 1999 Accelerated Technology, Inc. */
/* */
/* PROPRIETARY RIGHTS of Accelerated Technology are involved in the */
/* subject matter of this material. All manufacturing, reproduction, */
/* use, and sales rights pertaining to this subject matter are governed */
/* by the license agreement. The recipient of this software implicitly */
/* accepts the terms of the license. */
/* */
/*************************************************************************/
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* ARCS0.c 1.9 */
/* */
/* COMPONENT */
/* */
/* All */
/* */
/* DESCRIPTION */
/* */
/* This file contains the FrameArc & mwFDA functions. */
/* */
/* AUTHOR */
/* */
/* Robert G. Burrill, Accelerated Technology, Inc. */
/* */
/* DATA STRUCTURES */
/* */
/* None */
/* */
/* FUNCTIONS */
/* */
/* None */
/* */
/* DEPENDENCIES */
/* */
/* None */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* BobB 5/8/98 Corrected for global level */
/* BobB 3/10/99 Corrected dashed lines */
/* BobB 11/10/99 Corrected dashed lines */
/* */
/*************************************************************************/
#include "meta_wnd.h"
#include "metconst.h" /* MetaWINDOW Constant & Stucture Definitions */
#include "metports.h" /* MetaWINDOW Port & Bitmap Definitions */
#include "grafdata.h"
#include "metmacs3.h"
#include "xpol_4.h"
/* local function prototypes */
int ChkAngle(int angle);
void OvalPt(rect *argR, int angle, point *gblPt);
void mwSTQA(qarcState *QArcEdge, int QArcA, int QArcB, int QArcCenterX,
int QArcCenterY, int QArcDirection, int QArcTToB);
/* Function FrameArc draws an outline of the elliptical arc contained within
rectangle ovalR starting at bgnAngle degrees with a total of arcAngle degrees.
The current "pen" position is not affected by FrameArc. */
void FrameArc(rect *ovalR, int bgnAngle, int arcAngle)
{
void AddToGETYXSorted(qarcState *newEdge);
void mwSBQA(qarcState *QArcEdge, int QArcA, int QArcB, int QArcCenterX,
int QArcCenterY, int QArcDirection, int QArcTToB);
void mwSV(Vedge *VLEdge, int VLX, int VLY, int VLHeight, int VLDir);
void mwSLE(lineEdgeV *LineEdge, int XStart, int YStart, int XEnd, int YEnd,
int LineEdgeTToB);
void mwScanGET(void **GETPtrPtr, blitRcd *fillRcd, int scanRcdSize, int shape,
int fillRule, int allEdgesAreLines);
rect gBaseR; /* base rectangle */
rect gR; /* global outer rectangle */
rect iR; /* global inner rectangle */
rect cR; /* center point of rectangle */
point bgnPt; /* begin angle intersection point */
point endPt; /* end angle intersection point */
short grafErrValue; /* error value */
short halfWidth; /* offsets to edges of square pen */
short halfHeight;
short lineHeight;
int endAngle;
int bgnQuad;
int endQuad;
int arcType;
int typePtr;
short pointTbl[12]; /* table of X, Y values for the edges */
int i;
qarcState *newEdge; /* pointer to new edge to add to table */
void mwFDA(rect *boundR, int BANGLE, int AANGLE);
/* The following table defines the line segment insertions for the 20 arc
type cases.
For vertical "vt" lines the definitions provide the following
information for the call mwSV to insert the vertical edge:
db vt, X, minY, n/a, maxY, dir, more
mwSV(edgePtr, X, minY, maxY - minY, dir)
For arc edge "ln" lines the definitions provide the following
information for the "mwSLE" call to insert the line edge:
db ln, bgnX, bgnY, endX, endY, dir, more
mwSLE(edgePtr, bgnX, bgnY, endX, endY, dir);
In both cases "dir" indicates the edge trace direction (1=down, -1=up),
"more" indicates of another edge follows (0) or not (tEnd). */
#define vt 0 /* Vertical line */
#define ln 0xff /* Arc line edge */
#define tEnd 0xff /* end type definitions */
#define down 1 /* down edge */
#define up 0xff /* up edge */
#define NA 0
#define aeType 0 /* arc edge type, line (ln) or vertical (vt) */
#define aeBgnX 1 /* line begin X */
#define aeBgnY 2 /* line begin Y */
#define aeEndX 3 /* line end X */
#define aeEndY 4 /* line end Y */
#define aeDir 5 /* direction (up or down) */
#define aeEnd 6 /* last edge flag */
#define cXmin 0
#define cYmin 1
#define cXmax 2
#define cYmax 3
#define gXmin 4
#define gYmin 5
#define gXmax 6
#define gYmax 7
#define bgnX 8
#define bgnY 9
#define endX 10
#define endY 11
int typeTbl[20][5][7] = {
/* type00 */vt, gXmax, endY, NA, bgnY, down, 0,
ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
/* type01 */vt, gXmax, gYmin, NA, bgnY, down, 0,
ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, up, 0,
vt, gXmin, gYmin, NA, endY, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type02 */vt, gXmax, gYmin, NA, bgnY, down, 0,
ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, down, 0,
vt, gXmin, gYmin, NA, endY, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type03 */vt, gXmax, gYmin, NA, bgnY, down, 0,
ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, down, 0,
vt, gXmax, endY, NA, gYmax, down, 0,
vt, gXmin, gYmin, NA, gYmax, up, tEnd,
/* type04 */vt, gXmax, gYmin, NA, bgnY, down, 0,
ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, up, 0,
vt, gXmax, endY, NA, gYmax, down, 0,
vt, gXmin, gYmin, NA, gYmax, up, tEnd,
/* type05 */ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, up, 0,
vt, gXmin, bgnY, NA, endY, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
/* type06 */ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, down, 0,
vt, gXmin, bgnY, NA, endY, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
/* type07 */ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, down, 0,
vt, gXmax, endY, NA, gYmax, down, 0,
vt, gXmin, bgnY, NA, gYmax, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type08 */ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, up, 0,
vt, gXmax, endY, NA, gYmax, down, 0,
vt, gXmin, bgnY, NA, gYmax, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type09 */vt, gXmax, gYmin, NA, gYmax, down, 0,
vt, gXmin, bgnY, NA, gYmax, up, 0,
ln, bgnX, bgnY, cXmax, cYmax, down, 0,
ln, cXmax, cYmax, endX, endY, up, 0,
vt, gXmin, gYmin, NA, endY, up, tEnd,
/* type10 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmin, bgnY, NA, endY, down, 0,
ln, endX, endY, cXmax, cYmax, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
/* type11 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmin, bgnY, NA, gYmax, down, 0,
vt, gXmax, endY, NA, gYmax, up, 0,
ln, endX, endY, cXmax, cYmax, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type12 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmin, bgnY, NA, gYmax, down, 0,
vt, gXmax, endY, NA, gYmax, up, 0,
ln, endX, endY, cXmax, cYmax, down, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type13 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmin, bgnY, NA, gYmax, down, 0,
vt, gXmax, gYmin, NA, gYmax, up, 0,
vt, gXmin, gYmin, NA, endY, down, 0,
ln, endX, endY, cXmax, cYmax, down, tEnd,
/* type14 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmin, bgnY, NA, gYmax, down, 0,
vt, gXmax, gYmin, NA, gYmax, up, 0,
vt, gXmin, gYmin, NA, endY, down, 0,
ln, endX, endY, cXmax, cYmax, up, tEnd,
/* type15 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmax, endY, NA, bgnY, up, 0,
ln, endX, endY, cXmax, cYmax, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
/* type16 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmax, endY, NA, bgnY, up, 0,
ln, endX, endY, cXmax, cYmax, down, tEnd,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
/* type17 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmax, gYmin, NA, bgnY, up, 0,
vt, gXmin, gYmin, NA, endY, down, 0,
ln, endX, endY, cXmax, cYmax, down, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type18 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmax, gYmin, NA, bgnY, up, 0,
vt, gXmin, gYmin, NA, endY, down, 0,
ln, endX, endY, cXmax, cYmax, up, tEnd,
NA, NA, NA, NA, NA, NA, NA,
/* type19 */ln, cXmax, cYmax, bgnX, bgnY, down, 0,
vt, gXmax, gYmin, NA, bgnY, up, 0,
vt, gXmin, gYmin, NA, gYmax, down, 0,
vt, gXmax, endY, NA, gYmax, up, 0,
ln, endX, endY, cXmax, cYmax, up, tEnd};
for (i = 0; i < 12; i++) qaEdgeBuffer[i].NextEdge = 0; /* GET is initially empty */
if (grafPort.pnLevel < 0) return; /* nothing to do */
if (grafPort.pnFlags & pnDashFlg) /* is it dashed? */
{ /* yes, handle it elsewhere */
mwFDA(ovalR, bgnAngle, arcAngle);
return;
}
/* set up angles */
if (arcAngle == 0) return;
if (arcAngle < 0)
{ /* arc angle less than 0; fixup begin angle and make positive */
if (arcAngle < -3600) arcAngle = -3600;
bgnAngle = bgnAngle + arcAngle;
arcAngle = -arcAngle;
}
if (arcAngle > 3600) arcAngle = 3600; /* limit to +360.0 */
bgnAngle = ChkAngle(bgnAngle); /* insure ( 0 <= bgnANGLE < 3600 ) */
endAngle = bgnAngle + arcAngle;
bgnQuad = bgnAngle / 900;
endQuad = endAngle / 900;
arcType = endQuad + (bgnQuad << 2);
gR = *ovalR; /* get rectangle */
globalLevel--; /* check and keep global from now on */
/* BobB 5/8/98 corrected the following line for global level
if (globalLevel > 0) */
if (globalLevel >= 0)
{
/* convert from user to global */
U2GR(gR, &gR, 1);
}
if (!(grafPort.pnFlags & pnSizeFlg)) /* thin or wide line? */
{ /* thin */
xRadius = ((gR.Xmax - gR.Xmin) >> 1);
yRadius = ((gR.Ymax - gR.Ymin) >> 1);
if ((xRadius == 0) || (yRadius == 0))
{
globalLevel++;
return;
}
if ((xRadius < 0) || (yRadius < 0))
{
grafErrValue = c_FrameArc + c_NullRect; /* bad rectangle */
nuGrafErr(grafErrValue); /* report error */
globalLevel++;
return;
}
cR.Xmin = gR.Xmin + xRadius; /* compute center point */
cR.Ymin = gR.Ymin + yRadius;
cR.Xmax = gR.Xmax - xRadius;
cR.Ymax = gR.Ymax - yRadius;
gR.Xmax++; /* round up rect for frame */
gR.Ymax++;
OvalPt(&gR, bgnAngle, &bgnPt); /* point of intersection for begin angle */
OvalPt(&gR, endAngle, &endPt); /* point of intersection for end angle */
/* set up the outer edges first */
GETPtr = &qaEdgeBuffer[0];
newEdge = GETPtr;
newEdge->countNumber = 0; /* show as arc entry */
mwSTQA(newEdge, xRadius, yRadius, cR.Xmin, cR.Ymin, -1, -1);
newEdge = &qaEdgeBuffer[1];
mwSTQA(newEdge, xRadius, yRadius, (cR.Xmax +1), cR.Ymin, 1, 1);
newEdge->countNumber = 0; /* show as arc entry */
AddToGETYXSorted(newEdge); /* insert the new edge in GET, YX sorted */
newEdge = &qaEdgeBuffer[2];
mwSBQA(newEdge, xRadius, yRadius, cR.Xmin, cR.Ymax, 1, -1);
newEdge->countNumber = 0; /* show as arc entry */
AddToGETYXSorted(newEdge); /* insert the new edge in GET, YX sorted */
newEdge = &qaEdgeBuffer[3];
mwSBQA(newEdge, xRadius, yRadius, (cR.Xmax +1), cR.Ymax, -1, 1);
newEdge->countNumber = 0; /* show as arc entry */
AddToGETYXSorted(newEdge); /* insert the new edge in GET, YX sorted */
newEdge = &qaEdgeBuffer[4]; /* point to next table entry */
/* if the outer arcs are flat, the current GET is all we need */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -