home *** CD-ROM | disk | FTP | other *** search
- /* superview/svgfxbuffer.h */
- /* Version : 11.3 */
- /* Date : 30.04.1995 */
- /* Written by : Andreas R. Kleinert */
-
- #ifndef SUPERVIEW_SVGFXBUFFER_H
- #define SUPERVIEW_SVGFXBUFFER_H
-
- #ifndef SUPERVIEW_SUPERVIEW_H
- #include <superview/superview.h>
- #endif /* SUPERVIEW_SUPERVIEW_H */
-
-
- struct SV_GfxBuffer
- {
- /* All pointers (e.g. svgfx_Buffer) have to be and are AllocVec()'ed
- (as well as usually the structure itself).
-
- If you did not allocate SV_GfxBuffers by yourself, you must
- neither free them nor do write-accesses to them.
-
- If you allocated them by yourself, you also have to free them
- by yourself - if no one else is still accessing them.
- */
-
- ULONG svgfx_Version; /* structure version, see below */
-
- ULONG svgfx_BufferType; /* Data organization, see below */
-
- ULONG svgfx_Width; /* Graphic's Width */
- ULONG svgfx_Height; /* Graphic's Height */
- ULONG svgfx_ColorDepth; /* Graphic's ColorDepth */
- ULONG svgfx_ViewMode32; /* if NULL, best ScreenMode is suggested */
- /* (results in LowRes, if not changed). */
-
- UBYTE svgfx_Colors[256][3]; /* For ColorDepth <= 8 : 3-Byte RGB entries */
-
- /*
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- begin of "case-dependent" entries
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-
- ONLY if svgfx_BufferType == SVGFX_BUFFERTYPE_BITPLANE, else NULL.
-
- svgfx_BytesPerLine :
-
- size of one row
- of a plane in Bytes
- = Bytes per Row : (( [width] +7)>>3)
- Number of Rows per Plane : [height]
- Number of Planes : [depth]
-
- */
-
- ULONG svgfx_BytesPerLine; /* see above */
- ULONG svgfx_PixelBits; /* see below */
-
- /*
- ONLY if svgfx_BufferType == SVGFX_BUFFERTYPE_ONEPLANE, else NULL.
-
- svgfx_PixelBits :
-
- Bits Per Pixel
- (8, 16, 24, ...)
- => Bytes per Row : (svgfx_PixelBits>>3) * [width]
- Number of Rows per Plane : [height]
- Number of Planes : ONE
-
- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- end of "case-dependent" entries
- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- */
-
-
- APTR svgfx_Buffer; /* any kind of memory (no chip ram needed) */
- ULONG svgfx_BufferSize; /* if you want to copy it ... */
-
- /* ----------------------------------------------------------------------- */
- /* Begin of Version 2 entries: Check Version before reading further */
- /* ----------------------------------------------------------------------- */
-
- ULONG svgfx_NativeDIPF; /* This one contains the DIPF_-Flags, which */
- /* have been native to the original ViewMode */
- /* of the graphics. So you may determine */
- /* whether a graphics is HAM, EHB or such. */
- /* May be NULL for non-Amiga sources. */
-
- /* ----------------------------------------------------------------------- */
- /* Size of structure may grow in future versions... */
- /* ----------------------------------------------------------------------- */
- };
-
- #define SVGFX_VERSION (1) /* this is the minimum */
- #define SVGFX_ACT_VERSION (2) /* this is the current max. version */
-
- /* When copying a GfxBuffer you usually refer to
- sizeof(struct SV_GfxBuffer), which differs from version to version.
- So you have to check, whether svgfx_Version is > SVGFX_ACT_VERSION.
- If it is, just set svgfx_Version = SVGFX_ACT_VERSION, else
- keep it untouched (or maybe set the version you need).
- */
-
- #define SVGFX_BUFFERTYPE_BITPLANE (1) /* Amiga-like BitPlanes (unaligned) */
- #define SVGFX_BUFFERTYPE_ONEPLANE (2) /* single Byte-/Word-/24 Bit-Plane */
-
- /* there may be more types in the future */
- /* (at least reject all types > 2) */
-
-
- /*
- Some words about interpreting and using SV_GfxBuffer structures
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- SVGFX_BUFFERTYPE_BITPLANE
- =========================
-
- SVGFX_BUFFERTYPE_BITPLANE means, that there's plane stored after plane,
- but _no padding_ of the lines is done (e.g. to word- or longword-
- boundaries), which is different from Amiga-BPs or ACBM-ABITs :
-
- | line 1 of plane 1 | (each with svgfx_BytesPerLine)
- | ... |
- | line [height] of plane 1 |
-
- ...
-
- | line 1 of plane [] |
- | ... |
- | line [height] of plane [] |
-
- ...
-
- | line 1 of plane [depth] |
- | ... |
- | line [height] of plane [depth] |
-
-
- SVGFX_BUFFERTYPE_BITPLANE is only used upto 256 Colors at the time :
- 16 and 24 Bit data will usually not be stored this way.
-
-
- SVGFX_BUFFERTYPE_ONEPLANE
- =========================
-
- SVGFX_BUFFERTYPE_ONEPLANE means, that there's only one single plane stored.
- The size of one pixel in this plane is defined in svgfx_PixelBits
- (currently 8 for ChunkyPixel graphics or 24 for 24 Bit graphics).
-
- | line 1 with ([PixelBits] / 8) * [width] Bytes |
- | ... |
- | line [height] with ([PixelBits] / 8) * [width] Bytes |
-
-
- 8 Bit : Chunky Pixel (ColorMap) = 8 ; ColorRegister index
- 16 Bit : R:G:B = 5:5:5:1 ; + 1 Bit Alpha Channel : IGNORED
- 24 Bit : R:G:B = 8:8:8 ; RGB-value
-
-
- So 8 Bit Data contains [width] bytes in a row,
- 16 Bit Data contains [width]*2 bytes in a row
- and 24 Bit Data contains [width]*3 bytes in a row.
-
- Currently you will not find any SV_GfxBuffers with 16 Bit data,
- but this may change in the future.
-
-
- Differences, which perhaps are not obviously
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- In SV_GfxBuffer structures there are two "case-dependent" entries
- (see structure definition of SV_GfxBuffer) :
-
- BITPLANE : svgfx_BytesPerLine = ( [width] +7 )>>3
- svgfx_PixelBits = 0; ** IGNORE IT
- svgfx_ColorDepth = [number of planes]
-
- ONEPLANE : svgfx_BytesPerLine = 0; ** IGNORE IT
- svgfx_PixelBits = 8; ** or == 24
- svgfx_ColorDepth = [used PixelBits]
-
-
- svgfx_ColorDepth always describes the _real_ ColorDepth of the graphics,
- which means the stored number of planes for BITPLANE data and the number
- of _actually_ used pixelbits for ONEPLANE data.
-
- If svgfx_PixelBits is 24, svgfx_ColorDepth will perhaps always be 24, too.
- But if svgfx_PixelBits is 8, it may be anything between 1 and 8.
-
- The reason is, that e.g. GIF pictures are always stored 8 Bit-wide,
- no matter if they contain 4, 8 or 256 Colors.
- This is just because these 8 Bit are simply a ColorRegister index
- (into the field of RGB-Colors : svgfx_Colors).
-
- OK, there's no problem in displaying a ONEPLANE-8 graphics on a 256 Color
- Screen, no matter which value svgfx_ColorDepth actually contains.
- But if svgfx_ColorDepth is, let's say, only 4, this will be just a
- waste of memory (and the last 256-16 = 240 colors will be black, anyway).
-
- So finally we can say, that the data in a ONEPLANE SV_GfxBuffer is just
- stored the same way, as e.g. in ChunkyPixel modes of VGA-like Graphic Cards
- or in the source-buffers for GfxLibs's WritePixelLine8().
- (See "graphics.library"'s AutoDocs for more information on ChunkyPixel
- buffer (PixelLine8) handling under V37-40 with ECS/AGA or RTG).
-
-
- Which kind of data-storage is more likely ?
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The way of data-storage only depend on the specific SVObject.
-
- Some Examples :
-
- FileType BufferType PixelBits ColorDepth
-
- GIF ONEPLANE 8 1..8
- ILBM BITPLANE - 1..8
- JPEG ONEPLANE 8/24 8/24
-
-
- So any program, which supports GfxBuffers should handle both formats.
- This is not difficult, since superviewsupport.library
- contains functions to convert ONEPLANE buffers into BITPLANE buffers
- and vice versa.
- So you actually only have to support one of the data-storage alternatives.
-
- (See Example-SourceCodes for more and detailed information !)
- */
-
- #endif /* SUPERVIEW_SVGFXBUFFER_H */
-