BitMapSaver's doc $VER: BitMapSaver 1.3 (06/15/96) Author of documentation and object file: Jörg van de Loo. Date: 06/19/93 (updated 06/15/1996) FORMAT: BITMAPSAVER {<NAME>}TO{<NAME>}[OPT CMAP|SPRITE|C|QUICK|RAW|PEN|RAWHDR|SEPRIT|RGB32] FROM/A,TO/K,OPT/K/M,CMAP/S,SPRITE/S,C/S,QUICK/S,RAW/S,PEN/S,RAWHDR/S,SEPR IT/S,RGB32/S Description: With this little program it's possible to translate any IFF-ILBM file with less or equal 8 bitplanes to an assembler or C source which can be directly included. It's a Shellscript. quite old tool but one that can be used today from within a --------------------------------C SPRITE PEN RAW CMAP RGB32 SEPRIT RAWHDR QUICK Make code for the C-language, default assembler. Store data in the format needed by a SPRITE-object, default BitMaps. Store data as 8-bit pen-array instead of BitPlanes or sprite-object. Generate only binary data. Store 4-bit RGB colour table, default none. Store colour-values as V39 and up RGB32 colour format when option CMAP was chosen, default 4-bit. Split RAW-file, when option CMAP was chosen, into image and cmap-file. Write binary raw-file header instead of none if option RAW was chosen. Do it faster. Example: 4> bitmapsaver "work:dtp/pictures/gsx-r 750.iff" RAM:bike.c opt c cmap This will generate a file which can be used for the C-language, the data will be stored as bitplanes (each plane after another), the BitMapstructure is initialised but without pointed planes to it, the colour map is stored, too. ---- Generated code... ---C-language code... #ifndef #include #endif GRAPHICS_GFX_H "graphics/gfx.h" #ifndef #include #endif EXEC_TYPES_H "exec/types.h" struct BitMap NewBitMap = { 76, /* Bytes per row */ 60, /* Height */ 0, /* Flags */ 4, /* Depth */ 0, /* Strictly for longword adjustment */ 0, /* Pointer to plane 1 */ 0, /* Pointer to plane 2 */ 0, /* Pointer to plane 3 */ 0, /* Pointer to plane 4 */ 0, /* Pointer to plane 5 */ 0, /* Pointer to plane 6 */ 0, /* Pointer to plane 7 */ 0 /* Pointer to plane 8 */ }; UWORD BitMap_Data[] = /* Important Note: You have to force the datas on your own to chip-memory! Also you have to set the address of each plane to the Bitmap structure! */ { /* Plane1 */ ...., /* Plane2 */ ...., /* Plane3 */ ...., /* Plane4 */ .... }; UWORD Colors[16] = { 0x0AAA,0x0000,0x0EEE,0x068B,0x0E44,0x05D5,0x004D,0x0E90,0x0F60,0x0555, 0x0FE0,0x0080,0x00D0,0x00CC,0x006F,0x000A }; Asm-language code... _Bitmap dc.w dc.w ds.b dc.b ds.w dc.l dc.l dc.l dc.l dc.l dc.l dc.l dc.l 76 60 1 4 1 _Plane1 _Plane2 _Plane3 _Plane4 0 0 0 0 SECTION _Plane1 dc.w .... _Plane2 dc.w .... _Plane3 dc.w .... _Plane4 dc.w .... ; ; ; ; ; ; ; ; ; Bytes per row Number of lines Flags Depth Strictly for longword alignment ; Pointer to plane 1 ; Pointer to plane 2 ; Pointer to plane 3 ; Pointer to plane 4 Pointer to plane 5 Pointer to plane 6 Pointer to plane 7 Pointer to plane 8 "BITMAP",DATA_C ; Forced to chip memory SECTION "RGBColorTable",DATA _ColorTable dc.w $0AAA,$0000,$0EEE,$068B,$0E44,$05D5,$004D,$0E90,$0F60,$0555 dc.w $0FE0,$0080,$00D0,$00CC,$006F,$000A _CMAPNumEntries dc.w 16 ; Number of words The reason why the BitPlane-pointers aren't initialised for the Clanguage is because not all C-compilers/linkers support direct hunk-chip sections. Look into the file Box.c how to initialise them on your own. --------------------------------Sprites: Until Kickstart 3.0 a sprite had a maximum of 16 pixels in width, up from this Kickstart the maximum-width for a sprite has grown to 64 pixels. Because sprites have a maximum of 4 colours (depth=2 - without tricks!) BitMapSaver ever and only takes the first 2 bitplanes for the sprite image, the other are ignored. --------------------------------- Images: Images have almost the same binary format like bitplanes, only that image-bitplane-data are combined within one memory block, i.e. the normal and the select image can only lie after each other in memory: Image: 48 * 32 pixels, 3 bit planes (8 colours) Thus the normal image is stored first into memory: 48 / 8 * 32 * 3 = 576 bytes and right after this the select image is stored: 48 / 8 * 32 * 3 = 576 bytes makes a total of 1152 for both images. If you use a brush with more than one image, you have to reorder the bitplane format to the image format on your own; perhaps a future version of BitMapSaver should do the work? Taken out of "intuition/intuition.h|i" STRUCT(URE) Image(,0) WORD ig_LeftEdge ; starting offset relative to rastport's X offset (normally zero) WORD ig_TopEdge ; starting offset relative to rastport's Y offset (normally zero) WORD ig_Width ; width in pixels (must! be word-aligned) WORD ig_Height ; number of lines (rows) WORD ig_Depth ; depth (number of planes) APTR ig_ImageData ; pointer to the actual image data (Chip-RAM) BYTE ig_PlanePick ; bitmask for "plane(x) has to blit to display" BYTE ig_PlaneOnOff ; bitmask for plane data all one (1) or all zero (0) APTR ig_NextImage ; pointer to the next image or nil (LABEL ig_SIZEOF) To make pixel-width word-aligned (boundary 16): C: width = ((width + 7) & -8); ASM: move.w addq.w andi.w move.w width,d0 #7,d0 #-8,d0 d0,width PlanePick = 13 = % 00001101 - means: blit data as plane 0, 2, 3 but not plane 1! PlaneOnOff = 0 = % 00000000 - means: clear all data of plane 1 or PlaneOnOff = 2 = % 00000010 - means: set all data of plane 1 to one In this example the image has only 3 bitplanes where the image structure says there are four. This means that the image itself ( ImageData ) has only 3 planes. So in our example plane 0, 2 and 3 will be blitted to the corresponding bitplanes of the RastPort. If PlaneOnOff is set to zero, the concerned RastPort area of bitplane 1 is cleared, or if PlaneOnOff is set to 2, this area data will be set to one. For plain images use: PlanePick %00001111 = 15 PlaneOnOff %00000000 = 0 - means blit plane 0,1,2 and 3 - PlaneOnOff unused. Resume: Only where PlanePick's bitplanes taken to check for set or unset bits. are set to zero, PlaneOnOff is In our example this means in a 16-colour display all 4 bitplanes will be blitted to the display, if the display has less colours, only the affected bitplanes will be blitted. But, if the display has more colours (e.g. 256) the upper 4 bitplanes which are set to zero (%0000 0000 - PlaneOnOff) are cleared in the display. ¯¯¯¯ Example for a 16-colour image: PlanePick %00001111 = 15 OR PlaneOnOff %00000000 = 0 -15 - OK. PlanePick %00001111 = 15 OR PlaneOnOff %00001111 = 15 -15 - Also OK. PlanePick %00001111 = 15 OR PlaneOnOff %11111111 = 255 --255 - Wrong !!!! - means 256 colours. PlanePick %00001111 = 15 OR PlaneOnOff %00010000 = 16 -31 - Also wrong !!!! 32 colours. --------------------------------- QUICK: This option is only suitable when writing C- or assembler source codes. It will allocate a buffer (20 KB) where the data are written. When now this buffer is full, the contents of it are saved to disk. This gains a lot of time even if you are writing your data to a fast medium (e.g. RAM DISK). --------------------------------RAW: Sometimes it is not suitable to generate a source-code for images, e.g. when the images are so tall that MBs are needed to include them, e.g. a picture of 960*724 width and 8 planes will need 2,296,046 bytes of memory in ASCII form. Instead of it you may include directly the binary image data - here 695,552 bytes. You have to force those converted data on your own to Chipmemory (if required); also you have to create on your own a bitmap-structure (if needed) and compute each address for the bitplanes. --------------------------------PEN: This option is available when generating source codes ( C or Asm) and when writing raw-data. Instead of the output-data format "Bitplanes" it will force the data to an 8-bit pen array, which can "blitted" to the display (virtual screen) via: OS 1.x OS 2.x OS 3.1 and up SetAPen()/WritePixel() and up WritePixelArray8() WritePixelLine8() and up WriteChunkyPixels() This option is indeed useful if you have installed a 3rd party graphic board or - if you are in a surround of OS 3 and you want to adjust the pens to those of that screen. Even when you write games it is easier to use this format instead of bitplanes to let the background shine through a specified colour. Altough I know how to decode bitplane colour index' to the true-colour format I don't know if I should implement it into BitMapSaver, i.e. I have a written a utility (labelled Viewer) that already de- and encodes picture of 24 bit depth (including HAM6 and HAM8 images) to the true-colour format (RGB). If you are interested in such a conversion tell me. --------------------------------CMAP: Using this option enables either in the ASCII- or binary file. the storing of the 4-bit colour values --------------------------------RGB32: If the option "CMAP" was not chosen, this statement (RGB32) has no effect. It does only work in conjunction with the option "CMAP". If both are set (CMAP and! RGB32) the colour table is stored as 8-bit colour index which can be directly used by OS 3.x and up function LoadRGB32() or tag-item SA_Colors32. --------------------------------SEPRIT: When you have chosen the options "RAW" and "CMAP" for one image, the colourtable for this file is stored right behind the image data area. When now this connected file is loaded into Chip-memory, the RGB-colour table lies in Chip-memory, too. To avoid this, you may split this file into two; one will contain the image data, the other the colour-data. The keyword to do this is "SEPRIT". A file with the suffix ".cmap" is saved in the same directory as the file containing the image data, - when your image-file is named with a suffix, right in front of your suffix a second is stored, e.g. 4> bitmapsaver box.bsh to ram:Box.bin opt cmap raw seprit Result: RAM Disk:Box.bin RAM Disk:Box-cmap.bin or: 4> bitmapsaver box.bsh to ram:box opt cmap raw seprit Result: RAM Disk:box RAM Disk:box.cmap --------------------------------RAWHDR: RAWHDR means RAW-HEADER and will allow you to save the important informations of the image along with the raw-file when option RAW was chosen. The basic structure (header) is 16 bytes in size: struct RAWHEADER STRUCTURE RAWHEADER,0 { ULONG UWORD UWORD UBYTE UBYTE UWORD UWORD UWORD }; ID ID ID; ImageWidth; ImageHeight; Depth; kludgefill_0; Flags; BMWidth; Colors; ULONG rwh_ID UWORD rwh_ImageWidth UWORD rwh_ImageHeight UBYTE rwh_Depth UBYTE rwh_kludgefill_0 UWORD rwh_Flags UWORD rwh_BMWidth UWORD rwh_Colors LABEL rwh_SIZEOF = BMAP for non-interleaved bitmap data = PARY for pen array data ImageWidth = real image's width, e.g. 17 (0x11) ImageHeight = number of rows, e.g. 15 (0xF) Depth = number of bitplanes, e.g. 3 (0x3) kludgefill_0 = (ever) zero Flags = bit 0 set when this raw-data file contains a colour map at its end = bit 7 set when the colour map is stored in the RGB32 format BMWidth = boundary 16 of ImageWidth, 0x11 to 0x20 Colors = Number of used colours In our example an image of 17 * 15 pixel and 3 bitplanes without a colour map would look like this: BMAP 0011 000F 03 00 0000 0020 0008 or PARY 0011 000F 03 00 0000 0020 0008 When saved along with a colour map it could look like this: BMAP 0011 000F 03 00 0001 0020 0008 or PARY 0011 000F 03 00 0001 0020 0008 When the colour map is in the RGB32 format it would like this: BMAP 0011 000F 03 00 0081 0020 0008 or PARY 0011 000F 03 00 0081 0020 0008 NOTE: The BMAP type is ever aligned to a boundary of 16: (0x11 + 15) & -16 = 0x20 In our example (0x20 / 8 * 3) * 0xF = 180 bytes of pure data! [ 0x20 = aligned size of 0x11 = number of pixel in one row ] [ 8 = 1 byte of memory can hold 8 pixels ] [ 3 = three bitplanes ] [ 0xF = 15 rows ] The PARY type is not! aligned!!! 0x11 * 0xF = 255 bytes of pure data! To make the confusion perfect: the colour map can lie at an odd offset, in our example at offset (255 + 16 =) 271!!!! A good thing is to use DOS-function Read(): Read first 16 bytes of file! Check type: if BMAP compute length: BMWidth / 8 * Depth * ImageHeight Read the amount computed data into data-buffer Check Flags for colour map if 4-bit colour map: Double Colors, since WORDs have been stored (Colors * 2) Read amount computed data into colour-buffer if an 8-bit colour map compute: Colors * 3 * 4 + 8 (e.g.: 8 colours = 8 * 3 = 24 LONG WORDs 24 LONG WORDs * 4 = 96 bytes plus 8 bytes (2 LONG WORDs) makes a total of 104 bytes ) Read amount computed data into colour-buffer if PARY compute length: ImageWidth * ImageHeight Read the amount computed data into data-buffer Check Flags for colour map if 4-bit colour map: Double Colors, since WORDs have been stored (Colors * 2) Read amount computed data into colour-buffer if an 8-bit colour map compute: Colors * 3 * 4 + 8 (e.g.: 8 colours = 8 * 3 = 24 LONG WORDs 24 LONG WORDs * 4 = 96 bytes plus 8 bytes (2 LONG WORDs) makes a total of 104 bytes ) Read amount computed data into colour-buffer --------------------------------By the way: BitMapSaver is a re-entrant code; you may use the command Resident. Up from Workbench 2.1 or Kickstart 3.0 the dos-errors will appear in your native-language. Copyright: BitMapSaver's object file and the source-code are Freeware. It's strictly forbidden to spread the source-code of BitMapSaver to other public-domain series as those created by Fred Fish. It's allowed to upload the object file and documentation of BitMapSaver to Aminet. It's not allowed to enclose the Amiga load-file called BitMapSaver to commercial programs without my written permission. Needless to say that I can't be held for any errors may happen using BitMapSaver. (C) 1993 - 1996 J.v.d.Loo (ONIX)