home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xibm.zip / mpel / mpelXmorg.c < prev   
C/C++ Source or Header  |  1991-09-17  |  5KB  |  183 lines

  1. /*
  2.  * Copyright IBM Corporation 1987,1988,1989
  3.  *
  4.  * All Rights Reserved
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for any purpose and without fee is hereby granted,
  8.  * provided that the above copyright notice appear in all copies and that 
  9.  * both that copyright notice and this permission notice appear in
  10.  * supporting documentation, and that the name of IBM not be
  11.  * used in advertising or publicity pertaining to distribution of the
  12.  * software without specific, written prior permission.
  13.  *
  14.  * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  15.  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  16.  * IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  17.  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  18.  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  19.  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  20.  * SOFTWARE.
  21.  *
  22.  */
  23. /* $Header: /andrew/X11/R3src/tape/server/ddx/ibm/mpel/RCS/mpelXmorg.c,v 6.1 88/10/25 01:56:32 kbg Exp $ */
  24. /* $Source: /andrew/X11/R3src/tape/server/ddx/ibm/mpel/RCS/mpelXmorg.c,v $ */
  25.  
  26. #ifndef lint
  27. static char *rcsid = "$Id: mpelXmorg.c,v 6.1 88/10/25 01:56:32 kbg Exp $";
  28. #endif
  29.  
  30. #include "misc.h"
  31. #include "dixfontstr.h"
  32.  
  33. static unsigned char endmask[] = 
  34.     { 0xff,
  35.       0x80,
  36.       0xc0,
  37.       0xe0,
  38.       0xf0,
  39.       0xf8,
  40.       0xfc,
  41.       0xfe };
  42.  
  43.     /*
  44.      * Transmogrify: To change or alter greatly and often with
  45.      *    grotesque or humorous effect.
  46.      * (Websters Ninth New Collegiate Dictionary)
  47.      */
  48.  
  49. void
  50. mpelTransmogrify(w, h, src, dst)
  51.     int     w,h;
  52.     unsigned char *src;
  53.     unsigned short int *dst;
  54. {
  55.     unsigned char c, *ptr;
  56.     unsigned short int shrt, shrt2;
  57.     int i, width4, height4, hmod4, row, col, maskindex;
  58.     int    srcWidthBytes, glphWidthBytes;
  59.  
  60.     width4 = ((w+3)>>2) ;
  61.     height4 = ((h+3)>>2) ;
  62.     glphWidthBytes= ((w)+7)>>3;
  63.     srcWidthBytes= PADGLYPHWIDTHBYTES(w);
  64.  
  65.     if (maskindex = (w&0x7))
  66.     {
  67.     ptr = src + glphWidthBytes - 1;
  68.     for (i=0; i<h; i++)
  69.         {
  70.         c = *ptr & endmask[maskindex];
  71.         *ptr = c;
  72.         ptr += srcWidthBytes;
  73.         }
  74.     }
  75.  
  76.     if (width4 & 0x01)
  77.     /* ODD */
  78.     {
  79.     row = height4-1;
  80.     if (hmod4 = (h%4))
  81.         {
  82.         /* BOTTOM ROW */
  83.         for (col = 0; col<width4-1; col+=2)
  84.             {
  85.             ptr = src + (4*row)*srcWidthBytes + col/2;
  86.             shrt = shrt2 = 0;
  87.             for (i=0; i< hmod4; i++)
  88.                 {
  89.                 shrt  |= (((unsigned short)((*ptr) & 0xf0)) 
  90.                         << (8-(i*4))) ;
  91.                 shrt2 |= (((unsigned short)((*ptr) & 0x0f)) 
  92.                         << (12-(i*4))) ;
  93.                 ptr += srcWidthBytes;
  94.                 }
  95.             *dst++ = shrt;
  96.             *dst++ = shrt2;
  97.             }
  98.         ptr = src + (4*row)*srcWidthBytes + col/2;
  99.         shrt = 0;
  100.         for(i=0; i<hmod4; i++)
  101.             {
  102.             shrt  |= (((*ptr) & 0xf0) << (8-(i*4))) ;
  103.             ptr += srcWidthBytes;
  104.             }
  105.         *dst++ = shrt;
  106.         row--;
  107.         }
  108.  
  109.     for (; row >=0; row-- )
  110.         {
  111.         for (col = 0; col < ( width4 - 1) ; col+=2)
  112.             {
  113.             ptr = src + (4*row)*srcWidthBytes + col/2;
  114.             shrt  = ((*ptr) & 0xf0) << 8 ;
  115.             shrt2 = ((*ptr) & 0x0f) << 12 ;
  116.             ptr += srcWidthBytes;
  117.             shrt  |= ((*ptr) & 0xf0) << 4 ;
  118.             shrt2 |= ((*ptr) & 0x0f) << 8 ;
  119.             ptr += srcWidthBytes;
  120.             shrt  |= ((*ptr) & 0xf0) << 0 ;
  121.             shrt2 |= ((*ptr) & 0x0f) << 4 ;
  122.             ptr += srcWidthBytes;
  123.             shrt  |= ((*ptr) & 0xf0) >> 4 ;
  124.             shrt2 |= ((*ptr) & 0x0f)      ;
  125.             *dst++ = shrt;
  126.             *dst++ = shrt2;
  127.             }
  128.         shrt = 0;
  129.         ptr = src + (4*row)*srcWidthBytes + col/2;
  130.         shrt   = ((*ptr) & 0xf0) << 8 ;
  131.         ptr += srcWidthBytes;
  132.         shrt  |= ((*ptr) & 0xf0) << 4 ;
  133.         ptr += srcWidthBytes;
  134.         shrt  |= ((*ptr) & 0xf0) << 0 ;
  135.         ptr += srcWidthBytes;
  136.         shrt  |= ((*ptr) & 0xf0) >> 4 ;
  137.         *dst++ = shrt;
  138.         }
  139.     }
  140.    else /* EVEN */
  141.     {
  142.     row = height4-1;
  143.     if (hmod4 = (h%4))
  144.         {
  145.         /* BOTTOM ROW */
  146.         for (col = 0; col<width4; col+=2)
  147.             {
  148.             ptr = src + (4*row)*srcWidthBytes + col/2;
  149.             shrt = shrt2 = 0;
  150.             for (i=0; i< hmod4; i++)
  151.                 {
  152.                 shrt  |= (((*ptr) & 0xf0) << (8-(i*4))) ;
  153.                 shrt2 |= (((*ptr) & 0x0f) << (12-(i*4))) ;
  154.                 ptr += srcWidthBytes;
  155.                 }
  156.             *dst++ = shrt;
  157.             *dst++ = shrt2;
  158.             }
  159.         row--;
  160.         }
  161.  
  162.     for (; row >=0; row-- )
  163.         for (col = 0; col<width4; col+=2)
  164.             {
  165.             ptr = src + (4*row)*srcWidthBytes + col/2;
  166.             shrt  = ((*ptr) & 0xf0) << 8 ;
  167.             shrt2 = ((*ptr) & 0x0f) << 12 ;
  168.             ptr += srcWidthBytes;
  169.             shrt  |= ((*ptr) & 0xf0) << 4 ;
  170.             shrt2 |= ((*ptr) & 0x0f) << 8 ;
  171.             ptr += srcWidthBytes;
  172.             shrt  |= ((*ptr) & 0xf0) << 0 ;
  173.             shrt2 |= ((*ptr) & 0x0f) << 4 ;
  174.             ptr += srcWidthBytes;
  175.             shrt  |= ((*ptr) & 0xf0) >> 4 ;
  176.             shrt2 |= ((*ptr) & 0x0f)      ;
  177.             *dst++ = shrt;
  178.             *dst++ = shrt2;
  179.             }
  180.     }
  181.     return ;
  182. }
  183.