sl@0: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include "BITPANIC.H" sl@0: #include sl@0: #include sl@0: sl@0: // TPieArc sl@0: sl@0: class TArc : public TEllipse sl@0: { sl@0: public: sl@0: void Construct(const TRect& aRect,const TPoint& aStart,const TPoint& aEnd); sl@0: TBool SingleStep(TPoint& aTl,TBool& aDoTl,TPoint& aTr,TBool& aDoTr,TPoint& aBl,TBool& aDoBl,TPoint& aBr,TBool& aDoBr); sl@0: void Step(TPoint& aTl,TBool& aDoTl,TPoint& aTr,TBool& aDoTr,TPoint& aBl,TBool& aDoBl,TPoint& aBr,TBool& aDoBr); sl@0: public: sl@0: TPoint iStart; sl@0: TPoint iEnd; sl@0: private: sl@0: TBool iTlquad; sl@0: TBool iTrquad; sl@0: TBool iBlquad; sl@0: TBool iBrquad; sl@0: TBool iStartquadenabled; sl@0: TBool iEndquadenabled; sl@0: TBool iStartquaddone; sl@0: TBool iEndquaddone; sl@0: TInt iStartquad; sl@0: TInt iEndquad; sl@0: TBool iSlice; sl@0: }; sl@0: sl@0: void TArc::Construct(const TRect& aRect,const TPoint& aStart,const TPoint& aEnd) sl@0: { sl@0: iStart=Intersection(aRect,aStart); sl@0: iEnd=Intersection(aRect,aEnd); sl@0: TEllipse::Construct(aRect); sl@0: iTlquad=EFalse; sl@0: iTrquad=EFalse; sl@0: iBlquad=EFalse; sl@0: iBrquad=EFalse; sl@0: iStartquadenabled=EFalse; sl@0: iEndquadenabled=EFalse; sl@0: iSlice=EFalse; sl@0: iStartquad=0; sl@0: iEndquad=0; sl@0: TPoint center=aRect.Center(); sl@0: if (iStart.iX>=center.iX) iStartquad=1; sl@0: if (iStart.iY>=center.iY) iStartquad+=2; sl@0: if (iEnd.iX>=center.iX) iEndquad=1; sl@0: if (iEnd.iY>=center.iY) iEndquad+=2; sl@0: if (iStartquad!=iEndquad) sl@0: { sl@0: if (iStartquad==0 && iEndquad==1) sl@0: { sl@0: iBlquad=ETrue; sl@0: iBrquad=ETrue; sl@0: } sl@0: else if (iStartquad==0 && iEndquad==3) sl@0: iBlquad=ETrue; sl@0: else if (iStartquad==1 && iEndquad==2) sl@0: iTlquad=ETrue; sl@0: else if (iStartquad==1 && iEndquad==3) sl@0: { sl@0: iTlquad=ETrue; sl@0: iBlquad=ETrue; sl@0: } sl@0: else if (iStartquad==2 && iEndquad==0) sl@0: { sl@0: iTrquad=ETrue; sl@0: iBrquad=ETrue; sl@0: } sl@0: else if (iStartquad==2 && iEndquad==1) sl@0: iBrquad=ETrue; sl@0: else if (iStartquad==3 && iEndquad==0) sl@0: iTrquad=ETrue; sl@0: else if (iStartquad==3 && iEndquad==2) sl@0: { sl@0: iTlquad=ETrue; sl@0: iTrquad=ETrue; sl@0: } sl@0: } sl@0: else if (iStart==iEnd) sl@0: { sl@0: iTlquad=ETrue; sl@0: iTrquad=ETrue; sl@0: iBlquad=ETrue; sl@0: iBrquad=ETrue; sl@0: } sl@0: else sl@0: { sl@0: iSlice=ETrue; sl@0: if (iStartquad==0 && (iStart.iXiEnd.iY)) sl@0: { sl@0: iTrquad=ETrue; sl@0: iBlquad=ETrue; sl@0: iBrquad=ETrue; sl@0: iSlice=EFalse; sl@0: } sl@0: else if (iStartquad==1 && (iStart.iXiEnd.iX || iStart.iY>iEnd.iY)) sl@0: { sl@0: iTlquad=ETrue; sl@0: iTrquad=ETrue; sl@0: iBrquad=ETrue; sl@0: iSlice=EFalse; sl@0: } sl@0: else if (iStartquad==3 && (iStart.iX>iEnd.iX || iStart.iY=iStart.iY) sl@0: { sl@0: iStartquadenabled=ETrue; sl@0: iStartquaddone=ETrue; sl@0: } sl@0: if (iStartquad==3 && aBottomRight.iX>=iStart.iX && aBottomRight.iY<=iStart.iY) sl@0: { sl@0: iStartquadenabled=ETrue; sl@0: iStartquaddone=ETrue; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (iStartquad==1 && (aTopRight.iX>iStart.iX || aTopRight.iY>iStart.iY)) sl@0: { sl@0: iStartquadenabled=EFalse; sl@0: iStartquaddone=ETrue; sl@0: } sl@0: if (iStartquad==2 && (aBottomLeft.iXiEnd.iY)) sl@0: { sl@0: iEndquadenabled=EFalse; sl@0: iEndquaddone=ETrue; sl@0: } sl@0: if (iEndquad==3 && (aBottomRight.iX>iEnd.iX || aBottomRight.iY=iEnd.iX && aTopRight.iY>=iEnd.iY) sl@0: { sl@0: iEndquadenabled=ETrue; sl@0: iEndquaddone=ETrue; sl@0: } sl@0: if (iEndquad==2 && aBottomLeft.iX<=iEnd.iX && aBottomLeft.iY<=iEnd.iY) sl@0: { sl@0: iEndquadenabled=ETrue; sl@0: iEndquaddone=ETrue; sl@0: } sl@0: } sl@0: } sl@0: if (iStartquad!=iEndquad) sl@0: { sl@0: if (iStartquadenabled) sl@0: { sl@0: if (iStartquad==0) aDoTl=ETrue; sl@0: else if (iStartquad==1) aDoTr=ETrue; sl@0: else if (iStartquad==2) aDoBl=ETrue; sl@0: else if (iStartquad==3) aDoBr=ETrue; sl@0: } sl@0: if (iEndquadenabled) sl@0: { sl@0: if (iEndquad==0) aDoTl=ETrue; sl@0: else if (iEndquad==1) aDoTr=ETrue; sl@0: else if (iEndquad==2) aDoBl=ETrue; sl@0: else if (iEndquad==3) aDoBr=ETrue; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (iSlice) sl@0: { sl@0: if (iStartquadenabled && iEndquadenabled) sl@0: { sl@0: if (iStartquad==0) aDoTl=ETrue; sl@0: else if (iStartquad==1) aDoTr=ETrue; sl@0: else if (iStartquad==2) aDoBl=ETrue; sl@0: else if (iStartquad==3) aDoBr=ETrue; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (iStartquadenabled || iEndquadenabled) sl@0: { sl@0: if (iStartquad==0) aDoTl=ETrue; sl@0: else if (iStartquad==1) aDoTr=ETrue; sl@0: else if (iStartquad==2) aDoBl=ETrue; sl@0: else if (iStartquad==3) aDoBr=ETrue; sl@0: } sl@0: } sl@0: } sl@0: if (aTopLeft.iX==aTopRight.iX) sl@0: { sl@0: if (aDoTl && aDoTr) aDoTr=EFalse; sl@0: if (aDoBl && aDoBr) aDoBr=EFalse; sl@0: } sl@0: } sl@0: sl@0: // sl@0: // Pie and Arc drawing functions sl@0: // sl@0: sl@0: /** sl@0: Draws an arc. sl@0: sl@0: The function provides a concrete implementation of the pure virtual sl@0: function CGraphicsContext::DrawArc(). The function sl@0: behaviour is the same as documented in that class. sl@0: */ sl@0: EXPORT_C void CFbsBitGc::DrawArc(const TRect& aRect,const TPoint& aStartradius, sl@0: const TPoint& aEndradius) sl@0: { sl@0: if (!iPenStyle || !iPenSize.iWidth || !iPenSize.iHeight || aRect.IsEmpty() || CheckDevice(aRect)) sl@0: return; sl@0: sl@0: TRect rcpy(aRect); sl@0: rcpy.Move(iOrigin); sl@0: iDevice->TruncateRect(rcpy); sl@0: TRect arcBoundingRect(rcpy); sl@0: arcBoundingRect.Grow((iPenSize.iWidth>>1)+1,(iPenSize.iHeight>>1)+1); sl@0: if (!arcBoundingRect.Intersects(iUserClipRect)) sl@0: return; sl@0: sl@0: SetupDevice(); sl@0: iDevice->DrawingBegin(); sl@0: PieArcOutline(rcpy,aStartradius+iOrigin,aEndradius+iOrigin,EFalse); sl@0: iDevice->DrawingEnd(); sl@0: } sl@0: sl@0: /** sl@0: Draws and fills a pie slice. sl@0: sl@0: The function provides a concrete implementation of the pure virtual sl@0: function CGraphicsContext::DrawPie(). The function sl@0: behaviour is the same as documented in that class. sl@0: */ sl@0: EXPORT_C void CFbsBitGc::DrawPie(const TRect& aRect,const TPoint& aStartradius, sl@0: const TPoint& aEndradius) sl@0: { sl@0: if (CheckDevice(aRect)) sl@0: return; sl@0: sl@0: TRect rcpy(aRect); sl@0: rcpy.Move(iOrigin); sl@0: iDevice->TruncateRect(rcpy); sl@0: TRect pieBoundingRect(rcpy); sl@0: pieBoundingRect.Grow((iPenSize.iWidth>>1)+1,(iPenSize.iHeight>>1)+1); sl@0: if (!pieBoundingRect.Intersects(iUserClipRect)) sl@0: return; sl@0: sl@0: TPoint startIntersect = aStartradius + iOrigin, endIntersect = aEndradius + iOrigin; sl@0: TInt startQuadrant, endQuadrant; sl@0: TBool quadrants[5]; sl@0: const TBool isEllipse = AnalyseEllipse( sl@0: rcpy, startIntersect, endIntersect, startQuadrant, endQuadrant, quadrants); sl@0: sl@0: SetupDevice(); sl@0: iDevice->DrawingBegin(&iBrushBitmap); sl@0: CFbsRasterizer* brushRasterizer = PrepareRasterizerForExtendedBitmap(iBrushBitmap); sl@0: if (iBrushStyle!=ENullBrush) sl@0: { sl@0: if (isEllipse) sl@0: EllipseFill(rcpy); sl@0: else sl@0: PieFill(rcpy, startIntersect, endIntersect, startQuadrant, endQuadrant, quadrants); sl@0: } sl@0: if (iPenStyle!=ENullPen && iPenSize.iWidth>0 && iPenSize.iHeight>0) sl@0: PieArcOutline(rcpy,aStartradius+iOrigin,aEndradius+iOrigin,ETrue); sl@0: if (brushRasterizer) sl@0: { sl@0: brushRasterizer->EndBitmap(iBrushBitmap.SerialNumber()); sl@0: } sl@0: iDevice->DrawingEnd(&iBrushBitmap); sl@0: } sl@0: sl@0: /** sl@0: Determine the pie constructed within the given rectangle. sl@0: @internalTechnology sl@0: @param rc Input - The bounding rectangle. sl@0: @param srad Input/Output - The intersection point from the geometric centre sl@0: of the ellipse to the given start point sl@0: @param erad Input/Output - The intersection point from the geometric centre sl@0: of the ellipse to the given end point sl@0: @param startq Output - The start quadrant sl@0: @param endq Output - The end quadrant sl@0: @param quads Output - Quadrants sl@0: @pre Input params rc, srad, erad are to be given. sl@0: @post Output params srad, erad, startq, endq, quads will be populated. sl@0: @return ETrue if the pie is an ellipse, otherwise EFalse. sl@0: */ sl@0: TBool CFbsBitGc::AnalyseEllipse(const TRect& rc,TPoint& srad,TPoint& erad, sl@0: TInt& startq,TInt& endq,TBool* quads) sl@0: { sl@0: startq=0; sl@0: endq=0; sl@0: const TPoint center = rc.Center(); sl@0: TEllipse ellipse; sl@0: srad=ellipse.Intersection(rc,srad); sl@0: erad=ellipse.Intersection(rc,erad); sl@0: if (srad==erad) sl@0: { sl@0: quads[0]=EFalse; sl@0: quads[1]=ETrue; sl@0: quads[2]=ETrue; sl@0: quads[3]=ETrue; sl@0: quads[4]=ETrue; sl@0: return ETrue; sl@0: } sl@0: const TInt startx = srad.iX - center.iX, starty = srad.iY - center.iY; sl@0: const TInt endx = erad.iX - center.iX, endy = erad.iY - center.iY; sl@0: if (startx>=0) startq=1; sl@0: if (starty>=0) startq+=2; sl@0: if (endx>=0) endq=1; sl@0: if (endy>=0) endq+=2; sl@0: quads[1]=EFalse,quads[2]=EFalse,quads[3]=EFalse,quads[4]=EFalse; // complete quadrants to draw sl@0: quads[0]=EFalse; // ellipse is a sliver completely within a quadrant sl@0: if (startq==endq) sl@0: { sl@0: if (startq==0 && (startxendy)) sl@0: { sl@0: quads[2]=ETrue; sl@0: quads[3]=ETrue; sl@0: quads[4]=ETrue; sl@0: } sl@0: else if (startq==1 && (startxendx || starty>endy)) sl@0: { sl@0: quads[1]=ETrue; sl@0: quads[2]=ETrue; sl@0: quads[4]=ETrue; sl@0: } sl@0: else if (startq==3 && (startx>endx || starty>1; sl@0: TInt halfpenheight=iPenSize.iHeight>>1; sl@0: TInt otherhalfwidth=(iPenSize.iWidth+1)>>1; sl@0: TInt otherhalfheight=(iPenSize.iHeight+1)>>1; sl@0: rcpy.iTl.iX-=halfpenwidth; sl@0: rcpy.iTl.iY-=halfpenheight; sl@0: rcpy.iBr.iX+=otherhalfwidth; sl@0: rcpy.iBr.iY+=otherhalfheight; sl@0: AddRect(rcpy); sl@0: for(TInt count=0;countCount();count++) sl@0: { sl@0: iClipRect=(*iDefaultRegionPtr)[count]; sl@0: if (!iClipRect.Intersects(rcpy)) sl@0: continue; sl@0: iClipRect.Intersection(rcpy); sl@0: if (UserClipRect(iClipRect)) continue; sl@0: TArc arc; sl@0: arc.Construct(ellrect,startradius,endradius); sl@0: iDotParam=Max(iPenSize.iWidth>>1,iPenSize.iHeight>>1); sl@0: TBool dotl,dotr,dobl,dobr; sl@0: while(!arc.SingleStep(pt[0],dotl,pt[1],dotr,pt[2],dobl,pt[3],dobr)) sl@0: { sl@0: if (dotl) PenDrawClipped(pt[0]); sl@0: if (dotr) PenDrawClipped(pt[1]); sl@0: if (dobl) PenDrawClipped(pt[2]); sl@0: if (dobr) PenDrawClipped(pt[3]); sl@0: iDotParam+=iDotDirection; sl@0: } sl@0: if (pt[0].iY==pt[2].iY) sl@0: { sl@0: if (dotl) PenDrawClipped(pt[0]); sl@0: if (dotr) PenDrawClipped(pt[1]); sl@0: } sl@0: if (pie) sl@0: { sl@0: TPoint temp; sl@0: const TPoint center = ellrect.Center(); sl@0: TLinearDDA line; sl@0: line.Construct(arc.iStart,center); sl@0: line.SingleStep(temp); sl@0: while(!line.SingleStep(temp)) sl@0: { sl@0: PenDrawClipped(temp); sl@0: iDotParam+=iDotDirection; sl@0: } sl@0: line.Construct(arc.iEnd,center); sl@0: line.SingleStep(temp); sl@0: while(!line.SingleStep(temp)) sl@0: { sl@0: PenDrawClipped(temp); sl@0: iDotParam+=iDotDirection; sl@0: } sl@0: PenDrawClipped(center); sl@0: } sl@0: iDevice->iDrawDevice->UpdateRegion(iClipRect); sl@0: } sl@0: iDotParam=dotparam; sl@0: } sl@0: sl@0: // if iBrushBitmap is an extended bitmap, PrepareRasterizerForExtendedBitmap() must have been called before this method sl@0: void CFbsBitGc::PieFill(const TRect& ellrect, const TPoint& aStartIntersect, const TPoint& aEndIntersect, sl@0: TInt aStartQuadrant, TInt aEndQuadrant, const TBool* aQuadrants) sl@0: { sl@0: // arc runs counterclockwise, from startradius-center/ellipse intersect to endradius-center/ellipse intersect sl@0: AddRect(ellrect); sl@0: const TInt limit = iDefaultRegionPtr->Count(); sl@0: for(TInt count=0;countiDrawDevice->UpdateRegion(iClipRect); sl@0: } sl@0: } sl@0: sl@0: // if iBrushBitmap is an extended bitmap, PrepareRasterizerForExtendedBitmap() must have been called before this method sl@0: void CFbsBitGc::PieShell(const TRect& ellrect,const TPoint& startradius, sl@0: const TPoint& endradius, const TBool* quads, TInt startquad, TInt endquad) sl@0: { sl@0: TEllipse ellipse; sl@0: ellipse.Construct(ellrect); sl@0: TInt c=ellrect.Center().iX; sl@0: TPoint pt[4]; sl@0: TPoint tl,tr,bl,br; sl@0: TBool donestart=EFalse,doneend=EFalse; sl@0: TBool todostart=EFalse,todoend=EFalse; sl@0: while(!ellipse.NextStep(pt[0],pt[1],pt[2],pt[3])) sl@0: { sl@0: if (pt[startquad].iY==startradius.iY) sl@0: todostart=ETrue; sl@0: if (pt[endquad].iY==endradius.iY) sl@0: todoend=ETrue; sl@0: pt[0].iX++; sl@0: pt[1].iX--; sl@0: pt[2].iX++; sl@0: pt[3].iX--; sl@0: tl.iY=pt[0].iY; sl@0: tr.iY=pt[1].iY; sl@0: bl.iY=pt[2].iY; sl@0: br.iY=pt[3].iY; sl@0: if (quads[1] || (endquad==0 && !doneend)) // tl quadrant, half top end chord sl@0: tl.iX=pt[0].iX; sl@0: else tl.iX=c+1; sl@0: if (quads[2] || (startquad==1 && !donestart)) // tr quadrant, half top start chord sl@0: tr.iX=pt[1].iX; sl@0: else tr.iX=c; sl@0: if (quads[3] || (startquad==2 && !donestart)) // bl quadrant, half top start chord sl@0: bl.iX=pt[2].iX; sl@0: else bl.iX=c+1; sl@0: if (quads[4] || (endquad==3 && !doneend)) // br quadrant, half top end chord sl@0: br.iX=pt[3].iX; sl@0: else br.iX=c; sl@0: ClipFillLine(tl,tr); sl@0: ClipFillLine(bl,br); sl@0: // do partial quadrants sl@0: if (todostart) sl@0: { sl@0: if (startquad==0) sl@0: { sl@0: tl.iX=pt[0].iX; sl@0: tr.iX=startradius.iX; sl@0: ClipFillLine(tl,tr); sl@0: } sl@0: else if (startquad==3) sl@0: { sl@0: bl.iX=startradius.iX; sl@0: br.iX=pt[3].iX; sl@0: ClipFillLine(bl,br); sl@0: } sl@0: } sl@0: if (todoend) sl@0: { sl@0: if (endquad==2) sl@0: { sl@0: bl.iX=pt[2].iX; sl@0: br.iX=endradius.iX; sl@0: ClipFillLine(bl,br); sl@0: } sl@0: else if (endquad==1) sl@0: { sl@0: tl.iX=endradius.iX; sl@0: tr.iX=pt[1].iX; sl@0: ClipFillLine(tl,tr); sl@0: } sl@0: } sl@0: donestart=todostart; sl@0: doneend=todoend; sl@0: } sl@0: tl.iX=c+1; sl@0: tr.iX=c; sl@0: if (pt[0].iY==pt[2].iY) // congruent mid lines sl@0: { sl@0: if (pt[startquad].iY==startradius.iY) sl@0: todostart=ETrue; sl@0: if (pt[endquad].iY==endradius.iY) sl@0: todoend=ETrue; sl@0: pt[0].iX++; sl@0: pt[1].iX--; sl@0: tl.iY=pt[0].iY; sl@0: tr.iY=tl.iY; sl@0: TBool leftflag=EFalse,rightflag=EFalse; sl@0: if (quads[1] || (endquad==0 && !doneend) || sl@0: quads[3] || (startquad==2 && !donestart) || sl@0: (todostart && startquad==0) || (todoend && endquad==2)) sl@0: leftflag=ETrue; sl@0: if (quads[2] || (startquad==1 && !donestart) || sl@0: quads[4] || (endquad==3 && !doneend) || sl@0: (todostart && startquad==3) || (todoend && endquad==1)) sl@0: rightflag=ETrue; sl@0: if (leftflag) tl.iX=pt[0].iX; sl@0: if (rightflag) tr.iX=pt[1].iX; sl@0: ClipFillLine(tl,tr); sl@0: } sl@0: else sl@0: { sl@0: tl.iY=ellrect.Center().iY; sl@0: tr.iY=tl.iY; sl@0: if (startquad==3) tr.iX=startradius.iX-1; sl@0: if (endquad==2) tl.iX=endradius.iX+1; sl@0: ClipFillLine(tl,tr); sl@0: } sl@0: PieTriangles(startquad==1 || startquad==2,startradius,ellrect.Center()); sl@0: PieTriangles(endquad==0 || endquad==3,endradius,ellrect.Center()); sl@0: } sl@0: sl@0: // if iBrushBitmap is an extended bitmap, PrepareRasterizerForExtendedBitmap() must have been called before this method sl@0: void CFbsBitGc::PieTriangles(TBool aInside,const TPoint& aStart,const TPoint& aEnd) sl@0: { sl@0: TInt x=aInside?aEnd.iX:aStart.iX; sl@0: if (aStart.iX>aEnd.iX) sl@0: { sl@0: if (aInside) sl@0: x++; sl@0: else sl@0: x--; sl@0: } sl@0: else sl@0: if (!aInside) sl@0: x++; sl@0: TLinearDDA line; sl@0: TPoint pt,left,right; sl@0: line.Construct(aStart,aEnd); sl@0: line.NextStep(pt); sl@0: while(!line.NextStep(pt)) sl@0: { sl@0: if (pt.iY==aEnd.iY) break; sl@0: left.iX=Min(pt.iX,x); sl@0: right.iX=Max(pt.iX,x); sl@0: left.iY=right.iY=pt.iY; sl@0: ClipFillLine(left,right); sl@0: } sl@0: } sl@0: sl@0: // if iBrushBitmap is an extended bitmap, PrepareRasterizerForExtendedBitmap() must have been called before this method sl@0: void CFbsBitGc::PieSliver(const TRect& ellrect,const TPoint& startradius, sl@0: const TPoint& endradius,TInt quad) sl@0: { sl@0: TPoint center=ellrect.Center(),left,right; sl@0: TPoint nearinter(startradius),farinter(endradius); sl@0: if (Abs(nearinter.iY-center.iY)>Abs(farinter.iY-center.iY)) sl@0: { sl@0: nearinter=endradius; sl@0: farinter=startradius; sl@0: } sl@0: TBool ellipseComplete = EFalse; sl@0: TPoint pt[4]; sl@0: TEllipse ellipse; sl@0: ellipse.Construct(ellrect); sl@0: TLinearDDA mainline; sl@0: mainline.Construct(farinter,center); sl@0: ellipseComplete = ellipse.SingleStep(pt[0],pt[1],pt[2],pt[3]); sl@0: mainline.SingleStep(right); sl@0: do { sl@0: while(!ellipseComplete && pt[quad].iY!=right.iY) sl@0: ellipseComplete = ellipse.NextStep(pt[0],pt[1],pt[2],pt[3]); sl@0: left=pt[quad]; sl@0: while(!ellipseComplete && pt[quad].iY==right.iY) sl@0: { sl@0: left=pt[quad]; sl@0: ellipseComplete = ellipse.NextStep(pt[0],pt[1],pt[2],pt[3]); sl@0: } sl@0: if (right.iY==nearinter.iY || (ellipseComplete && (pt[0].iY != pt[2].iY))) sl@0: break; sl@0: if (left.iX>right.iX) sl@0: { sl@0: TInt temp=left.iX; sl@0: left.iX=right.iX; sl@0: right.iX=temp; sl@0: } sl@0: if(right==farinter && left.iX<=right.iX) sl@0: { sl@0: continue; sl@0: } sl@0: left.iX++; sl@0: right.iX--; sl@0: if (left.iX<=right.iX) sl@0: ClipFillLine(left,right); sl@0: } sl@0: while(!mainline.NextStep(right)); sl@0: TPoint temppt; sl@0: TLinearDDA line; sl@0: line.Construct(nearinter,center); sl@0: TBool linestat=EFalse; sl@0: do sl@0: linestat=line.SingleStep(temppt); sl@0: while(temppt.iY!=right.iY && !linestat); sl@0: do { sl@0: do { sl@0: left=temppt; sl@0: linestat=line.SingleStep(temppt); sl@0: } sl@0: while(temppt.iY==right.iY && !linestat); sl@0: if (ellipseComplete) sl@0: break; sl@0: if (left.iX>right.iX) sl@0: { sl@0: TInt temp=left.iX; sl@0: left.iX=right.iX; sl@0: right.iX=temp; sl@0: } sl@0: if(right==farinter && left.iX<=right.iX) sl@0: { sl@0: continue; sl@0: } sl@0: left.iX++; sl@0: right.iX--; sl@0: if (left.iX<=right.iX) sl@0: ClipFillLine(left,right); sl@0: } sl@0: while(!mainline.NextStep(right)); sl@0: } sl@0: