xc/programs/Xserver/Xprint/Init.c
xc/programs/Xserver/Xprint/ps/Imakefile xc/programs/Xserver/Xprint/ps/Ps.h xc/programs/Xserver/Xprint/ps/PsArea.c xc/programs/Xserver/Xprint/ps/PsColor.c xc/programs/Xserver/Xprint/ps/PsImageUtil.c xc/programs/Xserver/Xprint/ps/PsInit.c //bugs.freedesktop.org/show_bug.cgi?id=2879) attachment #2287 (https://bugs.freedesktop.org/attachment.cgi?id=2287) Follow-up to bugzilla #1299: Add new visuals in the Postscript DDX (including TrueColor 16bit, PseudoColor 15bit/12bpg(12 bits per R-, G-, B-channel as in PostScript Level 2 (and above) colors can have 12 bits per component (36 bit for RGB)), PseudoColor+GrayScale+StaticGray 12bit/12bpg) and switch the default visual from PseudoColor 8bit/8bpg to PseudoColor 12bit/12bpg.
This commit is contained in:
		
							parent
							
								
									fe37cc7e7b
								
							
						
					
					
						commit
						03d126081e
					
				| 
						 | 
					@ -164,6 +164,8 @@ PixmapFormatRec	PSPixmapFormats[] = {
 | 
				
			||||||
    {  1,  1, BITMAP_SCANLINE_PAD },
 | 
					    {  1,  1, BITMAP_SCANLINE_PAD },
 | 
				
			||||||
    {  8,  8, BITMAP_SCANLINE_PAD },
 | 
					    {  8,  8, BITMAP_SCANLINE_PAD },
 | 
				
			||||||
    { 12, 16, BITMAP_SCANLINE_PAD },
 | 
					    { 12, 16, BITMAP_SCANLINE_PAD },
 | 
				
			||||||
 | 
					    { 15, 16, BITMAP_SCANLINE_PAD },
 | 
				
			||||||
 | 
					    { 16, 16, BITMAP_SCANLINE_PAD },
 | 
				
			||||||
    { 24, 32, BITMAP_SCANLINE_PAD }
 | 
					    { 24, 32, BITMAP_SCANLINE_PAD }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -575,4 +575,12 @@ extern PsElmPtr PsCreateFillElementList(PixmapPtr pix, int *nElms);
 | 
				
			||||||
extern PsElmPtr PsCloneFillElementList(int nElms, PsElmPtr elms);
 | 
					extern PsElmPtr PsCloneFillElementList(int nElms, PsElmPtr elms);
 | 
				
			||||||
extern void PsDestroyFillElementList(int nElms, PsElmPtr elms);
 | 
					extern void PsDestroyFillElementList(int nElms, PsElmPtr elms);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *  Functions in PsImageUtil.c
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern unsigned long
 | 
				
			||||||
 | 
					PsGetImagePixel(char *pImage, int depth, int w, int h, int leftPad, int format,
 | 
				
			||||||
 | 
					                int px, int py);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  /* _PS_H_ */
 | 
					#endif  /* _PS_H_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,6 +78,7 @@ in this Software without prior written authorization from The Open Group.
 | 
				
			||||||
#include "gcstruct.h"
 | 
					#include "gcstruct.h"
 | 
				
			||||||
#include "windowstr.h"
 | 
					#include "windowstr.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
					PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
           int w, int h, int leftPad, int format, int imageRes, char *pImage)
 | 
					           int w, int h, int leftPad, int format, int imageRes, char *pImage)
 | 
				
			||||||
| 
						 | 
					@ -113,7 +114,6 @@ PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    int          i, j;
 | 
					    int          i, j;
 | 
				
			||||||
    int          r, c;
 | 
					    int          r, c;
 | 
				
			||||||
    int          swap;
 | 
					 | 
				
			||||||
    char        *pt;
 | 
					    char        *pt;
 | 
				
			||||||
    PsOutPtr     psOut;
 | 
					    PsOutPtr     psOut;
 | 
				
			||||||
    ColormapPtr  cMap;
 | 
					    ColormapPtr  cMap;
 | 
				
			||||||
| 
						 | 
					@ -129,139 +129,66 @@ PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
	sh = (float)h * (float)pageRes / (float)imageRes + 0.5;
 | 
						sh = (float)h * (float)pageRes / (float)imageRes + 0.5;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
 | 
					    PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
 | 
				
			||||||
    pt = (char *)(&i); i = 1; if( pt[0]=='\001' ) swap = 1; else swap = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					    if( depth!=1 )
 | 
				
			||||||
    if( depth==30 )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      ErrorF("PsPutScaledImage: Not implemented yet for 30bit\m");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					 | 
				
			||||||
    if( depth==24 )
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      PsOut_BeginImage(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
					      PsOut_BeginImage(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
				
			||||||
      if( format==XYPixmap )
 | 
					
 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        int   rowsiz = PixmapBytePad(w, depth);
 | 
					 | 
				
			||||||
        char *planes[3];
 | 
					 | 
				
			||||||
        planes[0] = pImage;
 | 
					 | 
				
			||||||
        planes[1] = &pImage[rowsiz*h];
 | 
					 | 
				
			||||||
        planes[2] = &pImage[rowsiz*h*2];
 | 
					 | 
				
			||||||
        for( r=0 ; r<h ; r++ )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          char *pt[3];
 | 
					 | 
				
			||||||
          for( i=0 ; i<3 ;  i++ ) pt[i] = &planes[i][rowsiz*r];
 | 
					 | 
				
			||||||
          for( c=0 ; c<w ; c++ )
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            for( i=0 ; i<3 ; i++ )
 | 
					 | 
				
			||||||
              { PsOut_OutImageBytes(psOut, 1, &pt[i][c]); pt[i]++; }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else if( format==ZPixmap )
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        int  rowsiz = PixmapBytePad(w, depth);
 | 
					 | 
				
			||||||
        for( r=0 ; r<h ; r++ )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          char *pt = &pImage[rowsiz*r];
 | 
					 | 
				
			||||||
          for( c=0 ; c<w ; c++,pt+=4 )
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            if( swap )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              char tmp[4];
 | 
					 | 
				
			||||||
              tmp[0] = pt[3]; tmp[1] = pt[2]; tmp[2] = pt[1]; tmp[3] = pt[0];
 | 
					 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 3, &tmp[1]);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 3, &pt[1]);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else goto error;
 | 
					 | 
				
			||||||
      PsOut_EndImage(psOut);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					 | 
				
			||||||
    else if( (depth > 8) && (depth < 16) )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      int  rowsiz = PixmapBytePad(w, depth);
 | 
					 | 
				
			||||||
      PsOut_BeginImage(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
					 | 
				
			||||||
      for( r=0 ; r<h ; r++ )
 | 
					      for( r=0 ; r<h ; r++ )
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        short *pt = (short *)&pImage[rowsiz*r];
 | 
					        for( c=0 ; c<w ; c++ )
 | 
				
			||||||
        for( c=0 ; c<w ; c++,pt++ )
 | 
					 | 
				
			||||||
        {         
 | 
					        {         
 | 
				
			||||||
          PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFFFF);
 | 
					          unsigned long pv = PsGetImagePixel(pImage, depth, w, h, leftPad, format, c, r);
 | 
				
			||||||
 | 
					          PsOutColor clr = PsGetPixelColor(cMap, pv);
 | 
				
			||||||
          /* XXX: This needs to be fixed for endian swapping and to support
 | 
					          /* XXX: This needs to be fixed for endian swapping and to support
 | 
				
			||||||
           * depths deeper than 8bit per R-,G-,B-gun... */
 | 
					           * depths deeper than 8bit per R-,G-,B-gun... */
 | 
				
			||||||
          int        val = PSOUTCOLOR_TO_RGB24BIT(clr);
 | 
					          unsigned long val = PSOUTCOLOR_TO_RGB24BIT(clr);
 | 
				
			||||||
          char      *ipt = (char *)&val;
 | 
					          char      *ipt = (char *)&val;
 | 
				
			||||||
          if( swap )
 | 
					/* XXX: Is this the right way to detect the platform endianess ? */
 | 
				
			||||||
 | 
					#if IMAGE_BYTE_ORDER == LSBFirst
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            char tmp[4];
 | 
					            long l;
 | 
				
			||||||
            tmp[0] = ipt[3]; tmp[1] = ipt[2]; tmp[2] = ipt[1]; tmp[3] = ipt[0];
 | 
					            swapl(&val, l);
 | 
				
			||||||
            PsOut_OutImageBytes(psOut, 3, &tmp[1]);
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          else
 | 
					#elif IMAGE_BYTE_ORDER == MSBFirst
 | 
				
			||||||
            PsOut_OutImageBytes(psOut, 3, &ipt[1]);
 | 
					#else
 | 
				
			||||||
 | 
					#error Unsupported byte order
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					          PsOut_OutImageBytes(psOut, 3, &ipt[1]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      PsOut_EndImage(psOut);
 | 
					      PsOut_EndImage(psOut);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					    else
 | 
				
			||||||
    else if( depth==8 )
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      int  rowsiz = PixmapBytePad(w, depth);
 | 
					      int  rowsiz = BitmapBytePad(w);
 | 
				
			||||||
      PsOut_BeginImage(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
					      int  psrsiz = (w+7)/8;
 | 
				
			||||||
 | 
					      PsOut_BeginImage(psOut, PsGetPixelColor(cMap, pGC->bgPixel),
 | 
				
			||||||
 | 
					                       PsGetPixelColor(cMap, pGC->fgPixel),
 | 
				
			||||||
 | 
					                       x, y, w, h, sw, sh, 1);
 | 
				
			||||||
      for( r=0 ; r<h ; r++ )
 | 
					      for( r=0 ; r<h ; r++ )
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        char *pt = &pImage[rowsiz*r];
 | 
					        char *pt = &pImage[rowsiz*r];
 | 
				
			||||||
        for( c=0 ; c<w ; c++,pt++ )
 | 
					        for( i=0 ; i<psrsiz ; i++ )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFF);
 | 
					          int  iv_, iv = (int)pt[i]&0xFF;
 | 
				
			||||||
          int        val = PSOUTCOLOR_TO_RGB24BIT(clr);
 | 
					          char c;
 | 
				
			||||||
          char      *ipt = (char *)&val;
 | 
					/* XXX: Is this the right way to detect the platform endianess ? */
 | 
				
			||||||
          if( swap )
 | 
					#if IMAGE_BYTE_ORDER == LSBFirst
 | 
				
			||||||
          {
 | 
					          { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); }
 | 
				
			||||||
            char tmp[4];
 | 
					#elif IMAGE_BYTE_ORDER == MSBFirst
 | 
				
			||||||
            tmp[0] = ipt[3]; tmp[1] = ipt[2]; tmp[2] = ipt[1]; tmp[3] = ipt[0];
 | 
					          iv_ = iv;
 | 
				
			||||||
            PsOut_OutImageBytes(psOut, 3, &tmp[1]);
 | 
					#else
 | 
				
			||||||
          }
 | 
					#error Unsupported byte order
 | 
				
			||||||
          else
 | 
					#endif
 | 
				
			||||||
            PsOut_OutImageBytes(psOut, 3, &ipt[1]);
 | 
					          c = iv_;
 | 
				
			||||||
 | 
					          PsOut_OutImageBytes(psOut, 1, &c);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      PsOut_EndImage(psOut);
 | 
					      PsOut_EndImage(psOut);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if( depth==1 )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        int  rowsiz = BitmapBytePad(w);
 | 
					 | 
				
			||||||
        int  psrsiz = (w+7)/8;
 | 
					 | 
				
			||||||
        PsOut_BeginImage(psOut, PsGetPixelColor(cMap, pGC->bgPixel),
 | 
					 | 
				
			||||||
                         PsGetPixelColor(cMap, pGC->fgPixel),
 | 
					 | 
				
			||||||
			 x, y, w, h, sw, sh, 1);
 | 
					 | 
				
			||||||
        for( r=0 ; r<h ; r++ )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          char *pt = &pImage[rowsiz*r];
 | 
					 | 
				
			||||||
          for( i=0 ; i<psrsiz ; i++ )
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            int  iv_, iv = (int)pt[i]&0xFF;
 | 
					 | 
				
			||||||
            char c;
 | 
					 | 
				
			||||||
            if( swap )
 | 
					 | 
				
			||||||
              { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
              iv_ = iv;
 | 
					 | 
				
			||||||
            c = iv_;
 | 
					 | 
				
			||||||
            PsOut_OutImageBytes(psOut, 1, &c);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        PsOut_EndImage(psOut);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
  return;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -299,7 +226,6 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    int          i, j;
 | 
					    int          i, j;
 | 
				
			||||||
    int          r, c;
 | 
					    int          r, c;
 | 
				
			||||||
    int          swap;
 | 
					 | 
				
			||||||
    char        *pt;
 | 
					    char        *pt;
 | 
				
			||||||
    PsOutPtr     psOut;
 | 
					    PsOutPtr     psOut;
 | 
				
			||||||
    ColormapPtr  cMap;
 | 
					    ColormapPtr  cMap;
 | 
				
			||||||
| 
						 | 
					@ -318,7 +244,6 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
        sh = (float)h * (float)pageRes / (float)imageRes + 0.5;
 | 
					        sh = (float)h * (float)pageRes / (float)imageRes + 0.5;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
 | 
					    PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
 | 
				
			||||||
    pt = (char *)(&i); i = 1; if( pt[0]=='\001' ) swap = 1; else swap = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BM_CACHE
 | 
					#ifdef BM_CACHE
 | 
				
			||||||
    cache_id = PsBmIsImageCached(w, h, pImage);
 | 
					    cache_id = PsBmIsImageCached(w, h, pImage);
 | 
				
			||||||
| 
						 | 
					@ -332,135 +257,64 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      PsOut_BeginImageCache(psOut, cache_id);
 | 
					      PsOut_BeginImageCache(psOut, cache_id);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					      if( depth!=1 )
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        PsOut_BeginImageIM(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					 | 
				
			||||||
      if( depth==30 )
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        ErrorF("PsPutScaledImageIM: Not implemented yet for 30bit\m");
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					 | 
				
			||||||
      if( depth==24 )
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        PsOut_BeginImageIM(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
					 | 
				
			||||||
        if( format==XYPixmap )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          int   rowsiz = PixmapBytePad(w, depth);
 | 
					 | 
				
			||||||
          char *planes[3];
 | 
					 | 
				
			||||||
          planes[0] = pImage;
 | 
					 | 
				
			||||||
          planes[1] = &pImage[rowsiz*h];
 | 
					 | 
				
			||||||
          planes[2] = &pImage[rowsiz*h*2];
 | 
					 | 
				
			||||||
          for( r=0 ; r<h ; r++ )
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            char *pt[3];
 | 
					 | 
				
			||||||
            for( i=0 ; i<3 ;  i++ ) pt[i] = &planes[i][rowsiz*r];
 | 
					 | 
				
			||||||
            for( c=0 ; c<w ; c++ )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              for( i=0 ; i<3 ; i++ )
 | 
					 | 
				
			||||||
                { PsOut_OutImageBytes(psOut, 1, &pt[i][c]); pt[i]++; }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else if( format==ZPixmap )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          int  rowsiz = PixmapBytePad(w, depth);
 | 
					 | 
				
			||||||
          for( r=0 ; r<h ; r++ )
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            char *pt = &pImage[rowsiz*r];
 | 
					 | 
				
			||||||
            for( c=0 ; c<w ; c++,pt+=4 )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              if( swap )
 | 
					 | 
				
			||||||
              {
 | 
					 | 
				
			||||||
                char tmp[4];
 | 
					 | 
				
			||||||
                tmp[0] = pt[3]; tmp[1] = pt[2]; tmp[2] = pt[1]; tmp[3] = pt[0];
 | 
					 | 
				
			||||||
                PsOut_OutImageBytes(psOut, 3, &tmp[1]);
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
              else
 | 
					 | 
				
			||||||
                PsOut_OutImageBytes(psOut, 3, &pt[1]);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else goto error;
 | 
					 | 
				
			||||||
        PsOut_EndImage(psOut);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					 | 
				
			||||||
      else if( (depth > 8) && (depth < 16) )
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        int  rowsiz = PixmapBytePad(w, depth);
 | 
					 | 
				
			||||||
        PsOut_BeginImageIM(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
					 | 
				
			||||||
        for( r=0 ; r<h ; r++ )
 | 
					        for( r=0 ; r<h ; r++ )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          short *pt = (short *)&pImage[rowsiz*r];
 | 
					          for( c=0 ; c<w ; c++ )
 | 
				
			||||||
          for( c=0 ; c<w ; c++,pt++ )
 | 
					 | 
				
			||||||
          {         
 | 
					          {         
 | 
				
			||||||
            PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFFFF);
 | 
					            unsigned long pv = PsGetImagePixel(pImage, depth, w, h, leftPad, format, c, r);
 | 
				
			||||||
            int        val = PSOUTCOLOR_TO_RGB24BIT(clr);
 | 
					            PsOutColor clr = PsGetPixelColor(cMap, pv);
 | 
				
			||||||
 | 
					            /* XXX: This needs to be fixed for endian swapping and to support
 | 
				
			||||||
 | 
					             * depths deeper than 8bit per R-,G-,B-gun... */
 | 
				
			||||||
 | 
					            unsigned long val = PSOUTCOLOR_TO_RGB24BIT(clr);
 | 
				
			||||||
            char      *ipt = (char *)&val;
 | 
					            char      *ipt = (char *)&val;
 | 
				
			||||||
            if( swap )
 | 
					/* XXX: Is this the right way to detect the platform endianess ? */
 | 
				
			||||||
            {
 | 
					#if IMAGE_BYTE_ORDER == LSBFirst
 | 
				
			||||||
              char tmp[4];
 | 
					          {
 | 
				
			||||||
              tmp[0] = ipt[3]; tmp[1] = ipt[2]; tmp[2] = ipt[1]; tmp[3] = ipt[0];
 | 
					            long l;
 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 3, &tmp[1]);
 | 
					            swapl(&val, l);
 | 
				
			||||||
            }
 | 
					          }
 | 
				
			||||||
            else
 | 
					#elif IMAGE_BYTE_ORDER == MSBFirst
 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 3, &ipt[1]);
 | 
					#else
 | 
				
			||||||
 | 
					#error Unsupported byte order
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					            PsOut_OutImageBytes(psOut, 3, &ipt[1]);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        PsOut_EndImage(psOut);
 | 
					        PsOut_EndImage(psOut);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					      else
 | 
				
			||||||
      else if( depth==8 )
 | 
					 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        int  rowsiz = PixmapBytePad(w, depth);
 | 
					        int  rowsiz = BitmapBytePad(w);
 | 
				
			||||||
        PsOut_BeginImageIM(psOut, 0, 0, x, y, w, h, sw, sh, 3);
 | 
					        int  psrsiz = (w+7)/8;
 | 
				
			||||||
 | 
					        PsOut_BeginImageIM(psOut, PsGetPixelColor(cMap, pGC->bgPixel),
 | 
				
			||||||
 | 
					                           PsGetPixelColor(cMap, pGC->fgPixel),
 | 
				
			||||||
 | 
					                           x, y, w, h, sw, sh, 1);
 | 
				
			||||||
        for( r=0 ; r<h ; r++ )
 | 
					        for( r=0 ; r<h ; r++ )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          char *pt = &pImage[rowsiz*r];
 | 
					          char *pt = &pImage[rowsiz*r];
 | 
				
			||||||
          for( c=0 ; c<w ; c++,pt++ )
 | 
					          for( i=0 ; i<psrsiz ; i++ )
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFF);
 | 
					            int  iv_, iv = (int)pt[i]&0xFF;
 | 
				
			||||||
            /* XXX: This needs to be fixed for endian swapping and to support
 | 
					            char c;
 | 
				
			||||||
             * depths deeper than 8bit per R-,G-,B-gun... */
 | 
					/* XXX: Is this the right way to detect the platform endianess ? */
 | 
				
			||||||
            int        val = PSOUTCOLOR_TO_RGB24BIT(clr);
 | 
					#if IMAGE_BYTE_ORDER == LSBFirst
 | 
				
			||||||
            char      *ipt = (char *)&val;
 | 
					            { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); }
 | 
				
			||||||
            if( swap )
 | 
					#elif IMAGE_BYTE_ORDER == MSBFirst
 | 
				
			||||||
            {
 | 
					            iv_ = iv;
 | 
				
			||||||
              char tmp[4];
 | 
					#else
 | 
				
			||||||
              tmp[0] = ipt[3]; tmp[1] = ipt[2]; tmp[2] = ipt[1]; tmp[3] = ipt[0];
 | 
					#error Unsupported byte order
 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 3, &tmp[1]);
 | 
					#endif
 | 
				
			||||||
            }
 | 
					            c = iv_;
 | 
				
			||||||
            else
 | 
					            PsOut_OutImageBytes(psOut, 1, &c);
 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 3, &ipt[1]);
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        PsOut_EndImage(psOut);
 | 
					        PsOut_EndImage(psOut);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else if( depth==1 )
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          int  rowsiz = BitmapBytePad(w);
 | 
					 | 
				
			||||||
          int  psrsiz = (w+7)/8;
 | 
					 | 
				
			||||||
          PsOut_BeginImageIM(psOut, PsGetPixelColor(cMap, pGC->bgPixel),
 | 
					 | 
				
			||||||
                           PsGetPixelColor(cMap, pGC->fgPixel),
 | 
					 | 
				
			||||||
                           x, y, w, h, sw, sh, 1);
 | 
					 | 
				
			||||||
          for( r=0 ; r<h ; r++ )
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            char *pt = &pImage[rowsiz*r];
 | 
					 | 
				
			||||||
            for( i=0 ; i<psrsiz ; i++ )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              int  iv_, iv = (int)pt[i]&0xFF;
 | 
					 | 
				
			||||||
              char c;
 | 
					 | 
				
			||||||
              if( swap )
 | 
					 | 
				
			||||||
                { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); }
 | 
					 | 
				
			||||||
              else
 | 
					 | 
				
			||||||
                iv_ = iv;
 | 
					 | 
				
			||||||
              c = iv_;
 | 
					 | 
				
			||||||
              PsOut_OutImageBytes(psOut, 1, &c);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          PsOut_EndImage(psOut);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
#ifdef BM_CACHE
 | 
					#ifdef BM_CACHE
 | 
				
			||||||
      PsOut_EndImageCache(psOut);
 | 
					      PsOut_EndImageCache(psOut);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -468,8 +322,6 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
                           PsGetPixelColor(cMap, pGC->fgPixel));
 | 
					                           PsGetPixelColor(cMap, pGC->fgPixel));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
  return;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
PsPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
					PsPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,19 +151,22 @@ PsGetPixelColor(ColormapPtr cMap, int pixval)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        PsOutColor p = pixval;       
 | 
					        PsOutColor p = pixval;       
 | 
				
			||||||
        PsOutColor r, g, b;
 | 
					        PsOutColor r, g, b;
 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					 | 
				
			||||||
        int shift = 16 - v->bitsPerRGBValue;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        int shift =  8 - v->bitsPerRGBValue;
 | 
					 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        r = ((p & v->redMask)   >> v->offsetRed)   << shift;
 | 
					        r = (p & v->redMask)   >> v->offsetRed;
 | 
				
			||||||
        g = ((p & v->greenMask) >> v->offsetGreen) << shift;
 | 
					        g = (p & v->greenMask) >> v->offsetGreen;
 | 
				
			||||||
        b = ((p & v->blueMask)  >> v->offsetBlue)  << shift;
 | 
					        b = (p & v->blueMask)  >> v->offsetBlue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        r = cMap->red[r].co.local.red;
 | 
				
			||||||
 | 
					        g = cMap->green[g].co.local.green;
 | 
				
			||||||
 | 
					        b = cMap->blue[b].co.local.blue;
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					#ifdef PSOUT_USE_DEEPCOLOR
 | 
				
			||||||
        return((r<<32)|(g<<16)|b);
 | 
					        return((r<<32)|(g<<16)|b);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					        r >>= 8;
 | 
				
			||||||
 | 
					        g >>= 8;
 | 
				
			||||||
 | 
					        b >>= 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return((r<<16)|(g<<8)|b);
 | 
					        return((r<<16)|(g<<8)|b);
 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					#endif /* PSOUT_USE_DEEPCOLOR */
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,325 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* $Xorg: PsImageUtil.c,v 1.1 2005/03/25 1:19:56 gisburn Exp $ */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright (c) 2005 Roland Mainz <roland.mainz@nrubsig.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | 
				
			||||||
 | 
					IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
				
			||||||
 | 
					CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Except as contained in this notice, the names of the copyright holders shall
 | 
				
			||||||
 | 
					not be used in advertising or otherwise to promote the sale, use or other
 | 
				
			||||||
 | 
					dealings in this Software without prior written authorization from said
 | 
				
			||||||
 | 
					copyright holders.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Please do not beat me for this ugly code - most of it has been stolen from
 | 
				
			||||||
 | 
					 * xc/lib/X11/ImUtil.c */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gcstruct.h"
 | 
				
			||||||
 | 
					#include "windowstr.h"
 | 
				
			||||||
 | 
					#include "servermd.h"
 | 
				
			||||||
 | 
					#include "attributes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned char const _reverse_byte[0x100] = {
 | 
				
			||||||
 | 
					        0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
 | 
				
			||||||
 | 
					        0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
 | 
				
			||||||
 | 
					        0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
 | 
				
			||||||
 | 
					        0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
 | 
				
			||||||
 | 
					        0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
 | 
				
			||||||
 | 
					        0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
 | 
				
			||||||
 | 
					        0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
 | 
				
			||||||
 | 
					        0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
 | 
				
			||||||
 | 
					        0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
 | 
				
			||||||
 | 
					        0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
 | 
				
			||||||
 | 
					        0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
 | 
				
			||||||
 | 
					        0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
 | 
				
			||||||
 | 
					        0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
 | 
				
			||||||
 | 
					        0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
 | 
				
			||||||
 | 
					        0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
 | 
				
			||||||
 | 
					        0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
 | 
				
			||||||
 | 
					        0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
 | 
				
			||||||
 | 
					        0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
 | 
				
			||||||
 | 
					        0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
 | 
				
			||||||
 | 
					        0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
 | 
				
			||||||
 | 
					        0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
 | 
				
			||||||
 | 
					        0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
 | 
				
			||||||
 | 
					        0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
 | 
				
			||||||
 | 
					        0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
 | 
				
			||||||
 | 
					        0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
 | 
				
			||||||
 | 
					        0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
 | 
				
			||||||
 | 
					        0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
 | 
				
			||||||
 | 
					        0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
 | 
				
			||||||
 | 
					        0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
 | 
				
			||||||
 | 
					        0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
 | 
				
			||||||
 | 
					        0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
 | 
				
			||||||
 | 
					        0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					int XReverse_Bytes(
 | 
				
			||||||
 | 
					    register unsigned char *bpt,
 | 
				
			||||||
 | 
					    register int nb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        *bpt = _reverse_byte[*bpt];
 | 
				
			||||||
 | 
					        bpt++;
 | 
				
			||||||
 | 
					    } while (--nb > 0);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Data structure for "image" data, used by image manipulation routines.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    int width, height;          /* size of image */
 | 
				
			||||||
 | 
					    int xoffset;                /* number of pixels offset in X direction */
 | 
				
			||||||
 | 
					    int format;                 /* XYBitmap, XYPixmap, ZPixmap */
 | 
				
			||||||
 | 
					    char *data;                 /* pointer to image data */
 | 
				
			||||||
 | 
					    int byte_order;             /* data byte order, LSBFirst, MSBFirst */
 | 
				
			||||||
 | 
					    int bitmap_unit;            /* quant. of scanline 8, 16, 32 */
 | 
				
			||||||
 | 
					    int bitmap_bit_order;       /* LSBFirst, MSBFirst */
 | 
				
			||||||
 | 
					    int depth;                  /* depth of image */
 | 
				
			||||||
 | 
					    int bytes_per_line;         /* accelarator to next line */
 | 
				
			||||||
 | 
					    int bits_per_pixel;         /* bits per pixel (ZPixmap) */
 | 
				
			||||||
 | 
					} TmpImage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void xynormalizeimagebits (
 | 
				
			||||||
 | 
					    register unsigned char *bp,
 | 
				
			||||||
 | 
					    register TmpImage *img)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						register unsigned char c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (img->byte_order != img->bitmap_bit_order) {
 | 
				
			||||||
 | 
						    switch (img->bitmap_unit) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 16:
 | 
				
			||||||
 | 
							    c = *bp;
 | 
				
			||||||
 | 
							    *bp = *(bp + 1);
 | 
				
			||||||
 | 
							    *(bp + 1) = c;
 | 
				
			||||||
 | 
							    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 32:
 | 
				
			||||||
 | 
							    c = *(bp + 3);
 | 
				
			||||||
 | 
							    *(bp + 3) = *bp;
 | 
				
			||||||
 | 
							    *bp = c;
 | 
				
			||||||
 | 
							    c = *(bp + 2);
 | 
				
			||||||
 | 
							    *(bp + 2) = *(bp + 1);
 | 
				
			||||||
 | 
							    *(bp + 1) = c;
 | 
				
			||||||
 | 
							    break;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (img->bitmap_bit_order == MSBFirst)
 | 
				
			||||||
 | 
						    XReverse_Bytes (bp, img->bitmap_unit >> 3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void znormalizeimagebits (
 | 
				
			||||||
 | 
					    register unsigned char *bp,
 | 
				
			||||||
 | 
					    register TmpImage *img)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						register unsigned char c;
 | 
				
			||||||
 | 
						switch (img->bits_per_pixel) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    case 4:
 | 
				
			||||||
 | 
							*bp = ((*bp >> 4) & 0xF) | ((*bp << 4) & ~0xF);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    case 16:
 | 
				
			||||||
 | 
							c = *bp;
 | 
				
			||||||
 | 
							*bp = *(bp + 1);
 | 
				
			||||||
 | 
							*(bp + 1) = c;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    case 24:
 | 
				
			||||||
 | 
							c = *(bp + 2);
 | 
				
			||||||
 | 
							*(bp + 2) = *bp;
 | 
				
			||||||
 | 
							*bp = c;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    case 32:
 | 
				
			||||||
 | 
							c = *(bp + 3);
 | 
				
			||||||
 | 
							*(bp + 3) = *bp;
 | 
				
			||||||
 | 
							*bp = c;
 | 
				
			||||||
 | 
							c = *(bp + 2);
 | 
				
			||||||
 | 
							*(bp + 2) = *(bp + 1);
 | 
				
			||||||
 | 
							*(bp + 1) = c;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Macros
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * The ROUNDUP macro rounds up a quantity to the specified boundary,
 | 
				
			||||||
 | 
					 * then truncates to bytes.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The XYNORMALIZE macro determines whether XY format data requires 
 | 
				
			||||||
 | 
					 * normalization and calls a routine to do so if needed. The logic in
 | 
				
			||||||
 | 
					 * this module is designed for LSBFirst byte and bit order, so 
 | 
				
			||||||
 | 
					 * normalization is done as required to present the data in this order.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The ZNORMALIZE macro performs byte and nibble order normalization if 
 | 
				
			||||||
 | 
					 * required for Z format data.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The XYINDEX macro computes the index to the starting byte (char) boundary
 | 
				
			||||||
 | 
					 * for a bitmap_unit containing a pixel with coordinates x and y for image
 | 
				
			||||||
 | 
					 * data in XY format.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * The ZINDEX macro computes the index to the starting byte (char) boundary 
 | 
				
			||||||
 | 
					 * for a pixel with coordinates x and y for image data in ZPixmap format.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(Lynx) && defined(ROUNDUP)
 | 
				
			||||||
 | 
					#undef ROUNDUP
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define XYNORMALIZE(bp, img) \
 | 
				
			||||||
 | 
					    if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \
 | 
				
			||||||
 | 
						xynormalizeimagebits((unsigned char *)(bp), img)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ZNORMALIZE(bp, img) \
 | 
				
			||||||
 | 
					    if (img->byte_order == MSBFirst) \
 | 
				
			||||||
 | 
						znormalizeimagebits((unsigned char *)(bp), img)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define XYINDEX(x, y, img) \
 | 
				
			||||||
 | 
					    ((y) * img->bytes_per_line) + \
 | 
				
			||||||
 | 
					    (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \
 | 
				
			||||||
 | 
					    (((x) * img->bits_per_pixel) >> 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * GetPixel
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Returns the specified pixel.  The X and Y coordinates are relative to 
 | 
				
			||||||
 | 
					 * the origin (upper left [0,0]) of the image.  The pixel value is returned
 | 
				
			||||||
 | 
					 * in normalized format, i.e. the LSB of the long is the LSB of the pixel.
 | 
				
			||||||
 | 
					 * The algorithm used is:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	copy the source bitmap_unit or Zpixel into temp
 | 
				
			||||||
 | 
					 *	normalize temp if needed
 | 
				
			||||||
 | 
					 *	extract the pixel bits into return value
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned long const low_bits_table[] = {
 | 
				
			||||||
 | 
					    0x00000000, 0x00000001, 0x00000003, 0x00000007,
 | 
				
			||||||
 | 
					    0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
 | 
				
			||||||
 | 
					    0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
 | 
				
			||||||
 | 
					    0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
 | 
				
			||||||
 | 
					    0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
 | 
				
			||||||
 | 
					    0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
 | 
				
			||||||
 | 
					    0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
 | 
				
			||||||
 | 
					    0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
 | 
				
			||||||
 | 
					    0xffffffff
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned long XGetPixel (TmpImage *ximage, int x, int y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long pixel, px;
 | 
				
			||||||
 | 
						register char *src;
 | 
				
			||||||
 | 
						register char *dst;
 | 
				
			||||||
 | 
						register int i, j;
 | 
				
			||||||
 | 
						int bits, nbytes;
 | 
				
			||||||
 | 
						long plane;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
						if ((ximage->bits_per_pixel | ximage->depth) == 1) {
 | 
				
			||||||
 | 
							src = &ximage->data[XYINDEX(x, y, ximage)];
 | 
				
			||||||
 | 
							dst = (char *)&pixel;
 | 
				
			||||||
 | 
							pixel = 0;
 | 
				
			||||||
 | 
							for (i = ximage->bitmap_unit >> 3; --i >= 0; ) *dst++ = *src++;
 | 
				
			||||||
 | 
							XYNORMALIZE(&pixel, ximage);
 | 
				
			||||||
 | 
					          	bits = (x + ximage->xoffset) % ximage->bitmap_unit;
 | 
				
			||||||
 | 
							pixel = ((((char *)&pixel)[bits>>3])>>(bits&7)) & 1;
 | 
				
			||||||
 | 
						} else if (ximage->format == XYPixmap) {
 | 
				
			||||||
 | 
							pixel = 0;
 | 
				
			||||||
 | 
							plane = 0;
 | 
				
			||||||
 | 
							nbytes = ximage->bitmap_unit >> 3;
 | 
				
			||||||
 | 
							for (i = ximage->depth; --i >= 0; ) {
 | 
				
			||||||
 | 
							    src = &ximage->data[XYINDEX(x, y, ximage)+ plane];
 | 
				
			||||||
 | 
							    dst = (char *)&px;
 | 
				
			||||||
 | 
							    px = 0;
 | 
				
			||||||
 | 
							    for (j = nbytes; --j >= 0; ) *dst++ = *src++;
 | 
				
			||||||
 | 
							    XYNORMALIZE(&px, ximage);
 | 
				
			||||||
 | 
							    bits = (x + ximage->xoffset) % ximage->bitmap_unit;
 | 
				
			||||||
 | 
							    pixel = (pixel << 1) |
 | 
				
			||||||
 | 
								    (((((char *)&px)[bits>>3])>>(bits&7)) & 1);
 | 
				
			||||||
 | 
							    plane = plane + (ximage->bytes_per_line * ximage->height);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else if (ximage->format == ZPixmap) {
 | 
				
			||||||
 | 
							src = &ximage->data[ZINDEX(x, y, ximage)];
 | 
				
			||||||
 | 
							dst = (char *)&px;
 | 
				
			||||||
 | 
							px = 0;
 | 
				
			||||||
 | 
							for (i = (ximage->bits_per_pixel + 7) >> 3; --i >= 0; )
 | 
				
			||||||
 | 
							    *dst++ = *src++;		
 | 
				
			||||||
 | 
							ZNORMALIZE(&px, ximage);
 | 
				
			||||||
 | 
							pixel = 0;
 | 
				
			||||||
 | 
							for (i=sizeof(unsigned long); --i >= 0; )
 | 
				
			||||||
 | 
							    pixel = (pixel << 8) | ((unsigned char *)&px)[i];
 | 
				
			||||||
 | 
							if (ximage->bits_per_pixel == 4) {
 | 
				
			||||||
 | 
							    if (x & 1)
 | 
				
			||||||
 | 
								pixel >>= 4;
 | 
				
			||||||
 | 
							    else
 | 
				
			||||||
 | 
								pixel &= 0xf;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return 0; /* bad image */
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (ximage->bits_per_pixel == ximage->depth)
 | 
				
			||||||
 | 
						  return pixel;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  return (pixel & low_bits_table[ximage->depth]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned long
 | 
				
			||||||
 | 
					PsGetImagePixel(char *pImage, int depth, int w, int h, int leftPad, int format,
 | 
				
			||||||
 | 
					                int px, int py)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  TmpImage xi = {0};
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  xi.width            = w;
 | 
				
			||||||
 | 
					  xi.height           = h;
 | 
				
			||||||
 | 
					  xi.xoffset          = 0/*leftPad*/;
 | 
				
			||||||
 | 
					  xi.format           = format;
 | 
				
			||||||
 | 
					  xi.data             = pImage;
 | 
				
			||||||
 | 
					  xi.byte_order       = IMAGE_BYTE_ORDER;
 | 
				
			||||||
 | 
					  xi.bitmap_bit_order = BITMAP_BIT_ORDER;
 | 
				
			||||||
 | 
					  xi.bitmap_unit      = ((depth > 16)?(32):
 | 
				
			||||||
 | 
					                        ((depth >  8)?(16):
 | 
				
			||||||
 | 
					                        ((depth >  1)? (8):
 | 
				
			||||||
 | 
					                                  (1))));
 | 
				
			||||||
 | 
					  xi.depth            = depth;
 | 
				
			||||||
 | 
					  xi.bits_per_pixel   = xi.bitmap_unit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					   * compute per line accelerator.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  if (format == ZPixmap)
 | 
				
			||||||
 | 
					      xi.bytes_per_line = 
 | 
				
			||||||
 | 
					          ROUNDUP((xi.bits_per_pixel * xi.width), 32);
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					      xi.bytes_per_line =
 | 
				
			||||||
 | 
					          ROUNDUP((xi.width + xi.xoffset), 32); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return XGetPixel(&xi, px, py);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,12 +121,17 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
                    nv_1bit,  /* number of 8bit visuals */
 | 
					                    nv_1bit,  /* number of 8bit visuals */
 | 
				
			||||||
                    nv_8bit,  /* number of 8bit visuals */
 | 
					                    nv_8bit,  /* number of 8bit visuals */
 | 
				
			||||||
                    nv_12bit, /* number of 12bit visuals */
 | 
					                    nv_12bit, /* number of 12bit visuals */
 | 
				
			||||||
 | 
					                    nv_15bit, /* number of 15bit visuals */
 | 
				
			||||||
 | 
					                    nv_16bit, /* number of 16bit visuals */
 | 
				
			||||||
                    nv_24bit, /* number of 24bit visuals*/
 | 
					                    nv_24bit, /* number of 24bit visuals*/
 | 
				
			||||||
                    nv_30bit; /* number of 30bit visuals*/
 | 
					                    nv_30bit; /* number of 30bit visuals*/
 | 
				
			||||||
  int               nd;       /* number of depths */
 | 
					  int               nd;       /* number of depths */
 | 
				
			||||||
 | 
					  int               defaultVisualIndex = -1;
 | 
				
			||||||
  VisualID         *vids_1bit,
 | 
					  VisualID         *vids_1bit,
 | 
				
			||||||
                   *vids_8bit,
 | 
					                   *vids_8bit,
 | 
				
			||||||
                   *vids_12bit,
 | 
					                   *vids_12bit,
 | 
				
			||||||
 | 
					                   *vids_15bit,
 | 
				
			||||||
 | 
					                   *vids_16bit,
 | 
				
			||||||
                   *vids_24bit,
 | 
					                   *vids_24bit,
 | 
				
			||||||
                   *vids_30bit;
 | 
					                   *vids_30bit;
 | 
				
			||||||
  VisualPtr         visuals;
 | 
					  VisualPtr         visuals;
 | 
				
			||||||
| 
						 | 
					@ -187,15 +192,40 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
    /* Will BitmapToRegion make any difference at all? */
 | 
					    /* Will BitmapToRegion make any difference at all? */
 | 
				
			||||||
  pScreen->BitmapToRegion         = mfbPixmapToRegion;
 | 
					  pScreen->BitmapToRegion         = mfbPixmapToRegion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  visuals    = (VisualPtr) xalloc(8*sizeof(VisualRec));
 | 
					  visuals    = (VisualPtr) xalloc(16*sizeof(VisualRec));
 | 
				
			||||||
  depths     = (DepthPtr)  xalloc(8*sizeof(DepthRec));
 | 
					  depths     = (DepthPtr)  xalloc(16*sizeof(DepthRec));
 | 
				
			||||||
  vids_1bit  = (VisualID *)xalloc(8*sizeof(VisualID));
 | 
					  vids_1bit  = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
  vids_8bit  = (VisualID *)xalloc(8*sizeof(VisualID));
 | 
					  vids_8bit  = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
  vids_12bit = (VisualID *)xalloc(8*sizeof(VisualID));
 | 
					  vids_12bit = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
  vids_24bit = (VisualID *)xalloc(8*sizeof(VisualID));
 | 
					  vids_15bit = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
  vids_30bit = (VisualID *)xalloc(8*sizeof(VisualID));
 | 
					  vids_16bit = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
 | 
					  vids_24bit = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
 | 
					  vids_30bit = (VisualID *)xalloc(16*sizeof(VisualID));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  nv = nv_1bit = nv_8bit = nv_12bit = nv_24bit = nv_30bit = nd = 0;
 | 
					  nv = nv_1bit = nv_8bit = nv_12bit = nv_15bit = nv_16bit = nv_24bit = nv_30bit = nd = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PSOUT_USE_DEEPCOLOR
 | 
				
			||||||
 | 
					/* gisburn: 30bit TrueColor has been disabled for now since it causes problems
 | 
				
			||||||
 | 
					 * with GLX - see https://bugs.freedesktop.org/show_bug.cgi?id=2868 ("Mesa
 | 
				
			||||||
 | 
					 * seems to be unable to handle 30bit TrueColor visuals") for details... 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifdef DISABLED_FOR_NOW
 | 
				
			||||||
 | 
					  /* TrueColor, 30bit, 10bit per R-,G-,B-gun */
 | 
				
			||||||
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
 | 
					  visuals[nv].class           = TrueColor;
 | 
				
			||||||
 | 
					  visuals[nv].bitsPerRGBValue = 10;
 | 
				
			||||||
 | 
					  visuals[nv].ColormapEntries = 1024;
 | 
				
			||||||
 | 
					  visuals[nv].nplanes         = 30;
 | 
				
			||||||
 | 
					  visuals[nv].redMask         = 0X3FF00000;
 | 
				
			||||||
 | 
					  visuals[nv].greenMask       = 0X000FFC00;
 | 
				
			||||||
 | 
					  visuals[nv].blueMask        = 0X000003FF;
 | 
				
			||||||
 | 
					  visuals[nv].offsetRed       = 20;
 | 
				
			||||||
 | 
					  visuals[nv].offsetGreen     = 10;
 | 
				
			||||||
 | 
					  visuals[nv].offsetBlue      = 0;
 | 
				
			||||||
 | 
					  vids_30bit[nv_30bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					  nv++; nv_30bit++;
 | 
				
			||||||
 | 
					#endif /* DISABLED_FOR_NOW */
 | 
				
			||||||
 | 
					#endif /* PSOUT_USE_DEEPCOLOR */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* TrueColor, 24bit */
 | 
					  /* TrueColor, 24bit */
 | 
				
			||||||
  visuals[nv].vid             = FakeClientID(0);
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
| 
						 | 
					@ -212,6 +242,86 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
  vids_24bit[nv_24bit] = visuals[nv].vid;
 | 
					  vids_24bit[nv_24bit] = visuals[nv].vid;
 | 
				
			||||||
  nv++; nv_24bit++;
 | 
					  nv++; nv_24bit++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* TrueColor, 16bit */
 | 
				
			||||||
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
 | 
					  visuals[nv].class           = TrueColor;
 | 
				
			||||||
 | 
					  visuals[nv].bitsPerRGBValue = 6;
 | 
				
			||||||
 | 
					  visuals[nv].ColormapEntries = 64;
 | 
				
			||||||
 | 
					  visuals[nv].nplanes         = 16;
 | 
				
			||||||
 | 
					  visuals[nv].redMask         = 0x0000f800;
 | 
				
			||||||
 | 
					  visuals[nv].greenMask       = 0x000007e0;
 | 
				
			||||||
 | 
					  visuals[nv].blueMask        = 0x0000001f;
 | 
				
			||||||
 | 
					  visuals[nv].offsetRed       = 11;
 | 
				
			||||||
 | 
					  visuals[nv].offsetGreen     = 5;
 | 
				
			||||||
 | 
					  visuals[nv].offsetBlue      = 0;
 | 
				
			||||||
 | 
					  vids_16bit[nv_16bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					  nv++; nv_16bit++;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					#ifdef PSOUT_USE_DEEPCOLOR
 | 
				
			||||||
 | 
					  /* PostScript Level 2 and above, colors can have 12 bits per component
 | 
				
			||||||
 | 
					   * (36 bit for RGB) */
 | 
				
			||||||
 | 
					  /* PseudoColor, 15bit */
 | 
				
			||||||
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
 | 
					  visuals[nv].class           = PseudoColor;
 | 
				
			||||||
 | 
					  visuals[nv].bitsPerRGBValue = 12;
 | 
				
			||||||
 | 
					  visuals[nv].ColormapEntries = 32768;
 | 
				
			||||||
 | 
					  visuals[nv].nplanes         = 15;
 | 
				
			||||||
 | 
					  visuals[nv].redMask         = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].greenMask       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].blueMask        = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetRed       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetGreen     = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetBlue      = 0x0;
 | 
				
			||||||
 | 
					  vids_15bit[nv_15bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					  nv++; nv_15bit++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* PseudoColor, 12bit */
 | 
				
			||||||
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
 | 
					  visuals[nv].class           = PseudoColor;
 | 
				
			||||||
 | 
					  visuals[nv].bitsPerRGBValue = 12;
 | 
				
			||||||
 | 
					  visuals[nv].ColormapEntries = 4096;
 | 
				
			||||||
 | 
					  visuals[nv].nplanes         = 12;
 | 
				
			||||||
 | 
					  visuals[nv].redMask         = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].greenMask       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].blueMask        = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetRed       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetGreen     = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetBlue      = 0x0;
 | 
				
			||||||
 | 
					  vids_12bit[nv_12bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					  defaultVisualIndex = nv;
 | 
				
			||||||
 | 
					  nv++; nv_12bit++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* GrayScale, 12bit, 12bit per R-,G-,B-gun */
 | 
				
			||||||
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
 | 
					  visuals[nv].class           = GrayScale;
 | 
				
			||||||
 | 
					  visuals[nv].bitsPerRGBValue = 12;
 | 
				
			||||||
 | 
					  visuals[nv].ColormapEntries = 4096;
 | 
				
			||||||
 | 
					  visuals[nv].nplanes         = 12;
 | 
				
			||||||
 | 
					  visuals[nv].redMask         = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].greenMask       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].blueMask        = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetRed       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetGreen     = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetBlue      = 0x0;
 | 
				
			||||||
 | 
					  vids_12bit[nv_12bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					  nv++; nv_12bit++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* StaticGray, 12bit, 12bit per R-,G-,B-gun */
 | 
				
			||||||
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
 | 
					  visuals[nv].class           = StaticGray;
 | 
				
			||||||
 | 
					  visuals[nv].bitsPerRGBValue = 12;
 | 
				
			||||||
 | 
					  visuals[nv].ColormapEntries = 4096;
 | 
				
			||||||
 | 
					  visuals[nv].nplanes         = 12;
 | 
				
			||||||
 | 
					  visuals[nv].redMask         = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].greenMask       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].blueMask        = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetRed       = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetGreen     = 0x0;
 | 
				
			||||||
 | 
					  visuals[nv].offsetBlue      = 0x0;
 | 
				
			||||||
 | 
					  vids_12bit[nv_12bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					  nv++; nv_12bit++;
 | 
				
			||||||
 | 
					#endif /* PSOUT_USE_DEEPCOLOR */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* PseudoColor, 8bit */
 | 
					  /* PseudoColor, 8bit */
 | 
				
			||||||
  visuals[nv].vid             = FakeClientID(0);
 | 
					  visuals[nv].vid             = FakeClientID(0);
 | 
				
			||||||
  visuals[nv].class           = PseudoColor;
 | 
					  visuals[nv].class           = PseudoColor;
 | 
				
			||||||
| 
						 | 
					@ -225,6 +335,9 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
  visuals[nv].offsetGreen     = 0x0;
 | 
					  visuals[nv].offsetGreen     = 0x0;
 | 
				
			||||||
  visuals[nv].offsetBlue      = 0x0;
 | 
					  visuals[nv].offsetBlue      = 0x0;
 | 
				
			||||||
  vids_8bit[nv_8bit] = visuals[nv].vid;
 | 
					  vids_8bit[nv_8bit] = visuals[nv].vid;
 | 
				
			||||||
 | 
					#ifndef PSOUT_USE_DEEPCOLOR
 | 
				
			||||||
 | 
					  defaultVisualIndex = nv;
 | 
				
			||||||
 | 
					#endif /* !PSOUT_USE_DEEPCOLOR */
 | 
				
			||||||
  nv++; nv_8bit++;
 | 
					  nv++; nv_8bit++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* GrayScale, 8bit */
 | 
					  /* GrayScale, 8bit */
 | 
				
			||||||
| 
						 | 
					@ -272,56 +385,6 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
  vids_1bit[nv_1bit] = visuals[nv].vid;
 | 
					  vids_1bit[nv_1bit] = visuals[nv].vid;
 | 
				
			||||||
  nv++; nv_1bit++;
 | 
					  nv++; nv_1bit++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					 | 
				
			||||||
  /* TrueColor, 30bit, 10bit per R-,G-,B-gun */
 | 
					 | 
				
			||||||
  visuals[nv].vid             = FakeClientID(0);
 | 
					 | 
				
			||||||
  visuals[nv].class           = TrueColor;
 | 
					 | 
				
			||||||
  visuals[nv].bitsPerRGBValue = 10;
 | 
					 | 
				
			||||||
  visuals[nv].ColormapEntries = 1024;
 | 
					 | 
				
			||||||
  visuals[nv].nplanes         = 30;
 | 
					 | 
				
			||||||
  visuals[nv].redMask         = 0X3FF00000;
 | 
					 | 
				
			||||||
  visuals[nv].greenMask       = 0X000FFC00;
 | 
					 | 
				
			||||||
  visuals[nv].blueMask        = 0X000003FF;
 | 
					 | 
				
			||||||
  visuals[nv].offsetRed       = 20;
 | 
					 | 
				
			||||||
  visuals[nv].offsetGreen     = 10;
 | 
					 | 
				
			||||||
  visuals[nv].offsetBlue      = 0;
 | 
					 | 
				
			||||||
  vids_30bit[nv_30bit] = visuals[nv].vid;
 | 
					 | 
				
			||||||
  nv++; nv_30bit++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* PostScript Level 2 and above, colors can have 12 bits per component
 | 
					 | 
				
			||||||
   * (36 bit for RGB) */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* GrayScale, 12bit, 12bit per R-,G-,B-gun */
 | 
					 | 
				
			||||||
  visuals[nv].vid             = FakeClientID(0);
 | 
					 | 
				
			||||||
  visuals[nv].class           = GrayScale;
 | 
					 | 
				
			||||||
  visuals[nv].bitsPerRGBValue = 12;
 | 
					 | 
				
			||||||
  visuals[nv].ColormapEntries = 4096;
 | 
					 | 
				
			||||||
  visuals[nv].nplanes         = 12;
 | 
					 | 
				
			||||||
  visuals[nv].redMask         = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].greenMask       = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].blueMask        = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].offsetRed       = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].offsetGreen     = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].offsetBlue      = 0x0;
 | 
					 | 
				
			||||||
  vids_12bit[nv_12bit] = visuals[nv].vid;
 | 
					 | 
				
			||||||
  nv++; nv_12bit++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* StaticGray, 12bit, 12bit per R-,G-,B-gun */
 | 
					 | 
				
			||||||
  visuals[nv].vid             = FakeClientID(0);
 | 
					 | 
				
			||||||
  visuals[nv].class           = StaticGray;
 | 
					 | 
				
			||||||
  visuals[nv].bitsPerRGBValue = 12;
 | 
					 | 
				
			||||||
  visuals[nv].ColormapEntries = 4096;
 | 
					 | 
				
			||||||
  visuals[nv].nplanes         = 12;
 | 
					 | 
				
			||||||
  visuals[nv].redMask         = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].greenMask       = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].blueMask        = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].offsetRed       = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].offsetGreen     = 0x0;
 | 
					 | 
				
			||||||
  visuals[nv].offsetBlue      = 0x0;
 | 
					 | 
				
			||||||
  vids_12bit[nv_12bit] = visuals[nv].vid;
 | 
					 | 
				
			||||||
  nv++; nv_12bit++;
 | 
					 | 
				
			||||||
#endif /* PSOUT_USE_DEEPCOLOR */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if( nv_30bit > 0 )
 | 
					  if( nv_30bit > 0 )
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    depths[nd].depth   = 30;
 | 
					    depths[nd].depth   = 30;
 | 
				
			||||||
| 
						 | 
					@ -338,6 +401,22 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
    nd++;
 | 
					    nd++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( nv_16bit > 0 )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    depths[nd].depth   = 16;
 | 
				
			||||||
 | 
					    depths[nd].numVids = nv_16bit;
 | 
				
			||||||
 | 
					    depths[nd].vids    = vids_16bit;
 | 
				
			||||||
 | 
					    nd++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( nv_15bit > 0 )
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    depths[nd].depth   = 15;
 | 
				
			||||||
 | 
					    depths[nd].numVids = nv_15bit;
 | 
				
			||||||
 | 
					    depths[nd].vids    = vids_15bit;
 | 
				
			||||||
 | 
					    nd++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  if( nv_12bit > 0 )
 | 
					  if( nv_12bit > 0 )
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    depths[nd].depth   = 12;
 | 
					    depths[nd].depth   = 12;
 | 
				
			||||||
| 
						 | 
					@ -362,9 +441,9 @@ InitializePsDriver(ndx, pScreen, argc, argv)
 | 
				
			||||||
    nd++;
 | 
					    nd++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Defaul visual is 8bit PseudoColor */
 | 
					  /* Defaul visual is 12bit PseudoColor */
 | 
				
			||||||
  defaultVisual = visuals[1].vid;
 | 
					  defaultVisual = visuals[defaultVisualIndex].vid;
 | 
				
			||||||
  rootDepth = visuals[1].nplanes;
 | 
					  rootDepth = visuals[defaultVisualIndex].nplanes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef GLXEXT
 | 
					#ifdef GLXEXT
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,8 +153,28 @@ typedef enum PsFTDownloadFontType_
 | 
				
			||||||
  PsFontType3
 | 
					  PsFontType3
 | 
				
			||||||
} PsFTDownloadFontType;
 | 
					} PsFTDownloadFontType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Define |PsOutColor| color type which can hold one RGB value
 | 
				
			||||||
 | 
					 * (note: this needs to be |signed| long/long long to represent
 | 
				
			||||||
 | 
					 * special values such as |PSOUTCOLOR_NOCOLOR|)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
#ifdef PSOUT_USE_DEEPCOLOR
 | 
					#ifdef PSOUT_USE_DEEPCOLOR
 | 
				
			||||||
typedef long long PsOutColor;
 | 
					/* 64bit |PsOutColor| which can hold 16bit R-,G-,B-values */
 | 
				
			||||||
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
					typedef signed __int64    PsOutColor;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					# if defined(__alpha__) || defined(__alpha) || \
 | 
				
			||||||
 | 
					     defined(ia64) || defined(__ia64__) || \
 | 
				
			||||||
 | 
					     defined(__sparc64__) || defined(_LP64) || \
 | 
				
			||||||
 | 
					     defined(__s390x__) || \
 | 
				
			||||||
 | 
					     defined(amd64) || defined (__amd64__) || \
 | 
				
			||||||
 | 
					     defined (__powerpc64__) || \
 | 
				
			||||||
 | 
					     (defined(sgi) && (_MIPS_SZLONG == 64))
 | 
				
			||||||
 | 
					typedef signed long       PsOutColor;
 | 
				
			||||||
 | 
					# else
 | 
				
			||||||
 | 
					typedef signed long long  PsOutColor;
 | 
				
			||||||
 | 
					# endif /* native 64bit platform */
 | 
				
			||||||
 | 
					#endif /* WIN32 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PSOUTCOLOR_TO_REDBITS(clr)    ((clr) >> 32)
 | 
					#define PSOUTCOLOR_TO_REDBITS(clr)    ((clr) >> 32)
 | 
				
			||||||
#define PSOUTCOLOR_TO_GREENBITS(clr)  (((clr) >> 16) & 0xFFFF)
 | 
					#define PSOUTCOLOR_TO_GREENBITS(clr)  (((clr) >> 16) & 0xFFFF)
 | 
				
			||||||
#define PSOUTCOLOR_TO_BLUEBITS(clr)   ((clr) & 0xFFFF)
 | 
					#define PSOUTCOLOR_TO_BLUEBITS(clr)   ((clr) & 0xFFFF)
 | 
				
			||||||
| 
						 | 
					@ -165,7 +185,8 @@ typedef long long PsOutColor;
 | 
				
			||||||
                                       ((PSOUTCOLOR_TO_GREENBITS(clr) >> 8) << 8)  | \
 | 
					                                       ((PSOUTCOLOR_TO_GREENBITS(clr) >> 8) << 8)  | \
 | 
				
			||||||
                                       ((PSOUTCOLOR_TO_BLUEBITS(clr)  >> 8) << 0))
 | 
					                                       ((PSOUTCOLOR_TO_BLUEBITS(clr)  >> 8) << 0))
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
typedef long PsOutColor;
 | 
					/* 32bit |PsOutColor| which can hold 8bit R-,G-,B-values */
 | 
				
			||||||
 | 
					typedef signed long PsOutColor;
 | 
				
			||||||
#define PSOUTCOLOR_TO_REDBITS(clr)    ((clr) >> 16)
 | 
					#define PSOUTCOLOR_TO_REDBITS(clr)    ((clr) >> 16)
 | 
				
			||||||
#define PSOUTCOLOR_TO_GREENBITS(clr)  (((clr) >> 8) & 0xFF)
 | 
					#define PSOUTCOLOR_TO_GREENBITS(clr)  (((clr) >> 8) & 0xFF)
 | 
				
			||||||
#define PSOUTCOLOR_TO_BLUEBITS(clr)   ((clr) & 0xFF)
 | 
					#define PSOUTCOLOR_TO_BLUEBITS(clr)   ((clr) & 0xFF)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue