home *** CD-ROM | disk | FTP | other *** search
/ vsiftp.vmssoftware.com / VSIPUBLIC@vsiftp.vmssoftware.com.tar / FREEWARE / FREEWARE40.ZIP / xv310a / xcmap.c < prev    next >
Text File  |  1995-06-12  |  16KB  |  417 lines

  1. /*
  2.  * xcmap.c - shows the contents of the colormap on 4, 6, or 8-bit X11 displays
  3.  *
  4.  *  Author:    John Bradley, University of Pennsylvania
  5.  *                (bradley@cis.upenn.edu)
  6.  */
  7.  
  8. #define REVDATE   "Rev: 2/13/89"
  9.  
  10. /* include files */
  11. #include <stdio.h>
  12. #include <sys/types.h>
  13. #include <ctype.h>
  14.  
  15. #include <X11/Xos.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xutil.h>
  18. #include <X11/cursorfont.h>
  19.  
  20. #ifdef VMS
  21. #define index strchr
  22. #endif
  23.  
  24. typedef unsigned char byte;
  25.  
  26. /* text centering macros for X11 */
  27. #define CENTERX(f,x,str) ((x)-XTextWidth(f,str,strlen(str))/2)
  28. #define CENTERY(f,y) ((y)-((f->ascent+f->descent)/2)+f->ascent)
  29.  
  30. #undef PARM
  31. #ifdef __STDC__
  32. #  define PARM(a) a
  33. #else
  34. #  define PARM(a) ()
  35. #endif
  36.  
  37. #define FONT "8x13"
  38.  
  39.  
  40. /* X stuff */
  41. Display       *theDisp;
  42. int           theScreen, dispcells;
  43. Colormap      theCmap;
  44. Window        rootW, mainW;
  45. GC            theGC;
  46. unsigned long fcol,bcol;
  47. Font          mfont;
  48. XFontStruct   *mfinfo;
  49. Visual        *theVisual;
  50.  
  51.  
  52. /* global vars */
  53. int            WIDE,HIGH,cWIDE,cHIGH,nxcells,nycells, pvalup;
  54. XColor         defs[256];
  55. char          *cmd, tmpstr[128];
  56.  
  57.  
  58.        int  main             PARM((int, char **));
  59. static void HandleEvent      PARM((XEvent *));
  60. static void Syntax           PARM((void));
  61. static void FatalError       PARM((char *));
  62. static void Quit             PARM((void));
  63. static void CreateMainWindow PARM((char *, char *, int, char **));
  64. static void DrawWindow       PARM((int,int,int,int));
  65. static void Resize           PARM((int,int));
  66. static void TrackMouse       PARM((int,int));
  67. static void DrawPixValue     PARM((int,int));
  68.  
  69. /*******************************************/
  70. int main(argc, argv)
  71.      int   argc;
  72.      char *argv[];
  73. /*******************************************/
  74. {
  75.   int        i;
  76.   char      *display, *geom;
  77.   XEvent     event;
  78.   
  79.   cmd = argv[0];
  80.   display = geom = NULL;
  81.   
  82.   
  83.   /*********************Options*********************/
  84.   
  85.   for (i = 1; i < argc; i++) {
  86.     char *strind;
  87.     
  88.     if (!strncmp(argv[i],"-g", (size_t)2)) {    /* geometry */
  89.       i++;
  90.       geom = argv[i];
  91.       continue;
  92.     }
  93.     
  94.     if (argv[i][0] == '=') {        /* old-style geometry */
  95.       geom = argv[i];
  96.       continue;
  97.     }
  98.     
  99.     if (!strncmp(argv[i],"-d",(size_t) 2)) {    /* display */
  100.       i++;
  101.       display = argv[i];
  102.       continue;
  103.     }
  104.     
  105.     strind = (char *) index(argv[i], ':');    /* old-style display */
  106.     if(strind != NULL) {
  107.       display = argv[i];
  108.       continue;
  109.     }
  110.     
  111.     Syntax();
  112.   }
  113.   
  114.   
  115.   /*****************************************************/
  116.   
  117.   /* Open up the display. */
  118.   
  119.   if ( (theDisp=XOpenDisplay(display)) == NULL)
  120.     FatalError("can't open display");
  121.   
  122.   theScreen = DefaultScreen(theDisp);
  123.   theCmap   = DefaultColormap(theDisp, theScreen);
  124.   rootW     = RootWindow(theDisp,theScreen);
  125.   theGC     = DefaultGC(theDisp,theScreen);
  126.   fcol      = WhitePixel(theDisp,theScreen);
  127.   bcol      = BlackPixel(theDisp,theScreen);
  128.   theVisual = DefaultVisual(theDisp,theScreen);
  129.   
  130.   dispcells = DisplayCells(theDisp, theScreen);
  131.   
  132.   if (dispcells>256) {
  133.     sprintf(tmpstr,"dispcells = %d.  %s",
  134.         dispcells, "This program can only deal with <= 8-bit displays.");
  135.     FatalError(tmpstr);
  136.   }
  137.   else if (dispcells>64)
  138.     nxcells = nycells = 16;
  139.   else if (dispcells>16)
  140.     nxcells = nycells = 8;
  141.   else if (dispcells>4)
  142.     nxcells = nycells = 4;
  143.   else
  144.     nxcells = nycells = 2;
  145.   
  146.   /**************** Create/Open X Resources ***************/
  147.   if ((mfinfo = XLoadQueryFont(theDisp,FONT))==NULL) {
  148.     sprintf(tmpstr,"couldn't open '%s' font",FONT);
  149.     FatalError(tmpstr);
  150.   }
  151.   
  152.   mfont=mfinfo->fid;
  153.   XSetFont(theDisp,theGC,mfont);
  154.   XSetForeground(theDisp,theGC,fcol);
  155.   XSetBackground(theDisp,theGC,bcol);
  156.   
  157.   CreateMainWindow(cmd,geom,argc,argv);
  158.   Resize(WIDE,HIGH);
  159.   
  160.   XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask 
  161.            | StructureNotifyMask | ButtonPressMask);
  162.   XMapWindow(theDisp,mainW);
  163.   
  164.   /**************** Main loop *****************/
  165.   while (1) {
  166.     XNextEvent(theDisp, &event);
  167.     HandleEvent(&event);
  168.   }
  169. }
  170.  
  171.  
  172.  
  173. /************************************************/
  174. static void HandleEvent(event)
  175.      XEvent *event;
  176. {
  177.   switch (event->type) {
  178.   case Expose: {
  179.     XExposeEvent *exp_event = (XExposeEvent *) event;
  180.     
  181.     if (exp_event->window==mainW) 
  182.       DrawWindow(exp_event->x,exp_event->y,
  183.          exp_event->width, exp_event->height);
  184.   }
  185.     break;
  186.     
  187.   case ButtonPress: {
  188.     XButtonEvent *but_event = (XButtonEvent *) event;
  189.     
  190.     if (but_event->window == mainW && but_event->button == Button1) 
  191.       TrackMouse(but_event->x, but_event->y);
  192.   }
  193.     break;
  194.     
  195.   case KeyPress: {
  196.     XKeyEvent *key_event = (XKeyEvent *) event;
  197.     KeySym ks;
  198.     XComposeStatus status;
  199.     
  200.     XLookupString(key_event,tmpstr,128,&ks,&status);
  201.     if (tmpstr[0]=='q' || tmpstr[0]=='Q') Quit();
  202.   }
  203.     break;
  204.     
  205.   case ConfigureNotify: {
  206.     XConfigureEvent *conf_event = (XConfigureEvent *) event;
  207.     
  208.     if (conf_event->window == mainW && 
  209.     (conf_event->width != WIDE || conf_event->height != HIGH))
  210.       Resize(conf_event->width, conf_event->height);
  211.   }
  212.     break;
  213.     
  214.     
  215.   case CirculateNotify:
  216.   case MapNotify:
  217.   case DestroyNotify:
  218.   case GravityNotify:
  219.   case ReparentNotify:
  220.   case UnmapNotify:
  221.   case MappingNotify:
  222.   case ClientMessage:         break;
  223.     
  224.   default:        /* ignore unexpected events */
  225.     break;
  226.   }  /* end of switch */
  227. }
  228.  
  229.  
  230. /***********************************/
  231. static void Syntax()
  232. {
  233.   printf("Usage: %s filename [=geom | -geometry geom] [ [-display] disp]\n",
  234.      cmd);
  235.   exit(1);
  236. }
  237.  
  238.  
  239. /***********************************/
  240. static void FatalError (identifier)
  241.      char *identifier;
  242. {
  243.   fprintf(stderr, "%s: %s\n",cmd, identifier);
  244.   exit(-1);
  245. }
  246.  
  247.  
  248. /***********************************/
  249. static void Quit()
  250. {
  251.   exit(0);
  252. }
  253.  
  254.  
  255. /***********************************/
  256. static void CreateMainWindow(name,geom,argc,argv)
  257.      char *name,*geom,**argv;
  258.      int   argc;
  259. {
  260.   XSetWindowAttributes xswa;
  261.   unsigned long xswamask;
  262.   XSizeHints hints;
  263.   int i,x,y;
  264.   unsigned int w,h;
  265.   
  266.   WIDE = HIGH = 256;            /* default window size */
  267.   
  268.   x=y=w=h=1;
  269.   i=XParseGeometry(geom,&x,&y,&w,&h);
  270.   if (i&WidthValue)  WIDE = (int) w;
  271.   if (i&HeightValue) HIGH = (int) h;
  272.   
  273.   if (i&XValue || i&YValue) hints.flags = USPosition;  
  274.   else hints.flags = PPosition;
  275.   
  276.   hints.flags |= USSize;
  277.   
  278.   if (i&XValue && i&XNegative) 
  279.     x = XDisplayWidth(theDisp,theScreen)-WIDE-abs(x);
  280.   if (i&YValue && i&YNegative) 
  281.     y = XDisplayHeight(theDisp,theScreen)-HIGH-abs(y);
  282.   
  283.   hints.x=x;             hints.y=y;
  284.   hints.width  = WIDE;   hints.height = HIGH;
  285.   hints.max_width  = DisplayWidth(theDisp,theScreen);
  286.   hints.max_height = DisplayHeight(theDisp,theScreen);
  287.   hints.min_width  = 16;
  288.   hints.min_height = 16;
  289.   hints.width_inc = hints.height_inc = 16;
  290.   hints.flags |= PMaxSize | PMinSize | PResizeInc;
  291.   
  292.   xswa.background_pixel = bcol;
  293.   xswa.border_pixel     = fcol;
  294.   xswa.cursor = XCreateFontCursor (theDisp, XC_top_left_arrow);
  295.   xswamask = CWBackPixel | CWBorderPixel | CWCursor;
  296.   
  297.   mainW = XCreateWindow(theDisp,rootW,x,y,(unsigned int) WIDE,
  298.             (unsigned int) HIGH, 2, 0, 
  299.             (unsigned int) CopyFromParent,
  300.             CopyFromParent, xswamask, &xswa);
  301.   
  302.   XSetStandardProperties(theDisp,mainW,"xcmap","xcmap",None,
  303.              argv,argc,&hints);
  304.   
  305.   if (!mainW) FatalError("Can't open main window");
  306.   
  307. }
  308.  
  309.  
  310. /***********************************/
  311. static void DrawWindow(x,y,w,h)
  312.      int x,y,w,h;
  313. {
  314.   int i,j,x1,y1,x2,y2;
  315.   
  316.   x1 = x / cWIDE;      y1 = y / cHIGH;    /* (x1,y1) (x2,y2): bounding */
  317.   x2 = ((x+w) + cWIDE - 1) / cWIDE;        /*       rect in cell coords */
  318.   y2 = ((y+h) + cHIGH - 1) / cHIGH;
  319.   
  320.   for (i=y1; i<y2; i++) {
  321.     for (j=x1; j<x2; j++) {
  322.       XSetForeground(theDisp,theGC,(unsigned long) (i*nycells+j) );
  323.       XFillRectangle(theDisp,mainW,theGC,j*cWIDE,i*cHIGH,
  324.              (unsigned int) cWIDE, (unsigned int) cHIGH);
  325.     }
  326.   }
  327. }
  328.  
  329.  
  330. /***********************************/
  331. static void Resize(w,h)
  332.      int w,h;
  333. {
  334.   cWIDE = (w + nxcells - 1) / nxcells;
  335.   cHIGH = (h + nycells - 1) / nycells;
  336.   WIDE = w;  HIGH = h;
  337. }
  338.  
  339.  
  340. /***********************************/
  341. static void TrackMouse(mx,my)
  342.      int mx,my;
  343. {
  344.   /* called when there's a button press in the window.  draws the pixel
  345.      value, and loops until button is released */
  346.   
  347.   Window        rootW,childW;
  348.   int           rx,ry,x,y;
  349.   unsigned int  mask;
  350.   
  351.   pvalup = 0;
  352.   DrawPixValue(mx,my);
  353.   
  354.   while (1) {
  355.     if (XQueryPointer(theDisp,mainW,&rootW,&childW,&rx,&ry,&x,&y,&mask)) {
  356.       if (!(mask & Button1Mask)) break;    /* button released */
  357.       
  358.       DrawPixValue(x,y);
  359.     }
  360.   }
  361. }
  362.  
  363.  
  364. /***********************************/
  365. static void DrawPixValue(x,y)
  366.      int x,y;
  367. {
  368.   static unsigned long pix, lastpix;
  369.   static int           pvaly;
  370.   
  371.   if (x<0) x=0;  if (x>=WIDE) x=WIDE-1;
  372.   if (y<0) y=0;  if (y>=HIGH) y=HIGH-1;
  373.   
  374.   if (!pvalup) {    /* it's not up.  make it so */
  375.     if (y >= HIGH/2) pvaly = 0;  else pvaly = HIGH - 12;
  376.     pvalup = 1;
  377.     lastpix = 0xffff;        /* kludge to force redraw on first */
  378.     XClearArea(theDisp,mainW,0,pvaly,
  379.            (unsigned int) WIDE, (unsigned int) 13,True);
  380.   }
  381.   
  382.   x /= cWIDE;  y /= cHIGH;
  383.   
  384.   pix = y * nxcells + x;
  385.   
  386.   if (pix != lastpix) {
  387.     XColor def;
  388.     char  *sp;
  389.     
  390.     XSetForeground(theDisp,theGC,fcol);
  391.     lastpix = def.pixel = pix;
  392.     if (pix<dispcells) {
  393.       XQueryColor(theDisp, theCmap, &def);
  394.       sprintf(tmpstr, "Pix %3ld = ($%04x, $%04x, $%04x)",
  395.           pix, def.red, def.green, def.blue);
  396.       
  397.       /* make the hex uppercase */        
  398.       for (sp=tmpstr+4; *sp; sp++) 
  399.     if (islower(*sp)) *sp = toupper(*sp);
  400.     }
  401.     else {
  402.       sprintf(tmpstr, "Pix %3ld is out of legal range. ", pix);
  403.     }
  404.     
  405.     XDrawImageString(theDisp,mainW,theGC,5,pvaly+10,tmpstr,
  406.              (int) strlen(tmpstr));
  407.   }
  408. }
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.