source: trunk/JPGPROC/source/gbmsrc/gbm.htm@ 2

Last change on this file since 2 was 2, checked in by stevenhl, 8 years ago

Import sources from cwmm-full.zip dated 2005-03-21

File size: 43.3 KB
Line 
1<HTML>
2<HEAD>
3<TITLE>Generalised Bitmap Module</TITLE>
4</HEAD>
5<BODY>
6
7<H1>Generalised Bitmap Module</H1>
8
9<!--...sIntroduction:0:-->
10<H2>Introduction</H2>
11
12<P>The GBM package consists of a number of components :-
13
14<P>
15<UL>
16<LI>A peice of code capable of loading and saving bitmap files
17 in a variety of popular
18 <A HREF="#formats">file formats</A>.
19 Programs may be written to use this code, and thus be able to
20 access a variety of file formats without actually knowing
21 what format the pictures are in, or any details about file format itself.
22<LI>Some peices of code that perform common operations on bitmap data.
23 Such as reflection, X-Y transposition, rotation, cropping, scaling,
24 halftoning, error-diffusing, palette mapping, and colour space mapping.
25<LI>Some sample
26 <A HREF="#cmdline">command line programs</A>
27 which use the above code.
28</UL>
29<!--...e-->
30<!--...sDistributed packages:0:-->
31<H2>Distributed packages</H2>
32
33<P>The GBM packages are best obtained via the links on my home page :-
34
35<P>
36<UL>
37<LI><A HREF="http://www.interalpha.net/customer/nyangau/">
38 <CODE>http://www.interalpha.net/customer/nyangau/</CODE></A>
39</UL>
40
41<P>The basic GBMOS2 package contains all the OS/2 executables.
42Often GBMDOS32, GBMWIN, GBMAIX, GBMLINUX and other packages are available too.
43
44<P>The GBMSRC source package contains all the source code,
45which is 32 bit portable C.
46Makefiles for OS/2 (VisualAge C++),
47Win32 (Visual C++ 4.2, 5.0, 6.0),
48and UNIX (using xlc under AIX, and gcc under Linux) are included.
49See the <A HREF="gbmsrc.htm">source documentation</A>
50
51<P>All the GBM source code is written using Andys Source Code Folding Editor,
52and this is also accessible via my home page.
53The source will look funny (have strange comments in it, etc.) when veiwed
54using a regular 'flat' editor.
55
56<P>There is a GBMOS2PM package, which contains programs specific to OS/2
57and to OS/2 with Presentation Manager.
58These include GBMV, GBMV2, GBMVFSA and GBMLOGO.
59These used to be a part of the standard packages, but I have recently
60split them out as most people don't have or use OS/2.
61See the <A HREF="gbmos2pm.htm">OS/2 extras documentation</A>.
62<!--...e-->
63<!--...sJPEG support:0:-->
64<A NAME="jpeg">
65<H2>JPEG support</H2></A>
66
67<P>The Independant JPEG Group have generously allowed others to
68use their source code to their JPEG handling library.
69The only condition of use is that the IJG must be credited for their work.
70Try looking for this library at :-
71
72<P>
73<UL>
74<LI><A HREF="ftp://sun2.urz.uni-heidelberg.de/pub/simtel/graphics/jpegsr6a.zip">
75 <CODE>ftp://sun2.urz.uni-heidelberg.de/pub/simtel/graphics/jpegsr6a.zip</CODE></A>.
76<LI><A HREF="ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6a.zip">
77 <CODE>ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6a.zip</CODE></A>.
78<LI><A HREF="http://sunsite.doc.ic.ac.uk/computing/systems/ibmpc/simtel/msdos/graphics/jpegsr6a.zip">
79 <CODE>http://sunsite.doc.ic.ac.uk/computing/systems/ibmpc/simtel/msdos/graphics/jpegsr6a.zip</CODE></A>.
80</UL>
81
82<P>Martin Lisowski <CODE>&lt;mlisowsk@aixterm1.urz.uni-heidelberg.de&gt;</CODE>
83has generously donated his <CODE>gbmjpg.c</CODE> to GBM.
84This file allows GBM to use the IJG 6a library.
85
86<P>GBM may be compiled up either with or without JPEG support.
87If you use the JPEG enabled variety of GBM in your project,
88you must credit the IJG.
89
90<P>This code has been tested on OS/2, AIX, Linux and NT.
91<!--...e-->
92<!--...sFormats supported:0:-->
93<A NAME="formats">
94<H2>Formats supported</H2></A>
95
96<P>GBM supports a variety of file formats, such as GIF, TIFF, PCX etc..
97
98<P>Normally, applications using GBM deduce the file format from the file
99extension.
100eg: <CODE>filename.gif</CODE> is a Compu$erve GIF file.
101
102<P>When specifying file names to programs written using GBM, it is usually
103possible to append a comma seperated list of format specific options.
104eg: you can say <CODE>webpiccy.gif,ilace</CODE>.
105In this case, the <CODE>ilace</CODE> is a cue to the code in GBM which writes
106GIF files, to tell it to write an interlaced GIF.
107
108<P>
109<PRE>
110Short name : Long name : File extensions
111 Comments
112</PRE>
113<PRE>
114Bitmap : OS/2 1.1, 1.2, 2.0 / Windows 3.0 bitmap : .BMP .VGA .BGA .RLE .DIB .RL4 .RL8
115 Reads any of the above if uncompressed or run-length compressed.
116 Will not read CCITT G3 MH Fax compressed files.
117 Will not read 24 bit RLE files.
118 If input is an OS/2 bitmaparray file then which bitmap can be specified.
119 Input options: index=# (default: 0)
120 Can be made to write OS/2 1.1 or Windows 3.0 / OS/2 2.0 bitmaps
121 Output options: 1.1,win,2.0 (default: 2.0, note win=2.0)
122 The handling of 1bpp bitmaps is a little complicated.
123 When reading 1bpp bitmaps, the palette is ignored.
124 1's are considered foreground, and they are considered black.
125 0's are considered background, and they are considered white.
126 This agrees with WorkPlace Shell WPFolder background mode, and most PM
127 programs, but notably disagrees with Windows PBrush.
128 When writing 1bpp bitmaps, the actual 2 colours in the palette are
129 ignored, and a fixed palette is written. This is so that the resulting
130 bitmap will display 1's in black on 0's in white when displayed by
131 WPFolder etc..
132 Foreground and background colours in palette can be inverted on input.
133 Input options: inv
134 Foreground and background colours in palette can be inverted on output.
135 Output options: inv
136 Foreground and background colours in bits can be inverted on input.
137 Input options: invb
138 Foreground and background colours in bits can be inverted on output.
139 Output options: invb
140 The best option for writing 1bpp bitmaps is to write the darkest
141 colour as the foreground. The resulting bitmap will have darkest
142 colour as 1 bits, and lightest colour as 0 bits. When reloaded
143 WPFolders and GBM will give a black 1's on white 0's picture.
144 Output option: darkfg
145 Also, there is an option for writing 1bpp bitmaps with the lightest
146 colour as foreground. As WPFolder and GBM assume the foreground is
147 black and the background is white on reloading, this will typically
148 cause the image to be inverted.
149 Output option: lightfg
150</PRE>
151<PRE>
152GIF : CompuServe Graphics Interchange Format : .GIF
153 Reads 1, bit data files.
154 Reads 2, 3 and 4 bit data files and presents them as 4 bit.
155 Reads 5, 6, 7 and 8 bit data files and presents them as 8 bit.
156 Writes 1, 4 and 8 bit data files.
157 Reads "GIF87a" and "GIF89a" style files.
158 Writes "GIF87a" style files.
159 Will write "GIF89a" file, if the transcol= option is used.
160 Should correctly handle deferred clear-code in LZW data stream.
161 Will not generate output with deferred clear-code.
162 ie: should not break older GIF readers.
163 Can specify index of image within file on read.
164 Input option: index=# (default 0)
165 Can specify to return decoded data so far rather than error if corrupt.
166 Input option: errok
167 Can specify screen size to write in output screen descriptor.
168 Output options: xscreen=#,yscreen=# (defaults: image size).
169 Can specify background colour index to write in file BMHD header.
170 Output option: background=# (default: 0)
171 Can specify position information in output image descriptor.
172 Output options: xpos=#,ypos=# (defaults: 0,0).
173 Can specify transparent colour index (useful for HTML embedding).
174 Output option: transcol=# (default is none).
175 Can specify transparent colour index same as first pixel.
176 Output option: transcol=edge
177 Can write interlaced GIFs (good for HTML &lt;IMG=SRC="x.gif"&gt;)
178 Output option: ilace
179 Extensively test on GIF files from a wide variety of sources.
180 Compatibility tested with xloadimage and xv.
181</PRE>
182<PRE>
183PCX : ZSoft PC Paintbrush Image format : .PCX .PCC
184 Reads and writes 1,4,8 and 24 bit colour files.
185 Subset of plane/bits-per-plane combinations supported.
186 Files are read and written using a run-length coding scheme.
187 Tested using Zsoft originated .PCX files.
188 Compressed runs of pixels are not supposed to straddle scan lines.
189 GBM never does this, but some other applications violate this rule.
190 By default, if GBM finds that a run of pixels is longer than the scan
191 line, it will use the leftover pixels on the next scan line.
192 Some images will not load properly, as they require the loading
193 program to discard those pixels in the run that extend beyond the end
194 of the scan line. This behaviour can be enabled in GBM.
195 Input option: trunc
196</PRE>
197<PRE>
198TIFF : Microsoft/Aldus Tagged Image File Format support : .TIF .TIFF
199 Reads and writes 1,4,8 and 24 bit colour files.
200 Can almost read all TIFF 6.0 Baseline compliant files.
201 Can read uncompressed and Packbits images.
202 CCITT Modified huffman compression is the missing peice.
203 Can read some files with extensions to Baseline.
204 Can read 1bpp greyscale and palettised files.
205 Can read Orientation==4 files.
206 Can read PlanarConfiguration==2 files for RGB image data.
207 Can read LZW compressed files too.
208 Can also read CMYK 4 colour seperation files.
209 No JPEG or Y-Cb-Cr support.
210 Writes files that comply with TIFF 6.0 Baseline.
211 Usually writes uncompressed files only.
212 Data is written out as a single large strip.
213 Can specify image within TIFF file with many images
214 Input option: index=# (default: 0)
215 Can write 1bpp as non-Baseline file preserving fg/bg cols
216 Output option: pal1bpp
217 Can ask for LZW compression.
218 Output option: lzw
219 Can specify informational tags to append on output.
220 Output options: artist=,software=,make=,model=,host=,documentname=,pagename=,imagedescription=
221</PRE>
222<PRE>
223Targa : Truevision Targa/Vista bitmap : .TGA .VST .AFI
224 Reads any uncompressed/run-length-compressed files.
225 Reads 8 bit and 24 bit files.
226 Can read 8 bit greyscale and 8 bit colour mapped files.
227 Reads both yup and ydown files.
228 Writes out as uncompressed 8 bit or 16,24,32 bit.
229 Output options: 16,24,32 (default 24)
230 8 bit data is always written out as a colour mapped file.
231 Can be made to write yup and ydown files.
232 Output options: ydown,yup (default: yup)
233</PRE>
234<PRE>
235ILBM : Amiga IFF / ILBM Interleaved bitmap format : .IFF .LBM
236 Reads 1 bit palettised files.
237 Reads 2,3 and 4 bit palettised files, returning them as 4 bit.
238 Reads 5,6,7 and 8 bit palettised files, returning them as 8 bit.
239 Reads 24 bit images and returns them as 24 bit.
240 Reads HAM6, HAM8, SHAM and Extra-Halfbrite images.
241 HAM6, HAM8 and SHAM returned as 24 bit data.
242 Writes 1,4 and 8 bit palettised colour files.
243 Writes 24 bit files normally, or by converting to HAM6 first.
244 This loses quality but results are still better than 8 bit.
245 Understands the RLE compression scheme used.
246 Uses BMHD, CMAP, CAMG and BODY sections of file only.
247 Only writes BMHD, CMAP, CAMG and BODY sections in output files.
248 Can specify position information in file BHMD header.
249 Output options: xpos=#,ypos=# (defaults: 0,0).
250 Can specify transparent colour to write in file BMHD header.
251 Output option: transcol=# (default: 0)
252 Can specify aspect ratio to write in file BMHD header.
253 Output options: xaspect=#,yaspect=# (defaults: 1,1).
254 Can specify screen size to write in output BMHD header.
255 Output options: xscreen=#,yscreen=# (defaults: image size).
256 Can specify to write 24 bpp data in HAM6 format.
257 Output option: ham6
258 Note that when DeluxePaint etc. try to load an 8 bit IFF file, they
259 switch to a 32 colour (5 bit mode) and only read the 5 least
260 significant planes of the file - this generally looks yukky!
261 Tested using DeluxePaint sample bitmaps.
262</PRE>
263<PRE>
264YUV12C : YUV12C M-Motion Frame Buffer : .VID
265 Reads files and presents data as 24 bit data.
266 Writes 24 bit data files by converting them into 12 bit YUV.
267 VID files MUST be a multiple of 4 pixels wide.
268 When writing a non-multiple of 4, the last 1, 2 or 3 pixels are lost.
269 Can specify image origin information in YUV12C header.
270 Output options: xpos=#,ypos=# (defaults: 0,0).
271 Tested using M-Control Program 2.0, Browser sample application.
272</PRE>
273<PRE>
274Greymap : Portable Greyscale-map (binary P5 type) : .PGM
275 Credit for file format to Jef Poskancer.
276 No palette present in file format.
277 Reads 8 bit grey scale files.
278 Writes red, green, blue plane or greyscale equivelent of 8 bit image.
279 Output options: r,g,b,k (default: k)
280</PRE>
281<PRE>
282Pixmap : Portable Pixel-map (binary P6 type) : .PPM
283 Credit for file format to Jef Poskancer.
284 Reads and writes 24 bit unpalettised RGB data files.
285</PRE>
286<PRE>
287KIPS : IBM KIPS : .KPS
288 Reads 8 bit palettised files.
289 Will look for palette in .PAL file unless .KPL file specified.
290 Input options: pal,kpl (default: pal)
291 Writes 8 bit palettised files.
292 Will write palette in .PAL file unless .KPL file specified.
293 Output options: pal,kpl (default: pal)
294</PRE>
295<PRE>
296IAX : IBM Image Access eXecutive : .IAX
297 Reads array as 8 bit greyscale.
298 File format does not hold image dimensions.
299 Hence code assumes width is 512 pixels unless overridden.
300 Input options: width=# (default: 512)
301 File format does not include palette.
302 Writes red, green, blue plane or greyscale equivelent of 8 bit image.
303 Output options: r,g,b,k (default: k)
304</PRE>
305<PRE>
306XBitmap : X Windows bitmap : .XBM
307 Reads 1bpp X bitmaps, presenting 1's as black, 0's as white.
308 Writes 1bpp X bitmaps, darkest colours as 1's, brightest colour as 0's.
309 Tested upon some sample .XBM files.
310</PRE>
311<PRE>
312Sprite : Archimedes Sprite format from RiscOS : .SPR .SPRITE
313 Technically sprite files have no extension.
314 But GBM recognises .SPR and .SPRITE for convenience.
315 Reads 1,4 and 8 bit sprites.
316 'First bit' value in header must be a multiple of 8 (v.likely).
317 Will only read image plane, will ignore any mask plane.
318 Will handle case when no palette present in file.
319 Will default to the default Wimp palette in this case.
320 If input contains more than one sprite then which can be specified.
321 Input options: index=# (default: 0)
322 Will output 1,4 and 8 bit files.
323 Will write a palette in the file.
324 Will only write an image plane, ie: no mask plane.
325 Will write a 16 entry palette for 8 bit data (not 64 entry).
326 Will map to wierd archmedes palette when writing 8 bit data.
327 Tested reading 4bpp sprites with no palette.
328 Tested reading 8bpp sprites with no palette and with 64 entry palette.
329 Sprites generated by GBM have been loaded on RiscOS.
330 Remember: Use SetType to change type of file from PC-file to Sprite,
331 by SetType option of filer menu or "*SetType &lt;filename&gt; Sprite".
332</PRE>
333<PRE>
334PSEG : IBM Printer Page Segment : .PSE .PSEG .PSEG38PP .PSEG3820
335 This is a file format used by IBM document/printing systems.
336 It is used to represent a bi-level image to be used in a document.
337 Reads data and presents a 1bpp bitmap.
338 Image is presented 1's as black on 0's as white background.
339 PSEG files should be downloaded from a VM host in binary mode.
340 Some PSEG files have a corrupt record structure.
341 This doesn't cause a problem on VM but can confuse a non-VM reader.
342 GBM can be made to attempt to handle these files.
343 Input option: fixrec
344 Will output 1bpp file.
345 Will output file with scale factor of 1000
346 Can specify new scale for both x and y
347 Output options: scalex=#, scaley=#
348 Can double the scale factors (option exists for backwards compatibility).
349 Output option: double
350 WIll output file with pel values of 2400 (dots per 10 inches, ie: 240 dpi).
351 Can specify new pel values for both x and y
352 Output options: pelx=#, pely=#
353 Palette in 1bpp data is lost when written to file.
354 The resulting non-VM file has no record structure.
355 So when it is uploaded it must be fixed using FIXL3820 EXEC or similar.
356 Image width is rounded up to next multiple of 8 when written.
357</PRE>
358<PRE>
359GemRas : GEM Raster : .IMG
360 There is a basic level of support, and assorted XIMG extensions.
361 One extension is the inclusion of palette info.
362 Another allows 24 bpp data to be placed into an .IMG file.
363 Reads 1 bpp files (which are B/W) and returns 1 bpp data.
364 Reads 2,3 and 4 bpp files (col, grey, XIMG with pal) and returns 4 bpp.
365 Reads 5,6,7 and 8 bpp files (grey, XIMG with pal) and returns 8 bpp.
366 Reads 24 bpp (which are by definition XIMG) files and returns 24 bpp.
367 Writes 1 bpp data as B/W 1 bpp file.
368 Writes 4 bpp data mapped to 'standard' 16 colour palette.
369 Or writes 4 bpp data greyscale 4 bpp file.
370 Output option: grey
371 Or writes 4 bpp data to XIMG file with palette.
372 Output option: pal
373 There is no 'standard' palette for 256 colour files.
374 Writes 8 bpp data as greyscale 8 bpp file.
375 Or writes 8 bpp to XIMG file with palette.
376 Output option: pal
377 Writes 24 bpp data as an XIMG file (normal file can't do 24 bpp).
378 The pixel dimensions in microns can be specified.
379 Output options: pixw=#,pixh=# (defaults: 85,85)
380</PRE>
381<PRE>
382Portrait : Portrait : .CVP
383 In Germany, photographers sometimes supply a floppy with a .CVP on it.
384 File holds a single 512x512 24bpp RGB image.
385 File is uncompressed, and will therefore always be 3/4Mb.
386 You can only write 512x512 images using this format.
387 Pixels in the file are not square, the width is approx. 3/4 the height.
388 This aspect ratio problem is not adjusted for when reading or writing.
389</PRE>
390<PRE>
391JPEG : JPEG File Interchange Format : .JPG .JPEG .JPE
392 Can read 8 bpp (greyscale) and 24 bpp files.
393 Can write 24 bpp data to a file.
394 Can write with varying degrees of quality.
395 Output option: quality=# (range 0 to 100, default 75)
396 Can write progressive JPEGs.
397 Output option: prog
398</PRE>
399<!--...e-->
400<!--...sCommand line programs:0:-->
401<A NAME="cmdline">
402<H2>Command line programs</H2></A>
403
404<P>All the command line programs are written in portable C, and therefore
405can be compiled up on a wide variety of platforms.
406
407<!--...sGBMHDR \45\ Display header information from bitmap files:0:-->
408<A NAME="gbmhdr">
409<H3>GBMHDR - Display header information from bitmap files</H3></A>
410
411<P>
412<PRE>
413 usage: gbmhdr [-g] [-s] [--] {fn.ext{,opt}}
414 flags: -g don't guess bitmap format, try each type
415 -s be silent about errors
416 fn.ext{,opt} input filenames (with any format specific options)
417 Bitmap when ext in [BMP VGA BGA RLE DIB RL4 RL8]
418 GIF when ext in [GIF]
419 PCX when ext in [PCX]
420 TIFF when ext in [TIF]
421 Targa when ext in [TGA VST AFI]
422 ILBM when ext in [IFF LBM]
423 YUV12C when ext in [VID]
424 Greymap when ext in [PGM]
425 Pixmap when ext in [PPM]
426 KIPS when ext in [KPS]
427 IAX when ext in [IAX]
428 XBitmap when ext in [XBM]
429 Sprite when ext in [SPR]
430 GemRas when ext in [IMG]
431 Portrait when ext in [CVP]
432 JPEG when ext in [JPG JPEG JPE]
433 opt bitmap format specific option to pass to bitmap reader
434</PRE>
435
436<P>Note that the GBM module only ever surfaces the size and bits per pixel
437of images (regardless of the other information present in the header).
438All GBM programs have access to the bitmap file formats documented
439above, although this list is omitted in subsequent documentation.
440
441<P>GBMHDR displays output in the following style :-
442
443<P>
444<PRE>
445 384x768 8bpp 51Kb 17% GIF aab.gif
446 227x254 8bpp 58Kb 102% Bitmap andy.bmp
447 256x256 24bpp 84Kb 43% TIFF bardot.tif
448</PRE>
449
450<P>Listed is the size, bits per pixel, Kb size of the file, a percentage
451value, the file format, and the file name.
452The percentage is calculated as (filesize*100/datasize) and effectively gives
453the compression ratio.
454For example <CODE>aab.gif</CODE> is well compressed (to 17% of the theoretical
455size).
456<CODE>andy.bmp</CODE> gives a &gt;100% value because of the file header.
457<!--...e-->
458<!--...sGBMREF \45\ Reflect in horizontal and\47\or vertical directions:0:-->
459<A NAME="gbmref">
460<H3>GBMREF - Reflect in horizontal and/or vertical directions</H3></A>
461
462<P>
463<PRE>
464 usage: gbmref [-h] [-v] [-t] [--] fn1.ext{,opt} [fn2.ext{,opt}]
465 flags: -h reflect horizontally
466 -v reflect vertically
467 -t transpose x for y
468 fn1.ext{,opt} input filename (with any format specific options)
469 fn2.ext{,opt} optional output filename (or will use fn1 if not present)
470 bitmap formats and options as before
471</PRE>
472
473<P>Certain non-obvious combinations of <CODE>-h</CODE>, <CODE>-v</CODE>
474and <CODE>-t</CODE> can be very handy :-
475
476<DL>
477<DT>None of them
478 <DD>can be used for just file format translation.
479<DT><CODE>-h -v</CODE>
480 <DD>reflect both, equivelent to 180 degree turn.
481<DT><CODE>-h -t</CODE>
482 <DD>equivelent to 90 degree turn clockwise.
483<DT><CODE>-v -t</CODE>
484 <DD>equivelent to 90 degree turn anti-clockwise.
485</DL>
486<!--...e-->
487<!--...sGBMSUB \45\ Extract a subrectangle of a bitmap:0:-->
488<A NAME="gbmsub">
489<H3>GBMSUB - Extract a subrectangle of a bitmap</H3></A>
490
491<P>
492<PRE>
493 usage: gbmsub [-x x] [-y y] [-w w] [-h h] [--] fn1.ext{,opt} [fn2.ext{,opt}]
494 flags: -x x left edge of rectangle (default 0)
495 -y y bottom edge of rectangle (default 0)
496 -w w width of rectangle (default width of image - x)
497 -h h height of rectangle (default height of image - y)
498 fn1.ext{,opt} input filename (with any format specific options)
499 fn2.ext{,opt} optional output filename (or will use fn1 if not present)
500 bitmap formats and options as before
501</PRE>
502
503<P>If none of the <CODE>-x</CODE>, <CODE>-y</CODE>, <CODE>-w</CODE> and
504<CODE>-h</CODE> options are supplied the defaults cover the whole of the
505input file.
506Hence this program will just read one file and write the data as another.
507Great for format conversion.
508<!--...e-->
509<!--...sGBMSIZE \45\ Change the size of a bitmap:0:-->
510<A NAME="gbmsize">
511<H3>GBMSIZE - Change the size of a bitmap</H3></A>
512
513<P>
514<PRE>
515 usage: gbmsize [-w w] [-h h] [-a] [--] fn1.ext{,opt} [fn2.ext{,opt}]
516 flags: -w w new width of bitmap (default width of bitmap)
517 -h h new height of bitmap (default height of bitmap)
518 -a preserve aspect ratio when only one of -w or -h given
519 fn1.ext{,opt} input filename (with any format specific options)
520 fn2.ext{,opt} optional output filename (or will use fn1 if not present)
521 bitmap formats and options as before
522</PRE>
523
524<P>If none of the <CODE>-w</CODE> or <CODE>-h</CODE> options are supplied,
525the defaults will be the input image size.
526Hence this program will just read one file and write the data as another.
527Great for format conversion.
528
529<P>The scaling algorithm simply uses pixel skipping and/or replication.
530<!--...e-->
531<!--...sGBMBPP \45\ Do various bits per pixel conversions:0:-->
532<A NAME="gbmbpp">
533<H3>GBMBPP - Do various bits per pixel conversions</H3></A>
534
535<P>
536<PRE>
537 usage: gbmbpp [-m map] [-e] [-hN] [-p fnp.ext{,opt}]
538 [--] fn1.ext{,opt} [fn2.ext{,opt}]
539 flags: -m map mapping to perform (default 7x8x4)
540 bw black and white
541 vga 16 colour VGA
542 8 8 colour (in 4 bit file)
543 4g 4 bit greyscale
544 7x8x4 7 levels red, 8 green, 4 blue 8514/A
545 6x6x6 6 levels red, 6 green, 6 blue
546 8g 8 bit greyscale
547 tripel 64 reds, 64 greens, 64 blues tripel
548 pal1bpp map to 1bpp, palette specified via -p
549 pal4bpp map to 4bpp, palette specified via -p
550 pal8bpp map to 8bpp, palette specified via -p
551 freqR:G:B:N keep R red, G green, b blue bits, and map
552 to N most used colours in 8 bit palette
553 mcutN median cut to N colours
554 R:G:B keep R red, G green, B blue bits
555 -e enable error-diffusion (default is to truncate)
556 -e only with -m bw, vga, 4g, 7x8x4, 6x6x6, no -h
557 -h enable halftoning (default is to truncate)
558 -h only with -m 7x8x4, 6x6x6, 8, vga or R:G:B, no -e
559 N is a halftoning algorithm number (default 0)
560 -p fnp.ext{,opt} palette is taken from this bitmap
561 fn1.ext{,opt} input filename (with any format specific options)
562 fn2.ext{,opt} optional output filename (or use fn1 if not present)
563 bitmap formats and options as before
564</PRE>
565
566<P>This program reads the input bitmap.
567If it is not 24 bit, then it is expanded to 24 bit per pixel.
568The data is then processed using the supplied mapping giving a 24,8,4 or 1 bit
569per pixel image, which is then written to the output bitmap file.
570
571<P>The <CODE>bw</CODE> mapping produces a 1 bpp output file,
572<CODE>vga</CODE> and <CODE>4g</CODE> gives 4 bit output files,
573<CODE>7x8x4</CODE>, <CODE>6x6x6</CODE>, <CODE>8g</CODE>, <CODE>freq</CODE>
574and <CODE>tripel</CODE> give 8 bit output files.
575<CODE>R:G:B</CODE> (where R,G and B are numbers in the range 0 to 8),
576gives a 24 bit output file where only the top R bits of red are non-zero,
577the top G of green and B of blue.
578
579<P>The normal way to map is simply to map each colour in the source
580bitmap to the closest one in the destination bitmap.
581However if <CODE>-e</CODE> is supplied, error diffusion is used to get a
582smoother result.
583Also, if <CODE>-h</CODE> is supplied halftoning may be used instead.
584<CODE>-e</CODE> and <CODE>-h</CODE> are not valid together, and are only
585valid with certain mappings.
586<!--...e-->
587<!--...sGBMGAMMA \45\ Convert between various colour spaces:0:-->
588<A NAME="gbmgamma">
589<H3>GBMGAMMA - Convert between various colour spaces</H3></A>
590
591<P>
592<PRE>
593 usage: gbmgamma [-m map] [-g gamma] [-s shelf] [--] fn1.ext{,opt} [fn2.ext{,opt}]
594 flags: -m map mapping in the form ?_to_? (default: i_to_l), where ? is
595 i physical intensitys (eg: raytracer output)
596 p gamma corrected for a specific monitor
597 l L* cyclometric linear perceived intensitys (as in PM)
598 -g gamma set monitor gamma (default 2.1)
599 -s shelf set monitor shelf (default 0.0)
600 gamma and shelf only used for mapping to or from p
601 for 8514 monitor gamma=2.3,shelf=0.136
602 for 8515 monitor gamma=2.1,shelf=0.0
603 fn1.ext{,opt} input filename (with any format specific options)
604 fn2.ext{,opt} optional output filename (or will use fn1 if not present)
605 bitmap formats and options as before
606</PRE>
607
608<P>This program reads a bitmap and assumes the pixel values in it are
609in the input colour space.
610
611<P>If the bitmap has a palette it maps each palette entry according to the
612supplied mapping, otherwise it maps each individual 24 bit pixel.
613
614<P>For example, if you get a 24 bit per pixel image from a Windows video
615capture program, the odds are in may be in a gamma corrected colour space
616with a gamma of 2.2.
617You can convert this to the L* cyclometric colour space used by PM by typing :-
618
619<P>
620<PRE>
621 gbmgamma -m p_to_l -g 2.2 captured.bmp nicepm.bmp
622</PRE>
623
624<P>The shelf option is primarily for when converting to a gamma corrected
625colour space for a specific monitor (when you aren't going to use PM to
626display the bitmap, and the display program doesn't do any correction).
627Some monitors don't actually start to light up pixels until the pixel
628values are a certain value.
629Normally <CODE>-s shelf</CODE> will not be used.
630<!--...e-->
631<!--...sGBMCPAL \45\ Map to Common Palette:0:-->
632<A NAME="gbmcpal">
633<H3>GBMCPAL - Map to Common Palette</H3></A>
634
635<P>
636<PRE>
637 usage: gbmcpal [-m map] [-v] n1 n2 n3 ifspec{,opt} ofspec{,opt}
638 flags: -m map mapping to perform (default freq6:6:6:256)
639 freqR:G:B:N map all bitmaps to same palette, worked
640 out using frequency of use histogram
641 mcutN map all bitmaps to same palette, worked
642 out using median cut algorithm
643 rofreqR:G:B:N:N2 map each bitmap to frequency palette,
644 reordered to minimise differences
645 between successive bitmaps
646 romcutN:N2 map each bitmap to median cut palette,
647 reordered to minimise differences
648 between successive bitmaps
649 R,G,B are bits of red, green and blue
650 to keep, N is number of unique colours,
651 N2 is extra palette entries
652 -v verbose mode
653 n1 n2 n3 for ( f=n1; f&lt;n2; f+=n3 )
654 ifspec printf(ifspec, f);
655 ofspec printf(ofspec, f);
656 filespecs are of the form fn.ext
657 ext's are used to deduce desired bitmap file formats
658 bitmap formats and options as before
659</PRE>
660
661<P>Given a set of bitmaps, it is possible to examine them all and compute
662a common palette for holding them, and then generate new bitmaps
663mapped to that palette.
664
665<P>The mappings available are frequency based and median-cut based.
666
667<P>Alternatively, it is possible to generate the most suitable palette
668for each frame, and then reorder the palettes of each bitmap so as to
669be as close as possible to its predecessor.
670
671<P>By reordering palettes (using <CODE>rofreq</CODE>/<CODE>romcut</CODE>)
672it is possible to remove almost all flicker on playback.
673From frame to frame, almost all palette entries in a given frame, have
674close entries in the previous frame.
675
676<P>However for a few, this is not true, and flicker may be seen.
677The <CODE>N2</CODE> parameter is designed to alleviate this.
678The process will handle the <CODE>N2</CODE> worst palette changes using
679<CODE>N2</CODE> extra palette entries.
680Thus the <CODE>N2</CODE> worst causes of flicker can be eliminated.
681A typical use might be :-
682
683<P>
684<PRE>
685 gbmcpal -m romcut240:16 0 100 1 in%02d.bmp out%02d.bmp
686</PRE>
687
688<P>This means map each frame to a palette with 240 unique colours in.
689Any given frame only uses 240 colours at most.
690But the palette is actually 240+16 colours in length, and the additional
69116 are used to eliminate flicker caused by the 16 worst matches.
692<!--...e-->
693<!--...e-->
694<!--...sColour spaces:0:-->
695<A NAME="colspace">
696<H2>Colour spaces</H2></A>
697
698<P>If a light is physically twice as bright, the eye does not necessarily see
699it as twice as bright.
700Also, if a pixel is written onto a monitor screen with twice the value,
701the physical intensity of the pixel is not necessarily double.
702
703<P>How exactly should numbers inside a bitmap file relate to physical or
704perceived intensitys when displayed on the screen?
705
706<P>In OS/2 PM perceived intensitys are proportional to the values in the bitmap
707file.
708Pixels in such a bitmap are in the 'L* cyclometric' colour space.
709
710<P>Ray Tracers often write pixel values in the bitmap proportional to the
711physical intensity computed for that ray.
712Such data is in the 'intensity' colour space.
713
714<P>Finally, if a bitmap holds values computed in such a way as to
715compensate for the gamma of the monitor (ie: intensitys transformed to
716cancel out the gamma of the monitor), then the data is in
717a 'gamma corrected' colour space.
718
719<P>So, if you have some Ray Tracer output, and you wish to display on an 8514
720monitor WITHOUT using OS/2 PM, then to get a decent colour rendition, you must
721map the bitmap from the 'intensity' to a 'gamma corrected' colour space.
722To do this you must know the gamma of the 8514 monitor (which is about 2.1).
723
724<P>Also, if you have some Ray Tracer output, and you wish to display on
725OS/2 PM, then to get a decent rendition you must map the bitmap from
726the 'intensity' to the 'L* cyclometric' colour space.
727
728<P><A HREF="#gbmgamma">GBMGAMMA</A> is a colour mapping program capable
729of performing mappings between any 2 of the 3 colour spaces above.
730
731<P>Mapping of this sort should really be done on 24 bit data, before
732error-diffusion or halftoning takes place.
733<!--...e-->
734<!--...sMaking bitmap animations:0:-->
735<A NAME="anim">
736<H2>Making bitmap animations</H2>
737
738<P>GBM was originally written as the bitmap handling portion of my homebrew
739Ray Tracer, RT.
740RT was originally written to allow me to trace snazzy animations.
741For example, here is what I did to make a spinning globe animation.
742
743<P>First I traced a largish number of individual bitmap frames using RT.
744I wrote these out under the names <CODE>globeNNN.tif</CODE> where
745<CODE>NNN</CODE> is <CODE>000</CODE>, <CODE>010</CODE>, <CODE>020</CODE>,
746... <CODE>350</CODE> (ie: the angle of rotation in degrees).
747I used the <CODE>,lzw</CODE> option to get the files
748written LZW encoded to reduce the disk space requirements.
749
750<P>Then to map the data to a common palette, I used
751<A HREF="#gbmcpal">GBMCPAL</A> :-
752
753<P>
754<PRE>
755 gbmcpal -m freq6:6:6:256 0 360 10 globe%03d.tif globe%03d.bmp
756</PRE>
757
758<P>Obviously there are file formats specifically for holding animations, and
759algorithms for having animations where palette entries vary from frame to
760frame, but the simple example above is ok for many purposes.
761<!--...e-->
762<!--...sExamples of use:0:-->
763<A NAME="examples">
764<H2>Examples of use</H2></A>
765
766<P>
767<PRE>
768 gbmhdr *.bmp *.tif
769 Displays the headers of all the bitmaps and TIFF files
770</PRE>
771<PRE>
772 gbmref file.bmp file.tga
773 Perform no reflection (no -h, -v or -t).
774 Hence simply converts file from Bitmap to Targa format!
775</PRE>
776<PRE>
777 gbmref -h larrow.tga rarrow.tga
778 Reflects larrow.tga to make rarrow.tga
779</PRE>
780<PRE>
781 gbmref -h -t profit.gif loss.gif
782 The combination of a horizontal flip with a transpose gives a 90
783 degree rotation clockwise. Thus a graph going up from bottom left
784 to top right, ends up going from top left to bottom right!
785</PRE>
786<PRE>
787 gbmref -v uarrow.pcx "darrow.lbm,xaspect=5,yaspect=6,xscreen=320,yscreen=200"
788 Reflects uarrow.pcx to make darrow.lbm
789 Output options defined for ILBM files used to write to aspect ratio
790 and screen size fields in output .lbm file.
791 Note: some command processors (such as OS/2 CMD.EXE) will split command
792 line arguments at spaces and commas, so we quote second argument.
793</PRE>
794<PRE>
795 gbmsub -x 100 -y 50 page.bmp
796 Trims 100 pixels off the left, and 50 off of the bottom
797 Note: no second filename given, so output overwrites page.bmp
798</PRE>
799<PRE>
800 gbmsize -w 1024 -h 768 strangesize.bmp screensized.bmp
801 Takes any bitmap and scales it to a typical SVGA screen size.
802</PRE>
803<PRE>
804 gbmbpp -m 7x8x4 24bit.tga 8bit.bpp
805 Maps a 24 RGB image to the 8514/A PM palette
806 Note: Source image format (Targa) not same as output format (Bitmap)
807</PRE>
808<PRE>
809 gbmbpp -m 7x8x4 -h 24bit.bmp nice8bit.bmp
810 As above but with halftoning
811</PRE>
812<PRE>
813 gbmbpp -m 7x8x4 -e 24bit.bmp nice8bit.bmp
814 As above, but with error diffusion
815</PRE>
816<PRE>
817 gbmbpp -m vga -e 24bit.bmp nice4bit.bmp
818 As above, but suitable for VGA display
819</PRE>
820<PRE>
821 gbmbpp -m 5:5:5 -e 8r8g8b.tga "5r5g5b.tga,16"
822 Error diffuse from 24 bit RGB to 15 bit RGB
823 (bottom 3 bits of each of R,G and B become zero)
824 Output option ",16" ensures data written in Targa-16 form
825 This reduces wasted disk space.
826</PRE>
827<PRE>
828 gbmbpp -m freq8:8:8:240 24bit.bmp 8bit.bmp
829 Finds 240 most frequently used colours.
830 For other colours finds closest match in most common 240 colours.
831 Maps colours in 24bit.bmp to give 8 bit output file.
832 If excessively large number of colours in original, may truncate bits.
833</PRE>
834<PRE>
835 gbmgamma -m i_to_l raytrace.bmp pmsuited.bmp
836 raytrace.bmp has pixels values proportional to physical intensity.
837 pmsuited.bmp is made with pixels proportional to perceived intensity.
838</PRE>
839<PRE>
840 gbmcpal -m freq6:6:6:256 0 360 10 globe%03d.bmp cpal%03d.bmp
841 Read globe000.bmp, globe010.bmp, ... globe350.bmp.
842 Compute a common shared palette.
843 Map each globeXXX.bmp file to a cpalXXX.bmp file.
844</PRE>
845<!--...e-->
846<!--...sRelated code:0:-->
847<A NAME="related">
848<H2>Related code</H2></A>
849
850<P>GBM was originally written as the file handling part of my homebrew
851ray tracer, RT.
852This may be found via my home page too.
853
854<P>My follow-on Modular Renderer package, currently in development, uses GBM.
855It does wire-frame, polygon rendering and raytracing.
856Not currently publically available.
857
858<P>Martin Lisowski informs me he is working on something he calls GBMV3,
859which is like the OS/2 PM GBMV2 viewer, only with extra features.
860It is currently "far from being ready, and still has bugs".
861
862<P>From time to time I notice people (other than myself) using GBM either
863in its precompiled DLL form, or by recompiling bits of the source.
864Sometimes people email me to let me know.
865
866<P>Of course, simply using the code unmodified makes it easier for you
867to pick up improvements in the code, as and when they happen.
868
869<P>IBM WebExplorer uses the Bitmap, GIF and XBM handling parts of GBM to
870some degree - in <CODE>webexwin.dll</CODE>, around byte offset 86924 (in my
871copy) are a whole load of GBM error strings.
872
873<P>IBM VisualAge C++ 3.0 for OS/2 uses large wedges of GBM source code.
874I think they're using it in their supplied <CODE>class IGBitmap</CODE>.
875This is apparent from the object filenames listed in
876<CODE>\ibmcpp\iocdll\cppoou3.rsp</CODE>
877and the exported function names in
878<CODE>\ibmcpp\iocdll\cppoou3.def</CODE>.
879
880<P>The IBM Person to Person personal conferencing system for OS/2 used
881the PCX and TIFF parts of GBM, and I think the AIX variant used whole loads
882more.
883
884<P>BITMAP32, a bitmap viewer for OS/2 PM, uses GBM.DLL unmodified.
885Because the IBM Developer Connection shipped BITMAP32, they ship GBM too.
886
887<P>BluePaint, an OS/2 PM painting program, being developed for
888Shareware (I think) uses GBM.DLL unmodified.
889<!--...e-->
890<!--...sLegal stuff:0:-->
891<A NAME="legal">
892<H2>Legal stuff</H2></A>
893
894<!--...sPublic domain declaration:0:-->
895<H3>Public domain declaration</H3>
896
897<P>I wrote all this code in my own time on my own equiptment.
898
899<P>I used public non-confidential information to do so.
900
901<P>I hereby place all this code into the public domain.
902
903<P>Feel free to do whatever you like with it.
904
905<P>No copyright / no royalties / no guarantees / no problem.
906
907<P>Caveat Emptor!
908
909<P>Anyone offering ideas/code must be happy with the above.
910
911<P>The above does not apply to the JPEG support.
912<!--...e-->
913<!--...sJPEG support:0:-->
914<H3>JPEG support</H3>
915
916<P>This section is applicable if you are using GBM with JPEG support.
917
918<P>The Independent JPEG Group JPEGLIB version 6a may be used provided
919they are credited, (which I do so here).
920
921<P>This software is based in part on the work of the Independent JPEG Group.
922
923<P>Martin Lisowski has donated <CODE>gbmjpg.c</CODE> to GBM and it is just as
924public domain as the rest of GBM.
925<!--...e-->
926<!--...sCompu\36\erve GIF Tax:0:-->
927<H3>Compu$erve GIF Tax</H3>
928
929<P>Both Unisys and IBM (and others) have various patents pertaining to the LZW
930algorithm used in GIF and LZW compressed TIFF files.
931
932<P>For many years Unisys have only licensed their LZW technology in hardware
933implementations (typically Modems).
934Now Unisys (through Compu$erve) are looking to license the use of LZW
935in software applications, such as GIF and TIFF.
936This is the infamous 'Compu$erve GIF Tax'.
937
938<P>Unisys have stated (in news postings) that non-commercial
939software need not be licensed.
940
941<P>Assuming this to be true, GBM will continue to
942support GIF and LZW compressed TIFF.
943
944<P>It is anticipated that this move will mean
945the death of LZW in image files, and that the Net will develop a replacement
946based on LZSS, LZ77, LZHUF, Yabba or other (hopefully) non-patented technology.
947The emerging PNG format could be exactly that.
948
949<P>If and when this occurs, there is a good chance GBM will support it.
950<!--...e-->
951<!--...e-->
952<!--...sChange Log:0:-->
953<A NAME="change">
954<H2>Change Log</H2></A>
955
956<P>
957<PRE>
95811/5/92 Initial general release.
959
96029/11/93 Supplied to IBM OS/2 Developer Connection.
961
9621/8/94 Submitted to Internet hobbes.nmsu.edu.
963
96410/1/95 Added gbm_version(), better error checking, const's.
965 Added clarification on LZW 'software patent'.
966 Submitted to hobbes.nmsu.edu.
967
96816/1/95 Added support for Portrait files (.CVP files).
969
97021/3/95 Fixed palettes in XIMG GemRas files (thanks Eero).
971 Fixed GIF writing transcol=edge, &amp; reading local colour tables.
972 Added GBMLOGO.EXE to ease use of MAKELOGO.EXE on DevCon CD 6.
973
97416/5/95 Distribution now uses InfoZIP ZIP.EXE, not PKZIP.EXE 2.04g.
975 Added Product Information dialog box to GBMV2.EXE.
976 Fixed GBMLOGO.EXE error message trap for non 640x400 bitmaps.
977
97825/3/96 Improved Bitmap reader to tolerate bad #colours in header.
979 Fixed reading XBitmaps with digits in their identifiers.
980 Added support for ilace flag on GIF output.
981
9821/4/96 Fixed reading XBitmaps with other chars in their identifiers.
983 Fixed interlaced GIF support.
984 Added Win32 makefile and compilability.
985 Added ability to cause GBM.DLL to use user defined I/O funcs.
986 Added accessibility of I/O funcs used by GBM.
987
98816/4/96 Applied fixes found by Wonkoo in 1/4/96 release.
989 Increase warning levels for OS/2 compile and cleaned up source.
990 Added /Os- to work around C-Set++ bug.
991
99229/4/96 Applied fix to GIF/TIFF readers found by David Wendt.
993
99419/6/96 Applied fixes found by Ralf and Andreas.
995 Fixed RLE4 Bitmap decoder (thanks for Marc for bug report).
996
99728/10/96 Changed over from IBM C-Set++ to IBM VisualAge C++ with CTC305.
998 Fixed 16bpp display bug in GBMV2.EXE.
999
100018/11/96 Added darkfg option on 1bpp BMP writing.
1001 Fixed printout of 1bpp bitmaps problem.
1002
10031/2/97 Changed colour-&gt;greyscale coefficients, as Wonkoo suggested.
1004 Added JPEG support.
1005 Changed documentation to HTML.
1006 Submitted to Internet hobbes.nmsu.edu.
1007
10081/5/98 Added initial Linux port.
1009 Support GIF files without EOI code in compressed data.
1010 Included source for OS/2 PM Scroller control.
1011
101212/7/98 Fixed writing 1bpp PCXs with reverse palettes (ta Wonkoo).
1013 Fixed OS/2 c0000005 Trap by increasing stack size (ta Gunter).
1014
10151/1/99 Added OS/2 _System Gbm_ entrypoints.
1016 Added support for filenames starting with -, via -- convention.
1017 Initial port to 32 bit DOS, via Watcom C/C++ and CauseWay.
1018
101920/1/99 Fixed reading of .pgm palettes (ta Wonkoo Kim).
1020 Fixed 2 low probability bugs in LZW encoders in GIF and TIFF.
1021
1022?/?/99 Change to gbmpgm.c and gbmppm.c to use \n in header.
1023 Splitting out of OS/2 specific stuff to seperate package.
1024 Fixed 32 bit DOS port to work properly with JPEG support.
1025
102621/11/99 Fixed reading OS/2 bitmaps with &lt; 2**N colours.
1027
102804/01/2000 Fixed reading of 24 bit GemRas image files.
1029
103012/05/2000 Improved TIFF and GIF LZW readers corrupt data detection.
1031 Improved TIFF LZW decompressor to work if EOI missing (ta Doug).
1032
103331/12/2000 A few minor tweaks to make source more friendly to Mac compiler.
1034 Basically factored in Karl Timmermann suggestions, fixed a few
1035 minor signed/unsigned char problems, and removed some #includes.
1036
103705/02/2001 gbmsize -a option, Jeroen Mosterts idea.
1038
103912/02/2001 gbmbpp -c palNbpp options to map to user defined palette.
1040
1041Future? Palette Manager capability in GBMV.EXE and GBMV2.EXE?
1042 Non-scaled and fixed scale print for GBMV2.EXE?
1043 Special logic for print to 1bpp and 3bpp printers for GBMV2.EXE?
1044 Photo-CD, RLE-Bitmap, G3-TIFF, G3-Bitmap for GBM.DLL?
1045 My free time is scarce - don't hold your breath!
1046</PRE>
1047<!--...e-->
1048<!--...sAuthor:0:-->
1049<HR>
1050This documentation is written and maintained by the GBM author, Andy Key
1051<ADDRESS>nyangau@interalpha.co.uk</ADDRESS>
1052<!--...e-->
1053
1054</BODY>
1055</HTML>
Note: See TracBrowser for help on using the repository browser.