dboles@ccwf.cc.utexas.edu (David Boles) (05/15/91)
Can anyone tell me the format of the files that end in '.rgb'? The data files are at the least used by the roam and zoom demos that came with the machine. Thanks, David Boles -- ------------------------------------------------------------------------------- David Boles Applied Research Laboratories dboles@ccwf.cc.utexas.edu apas611@chpc.utexas.edu This space for rent, apply within. -------------------------------------------------------------------------------
" ratcliffe) (05/15/91)
In article <49003@ut-emx.uucp> dboles@ccwf.cc.utexas.edu (David Boles) writes: >Can anyone tell me the format of the files that end in '.rgb'? >The data files are at the least used by the roam and zoom demos >that came with the machine. > >Thanks, David Boles >------------------------------------------------------------------------------- >David Boles Applied Research Laboratories >dboles@ccwf.cc.utexas.edu >apas611@chpc.utexas.edu This space for rent, apply within. >------------------------------------------------------------------------------- Subject: Re: RGB image format. follows is a piecemeal, *relatively* inadequate description about the "SGI imagelib image" format which is the same as those files possessing the .rgb suffix on their tails. in addition to the below, study the contents of the IMAGE structure in /usr/include/gl/image.h. it defines all the elements that are contained in the header part of an SGI image file. /usr/people/4Dgifts/iristools/libimage contains the source for the basic image file manipulation routines (open/read/write/close an image). it is important to re-emphasize what is stated below which is that as of SGI's next major SW release, IRIX 4.0, there will be a new image library, /usr/lib/libil.a which will contain a superset of libimage.a's functionality. it's default image file format will be tiff and it will be able to do everything with our current SGI imagelib image file format files that libimage.a currently does. in time, libimage.a will be phased-out and the much more powerful and 100% supported libil.a will be *the* standard SGI image library. this is important to understand for those people who may otherwise be trying to gain a major understanding of the way libimage.a was written. in time, libimage.a will be obsoleted by libil.a > are SGI format image files rgb run length encoded, or raw data? the default is always run length encoded. if they want the data to be raw, they can use iristools/imgtools/verbatim which will convert the image so that it is not stored with any compression (the way run length encoding does). > and how does one write information out in the header block? so below i am including the image library document, "libimage.a: Using The IRIS Image Library" (print it using "lp filename"--it's already been baked using "psroff -ms"--all it needs now is to be LP(1)'d to a PostScript printer)--quoting from the 2nd paragraph: iopen() Opens an image file for reading or writing and returns a pointer to IMAGE in the same style as the UNIX standard i/o library. so you see, the users are perhaps thinking that they are wanting/needing to know something that normally, they wudn't ever consider being pertinent. when they open a text file for writing do they REALLY want to know how the "information" gets written out? i doubt it... but.... since you asked, here's the dope (looking at iristools/libimage/open.c): below we see that all iopen does is to call, imgopen [A], which in turn allocates enuff memory for a local IMAGE structure[B], the read-write (rw) flag gets set to either true or false based on whether or not (mode[1] == '+') [C], if rw is true, the thing exits as read/write mode isn't supported [D], then if mode *is* for writing, CREAT(2) a new file to write the image data out to[E], and then populate elements of the local image structure w/the data passed in to iopen[F], and write out the contents of image to this newly opened file making sure that the size of image is exactly the size in bytes of what was written out[G]. then set image->flags with on of several FILE _flag values as defined in stdio.h[H], then, if the image is to be run length encoded populate the definitions in image pertinent to the inner workings of RLE-type data representation[I], then initialize some final image element values (gawd and sapoa only knows what these are for...)[J], set the pointer into this file to point to where the image data is to begin being placed[K]--i'm guessing about this statement--what about it sapoa, what does "512L" translate into in bytes?, and is this in fact the constant size of the header for any given image file? then, finally return the address of this image structure for use by that which called iopen() in the first place[L]. IMAGE *iopen(file, mode, type, dim, xsize, ysize, zsize) char *file; register char *mode; unsigned int type, dim, xsize, ysize, zsize; { [A] return(imgopen(0, file, mode, type, dim, xsize, ysize, zsize)); } IMAGE *imgopen(f, file, mode, type, dim, xsize, ysize, zsize) char *file; int f; register char *mode; unsigned int type, dim, xsize, ysize, zsize; { register IMAGE *image; register rw; int tablesize; register int i, max; [B] image = (IMAGE*)calloc(1,sizeof(IMAGE)); [C] rw = mode[1] == '+'; [D] if(rw) { i_errhdlr("iopen: read/write mode not supported\n"); return NULL; } [E] if (*mode=='w') { \ if (file) { \ f = creat(file, 0666); \ if (rw && f>=0) { \ close(f); \ f = open(file, 2); \ } \ } | if (f < 0) { | i_errhdlr("iopen: can't open output file %s\n",file); [E] return NULL; } [F] image->imagic = IMAGIC; | image->type = type; | image->xsize = xsize; | image->ysize = 1; | image->zsize = 1; | if (dim>1) | image->ysize = ysize; | if (dim>2) | image->zsize = zsize; | if(image->zsize == 1) { | image->dim = 2; | if(image->ysize == 1) | image->dim = 1; | } else { | image->dim = 3; | } | image->min = 10000000; | image->max = 0; | isetname(image,"no name"); | image->wastebytes = 0; [F] image->dorev = 0; [G] if (write(f,image,sizeof(IMAGE)) != sizeof(IMAGE)) { i_errhdlr("iopen: error on write of image header\n"); return NULL; } } else { ......... } [H] if (rw) | image->flags = _IORW; | else if (*mode != 'r') | image->flags = _IOWRT; | else [H] image->flags = _IOREAD; [I] if(ISRLE(image->type)) { | tablesize = image->ysize*image->zsize*sizeof(long); | image->rowstart = (unsigned long *)malloc(tablesize); | image->rowsize = (long *)malloc(tablesize); | if( image->rowstart == 0 || image->rowsize == 0 ) { | i_errhdlr("iopen: error on table alloc\n"); | return NULL; | } | image->rleend = 512L+2*tablesize; | if (*mode=='w') { | max = image->ysize*image->zsize; | for(i=0; i<max; i++) { | image->rowstart[i] = 0; | image->rowsize[i] = -1; | } | } else { | tablesize = image->ysize*image->zsize*sizeof(long); | lseek(f, 512L, 0); | if (read(f,image->rowstart,tablesize) != tablesize) { | i_errhdlr("iopen: error on read of rowstart\n"); | return NULL; | } | if(image->dorev) | cvtlongs(image->rowstart,tablesize); | if (read(f,image->rowsize,tablesize) != tablesize) { | i_errhdlr("iopen: error on read of rowsize\n"); | return NULL; | } | if(image->dorev) | cvtlongs(image->rowsize,tablesize); [I] } } [J] image->cnt = 0; | image->ptr = 0; | image->base = 0; | if( (image->tmpbuf = ibufalloc(image)) == 0 ) { | i_errhdlr("iopen: error on tmpbuf alloc %d\n",image->xsize); | return NULL; | } | image->x = image->y = image->z = 0; | image->file = f; [J] image->offset = 512L; /* set up for img_optseek */ [K] lseek(image->file, 512L, 0); [L] return(image); > Is there even > the teeniest, weeniest chance you could > possibly write something up that we could > fax to them, turn into a Pipeline article, > and later put into documentation? how about we start w/making the article (below) be something that get's put into the next pipeline? NOTE: there is a VERY IMPORTANT caveat in all this interest in SGI image file format: as of IRIX 4.0, the new image library, libil.a, will exist in fact even though it will not be 100% finished. this *will* become and be *the* current SGI image file format standard. libimage.a (iopen(), etc) will be phased out and libil.a will come to occupy the standard position as SGI's image file format. custs/users meticulously need to be aware of this coming reality before they get very lost inside of libimage.a's image file format/way of doing/defining things.... all you need to do with the below file is "lp filename" it to a PostScript printer. --------------------CUT HERE:___imglib.lp___:CUT HERE------------------------ %!PS-Adobe-1.0 %%Creator: ratmandu:dave (dave "who can do? ratmandu!" ratcliffe) %%Title: stdin (ditroff) %%CreationDate: Wed May 15 07:26:01 1991 %%EndComments % Start of psdit.pro -- prolog for ditroff translator % Copyright (c) 1985,1987 Adobe Systems Incorporated. All Rights Reserved. % GOVERNMENT END USERS: See Notice file in TranScript library directory % -- probably /usr/lib/ps/Notice % RCS: $Header: /cypress/att/usr/src/apps/trscript/lib/RCS/psdit.pro,v 1.3 89/04/26 19:34:25 wiltse Exp $ /$DITroff 140 dict def $DITroff begin /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def /xi {0 72 11 mul translate 72 resolution div dup neg scale 0 0 moveto /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def F /pagesave save def}def /PB{save /psv exch def currentpoint translate resolution 72 div dup neg scale 0 0 moveto}def /PE{psv restore}def /m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def /tan{dup sin exch cos div}bind def /point{resolution 72 div mul}bind def /dround {transform round exch round exch itransform}bind def /xT{/devname exch def}def /xr{/mh exch def /my exch def /resolution exch def}def /xp{}def /xs{docsave restore end}def /xt{}def /xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not {fonts slotno fontname findfont put fontnames slotno fontname put}if}def /xH{/fontheight exch def F}bind def /xS{/fontslant exch def F}bind def /s{/fontsize exch def /fontheight fontsize def F}bind def /f{/fontnum exch def F}bind def /F{fontheight 0 le {/fontheight fontsize def}if fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if makefont setfont .04 fontsize point mul 0 dround pop setlinewidth}bind def /X{exch currentpoint exch pop moveto show}bind def /N{3 1 roll moveto show}bind def /Y{exch currentpoint pop exch moveto show}bind def /S /show load def /ditpush{}def/ditpop{}def /AX{3 -1 roll currentpoint exch pop moveto 0 exch ashow}bind def /AN{4 2 roll moveto 0 exch ashow}bind def /AY{3 -1 roll currentpoint pop exch moveto 0 exch ashow}bind def /AS{0 exch ashow}bind def /MX{currentpoint exch pop moveto}bind def /MY{currentpoint pop exch moveto}bind def /MXY /moveto load def /cb{pop}def % action on unknown char -- nothing for now /n{}def/w{}def /p{pop showpage pagesave restore /pagesave save def}def /abspoint{currentpoint exch pop add exch currentpoint pop add exch}def /dstroke{currentpoint stroke moveto}bind def /Dl{2 copy gsave rlineto stroke grestore rmoveto}bind def /arcellipse{oldmat currentmatrix pop currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def rad 0 rad -180 180 arc oldmat setmatrix}def /Dc{gsave dup /diamv exch def /diamh exch def arcellipse dstroke grestore diamh 0 rmoveto}def /De{gsave /diamv exch def /diamh exch def arcellipse dstroke grestore diamh 0 rmoveto}def /Da{currentpoint /by exch def /bx exch def /fy exch def /fx exch def /cy exch def /cx exch def /rad cx cx mul cy cy mul add sqrt def /ang1 cy neg cx neg atan def /ang2 fy fx atan def cx bx add cy by add 2 copy rad ang1 ang2 arcn stroke exch fx add exch fy add moveto}def /Barray 200 array def % 200 values in a wiggle /D~{mark}def /D~~{counttomark Barray exch 0 exch getinterval astore /Bcontrol exch def pop /Blen Bcontrol length def Blen 4 ge Blen 2 mod 0 eq and {Bcontrol 0 get Bcontrol 1 get abspoint /Ycont exch def /Xcont exch def Bcontrol 0 2 copy get 2 mul put Bcontrol 1 2 copy get 2 mul put Bcontrol Blen 2 sub 2 copy get 2 mul put Bcontrol Blen 1 sub 2 copy get 2 mul put /Ybi /Xbi currentpoint 3 1 roll def def 0 2 Blen 4 sub {/i exch def Bcontrol i get 3 div Bcontrol i 1 add get 3 div Bcontrol i get 3 mul Bcontrol i 2 add get add 6 div Bcontrol i 1 add get 3 mul Bcontrol i 3 add get add 6 div /Xbi Xcont Bcontrol i 2 add get 2 div add def /Ybi Ycont Bcontrol i 3 add get 2 div add def /Xcont Xcont Bcontrol i 2 add get add def /Ycont Ycont Bcontrol i 3 add get add def Xbi currentpoint pop sub Ybi currentpoint exch pop sub rcurveto }for dstroke}if}def end /ditstart{$DITroff begin /nfonts 60 def % NFONTS makedev/ditroff dependent! /fonts[nfonts{0}repeat]def /fontnames[nfonts{()}repeat]def /docsave save def }def % character outcalls /oc {/pswid exch def /cc exch def /name exch def /ditwid pswid fontsize mul resolution mul 72000 div def /ditsiz fontsize resolution mul 72 div def ocprocs name known{ocprocs name get exec}{name cb} ifelse}def /fractm [.65 0 0 .6 0 0] def /fraction {/fden exch def /fnum exch def gsave /cf currentfont def cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto fnum show rmoveto currentfont cf setfont(\244)show setfont fden show grestore ditwid 0 rmoveto} def /oce {grestore ditwid 0 rmoveto}def /dm {ditsiz mul}def /ocprocs 50 dict def ocprocs begin (14){(1)(4)fraction}def (12){(1)(2)fraction}def (34){(3)(4)fraction}def (13){(1)(3)fraction}def (23){(2)(3)fraction}def (18){(1)(8)fraction}def (38){(3)(8)fraction}def (58){(5)(8)fraction}def (78){(7)(8)fraction}def (sr){gsave .05 dm .16 dm rmoveto(\326)show oce}def (is){gsave 0 .15 dm rmoveto(\362)show oce}def (->){gsave 0 .02 dm rmoveto(\256)show oce}def (<-){gsave 0 .02 dm rmoveto(\254)show oce}def (==){gsave 0 .05 dm rmoveto(\272)show oce}def end % DIThacks fonts for some special chars 50 dict dup begin /FontType 3 def /FontName /DIThacks def /FontMatrix [.001 0.0 0.0 .001 0.0 0.0] def /FontBBox [-220 -280 900 900] def% a lie but ... /Encoding 256 array def 0 1 255{Encoding exch /.notdef put}for Encoding dup 8#040/space put %space dup 8#110/rc put %right ceil dup 8#111/lt put %left top curl dup 8#112/bv put %bold vert dup 8#113/lk put %left mid curl dup 8#114/lb put %left bot curl dup 8#115/rt put %right top curl dup 8#116/rk put %right mid curl dup 8#117/rb put %right bot curl dup 8#120/rf put %right floor dup 8#121/lf put %left floor dup 8#122/lc put %left ceil dup 8#140/sq put %square dup 8#141/bx put %box dup 8#142/ci put %circle dup 8#143/br put %box rule dup 8#144/rn put %root extender dup 8#145/vr put %vertical rule dup 8#146/ob put %outline bullet dup 8#147/bu put %bullet dup 8#150/ru put %rule dup 8#151/ul put %underline pop /DITfd 100 dict def /BuildChar{0 begin /cc exch def /fd exch def /charname fd /Encoding get cc get def /charwid fd /Metrics get charname get def /charproc fd /CharProcs get charname get def charwid 0 fd /FontBBox get aload pop setcachedevice 40 setlinewidth newpath 0 0 moveto gsave charproc grestore end}def /BuildChar load 0 DITfd put %/UniqueID 5 def /CharProcs 50 dict def CharProcs begin /space{}def /.notdef{}def /ru{500 0 rls}def /rn{0 750 moveto 500 0 rls}def /vr{20 800 moveto 0 -770 rls}def /bv{20 800 moveto 0 -1000 rls}def /br{20 770 moveto 0 -1040 rls}def /ul{0 -250 moveto 500 0 rls}def /ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def /bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def /sq{80 0 rmoveto currentpoint dround newpath moveto 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def /bx{80 0 rmoveto currentpoint dround newpath moveto 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def /ci{355 333 rmoveto currentpoint newpath 333 0 360 arc 50 setlinewidth stroke}def /lt{20 -200 moveto 0 550 rlineto currx 800 2cx s4 add exch s4 a4p stroke}def /lb{20 800 moveto 0 -550 rlineto currx -200 2cx s4 add exch s4 a4p stroke}def /rt{20 -200 moveto 0 550 rlineto currx 800 2cx s4 sub exch s4 a4p stroke}def /rb{20 800 moveto 0 -500 rlineto currx -200 2cx s4 sub exch s4 a4p stroke}def /lk{20 800 moveto 20 300 -280 300 s4 arcto pop pop 1000 sub currentpoint stroke moveto 20 300 4 2 roll s4 a4p 20 -200 lineto stroke}def /rk{20 800 moveto 20 300 320 300 s4 arcto pop pop 1000 sub currentpoint stroke moveto 20 300 4 2 roll s4 a4p 20 -200 lineto stroke}def /lf{20 800 moveto 0 -1000 rlineto s4 0 rls}def /rf{20 800 moveto 0 -1000 rlineto s4 neg 0 rls}def /lc{20 -200 moveto 0 1000 rlineto s4 0 rls}def /rc{20 -200 moveto 0 1000 rlineto s4 neg 0 rls}def end /Metrics 50 dict def Metrics begin /.notdef 0 def /space 500 def /ru 500 def /br 0 def /lt 250 def /lb 250 def /rt 250 def /rb 250 def /lk 250 def /rk 250 def /rc 250 def /lc 250 def /rf 250 def /lf 250 def /bv 250 def /ob 350 def /bu 350 def /ci 750 def /bx 750 def /sq 750 def /rn 500 def /ul 500 def /vr 0 def end DITfd begin /s2 500 def /s4 250 def /s3 333 def /a4p{arcto pop pop pop pop}def /2cx{2 copy exch}def /rls{rlineto stroke}def /currx{currentpoint pop}def /dround{transform round exch round exch itransform} def end end /DIThacks exch definefont pop ditstart (psc)xT 576 1 1 xr 1(Times-Roman)xf 1 f 2(Times-Italic)xf 2 f 3(Times-Bold)xf 3 f 4(Times-BoldItalic)xf 4 f 5(Helvetica)xf 5 f 6(Helvetica-Bold)xf 6 f 7(Courier)xf 7 f 8(Courier-Bold)xf 8 f 9(Symbol)xf 9 f 10(DIThacks)xf 10 f 10 s 1 f xi %%EndProlog %%Page: 1 1 10 s 0 xH 0 xS 1 f 12 s 10 s 32(--)Y 4323(--)X 3 f 12 s 1429 688(libimage.a:)N 1910(Using)X 2168(The)X 2352(IRIS)X 2572(Image)X 2852(Library)X 1 f 10 s 776 908(IRIS)N 947(image)X 1163(\256les)X 1316(are)X 1435(used)X 1602(to)X 1684(store)X 1860(1)X 1920(2)X 1980(and)X 2116(3)X 2177(dimensional)X 2589(arrays)X 2807(of)X 2895(pixel)X 3076(values)X 3302(that)X 3443(contain)X 3700(either)X 3904(1)X 3965(or)X 576 1004(2)N 639(bytes)X 831(per)X 957(pixel.)X 1180(Pixel)X 1367(values)X 1595(are)X 1717(signed)X 1949(integers)X 2226(that)X 2369(cover)X 2571(the)X 2692(range)X 2894(0..255)X 3116(or)X 3205(-32768..32767)X 3694(\(i.e.)X 3841(1)X 3903(or)X 3992(2)X 576 1100(bytes\).)N 845(Image)X 1079(\256les)X 1245(are)X 1377(currently)X 1700(used)X 1880(to)X 1975(store)X 2164(rgb)X 2304(screen)X 2543(dumps,)X 2809(black)X 3016(and)X 3165(white)X 3376(images,)X 3656(color)X 3854(index)X 576 1196(images,)N 846(as)X 935(well)X 1095(as)X 1184(colormaps.)X 1580(To)X 1691(use)X 1820(the)X 1940(image)X 2158(library,)X 2414(put)X 2538(the)X 2658(token)X 2858(-limage)X 3125(on)X 3227(the)X 3347(compile)X 3627(line)X 3769(for)X 3885(your)X 576 1292(program.)N 913(Also,)X 1109(be)X 1210(sure)X 1369(to)X 1456(include)X 1717(image.h)X 1998(from)X 2179(/usr/include/gl)X 2666(in)X 2753(any)X 2894(source)X 3129(\256les)X 3287(that)X 3432(use)X 3564(these)X 3754(routines.)X 576 1388(The)N 721(following)X 1052(routines)X 1330(provide)X 1595(a)X 1651(procedural)X 2015(interface)X 2317(to)X 2399(image)X 2615(\256les:)X 3 f 576 1676(Opening)N 888(and)X 1036(Closing)X 1313(an)X 1417(Image)X 1651(File)X 8 f 864 1820(IMAGE)N 1152(*iopen\(file,)X 1776(mode)X 2016([,)X 2160(type,)X 2448(dim,)X 2688(xsize,)X 3024(ysize,)X 3360(zsize]\))X 864 1916(char)N 1104(*file;)X 864 2012(register)N 1296(char)X 1536(*mode;)X 864 2108(unsigned)N 1296(int)X 1488(type,)X 1776(dim,)X 2016(xsize,)X 2352(ysize,)X 2688(zsize;)X 1 f 776 2280(Opens)N 1006(an)X 1107(image)X 1328(\256le)X 1455(for)X 1574(reading)X 1840(or)X 1932(writing)X 2188(and)X 2329(returns)X 2577(a)X 2638(pointer)X 2890(to)X 2977(IMAGE)X 3265(in)X 3352(the)X 3475(same)X 3665(style)X 3841(as)X 3934(the)X 576 2376(UNIX)N 801(standard)X 1097(i/o)X 1205(library.)X 1483(A)X 1565(return)X 1781(value)X 1979(of)X 2070(0)X 2134(means)X 2363(the)X 2485(function)X 2776(failed)X 2983(to)X 3069(successfully)X 3485(open)X 3665(the)X 3787(\256le)X 3912(that)X 576 2472(was)N 721(named.)X 776 2596(To)N 890(open)X 1071(an)X 1172(image)X 1393(\256le)X 1520(for)X 1639(reading,)X 1925(iopen)X 2128(should)X 2366(be)X 2467(called)X 2684(with)X 2851(2)X 2916(arguments,)X 3295(the)X 3419(name)X 3619(of)X 3712(the)X 3836(image)X 576 2692(\256le)N 707(to)X 798(open)X 983(and)X 1128(a)X 1193(mode)X 1400(of)X 1496("r".)X 1657(The)X 1810(dimensions)X 2202(of)X 2297(the)X 2423(image)X 2647(may)X 2813(be)X 2917(determined)X 3306(by)X 3414(referencing)X 3809(image-)X 576 2788(>xsize,)N 831(image->ysize,)X 1309(and)X 1450(image->zsize,)X 1924(where)X 2146(image)X 2367(is)X 2445(the)X 2568(value)X 2767(returned)X 3060(by)X 3165(iopen.)X 3409(xsize)X 3600(and)X 3742(ysize)X 3933(are)X 576 2884(de\256ned)N 833(in)X 916(terms)X 1115(of)X 1202(pixels)X 1413(while)X 1611(zsize)X 1792(describes)X 2111(the)X 2229(number)X 2494(of)X 2581(channels)X 2882(\(i.e.)X 3027(layers\))X 3266(the)X 3384(image)X 3600(contains.)X 3907(The)X 576 2980(value)N 776(of)X 869(image->dim)X 1287(indicates)X 1598(whether)X 1883(the)X 2007(image)X 2229(is)X 2308(just)X 2449(a)X 2511(single)X 2728(row)X 2880(\(one)X 3050(dimensional\))X 3495(or)X 3589(is)X 3669(an)X 3772(array)X 3965(of)X 576 3076(rows)N 752(\(two)X 919(dimensional\))X 1357(or)X 1444(is)X 1517(an)X 1613(array)X 1799(of)X 1886(2)X 1946(dimensional)X 2357(images)X 2604(\(three)X 2812(dimensional\).)X 776 3200(An)N 894(rgb)X 1021(image)X 1238(can)X 1371(be)X 1468(thought)X 1733(of)X 1821(as)X 1909(a)X 1966(set)X 2076(of)X 2164(three)X 2346(2)X 2407(dimensional)X 2819(images.)X 3107(Sometimes)X 3483(this)X 3619(is)X 3693(referred)X 3970(to)X 576 3296(as)N 668(a)X 729(3)X 794(channel)X 1069(image.)X 1330(An)X 1453(rgb)X 1585(color)X 1775(image)X 1996(consists)X 2273(of)X 2364(3)X 2428(channels)X 2733(\(one)X 2900(channel)X 3174(each)X 3346(for)X 3464(the)X 3586(red)X 3713(green)X 3916(and)X 576 3392(blue)N 736(components)X 1145(of)X 1234(the)X 1354(image\))X 1599(and)X 1737(is)X 1812(represented)X 2205(as)X 2295(a)X 2354(three)X 2538(dimensional)X 2952(image)X 3171(that)X 3314(is)X 3390(xsize)X 3578(by)X 3681(ysize)X 3869(by)X 3972(3.)X 576 3488(A)N 660(black)X 860(and)X 1002(white)X 1206(image)X 1428(has)X 1561(one)X 1703(channel)X 1979(and)X 2121(is)X 2200(represented)X 2597(as)X 2690(a)X 2752(two)X 2898(dimensional)X 3315(image)X 3537(that)X 3683(is)X 3762(xsize)X 3952(by)X 576 3584(ysize.)N 776 3708(Other)N 988(information)X 1395(may)X 1563(be)X 1669(found)X 1886(in)X 1978(image->name)X 2450(\(holds)X 2680(the)X 2808(string)X 3020(that)X 3170(is)X 3253(usually)X 3514(the)X 3642(same)X 3837(as)X 3934(the)X 576 3804(actual)N 801(image)X 1030(\256lename\),)X 1386(image->colormap)X 1990(\(de\256nes)X 2277(whether)X 2569(the)X 2700(image)X 2929(is)X 3015(a)X 3084(series)X 3300(of)X 3400(intensity)X 3708(values,)X 3965(or)X 576 3900(color)N 776(lookup)X 1033(table)X 1224(indices,)X 1506(or)X 1608(an)X 1719(actual)X 1946(colormap\),)X 2331(image->max)X 2772(\(the)X 2933(maximum)X 3293(intensity)X 3604(stored)X 3836(in)X 3934(the)X 576 3996(image\),)N 839(and)X 975(image->min)X 1387(\(the)X 1532(minimum)X 1862(intensity)X 2157(stored)X 2373(in)X 2455(the)X 2573(image\).)X 776 4120(To)N 890(open)X 1071(an)X 1172(image)X 1393(\256le)X 1521(for)X 1641(writing,)X 1918(iopen)X 2122(should)X 2361(be)X 2463(called)X 2681(with)X 2849(7)X 2915(arguments,)X 3295(the)X 3419(name)X 3619(of)X 3712(the)X 3836(image)X 576 4216(\256le)N 703(to)X 790(open,)X 991(and)X 1132(a)X 1193(mode)X 1396(of)X 1488("w",)X 1657(followed)X 1967(by)X 2072(the)X 2195(type,)X 2378(the)X 2501(number)X 2771(of)X 2863(dimensions)X 3252(and)X 3393(the)X 3516(xsize,)X 3726(ysize)X 3916(and)X 576 4312(zsize)N 761(of)X 852(the)X 974(image.)X 1234(The)X 1383(type)X 1545(indicates)X 1854(how)X 2016(many)X 2218(bytes)X 2411(are)X 2535(stored)X 2756(per)X 2884(pixel)X 3069(value,)X 3288(and)X 3429(whether)X 3713(the)X 3836(image)X 576 4408(\256le)N 705(should)X 945(be)X 1048(run-length)X 1409(encoded.)X 1744(Type)X 1936(may)X 2101(be)X 2204(given)X 2408(as)X 2501(RLE\(1\),)X 2792(RLE\(2\),)X 3083(VERBATIM\(1\),)X 3641(or)X 3734(VERBA-)X 576 4504(TIM\(2\).)N 885(Run-length)X 1273(encoded)X 1569(\(RLE\))X 1802(image)X 2026(\256les)X 2187(are)X 2314(more)X 2507(ef\256ciently)X 2860(stored)X 3084(than)X 3250(verbatim)X 3564(\256les)X 3726(where)X 3952(no)X 576 4600(compression)N 1006(algorithm)X 1342(is)X 1420(used.)X 1632(1)X 1697(or)X 1789(2)X 1854(in)X 1941(the)X 2064(above)X 2281(speci\256es)X 2582(how)X 2745(many)X 2948(bytes)X 3142(are)X 3265(used)X 3436(for)X 3554(each)X 3726(pixel)X 3910(in)X 3996(a)X 576 4696(colormap)N 907(image,)X 1151(or)X 1246(for)X 1369(each)X 1546(channel)X 1825(in)X 1916(an)X 2021(rgb)X 2157(image.)X 2422(RLE\(2\))X 2696(or)X 2792(VERBATIM\(2\))X 3333(is)X 3415(used)X 3591(to)X 3682(store)X 3867(color)X 576 4792(index)N 785(images)X 1043(that)X 1194(contain)X 1461(12)X 1572(bits)X 1718(per)X 1851(pixel.)X 2081(RLE\(1\))X 2356(is)X 2439(the)X 2567(recommended)X 3052(default)X 3305(for)X 3429(rgb)X 3566(and)X 3712(black)X 3916(and)X 576 4888(white)N 774(images.)X 8 f 864 5224(iclose\(image\))N 864 5320(register)N 1296(IMAGE)X 1728(*image;)X 1 f 776 5492(Closes)N 1010(an)X 1107(image)X 1324(\256le)X 1447(that)X 1588(was)X 1734(open)X 1911(for)X 2026(reading)X 2288(or)X 2376(writing.)X 2668(All)X 2791(output)X 3016(is)X 3090(\257ushed)X 3342(to)X 3426(the)X 3546(output)X 3772(\256le,)X 3916(and)X 576 5588(the)N 694(output)X 918(\256le)X 1040(is)X 1113(closed.)X 2 p %%Page: 2 2 10 s 0 xH 0 xS 1 f 0 32(--)N 4323(--)X 2237 416(-)N 2284(2)X 2344(-)X 3 f 576 864(Reading)N 880(and)X 1028(Writing)X 1319(an)X 1423(Image)X 1657(File)X 1 f 776 988(The)N 929(following)X 1268(functions)X 1594(allow)X 1800(pixels)X 2019(to)X 2109(be)X 2213(transferred)X 2591(to)X 2682(and)X 2827(from)X 3012(an)X 3117(image)X 3342(\256le.)X 3513(These)X 3734(functions)X 576 1084(provide)N 844(an)X 943(interface)X 1248(to)X 1333(an)X 1431(image)X 1649(\256le)X 1773(that)X 1915(is)X 1990(independent)X 2404(of)X 2493(whether)X 2774(the)X 2894(image)X 3112(\256le)X 3236(happens)X 3521(to)X 3605(be)X 3703(run)X 3832(length)X 576 1180(encoded,)N 884(and)X 1020(independent)X 1432(of)X 1519(whether)X 1798(it)X 1862(maintains)X 2193(1)X 2253(or)X 2340(2)X 2400(bytes)X 2589(per)X 2712(pixel.)X 8 f 864 1324(putrow\(image,buffer,y,z\))N 864 1420(register)N 1296(IMAGE)X 1728(*image;)X 864 1516(unsigned)N 1296(short)X 1728(*buffer;)X 864 1612(unsigned)N 1440(y,)X 1584(z;)X 1 f 776 1784(Writes)N 1010(a)X 1066(row)X 1211(of)X 1298(pixels)X 1509(to)X 1591(the)X 1710(speci\256ed)X 2016(image)X 2233(\256le.)X 2376(The)X 2522(buffer)X 2740(should)X 2974(be)X 3071(an)X 3168(array)X 3355(of)X 3443(shorts)X 3655(that)X 3796(contain)X 576 1880(the)N 697(pixel)X 880(values)X 1108(of)X 1198(a)X 1257(colormap)X 1583(image)X 1802(or)X 1892(one)X 2031(of)X 2121(the)X 2242(3)X 2305(channels)X 2609(of)X 2698(an)X 2796(rgb)X 2925(image.)X 3183(If)X 3259(the)X 3379(image)X 3597(\256le)X 3721(maintains)X 576 1976(only)N 740(one)X 879(byte)X 1040(per)X 1166(pixel,)X 1369(then)X 1530(the)X 1651(values)X 1879(passed)X 2116(in)X 2201(the)X 2322(buffer)X 2542(should)X 2778(be)X 2877(in)X 2962(the)X 3083(range)X 3285(0..255.)X 3548(The)X 3696(row)X 3844(of)X 3934(the)X 576 2072(image)N 794(to)X 878(be)X 976(written)X 1225(is)X 1300(given)X 1500(by)X 1602(y,)X 1684(while)X 1884(z)X 1942(selects)X 2178(which)X 2396(channel)X 2668(of)X 2757(the)X 2877(image)X 3095(to)X 3179(write)X 3366(to.)X 3490(The)X 3637(\256rst)X 3782(channel)X 576 2168(of)N 671(the)X 797(image)X 1022(is)X 1104(channel)X 1383(0.)X 1492(A)X 1579(black)X 1782(and)X 1927(white)X 2134(image)X 2359(will)X 2512(have)X 2693(only)X 2864(1)X 2933(channel)X 3212(while)X 3419(rgb)X 3555(images)X 3811(have)X 3992(3)X 576 2264(channels.)N 918(In)X 1006(an)X 1103(rgb)X 1231(image,)X 1468(channel)X 1739(0)X 1800(is)X 1874(used)X 2042(to)X 2125(store)X 2302(red)X 2425(while)X 2623(channel)X 2893(1)X 2953(stores)X 3160(green,)X 3379(and)X 3515(channel)X 3785(2)X 3845(stores)X 576 2360(blue)N 745(pixel)X 936(data.)X 1141(The)X 1297(y)X 1368(argument)X 1702(should)X 1946(be)X 2053(greater)X 2308(than)X 2477(or)X 2575(equal)X 2780(to)X 2873(zero)X 3043(and)X 3190(less)X 3341(than)X 3510(the)X 3639(ysize)X 3835(of)X 3934(the)X 576 2456(image.)N 832(The)X 977(rows)X 1153(of)X 1240(the)X 1358(image)X 1574(\256le)X 1696(may)X 1854(be)X 1950(written)X 2197(in)X 2279(any)X 2415(order.)X 8 f 864 2600(getrow\(image,buffer,y,z\))N 864 2696(register)N 1296(IMAGE)X 1584(*image;)X 864 2792(unsigned)N 1296(short)X 1584(*buffer;)X 864 2888(register)N 1296(unsigned)X 1728(int)X 1920(y,)X 2064(z;)X 1 f 776 3060(Reads)N 1004(a)X 1072(row)X 1229(of)X 1329(pixels)X 1553(from)X 1742(the)X 1873(speci\256ed)X 2191(image)X 2420(\256le.)X 2595(The)X 2753(buffer)X 2983(should)X 3229(be)X 3338(an)X 3447(array)X 3646(of)X 3746(shorts)X 3970(to)X 576 3156(receive)N 833(pixel)X 1017(values)X 1246(of)X 1337(a)X 1397(colormap)X 1724(image)X 1944(or)X 2034(one)X 2173(of)X 2263(the)X 2384(3)X 2447(channels)X 2751(of)X 2841(an)X 2940(rgb)X 3070(image.)X 3329(The)X 3477(row)X 3625(of)X 3715(the)X 3836(image)X 576 3252(to)N 664(be)X 766(read)X 931(is)X 1010(given)X 1214(by)X 1320(y,)X 1406(while)X 1610(z)X 1672(selects)X 1912(which)X 2134(channel)X 2410(of)X 2503(the)X 2627(image)X 2849(to)X 2937(read)X 3102(from.)X 3324(The)X 3475(\256rst)X 3625(channel)X 3902(of)X 3996(a)X 576 3348(image)N 799(is)X 879(channel)X 1156(0.)X 1263(A)X 1348(black)X 1549(and)X 1692(white)X 1897(image)X 2120(will)X 2271(have)X 2450(only)X 2619(1)X 2686(channel,)X 2983(while)X 3187(an)X 3289(rgb)X 3422(image)X 3644(will)X 3794(have)X 3972(3.)X 576 3444(The)N 725(y)X 789(argument)X 1116(should)X 1353(be)X 1453(greater)X 1701(than)X 1863(or)X 1954(equal)X 2152(to)X 2238(zero)X 2401(and)X 2541(less)X 2685(than)X 2847(the)X 2969(ysize)X 3158(of)X 3250(the)X 3373(image.)X 3634(The)X 3784(rows)X 3965(of)X 576 3540(the)N 694(image)X 910(\256le)X 1032(may)X 1190(be)X 1286(read)X 1445(in)X 1527(any)X 1663(order.)X 3 f 576 3732(Miscellaneous)N 1076(Functions)X 8 f 864 3876(isetname\(image,name\))N 864 3972(IMAGE)N 1152(*image;)X 864 4068(char)N 1104(*name;)X 1 f 776 4240(Copies)N 1019(the)X 1138(character)X 1455(string)X 1658(name)X 1854(into)X 2000(the)X 2120(name)X 2316(\256eld)X 2480(of)X 2569(the)X 2689(image)X 2907(\256le.)X 3051(NOTE:)X 3329(handling)X 3631(names)X 3858(when)X 576 4336(processing)N 939(two)X 1079(\256les)X 1232(together)X 1515(is)X 1588(not)X 1710(well)X 1868(supported)X 2204(and)X 2340(is)X 2413(not)X 2535(encouraged.)X 8 f 864 4480(isetcolormap\(image,colormap\))N 864 4576(IMAGE)N 1152(*image;)X 864 4672(int)N 1056(colormap;)X 1 f 776 4844(Tells)N 960(ipaste)X 1171(and)X 1311(some)X 1504(printing)X 1781(utilities)X 2044(whether)X 2327(the)X 2449(pixel)X 2633(values)X 2862(should)X 3099(be)X 3199(interpreted)X 3571(as)X 3662(color-index)X 576 4940(pixels)N 788(or)X 876(intensities.)X 1241(A)X 1320(gray)X 1484(scale)X 1666(image)X 1883(consists)X 2157(of)X 2245(one)X 2382(channel)X 2653(of)X 2741(intensities,)X 3106(while)X 3305(an)X 3401(rgb)X 3528(image)X 3744(has)X 3871(three)X 576 5036(independent)N 993(channels)X 1300(of)X 1393(pixel)X 1579(intensities,)X 1949(one)X 2091(channel)X 2367(for)X 2487(each)X 2661(red,)X 2810(green)X 3015(and)X 3157(blue)X 3321(intensities.)X 3711(The)X 3862(argu-)X 576 5132(ment)N 757(colormap)X 1081(may)X 1240(be)X 1337(one)X 1474(of)X 1561(following)X 1892(three)X 2073(values:)X 2340(CM_NORMAL)X 2871(is)X 2944(the)X 3062(default)X 3305(indicating)X 3645(that)X 3785(the)X 3903(pix-)X 576 5228(els)N 690(are)X 814(intensity)X 1114(values.)X 1384(0)X 1449(is)X 1527(black)X 1726(and)X 1867(a)X 1928(value)X 2128(of)X 2221(255)X 2367(in)X 2455(the)X 2579(image)X 2801(is)X 2880(white.)X 3104(Black)X 3317(and)X 3459(white)X 3663(images)X 3916(and)X 576 5324(rgb)N 708(images)X 960(are)X 1084(stored)X 1305(with)X 1472(CM_NORMAL.)X 2048(CM_SCREEN)X 2543(indicates)X 2853(that)X 2998(the)X 3120(pixels)X 3335(were)X 3516(copied)X 3754(from)X 3934(the)X 576 5420(screen)N 807(and)X 948(must)X 1128(be)X 1229(transformed)X 1642(by)X 1747(a)X 1808(color)X 1998(map)X 2161(to)X 2248(be)X 2349(meaningful.)X 2759(Colormaps)X 3135(can)X 3272(also)X 3426(be)X 3527(stored)X 3748(in)X 3836(image)X 576 5516(\256les.)N 769(CM_COLORMAP)X 1397(means)X 1622(that)X 1762(the)X 1880(pixels)X 2091(in)X 2173(the)X 2291(image)X 2507(\256le)X 2629(represent)X 2944(a)X 3000(color)X 3185(map)X 3 p %%Page: 3 3 10 s 0 xH 0 xS 1 f 0 32(--)N 4323(--)X 2237 416(-)N 2284(3)X 2344(-)X 3 f 576 672(An)N 698(Example)X 1 f 776 796(The)N 923(following)X 1256(example)X 1551(shows)X 1774(how)X 1935(to)X 2020(open)X 2199(an)X 2298(image)X 2517(\256le)X 2642(and)X 2781(read)X 2943(its)X 3041(contents.)X 3371(More)X 3568(examples)X 3894(may)X 576 892(be)N 672(found)X 879(in)X 961(/usr/people/4Dgifts/iristools/imgtools.)X 8 f 8 s 576 1060(/*)N 614 1132(*)N 776 -0.4219(readimage)AX 1156(-)X 1232(Read)X 1422(an)X 1536(image)X 1764(file)X 1954(and)X 2106(print)X 2334(its)X 2486(pixel)X 2714(values.)X 614 1204(*)N 614 1276(*)N 776(To)X 890(compile:)X 1270(cc)X 1384 -0.4125(readimage.c)AX 1840(-o)X 1954 -0.4219(readimage)AX 2334(-limage)X 614 1348(*)N 614 1420(*)N 1376(Paul)X 1566(Haeberli)X 1908(-)X 1984(1991)X 614 1492(*/)N 576 1564(#include)N 918 -0.4091(<gl/image.h>)AX 576 1708 -0.4018(main\(argc,argv\))AN 576 1780(int)N 728(argc;)X 576 1852(char)N 766(**argv;)X 576 1924({)N 728 1996(IMAGE)N 956(*image;)X 728 2068(int)N 880(x,)X 994(y,)X 1108(z;)X 728 2140(short)N 956(*rbuf,)X 1222(*gbuf,)X 1488(*bbuf;)X 576 2284(/*)N 690(print)X 918(usage)X 1146(message)X 1450(*/)X 728 2356(if\()N 880(argc<2)X 1146(\))X 1222({)X 880 2428 -0.3929(fprintf\(stderr,"usage:)AN 1754 -0.4219(readimage)AX 2134 -0.4219(infile0\);)AX 880 2500(exit\(1\);)N 728 2572(})N 576 2716(/*)N 690(open)X 880(the)X 1032(image)X 1260(file)X 1450(*/)X 728 2788(if\()N 880 -0.3900(\(image=iopen\(argv[1],"r"\)\))AX 1906(==)X 2020(NULL)X 2210(\))X 2286({)X 880 2860 -0.3900(fprintf\(stderr,"readimage:)AN 1906(can't)X 2134(open)X 2324(input)X 2552(file)X 2742 -0.4062(%s0,argv[1]\);)AX 880 2932(exit\(1\);)N 728 3004(})N 576 3148(/*)N 690(print)X 918(a)X 994(little)X 1260(info)X 1450(about)X 1678(the)X 1830(image)X 2058(*/)X 728 3220 -0.4062(printf\("Image)AN 1260(x)X 1336(and)X 1488(y)X 1564(size)X 1754(in)X 1868(pixels:)X 2172(%d)X 2286 -0.3875(%d0,image->xsize,image->ysize\);)AX 728 3292 -0.4062(printf\("Image)AN 1260(zsize)X 1488(in)X 1602 -0.4219(channels:)AX 1982 -0.3971(%d0,image->zsize\);)AX 728 3364 -0.4062(printf\("Image)AN 1260(pixel)X 1488(min)X 1640(and)X 1792(max:)X 1982(%d)X 2096 -0.3900(%d0,image->min,image-max\);)AX 576 3508(/*)N 690(allocate)X 1032(buffers)X 1336(for)X 1488(image)X 1716(data)X 1906(*/)X 728 3580(rbuf)N 918(=)X 994(\(short)X 1260 -0.3854(*\)malloc\(image->xsize*sizeof\(short\)\);)AX 728 3652(gbuf)N 918(=)X 994(\(short)X 1260 -0.3854(*\)malloc\(image->xsize*sizeof\(short\)\);)AX 728 3724(bbuf)N 918(=)X 994(\(short)X 1260 -0.3854(*\)malloc\(image->xsize*sizeof\(short\)\);)AX 576 3868(/*)N 690(check)X 918(to)X 1032(see)X 1184(if)X 1298(the)X 1450(image)X 1678(is)X 1792(B/W)X 1944(or)X 2058(RGB)X 2210(*/)X 728 3940 -0.4018(if\(image->zsize)AN 1336(==)X 1450(1\))X 1564({)X 880 4012 -0.4091(printf\("This)AN 1374(is)X 1488(a)X 1564(black)X 1792(and)X 1944(write)X 2172(image0\);)X 880 4084(for\(y=0;)N 1222 -0.4018(y<image->ysize;)AX 1830(y++\))X 2020({)X 1032 4156 -0.3920(getrow\(image,rbuf,y,0\);)AN 1032 4228 -0.4125(printf\("row)AN 1488(%d:)X 1640(",y\);)X 1032 4300(for\(x=0;)N 1374 -0.4018(x<image->xsize;)AX 1982(x++\))X 1184 4372 -0.4167(printf\("%d)AN 9 f 1602(|)X 8 f 1615 -0.4125(",rbuf[x]\);)AX 1032 4444 -0.4125(printf\("0\);)AN 880 4516(})N 728 4588(})N 804(else)X 994 -0.4018(if\(image->zsize)AX 1602(>=)X 1716(3\))X 1830({)X 1944(/*)X 2058(if)X 2172(the)X 2324(image)X 2552(has)X 2704(alpha)X 2932(zsize)X 3160(is)X 3274(4)X 3350(*/)X 880 4660 -0.4091(printf\("This)AN 1374(is)X 1488(a)X 1564(rgb)X 1716(image0\);)X 880 4732(for\(y=0;)N 1222 -0.4018(y<image->ysize;)AX 1830(y++\))X 2020({)X 1032 4804 -0.3920(getrow\(image,rbuf,y,0\);)AN 1032 4876 -0.3920(getrow\(image,gbuf,y,1\);)AN 1032 4948 -0.3920(getrow\(image,bbuf,y,2\);)AN 1032 5020 -0.4125(printf\("row)AN 1488(%d:)X 1640(",y\);)X 1032 5092(for\(x=0;)N 1374 -0.4018(x<image->xsize;)AX 1982(x++\))X 1184 5164 -0.4167(printf\("%d)AN 1602(%d)X 1716(%d)X 9 f 1830(|)X 8 f 1843 -0.3894(",rbuf[x],gbuf[x],bbuf[x]\);)AX 1032 5236 -0.4125(printf\("0\);)AN 880 5308(})N 728 5380(})N 576 5452(})N 1 f 10 s 0 6360(--)N 4323(--)X 3 p %%Trailer xt xs