home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / REND / CRTX11.C < prev    next >
C/C++ Source or Header  |  1996-06-16  |  7KB  |  421 lines

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4.  
  5. #include <sys/time.h>
  6. #include <sys/types.h>
  7. #include <sys/select.h>
  8.  
  9.  
  10. #include "reader.h"
  11. #include "crtX11.h"
  12.  
  13.  
  14.  
  15.  
  16. char    *program = "Do-GA C.G.A System Rendering Program for X11" ;
  17.  
  18.  
  19. char app_name[] = "xrend";
  20.  
  21.  
  22.  
  23. extern    int        antiareas;            /* in rend.c */
  24. extern    int        XPixel,YPixel;        /* in glib.c */
  25.  
  26. static    u_int    rshift,gshift,bshift;
  27. static    u_int    rmaskl,gmaskl,bmaskl;
  28.  
  29.  
  30. void
  31. init_color(pixels,ncols)
  32. u_long    *pixels;
  33. u_int    ncols;
  34. {
  35.     u_int    ri,gi,bi;
  36.     u_int    rstep,gstep,bstep;
  37.     u_int    rlev,glev,blev;
  38.  
  39.     switch( ncols ){
  40.     case 256:
  41.         rshift = 3;
  42.         gshift = 3;
  43.         bshift = 2;
  44.         break;
  45.  
  46.     case 128:
  47.         rshift = 2;
  48.         gshift = 3;
  49.         bshift = 2;
  50.         break;
  51.  
  52.     case 64:
  53.         rshift = 2;
  54.         gshift = 2;
  55.         bshift = 2;
  56.         break;
  57.  
  58.     case 32:
  59.         rshift = 2;
  60.         gshift = 2;
  61.         bshift = 1;
  62.         break;
  63.  
  64.     case 16:
  65.         rshift = 1;
  66.         gshift = 2;
  67.         bshift = 1;
  68.         break;
  69.  
  70.     case 8:
  71.         rshift = 1;
  72.         gshift = 1;
  73.         bshift = 1;
  74.         break;
  75.  
  76.     default:
  77.         fprintf(stderr,"init color error. illegal argument ncol:%d\n",ncols);
  78.         exit(1);
  79.     }
  80.  
  81.  
  82.     rstep = (1<<rshift) - 1;
  83.     rlev = 65535/rstep;
  84.  
  85.     gstep = (1<<gshift) - 1;
  86.     glev = 65535/gstep;
  87.  
  88.     bstep = (1<<bshift) - 1;
  89.     blev = 65535/bstep;
  90.  
  91.     {
  92.         XColor    c;
  93.         int    i = 0;
  94.  
  95.         for( ri=0; ri<=rstep; ri++ ){
  96.             for( gi=0; gi<=gstep; gi++ ){
  97.                 for( bi=0; bi<=bstep; bi++ ){
  98.  
  99.                         c.pixel = pixels[i];
  100.                         red[i]   = c.red   = rlev*ri;
  101.                         green[i] = c.green = glev*gi;
  102.                         blue[i]  = c.blue  = blev*bi;
  103.                         c.flags = DoRed|DoGreen|DoBlue;
  104.                         XStoreColor(display,cmap,&c);
  105.  
  106.                         i++;
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
  112.  
  113.  
  114. u_int
  115. getshift(mask,depth)
  116. u_long    mask;
  117. int    depth;
  118. {
  119.     u_int    shift;
  120.  
  121.     for(shift=0;shift<depth;shift++){
  122.         if( mask & 1 )
  123.             break;
  124.         mask>>=1;
  125.     }
  126.  
  127.     return    shift;
  128. }
  129.  
  130. u_int
  131. getmasklen(mask,depth)
  132. u_long    mask;
  133. int    depth;
  134. {
  135.     u_int    i;
  136.     u_int    len = 0;
  137.  
  138.     mask >>= getshift(mask,depth);
  139.  
  140.     for(len=0;len<depth;len++){
  141.         if(!(mask & 1))
  142.             break;
  143.  
  144.         mask>>=1;
  145.     }
  146.  
  147.     return    len;
  148. }
  149.  
  150.  
  151.  
  152.  
  153. void    crtinit( line )
  154. int        line;
  155. {
  156.     display = XOpenDisplay(0);
  157.  
  158.     if(!display){
  159.         fprintf(stderr, "rend: Can't open display\n");
  160.         exit(1);
  161.     }
  162.     screen = DefaultScreen(display);
  163.  
  164.     bzero((char *)&hints, sizeof hints );
  165.  
  166.     hints.flags = PPosition|USSize|PMinSize|PMaxSize;
  167.     if(
  168.         0 !=
  169.         (XGeometry(display,screen, 0,0,1,1,1,0,0,&gm_x,&gm_y,&gm_w,&gm_h) & (XValue|YValue))
  170.     ){
  171.         hints.flags |= USPosition;
  172.     }
  173.  
  174.     gm_w = XPixel/antiareas;
  175.     gm_h = YPixel/antiareas;
  176.  
  177.     hints.x = gm_x;
  178.     hints.y = gm_y;
  179.     
  180.     hints.min_width  = hints.max_width  = hints.width  = gm_w;
  181.     hints.min_height = hints.max_height = hints.height = gm_h;
  182.  
  183.     window = XCreateSimpleWindow(
  184.             display,
  185.             RootWindow( display, screen ),
  186.             gm_x,
  187.             gm_y,
  188.             gm_w,
  189.             gm_h,
  190.             4,
  191.             BlackPixel( display, screen ),
  192.             WhitePixel( display, screen )
  193.         );
  194.  
  195.     if(!window){
  196.         printf("Can't create window\n");
  197.         exit(1);
  198.     }
  199.  
  200.     XSetNormalHints( display, window, &hints );
  201.     XStoreName(display, window, app_name );
  202.  
  203.     gc = XCreateGC( display, window, 0, 0 );
  204.     visual = DefaultVisual( display, screen );
  205.  
  206.     vclass = visual->class;
  207.  
  208.     {
  209.         char *classname[] = {
  210.             "StaticGray",
  211.             "GrayScale",
  212.             "StaticColor",
  213.             "PseudoColor",
  214.             "TrueColor",
  215.             "DirectColor"
  216.         };
  217.  
  218.         switch( vclass ){
  219.  
  220.         case PseudoColor:
  221.             break;
  222.         case TrueColor:
  223.             break;
  224.         case StaticGray:
  225.             break;
  226.         default:
  227.             fprintf(stderr,"Visualclass `%s' is not supported\n",classname[vclass]);
  228.             exit(1);
  229.         }
  230.     }
  231.  
  232.     cmap = DefaultColormap( display, screen );
  233.  
  234.  
  235.     if( vclass == PseudoColor ){
  236.         int i;
  237.         XColor    c;
  238.  
  239.         ncols = NCOLS;
  240.  
  241.         while(1){
  242.             result = XAllocColorCells( display, cmap, FALSE,
  243.                                         0,0,
  244.                                         pixels, ncols
  245.                     );
  246.  
  247.             if( result )
  248.                 break;
  249.  
  250.             if( ncols <= 8 ){
  251.                 fprintf(stderr,"Cannot alloc %d color cells.\n",ncols);
  252.                 exit(1);
  253.             }
  254.  
  255.             ncols/=2;
  256.         }
  257.  
  258.         init_color(pixels,ncols);
  259.     }
  260.  
  261.  
  262.     depth = DefaultDepth(display,screen);
  263.  
  264.     if( vclass == PseudoColor ){
  265.         (void*)imagedata = malloc(gm_w*gm_h);
  266.         image = XCreateImage( display, visual, depth, ZPixmap, 0,
  267.             (char *)imagedata, gm_w, gm_h, 8, 0 );
  268.         image->bits_per_pixel = 8;
  269.     }
  270.  
  271.  
  272.     if( vclass == TrueColor ){
  273.  
  274.         if( depth != 16 ){
  275.             fprintf(stderr,"not support %dbit depth - TrueColor\n",depth);
  276.             exit(1);
  277.         }
  278.  
  279.         rshift = getshift(visual->red_mask,depth);
  280.         gshift = getshift(visual->green_mask,depth);
  281.         bshift = getshift(visual->blue_mask,depth);
  282.  
  283.         rmaskl = getmasklen(visual->red_mask,depth);
  284.         gmaskl = getmasklen(visual->green_mask,depth);
  285.         bmaskl = getmasklen(visual->blue_mask,depth);
  286.  
  287.  
  288.         (void*)imagedata = malloc(gm_w*gm_h*(depth/8));
  289.         image = XCreateImage( display, visual, depth, ZPixmap, 0,
  290.             (char *)imagedata, gm_w, gm_h, 8, 0 );
  291.         image->bits_per_pixel = 16;
  292.     }
  293.  
  294.       
  295.     XSetWindowBackground( display, window, BlackPixel( display, screen ) );
  296.  
  297.     pixmap = XCreatePixmap( display, window, gm_w, gm_h, depth );
  298.     XSetForeground(display, gc, BlackPixel(display,screen));
  299.     XFillRectangle( display, pixmap, gc, 0, 0, gm_w, gm_h );
  300.     XSetWindowBackgroundPixmap(display, window, pixmap);
  301.  
  302.     XMapWindow( display, window );
  303.     XFlush( display );
  304.  
  305.     x11_enable = 1;
  306. }
  307.  
  308.  
  309.  
  310.  
  311. static    int    buffline = 0;
  312.  
  313. /*    」テ」メ」ヤ、ホ・ッ・・「    */
  314. void    crtclr()
  315. {
  316.     buffline = 0;
  317.  
  318.     XSetForeground(display, gc, BlackPixel(display,screen) );
  319.     XFillRectangle( display, window, gc, 0, 0, gm_w, gm_h );
  320.     XFillRectangle( display, pixmap, gc, 0, 0, gm_w, gm_h );
  321. }
  322.  
  323.  
  324.  
  325. /*    」テ」メ」ヤスミホマ    */
  326. void    crtout( framebuf, xlen, y )
  327. u_short    *framebuf ;
  328. int        xlen ;
  329. int        y ;
  330. {
  331.     u_short *p = framebuf;
  332.     u_long    ccode;
  333.     int i;
  334.  
  335.     if( y == 0 ){
  336.         XFlush(display);
  337.     }
  338.  
  339.     if( vclass == PseudoColor ){
  340.         u_short    r,g,b;
  341.         u_short    c;
  342.         char *imgp = (char *)imagedata+(gm_w*y);
  343.  
  344.         for( i=0; i<xlen; i++ ){
  345.             c = *p++;
  346.  
  347.             r = (c & 0x07c0) >> ( 6 + 5 - rshift );
  348.             g = (c & 0xf800) >> (11 + 5 - gshift );
  349.             b = (c & 0x003e) >> ( 1 + 5 - bshift );
  350.  
  351.             ccode = (r<<(gshift+bshift)) + (g<<(bshift)) + b;
  352.  
  353.             *imgp++ = (u_char)pixels[ccode];
  354.         }
  355.     }
  356.  
  357.  
  358.     if( (vclass == TrueColor) && (depth == 16)){
  359.         u_short    r,g,b;
  360.         u_short    c;
  361.         u_short    *imgp = (void *)imagedata+(gm_w*y*(depth/8));
  362.         u_long    pixel;
  363.  
  364.         for( i=0; i<xlen; i++ ){
  365.             c = *p++;
  366.  
  367.             r = (c>> 6) & 0x1f;
  368.             g = (c>>11) & 0x1f;
  369.             b = (c>> 1) & 0x1f;
  370.  
  371.             pixel =    (r<<(rshift-(5-rmaskl))) +
  372.                     (g<<(gshift-(5-gmaskl))) +
  373.                     (b<<(bshift-(5-bmaskl)));
  374.  
  375.             *imgp++ = (u_short)pixel;
  376.         }
  377.     }
  378.  
  379.  
  380. /*#define    BUFFERLINE    32    /**/
  381.  
  382. #ifdef BUFFERLINE
  383.     buffline++;
  384.  
  385.     if( buffline >= BUFFERLINE ){
  386.         buffline = 0;
  387.         XPutImage(display, pixmap, gc, image, 0,y-BUFFERLINE+1,0,y-BUFFERLINE+1,
  388.             xlen, BUFFERLINE );
  389.  
  390.         XCopyArea(display, pixmap, window, gc, 0,y-BUFFERLINE+1, xlen, BUFFERLINE, 0,y-BUFFERLINE+1,
  391.     }
  392. #else
  393.     XPutImage(display, pixmap, gc, image, 0,y,0,y,
  394.         xlen, 1 );
  395.  
  396.     XCopyArea(display, pixmap, window, gc, 0,y, xlen, 1, 0,y );
  397.  
  398. #endif
  399.  
  400.  
  401.  
  402.     if( y == YPixel-1 ){
  403. /* DONE */
  404.  
  405.  
  406.     }
  407. }
  408.  
  409.  
  410.  
  411. void    crtline( x1, y1, x2, y2 )
  412. int        x1, y1, x2, y2 ;
  413. {
  414.     XSetForeground(display, gc, WhitePixel(display,screen) );
  415.  
  416.     XDrawLine( display, pixmap, gc, x1, y1, x2-1, y2-1 );
  417.     XDrawLine( display, window, gc, x1, y1, x2-1, y2-1 );
  418. }
  419.  
  420.  
  421.