[comp.windows.x] converting icons

deke@valhalla.ee.rochester.edu (05/12/89)

I've just started to use X (X11R3) on SUN workstations.  Previously I had
been using 'suntools' and had fiddled with NeWS and X a bit.

I'd like to be able to use some of the classier icons I've collected and
had been using with suntools.  As a first pass, I just pulled out the
sunview icon header, put in my notion of a reasonable X icon header, and 
used 'bitmap' to display the icon image.  It looked almost right... but 
not quite.  It was as though each of the objects were mirror imaged, but
were correctly placed relative to eachother.  Additionally, some of the
borders seemed out of place.

Here is the sunview version
    /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
     */
	  [bitmap here]

And here is what I replaced it with for X
	#define Notes_width 64
	#define Notes_height 64
	static short Notes_bits[] = {
	  [bitmap here]
	}

Now for the question:  Is there a known way to do whatever bitmap translation
is necessary here?  Have I missed the obvious?

Thanks in advance

^Deke Kassabian,  deke@ee.rochester.edu  or  ...!rochester!ur-valhalla!deke
	University of Rochester, Department of Electrical Engineering
	      Work: +1 716-275-3106    Home: +1 716-328-5676

mikeo@sae.UUCP (Mike Ovington Overhead) (05/12/89)

Take a look at contrib/clients/pbm of the X11R3 distribution. It contains
a set of routines for converting to and from a portable bitmap format
developed by Jef Poskanzer. You can convert the Sun icon to the portable
bitmap and then from the portable bitmap to X11 bitmap format.
It supports a number of other formats as well (macpaint, GIF, Sun raster etc.)
It also contains a number of utilities for manipulating bitmaps as well.
(Cut and Paste, inverting, flipping). I've found it very useful.

   Michael S. Ovington
   Software Architecture & Engineering
   1600 Wilson Boulavard, Suite 500
   Arlington, VA 22209
   (703) 276-7910

d87-jse@nada.kth.se (Joakim Sernbrant) (05/12/89)

In article <2194@valhalla.ee.rochester.edu> deke@ee.rochester.edu (Dikran Kassabian) writes:
>
>I'd like to be able to use some of the classier icons I've collected and
>had been using with suntools.  As a first pass, I just pulled out the
>sunview icon header, put in my notion of a reasonable X icon header, and 
>used 'bitmap' to display the icon image.  It looked almost right... but 
>not quite.  It was as though each of the objects were mirror imaged, but
>were correctly placed relative to eachother.  Additionally, some of the
>borders seemed out of place.
>

The problem is that the bits are stored from left to right in one
format and right to left in the other (can't remember which) ...

Here is a quick hack I did to convert bitmaps from Sun to X (use
it any way you like) :

--------- CUT HERE ----------

/*

  s u n t o x b m . c

  Convert Sun icons to X bitmaps.

  usage: suntoxbm < file.icon > file.xbm

*/

#include <ctype.h>

main(argc, argv)
int argc;
char **argv;
{
  char c, s[100], *name = argv[1];
  int w, h, x, n;
  
  scanf("%*s%*s%*[^=]%*c%d%*[^=]%*c%d%*s%*s%*s%*s", &w, &h);

  printf("#define %s_width %d\n", name, w);
  printf("#define %s_height %d\n", name, w);
  printf("static char %s_bits[] = {\n");

  n = 0;
  printf("  ");
  while ((c = getchar()) != -1) {
    if (c == 'x') {
      x = gethex();
      if (n == 12 ) { printf(",\n  "); n = 0; }
      else if (n) printf(", ");
      printf("0x%02x, ", reverse((x & 0xff00) >> 8));
      printf("0x%02x", reverse(x & 0xff));
      n += 2;
    }
  }
  printf("};\n");
}


int reverse(x)
int x;
{
  int i, y = 0;
  for (i = 0; i < 8; i++) {
    y <<= 1;
    y |= ((x & 1) == 1);
    x >>= 1;
  }
  return y;
}


int gethex()
{
  int i, c, x = 0;

  for (i=0; i < 4; i++) {
    x <<= 4;
    c = getchar();
    if (isupper(c)) c = tolower(c);
    if (c >= 'a') x += c - 'a' + 10;
    else x += c - '0';
  }
  return x;
}

-- 
--  Joakim Sernbrant, Royal Institute of Technology, Stockholm, Sweden
--  Internet:  d87-jse@nada.kth.se
--

envbvs@epb2.lbl.gov (Brian V. Smith) (05/12/89)

In article <1014@draken.nada.kth.se>, d87-jse@nada.kth.se (Joakim Sernbrant) writes:
> In article <2194@valhalla.ee.rochester.edu> deke@ee.rochester.edu (Dikran Kassabian) writes:
> >
> >I'd like to be able to use some of the classier icons I've collected and
> >had been using with suntools.  As a first pass, I just pulled out the
> >sunview icon header, put in my notion of a reasonable X icon header, and 
> >used 'bitmap' to display the icon image.  It looked almost right... but 
> >not quite.  It was as though each of the objects were mirror imaged, but
> >were correctly placed relative to eachother.  Additionally, some of the
> >borders seemed out of place.
> >
> 
> The problem is that the bits are stored from left to right in one
> format and right to left in the other (can't remember which) ...
> 
> Here is a quick hack I did to convert bitmaps from Sun to X (use
> it any way you like) :
> 
   [program follows]

Instead of the reverse() procedure provided, here is a much faster way
to reverse bits in a byte:

unsigned char   reverse_byte[256] = {
                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
};

Just use the array values.  e.g. reverse(x) = reverse_byte[x];
_____________________________________
Brian V. Smith    (bvsmith@lbl.gov)
Lawrence Berkeley Laboratory
We don't need no signatures!

jef@ace.ee.lbl.gov (Jef Poskanzer) (05/13/89)

In the referenced message, d87-jse@nada.kth.se (Joakim Sernbrant) wrote:
}In article <2194@valhalla.ee.rochester.edu> deke@ee.rochester.edu (Dikran Kassabian) writes:
}>[how to convert icons to X bitmaps?]
}  s u n t o x b m . c

About three years ago an equivalent program became the nucleus of the
PBM package when I split it into the icontopbm and pbmtoxbm programs
that you can now find in your X source tree.
---
Jef

            Jef Poskanzer   jef@helios.ee.lbl.gov   ...well!pokey
                  Substantial penalty for early withdrawal.