Added some rasterization of polygons, moved some point definitions to correct locations.

This commit is contained in:
dcone%netscape.com 2000-05-11 03:58:58 +00:00
parent 639b586e85
commit 25178094e4
5 changed files with 393 additions and 33 deletions

View File

@ -379,6 +379,12 @@ public:
*/
NS_IMETHOD FillPolygon(const nsPoint aPoints[], PRInt32 aNumPoints) = 0;
/**
* Rasterize a polygon with the current fill color.
* @param aPoints points to use for the drawing, last must equal first
* @param aNumPonts number of points in the polygon
*/
NS_IMETHOD RasterPolygon(const nsPoint aPoints[], PRInt32 aNumPoints)=0;
/**
* Fill a poly in the current foreground color, without transformation taking place

View File

@ -109,15 +109,15 @@ struct nsFloatPoint {
* the curve.. or off of the curve for a path
* @update 03/29/00 dwc
*/
struct nsPathPoint: public nsPoint{
struct nsPathPoint: public nsFloatPoint{
PRBool mIsOnCurve;
// Constructors
nsPathPoint() {}
nsPathPoint(const nsPathPoint& aPoint) {x = aPoint.x; y = aPoint.y;mIsOnCurve=aPoint.mIsOnCurve;}
nsPathPoint(nscoord aX, nscoord aY) {x = aX; y = aY;mIsOnCurve=PR_TRUE;}
nsPathPoint(nscoord aX, nscoord aY,PRBool aIsOnCurve) {x = aX; y = aY;mIsOnCurve=aIsOnCurve;}
nsPathPoint(float aX, float aY) {x = aX; y = aY;mIsOnCurve=PR_TRUE;}
nsPathPoint(float aX, float aY,PRBool aIsOnCurve) {x = aX; y = aY;mIsOnCurve=aIsOnCurve;}
};

View File

@ -27,6 +27,13 @@
#include "nsPoint.h"
typedef struct {
double x; // x coordinate of edge's intersection with current scanline */
double dx; // change in x with respect to y
int i; // edge number: edge i goes from mPointList[i] to mPointList[i+1]
} Edge;
class nsRenderingContextImpl : public nsIRenderingContext
{
@ -36,6 +43,8 @@ public:
protected:
nsTransform2D *mTranMatrix; // The rendering contexts transformation matrix
int mAct; // number of active edges
Edge *mActive; // active edge list:edges crossing scanline y
public:
nsRenderingContextImpl();
@ -60,6 +69,14 @@ public:
*/
NS_IMETHOD FillPath(nsPathPoint aPointArray[],PRInt32 aNumPts);
/**
* Fill a poly in the current foreground color
* @param aPoints points to use for the drawing, last must equal first
* @param aNumPonts number of points in the polygon
*/
NS_IMETHOD RasterPolygon(const nsPoint aPoints[], PRInt32 aNumPoints);
/** ---------------------------------------------------
* See documentation in nsIRenderingContext.h
* @update 05/01/00 dwc
@ -95,7 +112,8 @@ protected:
*/
void TileImage(nsDrawingSurface aDS,nsRect &aSrcRect,PRInt16 aWidth,PRInt16 aHeight);
void cdelete(int i);
void cinsert(int i,int y,const nsPoint aPointArray[],PRInt32 aNumPts);
public:
@ -118,7 +136,7 @@ public:
void SetControls(nsFloatPoint &aAnc1,nsFloatPoint &aCon,nsFloatPoint &aAnc2) { mAnc1 = aAnc1; mCon = aCon; mAnc2 = aAnc2;}
void SetPoints(nscoord a1x,nscoord a1y,nscoord acx,nscoord acy,nscoord a2x,nscoord a2y) {mAnc1.MoveTo(a1x,a1y),mCon.MoveTo(acx,acy),mAnc2.MoveTo(a2x,a2y);}
void SetPoints(float a1x,float a1y,float acx,float acy,float a2x,float a2y) {mAnc1.MoveTo(a1x,a1y),mCon.MoveTo(acx,acy),mAnc2.MoveTo(a2x,a2y);}
void DebugPrint();
/** ---------------------------------------------------
* Divide a Quadratic curve into line segments if it is not smaller than a certain size
* else it is so small that it can be approximated by 2 lineto calls

View File

@ -24,6 +24,14 @@
#include "nsIDeviceContext.h"
#include "nsIImage.h"
#include "nsTransform2D.h"
#include <stdlib.h>
const nsPoint *gPts;
// comparison routines for qsort
int compare_ind(const void *u,const void *v){return gPts[(int)*((int*)u)].y <= gPts[(int)*((int*)v)].y ? -1 : 1;}
int compare_active(const void *u,const void *v){return ((Edge*)u)->x <= ((Edge*)v)->x ? -1 : 1;}
/** ---------------------------------------------------
@ -209,7 +217,6 @@ nsPathIter::eSegType curveType;
nsPoint thePath[MAXPATHSIZE];
PRInt16 curPoint=0;
// Transform the points first
if (aNumPts > 20){
pp0 = new nsPathPoint[aNumPts];
@ -246,6 +253,141 @@ PRInt16 curPoint=0;
return NS_OK;
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
*/
NS_IMETHODIMP
nsRenderingContextImpl::RasterPolygon(const nsPoint aPointArray[],PRInt32 aNumPts)
{
int x,k,y0,y1,y,i,j,xl,xr;
int *ind;
nsPoint pts[20];
nsPoint *pp,*pp0;
const nsPoint *np;
nsPoint thePath[MAXPATHSIZE];
if (aNumPts<=0)
return NS_OK;
// Transform the points first
if (aNumPts > 20){
pp0 = new nsPoint[aNumPts];
} else {
pp0 = &pts[0];
}
pp = pp0;
np = &aPointArray[0];
for ( i= 0; i < aNumPts; i++,np++,pp++){
pp->x = np->x;
pp->y = np->y;
mTranMatrix->TransformCoord((int*)&pp->x,(int*)&pp->y);
}
ind = new PRInt32[aNumPts];
mActive = new Edge[aNumPts];
gPts = pp0;
// create y-sorted array of indices ind[k] into vertex list
for (k=0; k<aNumPts; k++)
ind[k] = k;
qsort(ind, aNumPts, sizeof ind[0], compare_ind); // sort ind by mPointList[ind[k]].y
mAct = 0; // start with empty active list
k = 0; // ind[k] is next vertex to process
y0 = (int)ceil(pp0[ind[0]].y-.5);
y1 = (int)floor(pp0[ind[aNumPts-1]].y-.5);
for (y=y0; y<=y1; y++) { // step through scanlines
// check vertices between previous scanline and current one, if any */
for (; k<aNumPts && pp0[ind[k]].y<=y+.5; k++) {
i = ind[k];
j = i>0 ? i-1 : aNumPts-1;
if (pp0[j].y <= y-.5)
cdelete(j);
else if (pp0[j].y > y+.5)
cinsert(j, y,pp0, aNumPts);
j = i<aNumPts-1 ? i+1 : 0;
if (pp0[j].y <= y-.5)
cdelete(i);
else if (pp0[j].y > y+.5)
cinsert(i, y,pp0, aNumPts);
}
// sort active edge list by active[j].x
qsort(mActive, mAct, sizeof mActive[0], compare_active);
// draw horizontal segments for scanline y
for (j=0; j<mAct; j+=2) { // draw horizontal segments
xl = (int) ceil(mActive[j].x-.5); /* left end of span */
xr = (int)floor(mActive[j+1].x-.5); /* right end of span */
if(xl<=xr){
DrawStdLine(xl,y,xr,y);
//for(x=xl;x<xr;x++){
//aTheBits->SetPixel(x,y,aRed,aGreen,aBlue);
//}
}
mActive[j].x += mActive[j].dx; /* increment edge coords */
mActive[j+1].x += mActive[j+1].dx;
}
}
delete[] ind;
delete[] mActive;
return NS_OK;
}
/**-------------------------------------------------------------------
* remove edge i from active list
* @update dc 12/06/1999
*/
void
nsRenderingContextImpl::cdelete(int i)
{
int j;
for (j=0; j<mAct && mActive[j].i!=i; j++);
if (j>=mAct)
return;
mAct--;
memcpy(&mActive[j], &mActive[j+1],(mAct-j)*sizeof mActive[0]);
}
/**-------------------------------------------------------------------
* append edge i to end of active list
* @update dc 12/06/1999
*/
void
nsRenderingContextImpl::cinsert(int i,int y,const nsPoint aPointArray[],PRInt32 aNumPts)
{
int j;
double dx;
const nsPoint *p, *q;
j = i<aNumPts-1 ? i+1 : 0;
if (aPointArray[i].y < aPointArray[j].y) {
p = &aPointArray[i]; q = &aPointArray[j];
}else{
p = &aPointArray[j]; q = &aPointArray[i];
}
// initialize x position at intersection of edge with scanline y
mActive[mAct].dx = dx = ((double)q->x-(double)p->x)/((double)q->y-(double)p->y);
mActive[mAct].x = dx*(y+.5-(double)p->y)+(double)p->x;
mActive[mAct].i = i;
mAct++;
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
@ -299,12 +441,32 @@ float fx,fy,smag;
curve2.SubDivide(aRenderingContext);
}else{
// draw the curve
#ifdef DEBUGCURVE
printf("LINE 1- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y),
NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
printf("LINE 2- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y),
NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
#endif
aRenderingContext->DrawStdLine(NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y),NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y));
aRenderingContext->DrawStdLine(NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y),NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
}
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
*/
void
QBezierCurve::DebugPrint()
{
printf("CURVE COORDINATES\n");
printf("Anchor 1 %f %f\n",mAnc1.x,mAnc1.y);
printf("Control %f %f\n",mCon.x,mCon.y);
printf("Anchor %f %f\n",mAnc2.x,mAnc2.y);
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
@ -320,10 +482,8 @@ float fx,fy,smag;
// for now to fix the build
//fx = (float) fabs(curve1.mAnc2.x - this->mCon.x);
//fy = (float) fabs(curve1.mAnc2.y - this->mCon.y);
fx = fy = 0;
fx = (float) fabs(curve1.mAnc2.x - this->mCon.x);
fy = (float) fabs(curve1.mAnc2.y - this->mCon.y);
//smag = fx+fy-(PR_MIN(fx,fy)>>1);
smag = fx*fx + fy*fy;
@ -333,9 +493,17 @@ float fx,fy,smag;
curve2.SubDivide(aThePoints,aNumPts);
}else{
// draw the curve
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
#ifdef DEBUGCURVE
printf("LINE 1- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y),
NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
printf("LINE 2- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y),
NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
#endif
}
}
@ -431,7 +599,7 @@ float avx,avy,av1x,av1y;
switch(code) {
case 07: // 111
case 06: // 110
TheSegment.SetPoints(pt1->x,pt1->y,0,0,pt2->x,pt2->y);
TheSegment.SetPoints(pt1->x,pt1->y,0.0,0.0,pt2->x,pt2->y);
aCurveType = eLINE;
mCurPoint++;
break;
@ -443,18 +611,18 @@ float avx,avy,av1x,av1y;
case 04: // 100
avx = (float)((pt2->x+pt3->x)/2.0);
avy = (float)((pt2->y+pt3->y)/2.0);
TheSegment.SetPoints((float)pt1->x,(float)pt1->y,(float)pt2->x,(float)pt2->y,avx,avy);
TheSegment.SetPoints(pt1->x,pt1->y,pt2->x,pt2->y,avx,avy);
aCurveType = eQCURVE;
mCurPoint++;
case 03: // 011
case 02: // 010
TheSegment.SetPoints(pt1->x,pt1->y,0,0,pt2->x,pt2->y);
TheSegment.SetPoints(pt1->x,pt1->y,0.0,0.0,pt2->x,pt2->y);
aCurveType = eLINE;
mCurPoint++;
case 01: // 001
avx = (float)((pt1->x+pt2->x)/2.0);
avy = (float)((pt1->y+pt2->y)/2.0);
TheSegment.SetPoints(avx,avy,(float)pt2->x,(float)pt3->y,(float)pt2->x,(float)pt3->y);
TheSegment.SetPoints(avx,avy,pt2->x,pt3->y,pt2->x,pt3->y);
aCurveType = eQCURVE;
mCurPoint+=2;
case 00: // 000
@ -462,13 +630,13 @@ float avx,avy,av1x,av1y;
avy = (float)((pt1->y+pt2->y)/2.0);
av1x = (float)((pt2->x+pt3->x)/2.0);
av1y = (float)((pt2->y+pt3->y)/2.0);
TheSegment.SetPoints(avx,avy,(float)pt2->x,(float)pt2->y,av1x,av1y);
TheSegment.SetPoints(avx,avy,pt2->x,pt2->y,av1x,av1y);
default:
break;
}
} else {
// have two points.. draw a line
TheSegment.SetPoints(pt1->x,pt1->y,0,0,pt2->x,pt2->y);
TheSegment.SetPoints(pt1->x,pt1->y,0.0,0.0,pt2->x,pt2->y);
aCurveType = eLINE;
mCurPoint++;
}

View File

@ -24,6 +24,14 @@
#include "nsIDeviceContext.h"
#include "nsIImage.h"
#include "nsTransform2D.h"
#include <stdlib.h>
const nsPoint *gPts;
// comparison routines for qsort
int compare_ind(const void *u,const void *v){return gPts[(int)*((int*)u)].y <= gPts[(int)*((int*)v)].y ? -1 : 1;}
int compare_active(const void *u,const void *v){return ((Edge*)u)->x <= ((Edge*)v)->x ? -1 : 1;}
/** ---------------------------------------------------
@ -209,7 +217,6 @@ nsPathIter::eSegType curveType;
nsPoint thePath[MAXPATHSIZE];
PRInt16 curPoint=0;
// Transform the points first
if (aNumPts > 20){
pp0 = new nsPathPoint[aNumPts];
@ -246,6 +253,141 @@ PRInt16 curPoint=0;
return NS_OK;
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
*/
NS_IMETHODIMP
nsRenderingContextImpl::RasterPolygon(const nsPoint aPointArray[],PRInt32 aNumPts)
{
int x,k,y0,y1,y,i,j,xl,xr;
int *ind;
nsPoint pts[20];
nsPoint *pp,*pp0;
const nsPoint *np;
nsPoint thePath[MAXPATHSIZE];
if (aNumPts<=0)
return NS_OK;
// Transform the points first
if (aNumPts > 20){
pp0 = new nsPoint[aNumPts];
} else {
pp0 = &pts[0];
}
pp = pp0;
np = &aPointArray[0];
for ( i= 0; i < aNumPts; i++,np++,pp++){
pp->x = np->x;
pp->y = np->y;
mTranMatrix->TransformCoord((int*)&pp->x,(int*)&pp->y);
}
ind = new PRInt32[aNumPts];
mActive = new Edge[aNumPts];
gPts = pp0;
// create y-sorted array of indices ind[k] into vertex list
for (k=0; k<aNumPts; k++)
ind[k] = k;
qsort(ind, aNumPts, sizeof ind[0], compare_ind); // sort ind by mPointList[ind[k]].y
mAct = 0; // start with empty active list
k = 0; // ind[k] is next vertex to process
y0 = (int)ceil(pp0[ind[0]].y-.5);
y1 = (int)floor(pp0[ind[aNumPts-1]].y-.5);
for (y=y0; y<=y1; y++) { // step through scanlines
// check vertices between previous scanline and current one, if any */
for (; k<aNumPts && pp0[ind[k]].y<=y+.5; k++) {
i = ind[k];
j = i>0 ? i-1 : aNumPts-1;
if (pp0[j].y <= y-.5)
cdelete(j);
else if (pp0[j].y > y+.5)
cinsert(j, y,pp0, aNumPts);
j = i<aNumPts-1 ? i+1 : 0;
if (pp0[j].y <= y-.5)
cdelete(i);
else if (pp0[j].y > y+.5)
cinsert(i, y,pp0, aNumPts);
}
// sort active edge list by active[j].x
qsort(mActive, mAct, sizeof mActive[0], compare_active);
// draw horizontal segments for scanline y
for (j=0; j<mAct; j+=2) { // draw horizontal segments
xl = (int) ceil(mActive[j].x-.5); /* left end of span */
xr = (int)floor(mActive[j+1].x-.5); /* right end of span */
if(xl<=xr){
DrawStdLine(xl,y,xr,y);
//for(x=xl;x<xr;x++){
//aTheBits->SetPixel(x,y,aRed,aGreen,aBlue);
//}
}
mActive[j].x += mActive[j].dx; /* increment edge coords */
mActive[j+1].x += mActive[j+1].dx;
}
}
delete[] ind;
delete[] mActive;
return NS_OK;
}
/**-------------------------------------------------------------------
* remove edge i from active list
* @update dc 12/06/1999
*/
void
nsRenderingContextImpl::cdelete(int i)
{
int j;
for (j=0; j<mAct && mActive[j].i!=i; j++);
if (j>=mAct)
return;
mAct--;
memcpy(&mActive[j], &mActive[j+1],(mAct-j)*sizeof mActive[0]);
}
/**-------------------------------------------------------------------
* append edge i to end of active list
* @update dc 12/06/1999
*/
void
nsRenderingContextImpl::cinsert(int i,int y,const nsPoint aPointArray[],PRInt32 aNumPts)
{
int j;
double dx;
const nsPoint *p, *q;
j = i<aNumPts-1 ? i+1 : 0;
if (aPointArray[i].y < aPointArray[j].y) {
p = &aPointArray[i]; q = &aPointArray[j];
}else{
p = &aPointArray[j]; q = &aPointArray[i];
}
// initialize x position at intersection of edge with scanline y
mActive[mAct].dx = dx = ((double)q->x-(double)p->x)/((double)q->y-(double)p->y);
mActive[mAct].x = dx*(y+.5-(double)p->y)+(double)p->x;
mActive[mAct].i = i;
mAct++;
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
@ -299,12 +441,32 @@ float fx,fy,smag;
curve2.SubDivide(aRenderingContext);
}else{
// draw the curve
#ifdef DEBUGCURVE
printf("LINE 1- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y),
NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
printf("LINE 2- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y),
NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
#endif
aRenderingContext->DrawStdLine(NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y),NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y));
aRenderingContext->DrawStdLine(NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y),NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
}
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
*/
void
QBezierCurve::DebugPrint()
{
printf("CURVE COORDINATES\n");
printf("Anchor 1 %f %f\n",mAnc1.x,mAnc1.y);
printf("Control %f %f\n",mCon.x,mCon.y);
printf("Anchor %f %f\n",mAnc2.x,mAnc2.y);
}
/** ---------------------------------------------------
* See documentation in nsRenderingContextImpl.h
* @update 3/29/00 dwc
@ -320,10 +482,8 @@ float fx,fy,smag;
// for now to fix the build
//fx = (float) fabs(curve1.mAnc2.x - this->mCon.x);
//fy = (float) fabs(curve1.mAnc2.y - this->mCon.y);
fx = fy = 0;
fx = (float) fabs(curve1.mAnc2.x - this->mCon.x);
fy = (float) fabs(curve1.mAnc2.y - this->mCon.y);
//smag = fx+fy-(PR_MIN(fx,fy)>>1);
smag = fx*fx + fy*fy;
@ -333,9 +493,17 @@ float fx,fy,smag;
curve2.SubDivide(aThePoints,aNumPts);
}else{
// draw the curve
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y));
aThePoints[(*aNumPts)++].MoveTo(NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
#ifdef DEBUGCURVE
printf("LINE 1- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y),
NSToCoordRound(curve1.mAnc1.x),NSToCoordRound(curve1.mAnc1.y));
printf("LINE 2- %d,%d %d,%d\n",NSToCoordRound(curve1.mAnc2.x),NSToCoordRound(curve1.mAnc2.y),
NSToCoordRound(curve2.mAnc2.x),NSToCoordRound(curve2.mAnc2.y));
#endif
}
}
@ -431,7 +599,7 @@ float avx,avy,av1x,av1y;
switch(code) {
case 07: // 111
case 06: // 110
TheSegment.SetPoints(pt1->x,pt1->y,0,0,pt2->x,pt2->y);
TheSegment.SetPoints(pt1->x,pt1->y,0.0,0.0,pt2->x,pt2->y);
aCurveType = eLINE;
mCurPoint++;
break;
@ -443,18 +611,18 @@ float avx,avy,av1x,av1y;
case 04: // 100
avx = (float)((pt2->x+pt3->x)/2.0);
avy = (float)((pt2->y+pt3->y)/2.0);
TheSegment.SetPoints((float)pt1->x,(float)pt1->y,(float)pt2->x,(float)pt2->y,avx,avy);
TheSegment.SetPoints(pt1->x,pt1->y,pt2->x,pt2->y,avx,avy);
aCurveType = eQCURVE;
mCurPoint++;
case 03: // 011
case 02: // 010
TheSegment.SetPoints(pt1->x,pt1->y,0,0,pt2->x,pt2->y);
TheSegment.SetPoints(pt1->x,pt1->y,0.0,0.0,pt2->x,pt2->y);
aCurveType = eLINE;
mCurPoint++;
case 01: // 001
avx = (float)((pt1->x+pt2->x)/2.0);
avy = (float)((pt1->y+pt2->y)/2.0);
TheSegment.SetPoints(avx,avy,(float)pt2->x,(float)pt3->y,(float)pt2->x,(float)pt3->y);
TheSegment.SetPoints(avx,avy,pt2->x,pt3->y,pt2->x,pt3->y);
aCurveType = eQCURVE;
mCurPoint+=2;
case 00: // 000
@ -462,13 +630,13 @@ float avx,avy,av1x,av1y;
avy = (float)((pt1->y+pt2->y)/2.0);
av1x = (float)((pt2->x+pt3->x)/2.0);
av1y = (float)((pt2->y+pt3->y)/2.0);
TheSegment.SetPoints(avx,avy,(float)pt2->x,(float)pt2->y,av1x,av1y);
TheSegment.SetPoints(avx,avy,pt2->x,pt2->y,av1x,av1y);
default:
break;
}
} else {
// have two points.. draw a line
TheSegment.SetPoints(pt1->x,pt1->y,0,0,pt2->x,pt2->y);
TheSegment.SetPoints(pt1->x,pt1->y,0.0,0.0,pt2->x,pt2->y);
aCurveType = eLINE;
mCurPoint++;
}