home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / os2 / bench / bench.c next >
Encoding:
C/C++ Source or Header  |  1990-12-02  |  37.1 KB  |  1,428 lines

  1. /*    Bench.c (c) Axel Salomon, 1990, Public Domain   */
  2.  
  3. #define INCL_DOS
  4. #define INCL_WIN
  5. #define INCL_GPI
  6.  
  7. #include <os2.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <time.h>
  12. #include "bench.h"
  13.  
  14. #define FLOAT float
  15. #define MIN(a,b)     ( a<b ? a : b )
  16.  
  17. MRESULT EXPENTRY BenchProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
  18.  
  19. VOID cdecl main (VOID);
  20. VOID do_paint   (HWND hwnd);
  21. VOID do_size    (MPARAM mp2);
  22. VOID do_command (HWND hwnd, MPARAM mp1);
  23. VOID do_clear_screen( HWND hwnd );
  24. INT  do_init    (VOID);
  25.  
  26. VOID Display_Time( HWND hwnd);
  27. LONG Calc_MSec( PDATETIME dt );
  28. LONG Calc_Fraction( LONG value );
  29.  
  30. VOID do_gpi_fonts_box     (HWND hwnd);
  31. VOID do_gpi_fonts_chars   (HWND hwnd);
  32. VOID do_gpi_fonts_direct  (HWND hwnd);
  33. VOID do_gpi_fonts_angle   (HWND hwnd);
  34. VOID do_gpi_fonts_shear   (HWND hwnd);
  35. VOID do_gpi_fonts_all     (HWND hwnd);
  36.  
  37. VOID do_gpi_lines_arcs    (HWND hwnd);
  38. VOID do_gpi_lines_boxes   (HWND hwnd);
  39. VOID do_gpi_lines_fillets (HWND hwnd);
  40. VOID do_gpi_lines_lines   (HWND hwnd);
  41. VOID do_gpi_lines_splines (HWND hwnd);
  42. VOID do_gpi_lines_styles  (HWND hwnd);
  43. VOID do_gpi_lines_all     (HWND hwnd);
  44.  
  45. VOID do_gpi_marker_all    (HWND hwnd);
  46. VOID do_gpi_marker_box    (HWND hwnd);
  47. VOID do_gpi_marker_poly   (HWND hwnd);
  48. VOID do_gpi_marker_single (HWND hwnd);
  49. VOID do_gpi_marker_userdef(HWND hwnd);
  50.  
  51. VOID do_gpi_paths_ends    (HWND hwnd);
  52. VOID do_gpi_paths_fill    (HWND hwnd);
  53. VOID do_gpi_paths_join    (HWND hwnd); 
  54. VOID do_gpi_paths_lines   (HWND hwnd);
  55. VOID do_gpi_paths_pattern (HWND hwnd);
  56. VOID do_gpi_paths_width   (HWND hwnd);
  57. VOID do_gpi_paths_all     (HWND hwnd);
  58.  
  59. VOID do_gpi_all           (HWND hwnd);
  60. VOID do_gpi_extend        (HWND hwnd);
  61.   
  62. HAB      hab;
  63. HMQ      hmq;
  64. HDC      hdc;
  65. HWND     hwndMainFrame,hwndMainClient;
  66.  
  67. POINTL   center;
  68. INT      cx,cy;
  69.  
  70. DATETIME start_dt,ende_dt;
  71.  
  72. LONG colors[16] = { CLR_BLACK,
  73.                     CLR_DARKBLUE,
  74.                     CLR_DARKGREEN,
  75.                     CLR_DARKCYAN,
  76.                     CLR_DARKPINK,
  77.                     CLR_DARKRED,
  78.                     CLR_BROWN,
  79.                     CLR_PALEGRAY,
  80.                     CLR_DARKGRAY,
  81.                     CLR_BLUE,
  82.                     CLR_GREEN, 
  83.                     CLR_CYAN,
  84.                     CLR_PINK,
  85.                     CLR_RED,
  86.                     CLR_YELLOW,
  87.                     CLR_WHITE };
  88.  
  89. LONG linetype[8] = { LINETYPE_DEFAULT,
  90.                      LINETYPE_DOT,
  91.                      LINETYPE_SHORTDASH,
  92.                      LINETYPE_DASHDOT,
  93.                      LINETYPE_DOUBLEDOT,
  94.                      LINETYPE_LONGDASH,
  95.                      LINETYPE_DASHDOUBLEDOT,
  96.                      LINETYPE_SOLID };
  97.  
  98. CHAR linetext[8][15] = { "DEFAULT",
  99.                          "DOT",
  100.                          "SHORTDASH",
  101.                          "DASHDOT",
  102.                          "DOUBLEDOT",
  103.                          "LONGDASH",
  104.                          "DASHDOUBLEDOT",
  105.                          "SOLID" };
  106.  
  107. LONG endstyles[4] = { LINEEND_DEFAULT,
  108.                       LINEEND_FLAT,
  109.                       LINEEND_ROUND,
  110.                       LINEEND_SQUARE };
  111.  
  112. LONG markertype[11] = { MARKSYM_DEFAULT,
  113.                         MARKSYM_CROSS,
  114.                         MARKSYM_PLUS,
  115.                         MARKSYM_DIAMOND,
  116.                         MARKSYM_SQUARE,
  117.                         MARKSYM_SIXPOINTSTAR,
  118.                         MARKSYM_EIGHTPOINTSTAR,
  119.                         MARKSYM_SOLIDDIAMOND,
  120.                         MARKSYM_SOLIDSQUARE,
  121.                         MARKSYM_DOT,
  122.                         MARKSYM_SMALLCIRCLE };
  123.  
  124. LONG pattern[19] = { PATSYM_BLANK,
  125.                      PATSYM_DEFAULT,
  126.                      PATSYM_DENSE1,
  127.                      PATSYM_DENSE2,
  128.                      PATSYM_DENSE3,
  129.                      PATSYM_DENSE4,
  130.                      PATSYM_DENSE5,
  131.                      PATSYM_DENSE6,
  132.                      PATSYM_DENSE7,
  133.                      PATSYM_DENSE8,
  134.                      PATSYM_DIAG1,
  135.                      PATSYM_DIAG2,
  136.                      PATSYM_DIAG3,
  137.                      PATSYM_DIAG4,
  138.                      PATSYM_HALFTONE,
  139.                      PATSYM_HORIZ,
  140.                      PATSYM_NOSHADE,
  141.                      PATSYM_SOLID,
  142.                      PATSYM_VERT };
  143.  
  144. SHORT select[15] = { 0,
  145.                      FATTR_SEL_ITALIC,
  146.                      FATTR_SEL_ITALIC ^ FATTR_SEL_UNDERSCORE,
  147.                      FATTR_SEL_ITALIC ^ FATTR_SEL_STRIKEOUT,
  148.                      FATTR_SEL_ITALIC ^ FATTR_SEL_BOLD,
  149.                      FATTR_SEL_ITALIC ^ FATTR_SEL_UNDERSCORE ^ FATTR_SEL_STRIKEOUT,
  150.                      FATTR_SEL_ITALIC ^ FATTR_SEL_UNDERSCORE ^ FATTR_SEL_BOLD,
  151.                      FATTR_SEL_ITALIC ^ FATTR_SEL_UNDERSCORE ^ FATTR_SEL_STRIKEOUT ^ FATTR_SEL_BOLD,
  152.                      FATTR_SEL_UNDERSCORE,
  153.                      FATTR_SEL_UNDERSCORE ^ FATTR_SEL_STRIKEOUT,
  154.                      FATTR_SEL_UNDERSCORE ^ FATTR_SEL_BOLD,
  155.                      FATTR_SEL_UNDERSCORE ^ FATTR_SEL_STRIKEOUT ^ FATTR_SEL_BOLD,
  156.                      FATTR_SEL_STRIKEOUT,
  157.                      FATTR_SEL_STRIKEOUT ^ FATTR_SEL_BOLD,
  158.                      FATTR_SEL_BOLD };
  159.  
  160. LONG direct[4] = { CHDIRN_LEFTRIGHT,
  161.                    CHDIRN_RIGHTLEFT,
  162.                    CHDIRN_TOPBOTTOM,
  163.                    CHDIRN_BOTTOMTOP };
  164.  
  165.  
  166. /*-----------------------------------------------------------------*/
  167. /*                          M A I N                                */
  168. /*-----------------------------------------------------------------*/
  169. void cdecl main()
  170. {
  171.  QMSG qmsg;
  172.  
  173.  srand( (unsigned) time(NULL) );
  174.  
  175.  if ( do_init() ){
  176.     while(WinGetMsg(hab, &qmsg, NULL, 0, 0))
  177.        WinDispatchMsg(hab, &qmsg);
  178.  
  179.     WinDestroyWindow( hwndMainFrame );
  180.     WinDestroyMsgQueue( hmq );
  181.     WinTerminate( hab );
  182.  }
  183.  
  184. }
  185.  
  186. /*-----------------------------------------------------------------*/
  187. /*                  Initialisierungs-Prozedur                      */
  188. /*-----------------------------------------------------------------*/
  189. INT do_init()
  190. {
  191.   BOOL ok;
  192.   ULONG flFlags = FCF_STANDARD;
  193.  
  194.   hab = WinInitialize( NULL );
  195.   hmq = WinCreateMsgQueue( hab,0 );
  196.  
  197.   ok = GpiLoadFonts( hab, "C:\\OS2\\DLL\\TIMES.FON" );
  198.  
  199.   if (!(WinRegisterClass(hab,"BenchProc", BenchProc, CS_SIZEREDRAW, 0))) {
  200.      WinDestroyMsgQueue( hmq );
  201.      WinTerminate( hab );
  202.      return FALSE;
  203.   }
  204.  
  205.   if (!(hwndMainFrame = WinCreateStdWindow(HWND_DESKTOP,WS_VISIBLE,&flFlags,
  206.                        "BenchProc",NULL,WS_SYNCPAINT,NULL,MID_MAIN,&hwndMainClient))) {
  207.      WinDestroyMsgQueue( hmq );
  208.      WinTerminate( hab );
  209.      return FALSE;
  210.   }
  211.  
  212.   WinSetWindowText(hwndMainFrame,"Benchmark Program");
  213.   return TRUE;
  214. }
  215.  
  216. /*-----------------------------------------------------------------*/
  217. /*                 M A I N C L I E N T P R O C                     */
  218. /*-----------------------------------------------------------------*/
  219. MRESULT EXPENTRY BenchProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  220. {
  221.   switch (msg)
  222.    {
  223.      case WM_CREATE:
  224.           break;
  225.      case WM_COMMAND:
  226.           do_command(hwnd,mp1);
  227.           return 0;
  228.      case WM_PAINT:
  229.           do_paint(hwnd);
  230.           return 0;
  231.      case WM_SIZE:
  232.           do_size(mp2);
  233.           return 0;
  234.      case WM_CLOSE:
  235.           WinPostMsg( hwnd, WM_QUIT, 0L, 0L);
  236.           return 0;
  237.      default:
  238.           break;
  239.    }
  240.     return (WinDefWindowProc(hwnd, msg, mp1, mp2 ));
  241. }
  242.  
  243. /*-----------------------------------------------------------------*/
  244. /*                       Command-Prozeduren                        */
  245. /*-----------------------------------------------------------------*/
  246. VOID do_command(HWND hwnd, MPARAM mp1)
  247. {
  248.    HPOINTER hptr;
  249.  
  250.    hptr = WinQueryPointer( HWND_DESKTOP );
  251.    WinSetPointer( HWND_DESKTOP, (HPOINTER) NULL );
  252.  
  253.    DosGetDateTime(&start_dt);
  254.  
  255.    switch (SHORT1FROMMP(mp1))
  256.    { 
  257.      case MID_GPI_FONTS_BOX:
  258.           do_gpi_fonts_box(hwnd);
  259.           break;
  260.      case MID_GPI_FONTS_CHARS:
  261.           do_gpi_fonts_chars(hwnd);
  262.           break;
  263.      case MID_GPI_FONTS_DIRECT:
  264.           do_gpi_fonts_direct(hwnd);
  265.           break;
  266.      case MID_GPI_FONTS_ANGLE:
  267.           do_gpi_fonts_angle(hwnd);
  268.           break;
  269.      case MID_GPI_FONTS_SHEAR:
  270.           do_gpi_fonts_shear(hwnd);
  271.           break;
  272.      case MID_GPI_FONTS_ALL:
  273.           do_gpi_fonts_all(hwnd);
  274.           break;
  275.      case MID_GPI_LINES_ARCS:
  276.           do_gpi_lines_arcs(hwnd);
  277.           break;
  278.      case MID_GPI_LINES_BOXES:
  279.           do_gpi_lines_boxes(hwnd);
  280.           break;
  281.      case MID_GPI_LINES_FILLETS:
  282.           do_gpi_lines_fillets(hwnd);
  283.           break;
  284.      case MID_GPI_LINES_LINES:
  285.           do_gpi_lines_lines(hwnd);
  286.           break;
  287.      case MID_GPI_LINES_SPLINES:
  288.           do_gpi_lines_splines(hwnd);
  289.           break;
  290.      case MID_GPI_LINES_STYLES:
  291.           do_gpi_lines_styles(hwnd);
  292.           break;
  293.      case MID_GPI_LINES_ALL:
  294.           do_gpi_lines_all(hwnd);
  295.           break;
  296.      case MID_GPI_MARKER_BOX :
  297.           do_gpi_marker_box(hwnd);
  298.           break;
  299.      case MID_GPI_MARKER_POLY :
  300.           do_gpi_marker_poly(hwnd);
  301.           break;
  302.      case MID_GPI_MARKER_SINGLE :
  303.           do_gpi_marker_single(hwnd);
  304.           break;
  305.      case MID_GPI_MARKER_USERDEF :
  306.           do_gpi_marker_userdef(hwnd);
  307.           break;
  308.      case MID_GPI_MARKER_ALL :
  309.           do_gpi_marker_all(hwnd);
  310.           break;
  311.      case MID_GPI_PATHS_ENDS:
  312.           do_gpi_paths_ends(hwnd);
  313.           break;
  314.      case MID_GPI_PATHS_FILL:
  315.           do_gpi_paths_fill(hwnd);
  316.           break;
  317.      case MID_GPI_PATHS_JOIN:
  318.           do_gpi_paths_join(hwnd);
  319.           break;
  320.      case MID_GPI_PATHS_LINES:
  321.           do_gpi_paths_lines(hwnd);
  322.           break;
  323.      case MID_GPI_PATHS_PATTERN:
  324.           do_gpi_paths_pattern(hwnd);
  325.           break;
  326.      case MID_GPI_PATHS_WIDTH:
  327.           do_gpi_paths_width(hwnd);
  328.           break;
  329.      case MID_GPI_PATHS_ALL:
  330.           do_gpi_paths_all(hwnd);
  331.           break;
  332.      case MID_GPI_ALL:
  333.           do_gpi_all(hwnd);
  334.           break;
  335.      case MID_GPI_EXTEND:
  336.           do_gpi_extend(hwnd);
  337.           break;
  338.      case CMD_CLEAR:
  339.           do_clear_screen(hwnd);
  340.           break;
  341.      case CMD_EXIT:
  342.           WinPostMsg(hwnd,WM_CLOSE,(MPARAM) NULL,(MPARAM) NULL);
  343.           return;
  344.      default:
  345.           return;
  346.      }
  347.  
  348.    DosGetDateTime(&ende_dt);
  349.    Display_Time( hwnd );
  350.  
  351.    WinSetPointer( HWND_DESKTOP, hptr );
  352.  
  353. }
  354.  
  355. VOID Display_Time(HWND hwnd)
  356. {
  357.   CHAR buffer[50];
  358.  
  359.   sprintf( buffer, "Benchmark result : %lu ms", Calc_MSec(&ende_dt)-Calc_MSec(&start_dt));
  360.  
  361.   WinSetWindowText( hwndMainFrame, buffer );
  362.  
  363. }
  364.  
  365. #define MS_HUNDREDTHS   10L
  366. #define MS_SECONDS    1000L
  367. #define MS_MINUTES   60000L
  368. #define MS_HOUR    3600000L 
  369.  
  370. LONG Calc_MSec( PDATETIME dt )
  371. {
  372.  
  373.   return dt->hours      * MS_HOUR     +
  374.          dt->minutes    * MS_MINUTES  +
  375.          dt->seconds    * MS_SECONDS  +
  376.          dt->hundredths * MS_HUNDREDTHS;
  377.  
  378. }
  379.  
  380. LONG Calc_Fraction( LONG value )
  381. {
  382.   return (LONG)((FLOAT)rand()/(FLOAT)RAND_MAX*(FLOAT)value);
  383. }
  384.  
  385. /*-----------------------------------------------------------------*/
  386. /*                       Zeichen-Prozeduren                        */
  387. /*-----------------------------------------------------------------*/
  388. VOID do_paint(HWND hwnd)
  389. {
  390.   RECTL rc;
  391.   HPS hps;
  392.  
  393.   hps =  WinBeginPaint(hwnd, (HPS)NULL, &rc);
  394.          WinFillRect( hps, &rc, SYSCLR_WINDOW);
  395.          WinEndPaint(hps);
  396. }
  397.  
  398. VOID do_clear_screen( HWND hwnd )
  399. {
  400.   HPS hps;
  401.   RECTL rc;
  402.  
  403.   rc.xLeft  = rc.yBottom = 0L;
  404.   rc.xRight = cx;
  405.   rc.yTop   = cy;
  406.  
  407.   hps = WinGetPS( hwnd );
  408.         WinFillRect( hps, &rc, colors[ rand() % 16 ] );
  409.         WinReleasePS( hwnd );
  410.  
  411. }
  412.  
  413.  
  414. VOID do_size( MPARAM mp2 )
  415. {
  416.   cx = SHORT1FROMMP(mp2);
  417.   cy = SHORT2FROMMP(mp2);
  418.   center.x = (LONG)cx/2;
  419.   center.y = (LONG)cy/2; 
  420.  
  421. /* Fonts */
  422.  
  423. VOID do_gpi_fonts_box(HWND hwnd)
  424. {
  425.   INT i,j;
  426.   POINTL pkt;
  427.   FATTRS fat;
  428.   SIZEF siz;
  429.   BOOL ok;
  430.   HPS hps;
  431.  
  432.   fat.usRecordLength = sizeof(FATTRS);
  433.   fat.fsSelection    = 0;
  434.   fat.lMatch         = 0;
  435.   fat.idRegistry     = 0;
  436.   fat.usCodePage     = 850;
  437.   fat.lMaxBaselineExt= 0L;
  438.   fat.lAveCharWidth  = 0L;
  439.   fat.fsType         = 0;
  440.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  441.   strcpy(fat.szFacename,"Tms Rmn");
  442.  
  443.   hps = WinGetPS( hwnd );
  444.  
  445.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  446.   ok = GpiSetCharSet( hps, 1 );
  447.  
  448.   for (i=0; i<100; i++ ) {
  449.       pkt.x = Calc_Fraction( cx/3 );
  450.       pkt.y = Calc_Fraction( cy );
  451.       siz.cx = MAKEFIXED( rand() % 200 ,0 );
  452.       siz.cy = MAKEFIXED( rand() % 200 ,0 );
  453.       ok = GpiSetColor( hps, colors[rand() % 16] );
  454.       ok = GpiMove( hps, &pkt );
  455.       ok = GpiSetCharBox( hps, &siz );
  456.       ok = GpiCharString( hps, 10, "Benchmark");
  457.   }
  458.  
  459.   WinReleasePS( hwnd );
  460.  
  461. }
  462.  
  463. VOID do_gpi_fonts_direct(HWND hwnd)
  464. {
  465.   INT i,j;
  466.   POINTL pkt;
  467.   FATTRS fat;
  468.   SIZEF size;
  469.   BOOL ok;
  470.   HPS hps;
  471.  
  472.   fat.usRecordLength = sizeof(FATTRS);
  473.   fat.fsSelection    = 0;
  474.   fat.lMatch         = 0;
  475.   fat.idRegistry     = 0;
  476.   fat.usCodePage     = 850;
  477.   fat.lMaxBaselineExt= 0L;
  478.   fat.lAveCharWidth  = 0L;
  479.   fat.fsType         = 0;
  480.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  481.   strcpy(fat.szFacename,"Tms Rmn");
  482.  
  483.   size.cx = MAKEFIXED( 50,0 );
  484.   size.cy = MAKEFIXED( 50,0 );
  485.  
  486.   hps = WinGetPS( hwnd );
  487.  
  488.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  489.   ok = GpiSetCharSet( hps, 1 );
  490.   ok = GpiSetCharBox( hps, &size );
  491.  
  492.   for (i=0; i<100; i++ ) {
  493.       pkt.x = Calc_Fraction( cx );
  494.       pkt.y = Calc_Fraction( cy );
  495.       ok = GpiSetColor( hps, colors[rand() % 16] );
  496.       ok = GpiSetCharDirection( hps, direct[rand() % 4] );
  497.       ok = GpiMove( hps, &pkt );
  498.       ok = GpiCharString( hps, 10, "Benchmark");
  499.   }
  500.  
  501.   WinReleasePS( hwnd );
  502.  
  503. }
  504.  
  505. VOID do_gpi_fonts_chars(HWND hwnd)
  506. {
  507.   INT i,j;
  508.   POINTL pkt;
  509.   FATTRS fat;
  510.   SIZEF size;
  511.   BOOL ok;
  512.   HPS hps;
  513.  
  514.   fat.usRecordLength = sizeof(FATTRS);
  515.   fat.fsSelection    = 0;
  516.   fat.lMatch         = 0;
  517.   fat.idRegistry     = 0;
  518.   fat.usCodePage     = 850;
  519.   fat.lMaxBaselineExt= 0L;
  520.   fat.lAveCharWidth  = 0L;
  521.   fat.fsType         = 0;
  522.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  523.   strcpy(fat.szFacename,"Tms Rmn");
  524.  
  525.   size.cx = MAKEFIXED( 50,0 );
  526.   size.cy = MAKEFIXED( 50,0 );
  527.  
  528.   hps = WinGetPS( hwnd );
  529.  
  530.   for (i=0; i<100; i++ ) {
  531.       pkt.x = Calc_Fraction( cx );
  532.       pkt.y = Calc_Fraction( cy );
  533.       fat.fsSelection = select[ rand() % 15 ];
  534.       ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  535.       ok = GpiSetCharSet( hps, 1 );
  536.       ok = GpiSetCharBox( hps, &size );
  537.       ok = GpiSetColor( hps, colors[rand() % 16] );
  538.       ok = GpiMove( hps, &pkt );
  539.       ok = GpiCharString( hps, 10, "Benchmark");
  540.       ok = GpiSetCharSet( hps, 0 );
  541.       ok = GpiDeleteSetId( hps, 1);
  542.   }
  543.  
  544.   WinReleasePS( hwnd );
  545.  
  546. }
  547.  
  548. VOID do_gpi_fonts_angle(HWND hwnd)
  549. {
  550.   INT i;
  551.   POINTL pkt;
  552.   FATTRS fat;
  553.   GRADIENTL grad;
  554.   SIZEF size;
  555.   BOOL ok;
  556.   HPS hps;
  557.  
  558.   fat.usRecordLength = sizeof(FATTRS);
  559.   fat.fsSelection    = 0;
  560.   fat.lMatch         = 0;
  561.   fat.idRegistry     = 0;
  562.   fat.usCodePage     = 850;
  563.   fat.lMaxBaselineExt= 0L;
  564.   fat.lAveCharWidth  = 0L;
  565.   fat.fsType         = 0;
  566.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  567.   strcpy(fat.szFacename,"Tms Rmn");
  568.  
  569.   size.cx = MAKEFIXED( 50,0 );
  570.   size.cy = MAKEFIXED( 50,0 );
  571.  
  572.   hps = WinGetPS( hwnd );
  573.  
  574.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  575.   ok = GpiSetCharSet( hps, 1 );
  576.   ok = GpiSetCharBox( hps, &size );
  577.  
  578.   for (i=0; i<100; i++ ) {
  579.       pkt.x = Calc_Fraction( cx );
  580.       pkt.y = Calc_Fraction( cy );
  581.       grad.x = (LONG)(25-rand() % 50 );
  582.       grad.y = (LONG)(25-rand() % 50 );
  583.       ok = GpiSetColor( hps, colors[rand() % 16] );
  584.       ok = GpiMove( hps, &pkt );
  585.       ok = GpiSetCharAngle( hps, &grad );      
  586.       ok = GpiCharString( hps, 10, "Benchmark" );
  587.   }
  588.  
  589.   WinReleasePS( hwnd );
  590.  
  591. }
  592.  
  593. VOID do_gpi_fonts_shear(HWND hwnd)
  594. {
  595.   INT i;
  596.   POINTL pkt,shear;
  597.   FATTRS fat;
  598.   SIZEF size;
  599.   BOOL ok;
  600.   HPS hps;
  601.  
  602.   fat.usRecordLength = sizeof(FATTRS);
  603.   fat.fsSelection    = 0;
  604.   fat.lMatch         = 0;
  605.   fat.idRegistry     = 0;
  606.   fat.usCodePage     = 850;
  607.   fat.lMaxBaselineExt= 0L;
  608.   fat.lAveCharWidth  = 0L;
  609.   fat.fsType         = 0;
  610.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  611.   strcpy(fat.szFacename,"Tms Rmn");
  612.  
  613.   size.cx = MAKEFIXED( 50,0 );
  614.   size.cy = MAKEFIXED( 50,0 );
  615.  
  616.   hps = WinGetPS( hwnd );
  617.  
  618.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  619.   ok = GpiSetCharSet( hps, 1 );
  620.   ok = GpiSetCharBox( hps, &size );
  621.  
  622.   for (i=0; i<100; i++ ) {
  623.       pkt.x = Calc_Fraction( cx );
  624.       pkt.y = Calc_Fraction( cy );
  625.       shear.x = (LONG)(25-rand() % 50 );
  626.       shear.y = (LONG)(25-rand() % 50 );
  627.       ok = GpiSetColor( hps, colors[rand() % 16] );
  628.       ok = GpiMove( hps, &pkt );
  629.       ok = GpiSetCharShear( hps, &shear );      
  630.       ok = GpiCharString( hps, 10, "Benchmark" );
  631.   }
  632.  
  633.   WinReleasePS( hwnd );
  634.  
  635. }
  636.  
  637. VOID do_gpi_fonts_all(HWND hwnd)
  638. {
  639.   do_gpi_fonts_box     (hwnd);
  640.   do_gpi_fonts_chars   (hwnd);
  641.   do_gpi_fonts_direct  (hwnd);
  642.   do_gpi_fonts_angle   (hwnd);
  643.   do_gpi_fonts_shear   (hwnd);
  644. }
  645.  
  646. /* Lines */
  647.  
  648. VOID do_gpi_lines_arcs(HWND hwnd)
  649. {
  650.  
  651.   INT i;
  652.   ARCPARAMS arcp = { 1, 1, 0, 0 };
  653.   POINTL pkt;
  654.   BOOL ok;
  655.   HPS hps;
  656.  
  657.   hps = WinGetPS( hwnd );
  658.  
  659.   ok = GpiSetArcParams( hps, &arcp );
  660.  
  661.   for (i=0; i<500; i++) {
  662.       pkt.x = Calc_Fraction( cx );
  663.       pkt.y = Calc_Fraction( cy );
  664.       ok = GpiSetColor( hps, colors[rand() % 16] );
  665.       ok = GpiMove( hps, &pkt );
  666.       ok = GpiFullArc( hps, DRO_OUTLINEFILL, MAKEFIXED( rand() % 64, 0 ) );
  667.   }
  668.  
  669.   WinReleasePS( hwnd );
  670.  
  671. }
  672.  
  673. VOID do_gpi_lines_boxes(HWND hwnd)
  674. {
  675.  
  676.   INT i;
  677.   BOOL ok;
  678.   HPS hps;
  679.   POINTL pkt;
  680.  
  681.   hps = WinGetPS( hwnd );
  682.  
  683.   ok = GpiMove( hps, ¢er );
  684.   ok = GpiSetColor( hps, CLR_DARKGRAY );
  685.  
  686.   for (i=0; i<500; i++) {
  687.       pkt.x = Calc_Fraction( cx );
  688.       pkt.y = Calc_Fraction( cy );
  689.       ok = GpiSetColor( hps, colors[rand() % 16] );
  690.       ok = GpiBox( hps, DRO_OUTLINEFILL, &pkt, NULL, NULL );
  691.       ok = GpiMove( hps, &pkt );
  692.   }
  693.  
  694.   WinReleasePS( hwnd );
  695.  
  696. }
  697.  
  698. VOID do_gpi_lines_fillets(HWND hwnd)
  699.   HPS hps;
  700.   POINTL Multipkt[2];
  701.   BOOL ok;
  702.   INT i,j;
  703.  
  704.   hps = WinGetPS( hwnd );
  705.  
  706.   ok =  GpiMove(hps, ¢er);
  707.   for (j=0; j<500; j++ ) {
  708.       for (i=0; i<2; i++ ) {
  709.           ok = GpiSetColor( hps, colors[rand() % 16] );
  710.           Multipkt[i].x = Calc_Fraction( cx );
  711.           Multipkt[i].y = Calc_Fraction( cy );
  712.           ok =  GpiPolyFillet(hps, 2, Multipkt);
  713.       }
  714.   }
  715.  
  716.   WinReleasePS( hwnd );
  717. }
  718.  
  719. VOID do_gpi_lines_lines(HWND hwnd)
  720.   BOOL ok;
  721.   POINTL p1;
  722.   INT i,c;
  723.   HPS hps;
  724.  
  725.   hps = WinGetPS( hwnd );
  726.  
  727.   p1.x = 0L;
  728.   p1.y = 0L;
  729.  
  730.   for (c=0; c<16; c++ ) {
  731.       ok = GpiSetColor( hps, colors[c] );
  732.       for (i=0 ; i<360; i++ ) {
  733.           ok = GpiMove( hps, ¢er );
  734.           if (i<90) {
  735.              p1.x =(LONG)((FLOAT)cx*(FLOAT)i/90.0);
  736.              }
  737.           else if ( i<180 ) {
  738.              p1.x = cx;
  739.              p1.y = (LONG)((FLOAT)cy*(FLOAT)(i-90)/90.0);
  740.              }
  741.           else if ( i<270 ) {
  742.              p1.x = (LONG)((FLOAT)cx*(FLOAT)(270-i)/90.0);
  743.              p1.y = cy;
  744.              }
  745.           else if ( i<360 ) {
  746.              p1.x = 0L;
  747.              p1.y = (LONG)((FLOAT)cy*(FLOAT)(360-i)/90.0);
  748.              }
  749.           ok = GpiLine( hps, &p1 );
  750.       }
  751.   } 
  752.   WinReleasePS( hwnd );
  753.  
  754. }
  755.  
  756. VOID do_gpi_lines_splines(HWND hwnd)
  757. {
  758.   HPS hps;
  759.   POINTL Multipkt[3];
  760.   BOOL ok;
  761.   INT i,j;
  762.  
  763.   hps = WinGetPS( hwnd );
  764.  
  765.   ok =  GpiSetColor(hps, CLR_CYAN);
  766.   ok =  GpiMove(hps, ¢er);   
  767.  
  768.   for (i=0; i<500; i++ ) {
  769.       for (j=0;j<3;j++) {
  770.           Multipkt[j].x = Calc_Fraction( cx );
  771.           Multipkt[j].y = Calc_Fraction( cy );
  772.       }
  773.       ok = GpiSetColor( hps, colors[rand() % 16] );
  774.       ok = GpiPolySpline(hps, 3, Multipkt);
  775.   } 
  776.  
  777.  
  778.   WinReleasePS( hwnd );
  779. }
  780.  
  781. VOID do_gpi_lines_styles(HWND hwnd)
  782. {
  783.   HPS hps;
  784.   BOOL ok;
  785.   POINTL pkt;
  786.   INT i,j;
  787.  
  788.   hps = WinGetPS( hwnd );
  789.   
  790.   for ( i=0; i<8; i++) {
  791.       pkt.y = (LONG)((FLOAT)cy/8.0*(FLOAT)i);
  792.       ok = GpiSetLineType(hps,linetype[i]);
  793.       for (j=0; j<(INT)((FLOAT)cy/8.0);j+=3) {
  794.           ok = GpiSetColor( hps, colors[rand() % 16] );
  795.           pkt.x = 0L;
  796.           ok = GpiMove(hps,&pkt);
  797.           pkt.x = cx;
  798.           ok = GpiLine(hps,&pkt);
  799.           pkt.y+=3;
  800.       }
  801.       ok = GpiSetColor( hps, colors[0] );
  802.       pkt.x = 10L;
  803.       pkt.y = (LONG)((FLOAT)cy/8.0*(FLOAT)i);
  804.       ok = GpiMove( hps, &pkt );
  805.       ok = GpiCharString( hps, strlen(linetext[i]), linetext[i] );
  806.   }
  807.  
  808.   WinReleasePS( hwnd );
  809. }
  810.  
  811. VOID do_gpi_lines_all(HWND hwnd)
  812. {
  813.   do_gpi_lines_arcs    (hwnd);
  814.   do_gpi_lines_boxes   (hwnd);
  815.   do_gpi_lines_fillets (hwnd);
  816.   do_gpi_lines_lines   (hwnd);
  817.   do_gpi_lines_splines (hwnd);
  818.   do_gpi_lines_styles  (hwnd);
  819. }
  820.  
  821.  
  822. /* marker */
  823.  
  824. VOID do_gpi_marker_box(HWND hwnd)
  825. {
  826.  
  827.   INT i,j;
  828.   POINTL pkt;
  829.   FATTRS fat;
  830.   SIZEF siz;
  831.   BOOL ok;
  832.   HPS hps;
  833.  
  834.   fat.usRecordLength = sizeof(FATTRS);
  835.   fat.fsSelection    = 0;
  836.   fat.lMatch         = 0;
  837.   fat.idRegistry     = 0;
  838.   fat.usCodePage     = 850;
  839.   fat.lMaxBaselineExt= 0L;
  840.   fat.lAveCharWidth  = 0L;
  841.   fat.fsType         = 0;
  842.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  843.   strcpy(fat.szFacename,"Tms Rmn");
  844.  
  845.   hps = WinGetPS( hwnd );
  846.  
  847.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  848.   ok = GpiSetMarkerSet( hps, 1 );
  849.  
  850.   for (i=0; i<500; i++) {
  851.      pkt.x = Calc_Fraction( cx );
  852.      pkt.y = Calc_Fraction( cy );
  853.      siz.cx = MAKEFIXED( rand() % 200, 0 );
  854.      siz.cy = MAKEFIXED( rand() % 200, 0 );
  855.      ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  856.      ok = GpiSetMarker( hps, rand() % 256 );
  857.      ok = GpiSetMarkerBox( hps, &siz );
  858.      ok = GpiMarker( hps, &pkt );
  859.  
  860.   }
  861.  
  862.   WinReleasePS( hwnd );
  863.  
  864. }
  865.  
  866. VOID do_gpi_marker_poly(HWND hwnd)
  867. {
  868.  
  869.   INT i,j;
  870.   POINTL pkt,pkte[30];
  871.   BOOL ok;
  872.   HPS hps;
  873.  
  874.   hps = WinGetPS( hwnd );
  875.   for (i=0; i<17; i++) {
  876.       for (j=0; j<30; j++ ) {
  877.           pkte[j].x = Calc_Fraction( cx );
  878.           pkte[j].y = Calc_Fraction( cy );
  879.       }
  880.      ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  881.      ok = GpiSetMarker( hps, markertype[ rand() % 11 ] );
  882.      ok = GpiPolyMarker( hps, 30, pkte );
  883.       
  884.   }
  885.   WinReleasePS( hwnd );
  886.  
  887. }
  888.  
  889. VOID do_gpi_marker_single(HWND hwnd)
  890. {
  891.  
  892.   INT i;
  893.   POINTL pkt;
  894.   BOOL ok;
  895.   HPS hps;
  896.  
  897.   hps = WinGetPS( hwnd );
  898.   for( i=0; i<500; i++ ) {
  899.      pkt.x = Calc_Fraction( cx );
  900.      pkt.y = Calc_Fraction( cy );
  901.      ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  902.      ok = GpiSetMarker( hps, markertype[ rand() % 11 ] );
  903.      ok = GpiMarker( hps, &pkt );
  904.   }
  905.  
  906.   WinReleasePS( hwnd );
  907.  
  908. }
  909.  
  910. VOID do_gpi_marker_userdef(HWND hwnd)
  911. {
  912.  
  913.   INT i,j;
  914.   POINTL pkt;
  915.   FATTRS fat;
  916.   BOOL ok;
  917.   HPS hps;
  918.  
  919.   fat.usRecordLength = sizeof(FATTRS);
  920.   fat.fsSelection    = 0;
  921.   fat.lMatch         = 0;
  922.   fat.idRegistry     = 0;
  923.   fat.usCodePage     = 850;
  924.   fat.lMaxBaselineExt= 0L;
  925.   fat.lAveCharWidth  = 0L;
  926.   fat.fsType         = 0;
  927.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  928.  
  929.   hps = WinGetPS( hwnd );
  930.  
  931.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  932.   ok = GpiSetMarkerSet( hps, 1 );
  933.  
  934.   for (i=0; i<500; i++) {
  935.      pkt.x = Calc_Fraction( cx );
  936.      pkt.y = Calc_Fraction( cy );
  937.      ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  938.      ok = GpiSetMarker( hps, rand() % 256 );
  939.      ok = GpiMarker( hps, &pkt );
  940.  
  941.   }
  942.  
  943.   WinReleasePS( hwnd );
  944.  
  945. }
  946.  
  947. VOID do_gpi_marker_all(HWND hwnd)
  948. {
  949.   do_gpi_marker_box(hwnd);
  950.   do_gpi_marker_poly(hwnd);
  951.   do_gpi_marker_single(hwnd);
  952.   do_gpi_marker_userdef(hwnd);
  953. }
  954.  
  955.  
  956. /* paths */
  957.  
  958. VOID do_gpi_paths_ends(HWND hwnd)
  959. {
  960.   HPS hps;
  961.   BOOL ok;
  962.   POINTL p1,p2;
  963.   INT i,j;
  964.  
  965.   hps = WinGetPS( hwnd );
  966.   
  967.   for (i=0; i<4; i++ ) {
  968.       for (j=0; j<125; j++) {
  969.           p1.x = Calc_Fraction( cx );
  970.           p1.y = Calc_Fraction( cy );
  971.           p2.x = Calc_Fraction( cx );
  972.           p2.y = Calc_Fraction( cy );
  973.           ok = GpiBeginPath( hps, 1L );
  974.           ok = GpiSetLineEnd( hps, endstyles[i] );
  975.           ok = GpiSetLineWidthGeom( hps, 20L );
  976.           ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  977.           ok = GpiMove( hps, &p1 );
  978.           ok = GpiLine( hps, &p2 );
  979.           ok = GpiEndPath( hps );
  980.           ok = GpiStrokePath( hps, 1L, NULL );
  981.       }
  982.   }
  983.  
  984.   WinReleasePS( hwnd );
  985.  
  986. }
  987.  
  988. VOID do_gpi_paths_fill(HWND hwnd)
  989. {
  990.   HPS hps;
  991.   BOOL ok;
  992.   INT i;
  993.   POINTL p1, pkt[2];
  994.  
  995.   hps = WinGetPS( hwnd );
  996.   for (i=0; i<500; i++) {
  997.       p1.x = Calc_Fraction( cx );
  998.       p1.y = Calc_Fraction( cy );
  999.       pkt[0].x = Calc_Fraction( cx );
  1000.       pkt[0].y = Calc_Fraction( cy );
  1001.       pkt[1].x = Calc_Fraction( cx );
  1002.       pkt[1].y = Calc_Fraction( cy );
  1003.       ok = GpiBeginPath( hps, 1L );
  1004.       ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  1005.       ok = GpiMove( hps, &p1 );
  1006.       ok = GpiPolyLine( hps, 2, pkt );
  1007.       ok = GpiLine( hps, &p1 );
  1008.       ok = GpiEndPath( hps );
  1009.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1010.   }
  1011.  
  1012.   WinReleasePS( hwnd );
  1013.  
  1014. }
  1015.  
  1016. VOID do_gpi_paths_join(HWND hwnd)
  1017. {
  1018.   static LONG joinstyle[4] = { LINEJOIN_BEVEL,
  1019.                                LINEJOIN_DEFAULT,
  1020.                                LINEJOIN_MITRE,
  1021.                                LINEJOIN_ROUND };
  1022.   HPS hps;
  1023.   BOOL ok;
  1024.   INT i;
  1025.   POINTL p1, pkt[2];
  1026.  
  1027.   hps = WinGetPS( hwnd );
  1028.   for (i=0; i<500; i++) {
  1029.       p1.x = Calc_Fraction( cx );
  1030.       p1.y = Calc_Fraction( cy );
  1031.       pkt[0].x = Calc_Fraction( cx );
  1032.       pkt[0].y = Calc_Fraction( cy );
  1033.       pkt[1].x = Calc_Fraction( cx );
  1034.       pkt[1].y = Calc_Fraction( cy );
  1035.       ok = GpiBeginPath( hps, 1L );
  1036.       ok = GpiSetColor( hps, colors[ rand() % 16 ] );
  1037.       ok = GpiSetLineWidthGeom( hps, 10L );
  1038.       ok = GpiSetLineJoin( hps, joinstyle[ rand() % 4 ] ); 
  1039.       ok = GpiMove( hps, &p1 );
  1040.       ok = GpiPolyLine( hps, 2, pkt );
  1041.       ok = GpiLine( hps, &p1 );
  1042.       ok = GpiEndPath( hps );
  1043.       ok = GpiStrokePath( hps, 1L, NULL );
  1044.   }
  1045.  
  1046.   WinReleasePS( hwnd );
  1047.  
  1048. }
  1049.  
  1050. VOID do_gpi_paths_lines(HWND hwnd)
  1051. {
  1052.   HPS hps;
  1053.   BOOL ok;
  1054.   POINTL pkt,pa1[2],pa2[3];
  1055.   INT i,sa,ea,ra;
  1056.  
  1057.   hps = WinGetPS( hwnd );
  1058.   for (i=0; i<125; i++) {
  1059.       pkt.x = Calc_Fraction( cx );
  1060.       pkt.y = Calc_Fraction( cy );
  1061.       sa = (INT) Calc_Fraction( 360L );
  1062.       ea = (INT) Calc_Fraction( 360L );
  1063.       ra = (INT) Calc_Fraction( 200L );
  1064.       ok = GpiBeginPath( hps, 1L );
  1065.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1066.       ok = GpiMove( hps, &pkt ); 
  1067.       ok = GpiPartialArc( hps, &pkt, MAKEFIXED( ra, 0), MAKEFIXED( sa, 0 ), MAKEFIXED( ea,0) );
  1068.       ok = GpiLine( hps, &pkt );
  1069.       ok = GpiEndPath( hps );
  1070.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1071.   }
  1072.  
  1073.   for (i=0; i<125; i++) {
  1074.       pkt.x = Calc_Fraction( cx );
  1075.       pkt.y = Calc_Fraction( cy );
  1076.       pa1[0].x = Calc_Fraction( cx );
  1077.       pa1[0].y = Calc_Fraction( cy );
  1078.       pa1[1].x = Calc_Fraction( cx );
  1079.       pa1[1].y = Calc_Fraction( cy );
  1080.       ok = GpiBeginPath( hps, 1L );
  1081.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1082.       ok = GpiMove( hps, &pkt );
  1083.       ok = GpiPolyFillet( hps, 2, pa1 );
  1084.       ok = GpiLine( hps, &pkt );
  1085.       ok = GpiEndPath( hps );
  1086.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1087.   }
  1088.  
  1089.   for (i=0; i<125; i++) {
  1090.       pkt.x = Calc_Fraction( cx );
  1091.       pkt.y = Calc_Fraction( cy );
  1092.       pa2[0].x = Calc_Fraction( cx );
  1093.       pa2[0].y = Calc_Fraction( cy );
  1094.       pa2[1].x = Calc_Fraction( cx );
  1095.       pa2[1].y = Calc_Fraction( cy );
  1096.       pa2[2].x = Calc_Fraction( cx );
  1097.       pa2[2].y = Calc_Fraction( cy );
  1098.       ok = GpiBeginPath( hps, 1L );
  1099.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1100.       ok = GpiMove( hps, &pkt );
  1101.       ok = GpiPolySpline( hps, 3, pa2 );
  1102.       ok = GpiLine( hps, &pkt );
  1103.       ok = GpiEndPath( hps );
  1104.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1105.   }
  1106.  
  1107.   for (i=0; i<125; i++) {
  1108.       pkt.x = Calc_Fraction( cx );
  1109.       pkt.y = Calc_Fraction( cy );
  1110.       pa2[0].x = Calc_Fraction( cx );
  1111.       pa2[0].y = Calc_Fraction( cy );
  1112.       pa2[1].x = Calc_Fraction( cx );
  1113.       pa2[1].y = Calc_Fraction( cy );
  1114.       pa2[2].x = Calc_Fraction( cx );
  1115.       pa2[2].y = Calc_Fraction( cy );
  1116.       ok = GpiBeginPath( hps, 1L );
  1117.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1118.       ok = GpiMove( hps, &pkt );
  1119.       ok = GpiPolyLine( hps, 3, pa2 );
  1120.       ok = GpiLine( hps, &pkt );
  1121.       ok = GpiEndPath( hps );
  1122.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1123.   }
  1124.  
  1125.   WinReleasePS( hwnd );
  1126.  
  1127. }
  1128.  
  1129. VOID do_gpi_paths_pattern(HWND hwnd)
  1130. {
  1131.   HPS hps;
  1132.   BOOL ok;
  1133.   POINTL pkt,pa1[2],pa2[3];
  1134.   INT i,sa,ea,ra;
  1135.  
  1136.   hps = WinGetPS( hwnd );
  1137.   for (i=0; i<125; i++) {
  1138.       pkt.x = Calc_Fraction( cx );
  1139.       pkt.y = Calc_Fraction( cy );
  1140.       sa = (INT) Calc_Fraction( 360L );
  1141.       ea = (INT) Calc_Fraction( 360L );
  1142.       ra = (INT) Calc_Fraction( 200L );
  1143.       ok = GpiBeginPath( hps, 1L );
  1144.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1145.       ok = GpiSetPattern( hps, pattern[ rand() % 19 ] );
  1146.       ok = GpiMove( hps, &pkt ); 
  1147.       ok = GpiPartialArc( hps, &pkt, MAKEFIXED( ra, 0), MAKEFIXED( sa, 0 ), MAKEFIXED( ea,0) );
  1148.       ok = GpiLine( hps, &pkt );
  1149.       ok = GpiEndPath( hps );
  1150.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1151.   }
  1152.  
  1153.   for (i=0; i<125; i++) {
  1154.       pkt.x = Calc_Fraction( cx );
  1155.       pkt.y = Calc_Fraction( cy );
  1156.       pa1[0].x = Calc_Fraction( cx );
  1157.       pa1[0].y = Calc_Fraction( cy );
  1158.       pa1[1].x = Calc_Fraction( cx );
  1159.       pa1[1].y = Calc_Fraction( cy );
  1160.       ok = GpiBeginPath( hps, 1L );
  1161.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1162.       ok = GpiSetPattern( hps, pattern[ rand() % 19 ] );
  1163.       ok = GpiMove( hps, &pkt );
  1164.       ok = GpiPolyFillet( hps, 2, pa1 );
  1165.       ok = GpiLine( hps, &pkt );
  1166.       ok = GpiEndPath( hps );
  1167.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1168.   }
  1169.  
  1170.   for (i=0; i<125; i++) {
  1171.       pkt.x = Calc_Fraction( cx );
  1172.       pkt.y = Calc_Fraction( cy );
  1173.       pa2[0].x = Calc_Fraction( cx );
  1174.       pa2[0].y = Calc_Fraction( cy );
  1175.       pa2[1].x = Calc_Fraction( cx );
  1176.       pa2[1].y = Calc_Fraction( cy );
  1177.       pa2[2].x = Calc_Fraction( cx );
  1178.       pa2[2].y = Calc_Fraction( cy );
  1179.       ok = GpiBeginPath( hps, 1L );
  1180.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1181.       ok = GpiSetPattern( hps, pattern[ rand() % 19 ] );
  1182.       ok = GpiMove( hps, &pkt );
  1183.       ok = GpiPolySpline( hps, 3, pa2 );
  1184.       ok = GpiLine( hps, &pkt );
  1185.       ok = GpiEndPath( hps );
  1186.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1187.   }
  1188.  
  1189.   for (i=0; i<125; i++) {
  1190.       pkt.x = Calc_Fraction( cx );
  1191.       pkt.y = Calc_Fraction( cy );
  1192.       pa2[0].x = Calc_Fraction( cx );
  1193.       pa2[0].y = Calc_Fraction( cy );
  1194.       pa2[1].x = Calc_Fraction( cx );
  1195.       pa2[1].y = Calc_Fraction( cy );
  1196.       pa2[2].x = Calc_Fraction( cx );
  1197.       pa2[2].y = Calc_Fraction( cy );
  1198.       ok = GpiBeginPath( hps, 1L );
  1199.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1200.       ok = GpiSetPattern( hps, pattern[ rand() % 19 ] );
  1201.       ok = GpiMove( hps, &pkt );
  1202.       ok = GpiPolyLine( hps, 3, pa2 );
  1203.       ok = GpiLine( hps, &pkt );
  1204.       ok = GpiEndPath( hps );
  1205.       ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1206.   }
  1207.  
  1208.   WinReleasePS( hwnd );
  1209.  
  1210. }
  1211.  
  1212. VOID do_gpi_paths_width(HWND hwnd)
  1213. {
  1214.   HPS hps;
  1215.   BOOL ok;
  1216.   POINTL pkt,pa1[2],pa2[3];
  1217.   INT i,sa,ea,ra;
  1218.  
  1219.   hps = WinGetPS( hwnd );
  1220.  
  1221.   for (i=0; i<125; i++) {
  1222.       pkt.x = Calc_Fraction( cx );
  1223.       pkt.y = Calc_Fraction( cy );
  1224.       sa = (INT) Calc_Fraction( 360L );
  1225.       ea = (INT) Calc_Fraction( 360L );
  1226.       ra = (INT) Calc_Fraction( 200L );
  1227.       ok = GpiBeginPath( hps, 1L );
  1228.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1229.       ok = GpiSetLineWidthGeom( hps, Calc_Fraction( 64L ) );
  1230.       ok = GpiMove( hps, &pkt ); 
  1231.       ok = GpiPartialArc( hps, &pkt, MAKEFIXED( ra, 0), MAKEFIXED( sa, 0 ), MAKEFIXED( ea,0) );
  1232.       ok = GpiLine( hps, &pkt );
  1233.       ok = GpiEndPath( hps );
  1234.       ok = GpiStrokePath( hps, 1L, NULL );
  1235.   }
  1236.  
  1237.   for (i=0; i<125; i++) {
  1238.       pkt.x = Calc_Fraction( cx );
  1239.       pkt.y = Calc_Fraction( cy );
  1240.       pa1[0].x = Calc_Fraction( cx );
  1241.       pa1[0].y = Calc_Fraction( cy );
  1242.       pa1[1].x = Calc_Fraction( cx );
  1243.       pa1[1].y = Calc_Fraction( cy );
  1244.       ok = GpiBeginPath( hps, 1L );
  1245.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1246.       ok = GpiSetLineWidthGeom( hps, Calc_Fraction( 64L ) );
  1247.       ok = GpiMove( hps, &pkt );
  1248.       ok = GpiPolyFillet( hps, 2, pa1 );
  1249.       ok = GpiLine( hps, &pkt );
  1250.       ok = GpiEndPath( hps );
  1251.       ok = GpiStrokePath( hps, 1L, NULL );
  1252.   }
  1253.  
  1254.   for (i=0; i<125; i++) {
  1255.       pkt.x = Calc_Fraction( cx );
  1256.       pkt.y = Calc_Fraction( cy );
  1257.       pa2[0].x = Calc_Fraction( cx );
  1258.       pa2[0].y = Calc_Fraction( cy );
  1259.       pa2[1].x = Calc_Fraction( cx );
  1260.       pa2[1].y = Calc_Fraction( cy );
  1261.       pa2[2].x = Calc_Fraction( cx );
  1262.       pa2[2].y = Calc_Fraction( cy );
  1263.       ok = GpiBeginPath( hps, 1L );
  1264.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1265.       ok = GpiSetLineWidthGeom( hps, Calc_Fraction( 64L ) );
  1266.       ok = GpiMove( hps, &pkt );
  1267.       ok = GpiPolySpline( hps, 3, pa2 );
  1268.       ok = GpiLine( hps, &pkt );
  1269.       ok = GpiEndPath( hps );
  1270.       ok = GpiStrokePath( hps, 1L, NULL );
  1271.   }
  1272.  
  1273.   for (i=0; i<125; i++) {
  1274.       pkt.x = Calc_Fraction( cx );
  1275.       pkt.y = Calc_Fraction( cy );
  1276.       pa2[0].x = Calc_Fraction( cx );
  1277.       pa2[0].y = Calc_Fraction( cy );
  1278.       pa2[1].x = Calc_Fraction( cx );
  1279.       pa2[1].y = Calc_Fraction( cy );
  1280.       pa2[2].x = Calc_Fraction( cx );
  1281.       pa2[2].y = Calc_Fraction( cy );
  1282.       ok = GpiBeginPath( hps, 1L );
  1283.       ok = GpiSetColor( hps, colors[rand() % 16] );
  1284.       ok = GpiSetLineWidthGeom( hps, Calc_Fraction( 64L ) );
  1285.       ok = GpiMove( hps, &pkt );
  1286.       ok = GpiPolyLine( hps, 3, pa2 );
  1287.       ok = GpiLine( hps, &pkt );
  1288.       ok = GpiEndPath( hps );
  1289.       ok = GpiStrokePath( hps, 1L, NULL );
  1290.   }
  1291.  
  1292.   WinReleasePS( hwnd );
  1293.  
  1294. }
  1295.  
  1296. VOID do_gpi_paths_all(HWND hwnd)
  1297. {
  1298.   do_gpi_paths_ends    (hwnd);
  1299.   do_gpi_paths_fill    (hwnd);
  1300.   do_gpi_paths_join    (hwnd);
  1301.   do_gpi_paths_lines   (hwnd);
  1302.   do_gpi_paths_pattern (hwnd);
  1303.   do_gpi_paths_width   (hwnd);
  1304. }
  1305.  
  1306. VOID do_gpi_all(HWND hwnd)
  1307.   do_gpi_fonts_all  (hwnd);
  1308.   do_gpi_lines_all  (hwnd);
  1309.   do_gpi_marker_all (hwnd);
  1310.   do_gpi_paths_all  (hwnd);
  1311. }
  1312.  
  1313. VOID do_gpi_extend(HWND hwnd)
  1314. {
  1315.   HPS hps;
  1316.   BOOL ok;
  1317.   POINTL pkt,shear;
  1318.   INT i,sa,ea,ra;
  1319.   FATTRS fat;
  1320.   SIZEF size;
  1321.   GRADIENTL grad;
  1322.  
  1323.   static INT  pie[5] = { 40, 60, 95, 65, 50 };
  1324.   static LONG col[5] = { CLR_PINK, CLR_DARKCYAN, CLR_YELLOW, CLR_DARKPINK, CLR_CYAN }; 
  1325.  
  1326.   fat.usRecordLength = sizeof(FATTRS);
  1327.   fat.fsSelection    = 0;
  1328.   fat.lMatch         = 0;
  1329.   fat.idRegistry     = 0;
  1330.   fat.usCodePage     = 850;
  1331.   fat.lMaxBaselineExt= 0L;
  1332.   fat.lAveCharWidth  = 0L;
  1333.   fat.fsType         = 0;
  1334.   fat.fsFontUse      = FATTR_FONTUSE_OUTLINE;
  1335.   strcpy(fat.szFacename,"Tms Rmn");
  1336.  
  1337.   size.cx = MAKEFIXED( 50,0 );
  1338.   size.cy = MAKEFIXED( 50,0 );
  1339.  
  1340.   shear.x = 20;
  1341.   shear.y = 20;
  1342.  
  1343.   pkt.x = 10;
  1344.   pkt.y = 10;
  1345.  
  1346.   hps = WinGetPS( hwnd );
  1347.  
  1348.   ok = GpiCreateLogFont( hps, (PSTR8) NULL, 1, &fat );
  1349.   ok = GpiSetCharSet( hps, 1 );
  1350.   ok = GpiSetCharBox( hps, &size );
  1351.   ok = GpiSetCharShear( hps, &shear );
  1352.   ok = GpiMove( hps, &pkt );
  1353.   ok = GpiSetColor( hps, CLR_DARKGRAY );
  1354.   ok = GpiCharString( hps, 10, "Benchmark" );
  1355.  
  1356.   shear.x = 0;
  1357.   shear.y = 0;
  1358.  
  1359.   ok = GpiMove( hps, &pkt );
  1360.   ok = GpiSetColor( hps, CLR_PALEGRAY );
  1361.   ok = GpiSetCharShear( hps, &shear );
  1362.   ok = GpiCharString( hps, 10, "Benchmark" );
  1363.  
  1364.   pkt.x = center.x/2;
  1365.   pkt.y = center.y;
  1366.  
  1367.   ra = 75; sa = 0; ea = 50;
  1368.  
  1369.   for (i=0; i<5; i++ ) {
  1370.      ok = GpiBeginPath( hps, 1L );
  1371.      ok = GpiSetColor( hps, col[i] );
  1372.      ok = GpiMove( hps, &pkt);
  1373.      ok = GpiPartialArc( hps, &pkt, MAKEFIXED( ra, 0 ), MAKEFIXED( sa, 0 ), MAKEFIXED( ea, 0 )  );
  1374.      ok = GpiLine( hps, &pkt);
  1375.      ok = GpiEndPath( hps );
  1376.      ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1377.      sa += ea; ea = pie[i];
  1378.   }
  1379.  
  1380.   pkt.x += 10;
  1381.   pkt.y -= 4;
  1382.  
  1383.   ok = GpiBeginPath( hps, 1L );
  1384.   ok = GpiSetColor( hps, CLR_BLUE );
  1385.   ok = GpiMove( hps, &pkt);
  1386.   ok = GpiPartialArc( hps, &pkt, MAKEFIXED( ra, 0 ), MAKEFIXED( sa, 0 ), MAKEFIXED( ea, 0 )  );
  1387.   ok = GpiLine( hps, &pkt);
  1388.   ok = GpiEndPath( hps );
  1389.   ok = GpiFillPath( hps, 1L, FPATH_ALTERNATE );
  1390.  
  1391.   grad.x =  50;
  1392.   grad.y = -25;
  1393.  
  1394.   size.cx = MAKEFIXED( 20,0 );
  1395.   size.cy = MAKEFIXED( 20,0 );
  1396.  
  1397.   pkt.x += 80;
  1398.   pkt.y -= 38;
  1399.  
  1400.   ok = GpiSetColor( hps, CLR_DARKBLUE );
  1401.   ok = GpiMove( hps, &pkt );
  1402.   ok = GpiSetCharAngle( hps, &grad );
  1403.   ok = GpiSetCharBox( hps, &size );
  1404.   ok = GpiCharString( hps, 14, "Extra Segment" );
  1405.  
  1406.   ok = GpiBeginPath( hps, 1L );
  1407.   ok = GpiSetColor( hps, CLR_BLACK );
  1408.   pkt.x = center.x+20;
  1409.   pkt.y = center.y-5;
  1410.   ok = GpiMove( hps, &pkt );
  1411.   pkt.y = cy-5;
  1412.   ok = GpiLine( hps, &pkt );
  1413.   pkt.x = center.x+15;
  1414.   pkt.y = center.y;
  1415.   ok = GpiMove( hps, &pkt );
  1416.   pkt.x = cx-5;
  1417.   ok = GpiLine( hps, &pkt );
  1418.   ok = GpiEndPath( hps );
  1419.   ok = GpiStrokePath( hps, 1L, FPATH_ALTERNATE );
  1420.  
  1421.   WinReleasePS( hwnd );
  1422.  
  1423. }
  1424.