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,112 +129,38 @@ 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++ ) |       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( c=0 ; c<w ; c++ ) | ||||||
|         {          |         {          | ||||||
|             for( i=0 ; i<3 ; i++ ) |           unsigned long pv = PsGetImagePixel(pImage, depth, w, h, leftPad, format, c, r); | ||||||
|               { PsOut_OutImageBytes(psOut, 1, &pt[i][c]); pt[i]++; } |           PsOutColor clr = PsGetPixelColor(cMap, pv); | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       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++ ) |  | ||||||
|       { |  | ||||||
|         short *pt = (short *)&pImage[rowsiz*r]; |  | ||||||
|         for( c=0 ; c<w ; c++,pt++ ) |  | ||||||
|         { |  | ||||||
|           PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFFFF); |  | ||||||
|           /* 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 | ||||||
|  | #else | ||||||
|  | #error Unsupported byte order | ||||||
|  | #endif | ||||||
|           PsOut_OutImageBytes(psOut, 3, &ipt[1]); |           PsOut_OutImageBytes(psOut, 3, &ipt[1]); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  | 
 | ||||||
|       PsOut_EndImage(psOut); |       PsOut_EndImage(psOut); | ||||||
|     } |     } | ||||||
| #endif /* PSOUT_USE_DEEPCOLOR */ |  | ||||||
|     else if( depth==8 ) |  | ||||||
|     { |  | ||||||
|       int  rowsiz = PixmapBytePad(w, depth); |  | ||||||
|       PsOut_BeginImage(psOut, 0, 0, x, y, w, h, sw, sh, 3); |  | ||||||
|       for( r=0 ; r<h ; r++ ) |  | ||||||
|       { |  | ||||||
|         char *pt = &pImage[rowsiz*r]; |  | ||||||
|         for( c=0 ; c<w ; c++,pt++ ) |  | ||||||
|         { |  | ||||||
|           PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFF); |  | ||||||
|           int        val = PSOUTCOLOR_TO_RGB24BIT(clr); |  | ||||||
|           char      *ipt = (char *)&val; |  | ||||||
|           if( swap ) |  | ||||||
|           { |  | ||||||
|             char tmp[4]; |  | ||||||
|             tmp[0] = ipt[3]; tmp[1] = ipt[2]; tmp[2] = ipt[1]; tmp[3] = ipt[0]; |  | ||||||
|             PsOut_OutImageBytes(psOut, 3, &tmp[1]); |  | ||||||
|           } |  | ||||||
|     else |     else | ||||||
|             PsOut_OutImageBytes(psOut, 3, &ipt[1]); |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       PsOut_EndImage(psOut); |  | ||||||
|     } |  | ||||||
|     else if( depth==1 ) |  | ||||||
|     { |  | ||||||
|     { |     { | ||||||
|       int  rowsiz = BitmapBytePad(w); |       int  rowsiz = BitmapBytePad(w); | ||||||
|       int  psrsiz = (w+7)/8; |       int  psrsiz = (w+7)/8; | ||||||
|  | @ -248,10 +174,14 @@ PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, | ||||||
|         { |         { | ||||||
|           int  iv_, iv = (int)pt[i]&0xFF; |           int  iv_, iv = (int)pt[i]&0xFF; | ||||||
|           char c; |           char c; | ||||||
|             if( swap ) | /* XXX: Is this the right way to detect the platform endianess ? */ | ||||||
|  | #if IMAGE_BYTE_ORDER == LSBFirst | ||||||
|           { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); } |           { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); } | ||||||
|             else | #elif IMAGE_BYTE_ORDER == MSBFirst | ||||||
|           iv_ = iv; |           iv_ = iv; | ||||||
|  | #else | ||||||
|  | #error Unsupported byte order | ||||||
|  | #endif | ||||||
|           c = iv_; |           c = iv_; | ||||||
|           PsOut_OutImageBytes(psOut, 1, &c); |           PsOut_OutImageBytes(psOut, 1, &c); | ||||||
|         } |         } | ||||||
|  | @ -259,9 +189,6 @@ PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, | ||||||
|       PsOut_EndImage(psOut); |       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,111 +257,37 @@ 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 ) | ||||||
| #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); |         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++ ) |         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( c=0 ; c<w ; c++ ) | ||||||
|           {          |           {          | ||||||
|               for( i=0 ; i<3 ; i++ ) |             unsigned long pv = PsGetImagePixel(pImage, depth, w, h, leftPad, format, c, r); | ||||||
|                 { PsOut_OutImageBytes(psOut, 1, &pt[i][c]); pt[i]++; } |             PsOutColor clr = PsGetPixelColor(cMap, pv); | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         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++ ) |  | ||||||
|         { |  | ||||||
|           short *pt = (short *)&pImage[rowsiz*r]; |  | ||||||
|           for( c=0 ; c<w ; c++,pt++ ) |  | ||||||
|           { |  | ||||||
|             PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFFFF); |  | ||||||
|             int        val = PSOUTCOLOR_TO_RGB24BIT(clr); |  | ||||||
|             char      *ipt = (char *)&val; |  | ||||||
|             if( swap ) |  | ||||||
|             { |  | ||||||
|               char tmp[4]; |  | ||||||
|               tmp[0] = ipt[3]; tmp[1] = ipt[2]; tmp[2] = ipt[1]; tmp[3] = ipt[0]; |  | ||||||
|               PsOut_OutImageBytes(psOut, 3, &tmp[1]); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|               PsOut_OutImageBytes(psOut, 3, &ipt[1]); |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         PsOut_EndImage(psOut); |  | ||||||
|       } |  | ||||||
| #endif /* PSOUT_USE_DEEPCOLOR */ |  | ||||||
|       else if( depth==8 ) |  | ||||||
|       { |  | ||||||
|         int  rowsiz = PixmapBytePad(w, depth); |  | ||||||
|         PsOut_BeginImageIM(psOut, 0, 0, x, y, w, h, sw, sh, 3); |  | ||||||
|         for( r=0 ; r<h ; r++ ) |  | ||||||
|         { |  | ||||||
|           char *pt = &pImage[rowsiz*r]; |  | ||||||
|           for( c=0 ; c<w ; c++,pt++ ) |  | ||||||
|           { |  | ||||||
|             PsOutColor clr = PsGetPixelColor(cMap, (int)(*pt)&0xFF); |  | ||||||
|             /* 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 | ||||||
|  | #else | ||||||
|  | #error Unsupported byte order | ||||||
|  | #endif | ||||||
|             PsOut_OutImageBytes(psOut, 3, &ipt[1]); |             PsOut_OutImageBytes(psOut, 3, &ipt[1]); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|         PsOut_EndImage(psOut); |         PsOut_EndImage(psOut); | ||||||
|       } |       } | ||||||
|       else if( depth==1 ) |       else | ||||||
|       { |  | ||||||
|       { |       { | ||||||
|         int  rowsiz = BitmapBytePad(w); |         int  rowsiz = BitmapBytePad(w); | ||||||
|         int  psrsiz = (w+7)/8; |         int  psrsiz = (w+7)/8; | ||||||
|  | @ -450,17 +301,20 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, | ||||||
|           { |           { | ||||||
|             int  iv_, iv = (int)pt[i]&0xFF; |             int  iv_, iv = (int)pt[i]&0xFF; | ||||||
|             char c; |             char c; | ||||||
|               if( swap ) | /* XXX: Is this the right way to detect the platform endianess ? */ | ||||||
|  | #if IMAGE_BYTE_ORDER == LSBFirst | ||||||
|             { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); } |             { for( j=0,iv_=0 ; j<8 ; j++ ) iv_ |= (((iv>>j)&1)<<(7-j)); } | ||||||
|               else | #elif IMAGE_BYTE_ORDER == MSBFirst | ||||||
|             iv_ = iv; |             iv_ = iv; | ||||||
|  | #else | ||||||
|  | #error Unsupported byte order | ||||||
|  | #endif | ||||||
|             c = iv_; |             c = iv_; | ||||||
|             PsOut_OutImageBytes(psOut, 1, &c); |             PsOut_OutImageBytes(psOut, 1, &c); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|         PsOut_EndImage(psOut); |         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