home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume15 / gbench / part01 / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-06-12  |  8.0 KB  |  310 lines

  1. #include <gbench.h>
  2.  
  3. #ifdef X10
  4. #   include <X10/bitmaps/gray1.bitmap>
  5. #   include <X10/cursors/target.cursor>
  6. #   include <X10/cursors/target_mask.cursor>
  7. #else
  8. #   include <X11/bitmaps/dot>
  9. #   include <X11/bitmaps/gray1>
  10. #endif
  11.  
  12. char* OpNames[NumOps][1+MaxPositional] = {
  13.     {"arc",    "opts",    "size",    "aspect",   "angle",    "lwidth"},
  14.     {"blit",    "opts",    "size", "offset",   nil,    nil},
  15.     {"map",    "opts",    "size", "nwin",        nil,    nil},
  16.     {"nop",     "opts",    nil,    nil,        nil,    nil},
  17.     {"point",    "opts",    nil,    nil,        nil,    nil},
  18.     {"poly",    "opts",    "size",    "nvert",    "lwidth",   nil},
  19.     {"rect",    "opts",    "size",    "lwidth",    nil,    nil},
  20.     {"text",    "opts",    "nchar","ptsize",   nil,    nil},
  21.     {"vec",    "opts",    "size",    "angle",    "lwidth",   nil}
  22. };
  23.  
  24. Op Ops[NumOps][4] = {
  25.     {StartArc,    DoArc,    Erase,  Finish},
  26.     {StartBlit,    DoBlit,    Erase,  Finish},
  27.     {StartMap,    DoMap,    Erase,  FinishMap},
  28.     {Start,    DoNop,    Erase,  Finish},
  29.     {StartPoint,DoPoint,Erase,    Finish},
  30.     {StartPoly,    DoPoly,    Erase,  Finish},
  31.     {StartRect, DoRect,    Erase,  Finish},
  32.     {StartText, DoText,    Erase,  Finish},
  33.     {StartVec,    DoVec,    Erase,  Finish}
  34. };
  35.  
  36. char* ResultMsgs[] = {
  37.     "Succeeded",
  38.     "CmdNotSupported",
  39.     "OptNotSupported",
  40.     "NoFonts",
  41.     "NoOffscreenMem"
  42. };
  43.  
  44. char* Script[] = {
  45.     "@# Starting script",
  46.     "c",
  47.     "a",
  48.     "a f 10",
  49.     "a f 100",
  50.     "b",
  51.     "n",
  52.     "point",
  53.     "poly",
  54.     "poly f 10",
  55.     "poly f 100",
  56.     "r",
  57.     "r f 10",
  58.     "r f 100",
  59.     "t n 1",
  60.     "t n 10",
  61.     "v n 10",
  62.     "v n 100",
  63.     "@# End of script",
  64.     nil
  65. };
  66.  
  67. static char* pname = "gbench";
  68.  
  69. void SetFonts(sp,pp)
  70.     State*  sp;
  71.     Params* pp;
  72. {
  73.     int        findex = 0;
  74.     int        foundcount;
  75.     char**    foundlist;
  76.     int        i;
  77.     char*    name;
  78.     char*    np = pp->fonts;
  79.     char    nlist[MaxStr];
  80.     TokenState    ts;
  81.  
  82.     strcpy(nlist,pp->fonts);
  83.     for (i=0;(i<MaxFonts)&&sp->fontinfo[i];i++) {
  84.     XFreeFont(DARGC sp->fontinfo[i]);
  85.     sp->fontinfo[i] = nil;
  86.     }
  87.     if (name=StrToken(nlist,",",&ts)) do {
  88. #    ifdef X10
  89.         if (sp->fontinfo[findex]=XOpenFont(name)) {
  90.         sp->fontinfo[findex]->width = XQueryWidth("AA",
  91.             sp->fontinfo[findex]->id)/2+1;
  92.         sprintf(np,"%s,",name);
  93.         np += strlen(np);
  94.         findex++;
  95.         }
  96. #    else
  97.         foundlist = XListFonts(sp->d,name,MaxFonts,&foundcount);
  98.         for (i=0;(i<foundcount)&&(findex<MaxFonts);i++)
  99.         if (sp->fontinfo[findex]=XLoadQueryFont(sp->d,foundlist[i])) {
  100.             sprintf(np,"%s,",foundlist[i]);
  101.             np += strlen(np);
  102.             findex++;
  103.         }
  104.         XFreeFontNames(foundlist);
  105. #    endif
  106.     } while ((findex<MaxFonts)&&(name=StrToken(nil,",",&ts)));
  107.     if (np>pp->fonts) *--np = '\0';
  108.     strcpy(sp->fonts,pp->fonts);
  109. }
  110.  
  111. void SetOutfile(sp,pp)
  112.     State*  sp;
  113.     Params* pp;
  114. {
  115.     if (sp->outfd!=stdout) fclose(sp->outfd);
  116.     if (!strcmp(pp->outfile,"stdout")) sp->outfd = stdout;
  117.     else if (!(sp->outfd=fopen(pp->outfile,"a"))) {
  118.     sp->outfd = stdout;
  119.     strcpy(pp->outfile,"stdout");
  120.     }
  121.     strcpy(sp->outfile,pp->outfile);
  122. }
  123.  
  124. void SetWinsize(sp,pp)
  125.     State*  sp;
  126.     Params* pp;
  127. {
  128. #   ifdef X11
  129.     XSizeHints sh;
  130. #   endif X11
  131.  
  132. #   ifdef X10
  133.     XChangeWindow(sp->w1,pp->winsize,pp->winsize);
  134.     XChangeWindow(sp->w2,pp->winsize,pp->winsize);
  135. #   else
  136.     sh.flags = USSize|PAspect;
  137.     sh.width = sh.height = pp->winsize;
  138.     sh.min_aspect.x = sh.max_aspect.x = sh.width;
  139.     sh.min_aspect.y = sh.max_aspect.y = sh.height;
  140.     XResizeWindow(sp->d,sp->w1,pp->winsize,pp->winsize);
  141.     XSetNormalHints(sp->d,sp->w1,&sh);
  142.     XResizeWindow(sp->d,sp->w2,pp->winsize,pp->winsize);
  143.     XSetNormalHints(sp->d,sp->w2,&sh);
  144.     if (pp->winsize>sp->winsize||!sp->offpix) {
  145.         if (sp->offpix) XFreePixmap(sp->d,sp->offpix);
  146.         sp->offpix = XCreatePixmap(
  147.         sp->d,_RootWindow,pp->winsize,pp->winsize,
  148.         DefaultDepth(sp->d,DefaultScreen(sp->d))
  149.         );
  150.     }
  151. #   endif
  152.     sp->winsize = pp->winsize;
  153.     XFlush(DARG);
  154. }
  155.  
  156. void InitParams(sp,pp)
  157.     State*  sp;
  158.     Params* pp;
  159. {
  160.     pp->angle = DefaultAngle;
  161.     pp->aspect = DefaultAspect;
  162.     pp->count = 1;
  163.     strcpy(pp->fonts,DefaultFonts);
  164.     pp->ptsize = DefaultPtsize;
  165.     pp->lwidth = DefaultLwidth;
  166.     pp->maxshift = DefaultMaxshift;
  167.     pp->offset = DefaultOffset;
  168.     pp->nchar = DefaultNchar;
  169.     pp->nwin = DefaultNwin;
  170.     pp->nvert = DefaultNvert;
  171.     *pp->opts = '\0';
  172.     strcpy(pp->outfile,"stdout");
  173.     pp->size = DefaultSize;
  174.     *pp->tag = '\0';
  175.     pp->timegoal = DefaultTimegoal;
  176.     pp->winsize = DefaultWinsize;
  177.     if (strcmp(sp->fonts,pp->fonts)) SetFonts(sp,pp);
  178.     if (strcmp(sp->outfile,pp->outfile)) SetOutfile(sp,pp);
  179.     if (sp->winsize!=pp->winsize) SetWinsize(sp,pp);
  180. }
  181.  
  182. void InitState(sp)
  183.     State* sp;
  184. {
  185.     char*   cp;
  186.     int        i;
  187.     int        j;
  188. #   ifdef X11
  189.     XGCValues   gcv;
  190.     XSizeHints  sh;
  191. #   endif X11
  192.  
  193.     sp->altwin = false;
  194.     sp->argindex = 1;
  195.     *sp->fonts = '\0';
  196.     for (i=0;i<MaxFonts;i++) sp->fontinfo[i] = nil;
  197.     sp->infds[0] = stdin;
  198.     sp->indepth = 0;
  199.     sp->offpix = nil;
  200.     sp->outfd = stdout;
  201.     strcpy(sp->outfile,"stdout");
  202.     sp->winsize = DefaultWinsize;
  203.     InitParams(sp,&sp->defaults);
  204.     sp->previndex = NilIndex;
  205.     InitParams(sp,&sp->prevparams);
  206.     gethostname(sp->host,MaxStr);
  207.     strncpy(sp->disphost,getenv("DISPLAY"),MaxStr);
  208.     if (cp=strchr(sp->disphost,':')) *cp = '\0';
  209.     if (!strcmp(sp->disphost,"unix")) strcpy(sp->disphost,sp->host);
  210.     for (i=0;i<MaxStr;i++) sp->outstr[i] = 'A'+(i%26);
  211.     sp->scriptindex = -1;
  212.     sp->w1 = XCreateSimpleWindow(
  213.     DARGC _RootWindow,0,0,sp->winsize,sp->winsize,2,WhitePixmap,BlackPixmap
  214.     );
  215.     sp->cw1 = XCreateSimpleWindow(
  216.     DARGC sp->w1,0,0,OverlapSize,OverlapSize,1,WhitePixmap,BlackPixmap
  217.     );
  218.     sp->w2 = XCreateSimpleWindow(
  219.     DARGC _RootWindow,sp->winsize,0,sp->winsize,sp->winsize,2,WhitePixmap,
  220.     BlackPixmap
  221.     );
  222.     sp->cw2 = XCreateSimpleWindow(
  223.     DARGC sp->w2,0,0,OverlapSize,OverlapSize,1,WhitePixmap,BlackPixmap
  224.     );
  225.     sp->dest1 = sp->w1;
  226.     sp->src1 = sp->w1;
  227.     sp->dest2 = sp->w2;
  228.     sp->src2 = sp->w2;
  229.     for (i=0;i<NumOps;i++) sp->supcmds[i] = true;
  230.     for (i=0;i<(sizeof(OptFlags)/sizeof(bool));i++) {
  231.     ((bool*)&sp->supopts)[i] = true;
  232.     }
  233. #   ifdef X10
  234.     sp->supcmds[(int)ArcIndex] = false;
  235.     sp->supcmds[(int)NopIndex] = false;
  236.     sp->supcmds[(int)PointIndex] = false;
  237.     sp->supopts.altfont = false;
  238.     sp->supopts.altgc = false;
  239.     sp->supopts.offdest = false;
  240.     sp->supopts.offsrc =false;
  241.     sp->supopts.polywind = false;
  242.     sp->cursor = XCreateCursor(
  243.         target_width,target_height,target_bits,target_mask_bits,
  244.         target_x_hot,target_y_hot,_WhitePixel,_BlackPixel,GXcopy
  245.     );
  246.     sp->gxname = "X10";
  247.     sp->offpix = sp->w1;
  248.     sp->pattern = XMakePattern(1,2,4);
  249.     sp->tile = XMakePixmap(
  250.         XStoreBitmap(gray1_width,gray1_height,gray1_bits),_WhitePixel,
  251.         _BlackPixel
  252.     );
  253. #   else
  254.     sp->cursor = XCreateFontCursor(sp->d,XC_target);
  255.     gcv.foreground = _WhitePixel;
  256.     gcv.background = _BlackPixel;
  257.     gcv.tile = XCreatePixmapFromBitmapData(
  258.         sp->d,_RootWindow,gray1_bits,gray1_width,gray1_height,_WhitePixel,
  259.         _BlackPixel,DefaultDepth(sp->d,DefaultScreen(sp->d))
  260.     );
  261.     gcv.stipple = XCreateBitmapFromData(
  262.         sp->d,_RootWindow,dot_bits,dot_width,dot_height
  263.     );
  264.     sp->gc1 = XCreateGC(
  265.         sp->d,_RootWindow,GCForeground|GCBackground|GCTile|GCStipple,&gcv
  266.     );
  267.     sp->gc2 = XCreateGC(
  268.         sp->d,_RootWindow,GCForeground|GCBackground|GCTile|GCStipple,&gcv
  269.     );
  270.     sp->gxname = "X11";
  271.     sh.flags = USPosition|USSize|PAspect;
  272.     sh.x = sh.y = 0;
  273.     sh.width = sh.height = sp->winsize;
  274.     sh.min_aspect.x = sh.max_aspect.x = sh.width;
  275.     sh.min_aspect.y = sh.max_aspect.y = sh.height;
  276.     XSetStandardProperties(
  277.         sp->d,sp->w1,"gbench w1","gbench w1",None,sp->argv,sp->argc,&sh
  278.     );
  279.     sh.x = sp->winsize;
  280.     XSetStandardProperties(
  281.         sp->d,sp->w2,"gbench w2","gbench w2",None,sp->argv,sp->argc,&sh
  282.     );
  283.     for (i=0;i<MaxStr;i++) {
  284.         sp->texts[i].chars = sp->outstr+i;
  285.         sp->texts[i].nchars = 1;
  286.         sp->texts[i].delta = 0;
  287.     }
  288. #   endif
  289.     MapWin(sp,sp->w1);
  290.     XClearWindow(DARGC sp->w1);
  291.     XFlush(DARG);
  292. }
  293.  
  294. int main(argc,argv)
  295.     int        argc;
  296.     char*   argv[];
  297. {
  298.     State   s;
  299.     State*  sp = &s;
  300.  
  301.     s.argc = argc;
  302.     s.argv = argv;
  303.     ProfControl(0);
  304.     if (!(s.d=XOpenDisplay(0))) Fatal(pname,"Couldn't open display");
  305.     InitState(&s);
  306.     ExecCmds(&s);
  307.     XFlush(DARG);
  308.     return 0;
  309. }
  310.