static void _DrawPercentLabel( short xc, short yc, short xradius, short yradius, float xratio, float yratio, float value ) //================================================================== /* Draws the percents on the pie graph. This function was created to save some space. */ { short x, y; short length; short pixels; char buffer[ 10 ]; _setcolor( _PGPalette[ 1 ].color ); _StringPrint( buffer, _PG_DECFORMAT, 1, 100 * value ); length = strlen( buffer ); buffer[ length ] = '%'; buffer[ length + 1 ] = '\0'; pixels = _getgtextextent( buffer ); x = xc + xratio * ( _CharWidth + xradius ); y = yc - yratio * ( 3 * _CharHeight / 2 + yradius ) - _CharHeight / 2; if( xratio > 0 ) { _moveto( x, y ); } else { _moveto( x - pixels, y ); } _outgtext( buffer ); }
static void RasterUpdate (int xLeft, int yTop, int nScaling) { int x, y; int nStep; LT_GraphicsClearScreen (); nStep = MIN (FIELD_WIDTH / nRasterWidth, FIELD_HEIGHT / nRasterHeight); if (nStep == 0) nStep = 1; _setcolor (15); _rectangle (_GFILLINTERIOR, (0 - xLeft) / nScaling, (0 - yTop) / nScaling, (nRasterWidth * nStep - xLeft) / nScaling, (nRasterHeight * nStep - yTop) / nScaling); _setcolor (0); for (x = 0; x < nRasterWidth; x++) { for (y = 0; y < nRasterHeight; y++) { if ((pRaster [y * nRasterByteWidth + x / 8] << x % 8) & 0x80) { _rectangle (_GFILLINTERIOR, (x * nStep - xLeft) / nScaling, (y * nStep - yTop) / nScaling, ((x + 1) * nStep - xLeft) / nScaling, ((y + 1) * nStep - yTop) / nScaling); } } } _setcolor (7); for (x = 0; x <= nRasterWidth; x++) { _moveto ((x * nStep - xLeft) / nScaling, (0 - yTop) / nScaling); _lineto ((x * nStep - xLeft) / nScaling, (nRasterHeight * nStep - yTop) / nScaling); } for (y = 0; y <= nRasterHeight; y++) { _moveto ((0 - xLeft) / nScaling, (y * nStep - yTop) / nScaling); _lineto ((nRasterWidth * nStep - xLeft) / nScaling, (y * nStep - yTop) / nScaling); } }
void main(void) { int x1, y1, x2, y2, color, index; _setvideomode(_VRES16COLOR); //draw 10,000 points for(index = 0; index < 1000; index++) { x1 = rand() % 640; y1 = rand() % 480; x2 = rand() % 640; y2 = rand() % 480; color = rand() % 16; _setcolor(color); _moveto(x1,y1); _lineto(x2,y2); } while(!kbhit()) {} _setvideomode(_DEFAULTMODE); }
_WCRTLINK short _WCI86FAR _CGRAPH _arc( short x1, short y1, short x2, short y2, /*====================*/ short x3, short y3, short x4, short y4 ) /* This function draws an elliptical arc. The virtual ellipse is defined by the rectangle whose opposite corners are ( x1, y1 ) and ( x2, y2 ). The intersections of the vectors from the center of the ellipse to the points ( x3, y3 ) and ( x4, y4 ) define the start and end points respectively where the arc is drawn in a counter clockwise direction. */ { short success; if( _GrProlog() ) { success = _L2arc( _VtoPhysX( x1 ), _VtoPhysY( y1 ), _VtoPhysX( x2 ), _VtoPhysY( y2 ), _VtoPhysX( x3 ), _VtoPhysY( y3 ), _VtoPhysX( x4 ), _VtoPhysY( y4 ) ); if( success ) { _moveto( _GetLogX( _ArcInfo.end.xcoord ), _GetLogY( _ArcInfo.end.ycoord ) ); } _GrEpilog(); } else { success = 0; } return( success ); }
void Zeichne_stueck(void) { short hoehe_pt,laenge_pt,start_pt,za; hoehe_pt=Unit2PntY(durchm); laenge_pt=Unit2PntX(laenge); start_pt=Unit2PntY(idurchm); _setvieworg(0,50); /* Untere Haelfte */ for (za=0;za<laenge_pt;za++) { _moveto(za,(short)(start_pt/2)); _lineto(za,(short)(hoehe_pt/2)-1); } /* rahmen: */ _moveto(laenge_pt-1,1); _lineto(laenge_pt-1,(short)(hoehe_pt/2)-1); }
main() { _setvideomode( _VRES16COLOR ); _moveto( 100, 100 ); _lineto( 540, 100 ); _lineto( 320, 380 ); _lineto( 100, 100 ); getch(); _setvideomode( _DEFAULTMODE ); }
/* Grafikbildschirm einrichten */ void SimBildschirmmaske(void) { char buf_l[20],buf_d[20]; sprintf(buf_l,"%6.2f",(float)laenge/100.0F); sprintf(buf_d,"%6.2f",(float)durchm/100.0F); _setcolor(7); _moveto(0,431); _lineto(640,431); _settextposition(1,1); _outtext(" Simulator: � Pausefunktion: Stop stArt � Trace: troN troFf | Ende: ESC\n"); _moveto(0,7); _lineto(640,7); _outtext("X-Drm �: Werkzeug: T01 (Ref) Koordinaten:INC \n"); _outtext("Z-Pos : Trace : Aus \n"); _outtext("\nWerkst�ck: l="); _outtext(buf_l); _outtext("mm �="); _outtext(buf_d); _outtext("mm Status:\nMeldung :"); _moveto(0,7); _lineto(640,7); _moveto(0,48); _lineto(640,48); _moveto(0,175); _lineto(640,175); /* Graphicfenster */ _setviewport(0,49,639,174); _setvieworg(0,50); Zeichne_stueck(); /* Maschinen-NP */ _ellipse(_GFILLINTERIOR,2,2,-2,-2); }
void press_key() //============== // Display a message and wait for the user to press a key { int len; char *msg; struct _fontinfo info; _getfontinfo( &info ); msg = " Press any key "; len = _getgtextextent( msg ); _setcolor( 4 ); _rectangle( _GFILLINTERIOR, xmax - len, 0, xmax - 1, info.pixheight + 2 ); _setcolor( 15 ); _moveto( xmax - len, 1 ); _outgtext( msg ); getch(); }
static void SeparatorOutput (SEPARATOR *pSep, int nColor, int OutputMode, int xLeft, int yTop, int nScaling) { if (pSep == NULL) return; _setcolor (nColor); switch (OutputMode) { case SEPOUT_LINE: break; case SEPOUT_DASH_1: _setlinestyle (0xf0f0); break; case SEPOUT_DASH_2: _setlinestyle (0x0f0f); break; } switch (pSep -> Type) { default: break; case SEP_VERT: case SEP_HORZ: _moveto ((pSep -> xBegin - xLeft) / nScaling, (pSep -> yBegin - yTop) / nScaling); _lineto ((pSep -> xEnd - xLeft) / nScaling, (pSep -> yEnd - yTop) / nScaling); break; case SEP_RECT: _rectangle (_GBORDER, (pSep -> xBegin - xLeft) / nScaling + 3, (pSep -> yBegin - yTop) / nScaling + 3, (pSep -> xEnd - xLeft) / nScaling - 3, (pSep -> yEnd - yTop) / nScaling - 3); break; } _setlinestyle (0xffff); }
_WCRTLINK short _WCI86FAR _CGRAPH _pg_vlabelchart( chartenv _WCI86FAR *env, short x, short y, short color, char _WCI86FAR *label ) //=========================================================================== /* Draws vertical label on the chart. Coordinates are relative to the upper left corner of the chartwindow. */ { char buffer[ 2 ]; _setcolor( _PGPalette[ color ].color ); buffer[ 1 ] = '\0'; x += env->chartwindow.x1; y += env->chartwindow.y1; while( *label != '\0' ) { buffer[ 0 ] = *label; _moveto( x + ( _CharWidth - _getgtextextent( buffer ) ) / 2, y ); _outgtext( buffer ); ++label; y += _CharHeight; } return( 0 ); }
static void BreakingUpdate (int xLeft, int yTop, int nScaling) { int x, y; int nStep; LT_GraphicsClearScreen (); nStep = MIN (FIELD_WIDTH / nRasterWidth, FIELD_HEIGHT / nRasterHeight); if (nStep == 0) nStep = 1; _setcolor (15); _rectangle (_GFILLINTERIOR, (0 - xLeft) / nScaling, (0 - yTop) / nScaling, (nRasterWidth * nStep - xLeft) / nScaling, (nRasterHeight * nStep - yTop) / nScaling); for (x = 0; x < nRasterWidth; x++) { for (y = 0; y < nRasterHeight; y++) { if ((pRaster [y * nRasterByteWidth + x / 8] << x % 8) & 0x80) _setcolor (0); else if (y == yRasterBreakLine) _setcolor (12); else if (y >= yRasterUpBreakLimit && y <= yRasterDownBreakLimit) _setcolor (14); else continue; _rectangle (_GFILLINTERIOR, (x * nStep - xLeft) / nScaling, (y * nStep - yTop) / nScaling, ((x + 1) * nStep - xLeft) / nScaling, ((y + 1) * nStep - yTop) / nScaling); } } _setcolor (7); for (x = 0; x <= nRasterWidth; x++) { _moveto ((x * nStep - xLeft) / nScaling, (0 - yTop) / nScaling); _lineto ((x * nStep - xLeft) / nScaling, (nRasterHeight * nStep - yTop) / nScaling); } for (y = 0; y <= nRasterHeight; y++) { _moveto ((0 - xLeft) / nScaling, (y * nStep - yTop) / nScaling); _lineto ((nRasterWidth * nStep - xLeft) / nScaling, (y * nStep - yTop) / nScaling); } _setcolor (9); for (y = 0; y <= nRasterHeight; y++) { _rectangle (_GFILLINTERIOR, ((nRasterWidth + 1) * nStep - xLeft) / nScaling, (y * nStep - yTop) / nScaling, ((aRasterHystogram [y] + nRasterWidth + 1) * nStep - xLeft) / nScaling, ((y + 1) * nStep - yTop) / nScaling); } }
static void StringsUpdate (int xLeft, int yTop, int nScaling) { STRING *pString; ROOT *pRoot; int nString; int nColor; int nDustShift; int i; unsigned old_style; LT_GraphicsClearScreen (); for (pString = pStringsUpList, nString = 0; pString != NULL; pString = pString -> pDown, nString++) { nColor = NUMBER_TO_COLOR (nString); nDustShift = 2 * (nString % 6 + 1); _setcolor (nColor + 8); _rectangle (_GBORDER, (pString -> xLeft - xLeft) / nScaling, (pString -> yTop - yTop) / nScaling, (pString -> xRight - xLeft) / nScaling, (pString -> yBottom - yTop) / nScaling); for (i = 0; i < pString -> nLetters; i++) { pRoot = cf::Roots::at(pString -> pLettersList [i]); _setcolor ((pRoot -> bType & ROOT_SPECIAL_LETTER) ? 15 : nColor); _rectangle (_GFILLINTERIOR, (pRoot -> xColumn - xLeft) / nScaling + nDustShift, (pRoot -> yRow - yTop) / nScaling, (pRoot -> xColumn + pRoot ->nWidth - 1 - xLeft) / nScaling + nDustShift, (pRoot -> yRow + pRoot ->nHeight - 1 - yTop) / nScaling); } _setcolor (nColor + 8); for (i = 0; i < pString -> nDust; i++) { pRoot = cf::Roots::at(pString -> pDustList [i]); if (pRoot -> bType & ROOT_USED) continue; _rectangle (_GBORDER, (pRoot -> xColumn - xLeft) / nScaling + nDustShift, (pRoot -> yRow - yTop) / nScaling, (pRoot -> xColumn + pRoot ->nWidth - 1 - xLeft) / nScaling + nDustShift, (pRoot -> yRow + pRoot ->nHeight - 1 - yTop) / nScaling); } _setcolor (15); for (i = 0; i < pString -> nDust; i++) { pRoot = cf::Roots::at(pString -> pDustList [i]); if (pRoot -> bType & ROOT_USED) continue; _rectangle (_GBORDER, (pRoot -> xColumn - xLeft) / nScaling, (pRoot -> yRow - yTop) / nScaling, (pRoot -> xColumn + pRoot ->nWidth - 1 - xLeft) / nScaling, (pRoot -> yRow + pRoot ->nHeight - 1 - yTop) / nScaling); } _setcolor (nColor + 8); old_style = _getlinestyle (); _setlinestyle (0xcccc); _moveto ((pString -> xLeft - xLeft) / nScaling, (pString -> yMin - yTop) / nScaling); _lineto ((pString -> xRight - xLeft) / nScaling, (pString -> yMin - yTop) / nScaling); _moveto ((pString -> xLeft - xLeft) / nScaling, (pString -> yMax - yTop) / nScaling); _lineto ((pString -> xRight - xLeft) / nScaling, (pString -> yMax - yTop) / nScaling); _setlinestyle (old_style); _setcolor (12); _rectangle (_GBORDER, (pString -> xLeft - xLeft) / nScaling, (pString -> yTop - yTop) / nScaling, (pString -> xRight - xLeft) / nScaling, (pString -> yBottom - yTop) / nScaling); _setcolor (15); _moveto ((pString -> xLeft - xLeft) / nScaling, (pString -> yMiddleTop - yTop) / nScaling); _lineto ((pString -> xRight - xLeft) / nScaling, (pString -> yMiddleTop - yTop) / nScaling); _moveto ((pString -> xLeft - xLeft) / nScaling, (pString -> yMiddleBottom - yTop) / nScaling); _lineto ((pString -> xRight - xLeft) / nScaling, (pString -> yMiddleBottom - yTop) / nScaling); } SeparatorsOutput (xLeft, yTop, nScaling); }
static void CurrentStringUpdate (int xLeft, int yTop, int nScaling) { ROOT *pRoot; int i; unsigned old_style; LT_GraphicsClearScreen (); for (i = 0; i < String.nLetters; i++) { pRoot = cf::Roots::at(String.pLettersList[i]); _setcolor ((pRoot -> bType & ROOT_SPECIAL_LETTER) ? 15 : 10); _rectangle (_GFILLINTERIOR, (pRoot -> xColumn - xLeft) / nScaling, (pRoot -> yRow - yTop) / nScaling, (pRoot -> xColumn + pRoot ->nWidth - 1 - xLeft) / nScaling, (pRoot -> yRow + pRoot ->nHeight - 1 - yTop) / nScaling); } _setcolor (10); for (i = 0; i < String.nDust; i++) { pRoot = cf::Roots::at(String.pDustList[i]); _rectangle (_GBORDER, (pRoot -> xColumn - xLeft) / nScaling - 1, (pRoot -> yRow - yTop) / nScaling - 1, (pRoot -> xColumn + pRoot -> nWidth - 1 - xLeft) / nScaling + 1, (pRoot -> yRow + pRoot -> nHeight - 1 - yTop) / nScaling + 1); } old_style = _getlinestyle (); _setlinestyle (0xcccc); _moveto ((String.xLeft - xLeft) / nScaling, (String.yMin - yTop) / nScaling); _lineto ((String.xRight - xLeft) / nScaling, (String.yMin - yTop) / nScaling); _moveto ((String.xLeft - xLeft) / nScaling, (String.yMax - yTop) / nScaling); _lineto ((String.xRight - xLeft) / nScaling, (String.yMax - yTop) / nScaling); _setlinestyle (old_style); _setcolor (12); _rectangle (_GBORDER, (String.xLeft - xLeft) / nScaling, (String.yTop - yTop) / nScaling, (String.xRight - xLeft) / nScaling, (String.yBottom - yTop) / nScaling); _setcolor (15); _moveto ((String.xLeft - xLeft) / nScaling, (String.yMiddleTop - yTop) / nScaling); _lineto ((String.xRight - xLeft) / nScaling, (String.yMiddleTop - yTop) / nScaling); _moveto ((String.xLeft - xLeft) / nScaling, (String.yMiddleBottom - yTop) / nScaling); _lineto ((String.xRight - xLeft) / nScaling, (String.yMiddleBottom - yTop) / nScaling); }
static void HystogramUpdate (int xLeft, int yTop, int nScaling) { char szBuffer [32]; int i; int nMaxValue; int iMaxColumn; struct textsettings ts; int nCharHeight; ROOT *pRoot;//Rom LT_GraphicsClearScreen (); nMaxValue = 0; iMaxColumn = 0; /**/ for (pRoot = cf::Roots::first(); pRoot < pAfterRoots; pRoot++) { if(pRoot->nBlock == pDebugBlock->nNumber) { int nColor = 8; if (pRoot -> bType & ROOT_LETTER) nColor |= 1; if (pRoot -> bType & ROOT_RECOGNIZED) nColor |= 2; if (pRoot->isLayoutDust()) nColor |= 4; if (pRoot -> bType & ROOT_DEBUG) nColor = 14; _setcolor (nColor); _rectangle (_GFILLINTERIOR, (pRoot -> xColumn - xLeft) / nScaling, (pRoot -> yRow - yTop) / nScaling, (pRoot -> xColumn + pRoot ->nWidth - 1 - xLeft) / nScaling, (pRoot -> yRow + pRoot ->nHeight - 1 - yTop) / nScaling); } } /**/ for (i = 0; i < nHystColumns; i++) { if (nMaxValue < pHystogram [i]) { nMaxValue = pHystogram [i]; iMaxColumn = i; } } if (nMaxValue < 10) nMaxValue = 10; _gettextsettings (&ts); for (i = 0; i < nHystColumns; i++) { if (pHystogram [i] == 0) { } else { _setcolor (9); _rectangle (_GFILLINTERIOR, (i * VIEW_WIDTH / nHystColumns + VIEW_LEFT - xLeft) / nScaling, (VIEW_BOTTOM - pHystogram [i] * VIEW_HEIGHT / nMaxValue - yTop) / nScaling, ((i + 1) * VIEW_WIDTH / nHystColumns + VIEW_LEFT - xLeft) / nScaling, (VIEW_BOTTOM - yTop) / nScaling); } } _setcolor (12); _moveto (((xDebugVertLine - pDebugBlock -> Rect.xLeft) * VIEW_WIDTH / nHystColumns + VIEW_WIDTH / nHystColumns / 2 + VIEW_LEFT - xLeft) / nScaling, 0); _lineto (((xDebugVertLine - pDebugBlock -> Rect.xLeft) * VIEW_WIDTH / nHystColumns + VIEW_WIDTH / nHystColumns / 2 + VIEW_LEFT - xLeft) / nScaling, SCREEN_HEIGHT); _setcolor (15); _settextalign (_RIGHT, _TOP); nCharHeight = VIEW_HEIGHT / 10 / nScaling / 2; _setcharsize (nCharHeight, nCharHeight / 2); for (i = 0; i < nMaxValue - nMaxValue / 20; i += MAX (nMaxValue / 10, 1)) { _moveto ((VIEW_LEFT - xLeft)/ nScaling, (VIEW_BOTTOM - i * VIEW_HEIGHT / nMaxValue - yTop) / nScaling); _lineto ((VIEW_RIGHT - xLeft)/ nScaling, (VIEW_BOTTOM - i * VIEW_HEIGHT / nMaxValue - yTop) / nScaling); if (i != 0) { sprintf (szBuffer, "%d\n", i); _grtext ((VIEW_LEFT - xLeft) / nScaling, (VIEW_BOTTOM - i * VIEW_HEIGHT / nMaxValue - yTop) / nScaling, szBuffer); } } sprintf (szBuffer, "%d\n", nMaxValue); _grtext ((VIEW_LEFT - xLeft) / nScaling, (VIEW_TOP - yTop) / nScaling, szBuffer); _rectangle (_GBORDER, (VIEW_LEFT - xLeft) / nScaling, (VIEW_TOP - yTop) / nScaling, (VIEW_RIGHT - xLeft) / nScaling, (VIEW_BOTTOM - yTop) / nScaling); _setcharsize (ts.height, ts.width); }
void drawTree(int leftBranch, int midBranch, int rightBranch) { // draws a tree on the screen _clearscreen(_GCLEARSCREEN); _setcolor(15); _setlinestyle(0xAAAA); _moveto(vc.numxpixels/2, vc.numypixels); _lineto(vc.numxpixels/2, vc.numypixels*3/4); _lineto(vc.numxpixels/6, vc.numypixels/3); _moveto(vc.numxpixels/2, vc.numypixels*3/4); _lineto(vc.numxpixels/2, vc.numypixels/4); _moveto(vc.numxpixels/2, vc.numypixels*3/4); _lineto(vc.numxpixels*5/6, vc.numypixels/3); if (leftBranch) { _moveto(vc.numxpixels/6, vc.numypixels/3); _lineto(vc.numxpixels/18, 0); _moveto(vc.numxpixels/6, vc.numypixels/3); _lineto(vc.numxpixels*3/18, 0); _moveto(vc.numxpixels/6, vc.numypixels/3); _lineto(vc.numxpixels*5/18, 0); }; // if if (midBranch) { _moveto(vc.numxpixels/2, vc.numypixels/4); _lineto(vc.numxpixels*7/18, 0); _moveto(vc.numxpixels/2, vc.numypixels/4); _lineto(vc.numxpixels*9/18, 0); _moveto(vc.numxpixels/2, vc.numypixels/4); _lineto(vc.numxpixels*11/18, 0); }; // if if (rightBranch) { _moveto(vc.numxpixels*5/6, vc.numypixels/3); _lineto(vc.numxpixels*13/18, 0); _moveto(vc.numxpixels*5/6, vc.numypixels/3); _lineto(vc.numxpixels*15/18, 0); _moveto(vc.numxpixels*5/6, vc.numypixels/3); _lineto(vc.numxpixels*17/18, 0); }; // if }; // drawTree
/* Stahl Nummer "tool" zeichen */ void Zeichne_Stahl(short xp,short yp,char tool,short color) { _setcolor(color); switch(tool) { case 1:/* rechter Seitenstahl */ { _moveto(xp,yp); _lineto(xp+0,yp+12); _lineto(xp+24,yp+18); _lineto(xp+24,yp+8); _lineto(xp,yp); _moveto(xp+8,yp+14); _lineto(xp+8,yp+50); /* 3 3 -> x4 y2 */ _moveto(xp+24,yp+10); _lineto(xp+40,yp+12); _lineto(xp+40,yp+50); } break; case 2:/* linker Seitenstahl */ { _moveto(xp+56,yp); _lineto(xp+32,yp+8); _lineto(xp+32,yp+20); _lineto(xp+56,yp+12); _lineto(xp+56,yp); _moveto(xp+48,yp+14); _lineto(xp+48,yp+50); _moveto(xp+32,yp+10); _lineto(xp+16,yp+14); _lineto(xp+16,yp+50); } break; case 3:/* neutraler Drehstahl */ { _moveto(xp+28,yp); _lineto(xp+16,yp+11); _lineto(xp+28,yp+22); _lineto(xp+40,yp+11); _lineto(xp+28,yp); _moveto(xp+16,yp+13); _lineto(xp+9,yp+16); _lineto(xp+9,yp+50); _moveto(xp+40,yp+13); _lineto(xp+50,yp+16); _lineto(xp+50,yp+50); } break; case 4:/* Gewindestahl aussen rechts */ { _moveto(xp+8,yp); _lineto(xp+16,yp+6); _lineto(xp+24,yp+6); _lineto(xp+32,yp+8); _lineto(xp+48,yp+8); _lineto(xp+48,yp+50); _moveto(xp+8,yp); _lineto(xp-0,yp+7); _lineto(xp-7,yp+7); _lineto(xp-7,yp+50); } break; case 5:/* Stecher fuer Seegereinstiche */ { _moveto(xp,yp+50); _lineto(xp,yp-20); _lineto(xp+8,yp-20); _lineto(xp+8,yp-16); _lineto(xp+12,yp-14); _lineto(xp+12,yp-10); _lineto(xp+40,yp-4); _lineto(xp+40,yp+50); } break; case 6:/* Abstechklinge HSS */ { _moveto(xp,yp+50); _lineto(xp,yp); _lineto(xp+13,yp); _lineto(xp+13,yp+50); _moveto(xp,yp+17); _lineto(xp+13,yp+17); } break; case 7:/* Gewindestahl innen rechts */ { _moveto(xp-80,yp+20); _lineto(xp-71,yp+14); _lineto(xp-64,yp+14); _lineto(xp-56,yp+10); _lineto(xp+80,yp+10); _moveto(xp-80,yp+20); _lineto(xp-99,yp+14); _lineto(xp-100,yp+14); _lineto(xp-100,yp+0); _lineto(xp-92,yp-4); _lineto(xp-92,yp-6); _lineto(xp+80,yp-6); } break; case 8:/* Innendrehstahl */ { _moveto(xp-80,yp+20); _lineto(xp-80,yp+8); _lineto(xp-56,yp); /*y+1*/ _lineto(xp-56,yp+14); _lineto(xp-80,yp+20); _moveto(xp-56,yp+10); _lineto(xp+40,yp+10); _moveto(xp-72,yp+6); _lineto(xp-72,yp-6); _lineto(xp+40,yp-6); } } }