Additional documentation and document layout changes.

This commit is contained in:
Wayne Venables
2023-03-03 23:31:17 -08:00
parent 085f467ea4
commit 30385af67f
6 changed files with 416 additions and 109 deletions

226
DoxygenLayout.xml Normal file
View File

@@ -0,0 +1,226 @@
<doxygenlayout version="1.0">
<!-- Generated by doxygen 1.8.17 -->
<!-- Navigation index tabs for HTML output -->
<navindex>
<tab type="mainpage" visible="yes" title=""/>
<tab type="pages" visible="yes" title="" intro=""/>
<tab type="modules" visible="yes" title="Functions" intro=""/>
<tab type="namespaces" visible="yes" title="">
<tab type="namespacelist" visible="yes" title="" intro=""/>
<tab type="namespacemembers" visible="yes" title="" intro=""/>
</tab>
<tab type="interfaces" visible="yes" title="">
<tab type="interfacelist" visible="yes" title="" intro=""/>
<tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="interfacehierarchy" visible="yes" title="" intro=""/>
</tab>
<tab type="classes" visible="yes">
<tab type="classlist" visible="yes" title="" intro=""/>
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="hierarchy" visible="yes" title="" intro=""/>
<tab type="classmembers" visible="yes" title="" intro=""/>
</tab>
<tab type="structs" visible="yes" title="">
<tab type="structlist" visible="yes" title="" intro=""/>
<tab type="structindex" visible="$ALPHABETICAL_INDEX" title=""/>
</tab>
<tab type="exceptions" visible="yes" title="">
<tab type="exceptionlist" visible="yes" title="" intro=""/>
<tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="exceptionhierarchy" visible="yes" title="" intro=""/>
</tab>
<tab type="files" visible="yes" title="">
<tab type="filelist" visible="yes" title="" intro=""/>
<tab type="globals" visible="yes" title="" intro=""/>
</tab>
<tab type="examples" visible="yes" title="" intro=""/>
</navindex>
<!-- Layout definition for a class page -->
<class>
<briefdescription visible="yes"/>
<includes visible="$SHOW_INCLUDE_FILES"/>
<inheritancegraph visible="$CLASS_GRAPH"/>
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
<memberdecl>
<nestedclasses visible="yes" title=""/>
<publictypes title=""/>
<services title=""/>
<interfaces title=""/>
<publicslots title=""/>
<signals title=""/>
<publicmethods title=""/>
<publicstaticmethods title=""/>
<publicattributes title=""/>
<publicstaticattributes title=""/>
<protectedtypes title=""/>
<protectedslots title=""/>
<protectedmethods title=""/>
<protectedstaticmethods title=""/>
<protectedattributes title=""/>
<protectedstaticattributes title=""/>
<packagetypes title=""/>
<packagemethods title=""/>
<packagestaticmethods title=""/>
<packageattributes title=""/>
<packagestaticattributes title=""/>
<properties title=""/>
<events title=""/>
<privatetypes title=""/>
<privateslots title=""/>
<privatemethods title=""/>
<privatestaticmethods title=""/>
<privateattributes title=""/>
<privatestaticattributes title=""/>
<friends title=""/>
<related title="" subtitle=""/>
<membergroups visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
<memberdef>
<inlineclasses title=""/>
<typedefs title=""/>
<enums title=""/>
<services title=""/>
<interfaces title=""/>
<constructors title=""/>
<functions title=""/>
<related title=""/>
<variables title=""/>
<properties title=""/>
<events title=""/>
</memberdef>
<allmemberslink visible="yes"/>
<usedfiles visible="$SHOW_USED_FILES"/>
<authorsection visible="yes"/>
</class>
<!-- Layout definition for a namespace page -->
<namespace>
<briefdescription visible="yes"/>
<memberdecl>
<nestednamespaces visible="yes" title=""/>
<constantgroups visible="yes" title=""/>
<interfaces visible="yes" title=""/>
<classes visible="yes" title=""/>
<structs visible="yes" title=""/>
<exceptions visible="yes" title=""/>
<typedefs title=""/>
<sequences title=""/>
<dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
<membergroups visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
<memberdef>
<inlineclasses title=""/>
<typedefs title=""/>
<sequences title=""/>
<dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
</memberdef>
<authorsection visible="yes"/>
</namespace>
<!-- Layout definition for a file page -->
<file>
<briefdescription visible="yes"/>
<includes visible="$SHOW_INCLUDE_FILES"/>
<includegraph visible="$INCLUDE_GRAPH"/>
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
<sourcelink visible="yes"/>
<memberdecl>
<interfaces visible="yes" title=""/>
<classes visible="yes" title=""/>
<structs visible="yes" title=""/>
<exceptions visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<constantgroups visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
<sequences title=""/>
<dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
<membergroups visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
<memberdef>
<inlineclasses title=""/>
<defines title=""/>
<typedefs title=""/>
<sequences title=""/>
<dictionaries title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
</memberdef>
<authorsection/>
</file>
<!-- Layout definition for a group page -->
<group>
<briefdescription visible="no"/>
<detaileddescription title="Description"/>
<groupgraph visible="$GROUP_GRAPHS"/>
<memberdecl>
<nestedgroups visible="yes" title=""/>
<dirs visible="yes" title=""/>
<files visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<classes visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
<sequences title=""/>
<dictionaries title=""/>
<enums title=""/>
<enumvalues title=""/>
<functions title=""/>
<variables title=""/>
<signals title=""/>
<publicslots title=""/>
<protectedslots title=""/>
<privateslots title=""/>
<events title=""/>
<properties title=""/>
<friends title=""/>
<membergroups visible="yes"/>
</memberdecl>
<memberdef>
<pagedocs/>
<inlineclasses title=""/>
<defines title=""/>
<typedefs title=""/>
<sequences title=""/>
<dictionaries title=""/>
<enums title=""/>
<enumvalues title=""/>
<functions title=""/>
<variables title=""/>
<signals title=""/>
<publicslots title=""/>
<protectedslots title=""/>
<privateslots title=""/>
<events title=""/>
<properties title=""/>
<friends title=""/>
</memberdef>
<authorsection visible="yes"/>
</group>
<!-- Layout definition for a directory page -->
<directory>
<briefdescription visible="yes"/>
<directorygraph visible="yes"/>
<memberdecl>
<dirs visible="yes"/>
<files visible="yes"/>
</memberdecl>
<detaileddescription title=""/>
</directory>
</doxygenlayout>

View File

@@ -275,7 +275,7 @@ TCL_SUBST =
# members will be omitted, etc.
# The default value is: NO.
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_FOR_C = YES
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored

View File

@@ -12,8 +12,8 @@
#ifndef _PICOVGA_H
#define _PICOVGA_H
//!@addtogroup VideoInit Video Initialization
//!@addtogroup VideoMode Video mode configuration
//!@addtogroup VideoInit Video/Library Initialization
//!@addtogroup VideoMode Configurating Video Mode
//!@addtogroup Screen Screen layout
typedef signed char s8;

View File

@@ -114,9 +114,10 @@ void ScanlineTypePrint(const u8* scan, int lines);
// - All layer modes must use same layer program (LAYERMODE_BASE = overlapped layers are OFF)
void VgaInit(const sVmode* vmode); //, u8 layer1mode=LAYERMODE_BASE, u8 layer2mode=LAYERMODE_BASE, u8 layer3mode=LAYERMODE_BASE);
//!@addtogroup VideoInit Video Initialization
//!@brief Functions for initialzing the library
//!@{
//! @addtogroup VideoInit
//! @brief Functions for initialzing the library
//! @details The video mode can be initialized either simply by the Video() function or in more detail by the following functions.
//! @{
/**
* @brief Start the VGA processing on core1
@@ -126,25 +127,25 @@ void StartVgaCore();
/**
* @brief Request to initialize VGA videomode
* @details This function passes the library a pointer to the format descriptor generated by the VgaCfg function.
* @details This function passes the library a pointer to the format descriptor generated by the VgaCfg() function.
* This function does not actually initialize the video mode, it just passes the pointer to the library in the 2nd
* processor core and then waits for confirmation that the initialization is complete. If the video mode needs to
* be changed (this refers to changing the timing of the video signal and changing the type of overlay layers), it
* is necessary to first stop the video generation by calling the VgaInitReq function with the NULL parameter, and
* only then call the function with the new video mode setting.
* @param vmode Video format description generated by VgaCfg or NULL to stop driver.
* @param vmode Video format description generated by VgaCfg() or NULL to stop driver.
*/
void VgaInitReq(const sVmode* vmode);
//!@}
//! @}
//!@addtogroup Core Second core
//!@brief Execute functions on the second core
//!@details If the 2nd core is not too busy generating the video, it can be passed a request to perform the function.
//! @addtogroup Core Second core
//! @brief Execute functions on the second core
//! @details If the 2nd core is not too busy generating the video, it can be passed a request to perform the function.
//! This does not affect the video generation, it may just happen that the requested function runs slowly when the
//! generator is heavily loaded. The function cannot use interrupts, cannot disable interrupts, and may be restricted
//! from using the hardware interpolator (video interrupt does not save its state).
//!@{
//! @{
/**
* @brief Execute remote function on second core

View File

@@ -8,7 +8,7 @@
#ifndef _VGA_SCREEN_H
#define _VGA_SCREEN_H
//!@addtogroup Screen Screen layout
//!@addtogroup Screen
//!@brief Defining the layout of the display
//!@details When displaying screen image, the default pointer is pScreen for the library. It points to the sScreen structure that
//!describes the contents of the display. The Raspberry Pico has a limited RAM size and cannot accommodate a high resolution image. Therefore, the image must be composed of smaller segments to minimize the memory-intensive parts.
@@ -124,7 +124,7 @@ void ScreenSegmGraph8(sSegm* segm, const void* data, int wb);
/**
* @brief Generate 16-color palette translation table
* @details Generates a palette translation table for the @link ScreenSegmGraph4() function. The translation table is 256 entries of
* @details Generates a palette translation table for the ScreenSegmGraph4() function. The translation table is 256 entries of
* 16 bits, so it takes 512 bytes in memory. The table is used during display for internal purposes, must be aligned to 4 bytes,
* and must be available for the entire time the segment is displayed. The input to the function is the palette table, which is
* 16 color entries of 1 byte.
@@ -147,7 +147,7 @@ void ScreenSegmGraph4(sSegm* segm, const void* data, const void* trans, int wb);
/**
* @brief Generate palette 4 translation table for function
* @details Generate a palette translation table for the @link ScreenSegmGraph2() function. The translation table is 256 entries with
* @details Generate a palette translation table for the ScreenSegmGraph2() function. The translation table is 256 entries with
* a size of 32 bits, so it takes 1024 bytes in memory. The table is used during display for internal purposes, must be aligned
* to 4 bytes, and must be available for the entire time the segment is displayed. The input to the function is the palette table,
* which is 4 color entries of 1 byte.
@@ -290,7 +290,7 @@ void ScreenSegmTile(sSegm* segm, const void* data, const void* tiles, int w, int
/**
* @brief Set video segment to alternate tiles
* @details Tiles in a row (GF_TILE2). This function is an alternative to @link ScreenSegmTile(), except that the tile patterns
* @details Tiles in a row (GF_TILE2). This function is an alternative to ScreenSegmTile(), except that the tile patterns
* are arranged in a single row in the image. This may be more convenient when creating a tile image, however, you must
* additionally specify the parameter 'tilewb' representing the line length of the tile image.
* Usually tilewb = number of tiles * tile width.
@@ -360,8 +360,8 @@ void ScreenSegmOscil(sSegm* segm, const void* data, u8 bg, u8 fg, int pixh);
void ScreenSegmOscLine(sSegm* segm, const void* data, u8 bg, u8 fg);
/**
* @brief Generate palette 4-color translation table for function @link ScreenSegmPlane2()
* @details Generate a palette translation table for the @link ScreenSegmPlane2() function. The translation table is 256 entries of
* @brief Generate palette 4-color translation table for function ScreenSegmPlane2()
* @details Generate a palette translation table for the ScreenSegmPlane2() function. The translation table is 256 entries of
* 32 bits, so it takes 1024 bytes in memory. The table is used during display for internal purposes, must be aligned to 4 bytes,
* and must be available for the entire time the segment is displayed. The input to the function is the palette table, which is
* 4 color entries of 1 byte. Although there is no program in the PicoVGA library utilities that prepares an image in 2-plane
@@ -372,102 +372,177 @@ void ScreenSegmOscLine(sSegm* segm, const void* data, u8 bg, u8 fg);
*/
void GenPal4Plane(u32* trans, const u8* pal);
// set video segment to 4-color on 2-planes graphics
// data = pointer to data buffer
// plane = offset of 2nd graphics plane (in bytes), size of one graphics plane
// trans = pointer to 4-color palette translation table (generated with GenPal4Plane function)
// wb = pitch - number of bytes between lines
// To scroll image, set virtual dimension wrapx and wrapy, then shift offx and offy.
/**
* @brief Set video segment to 4-color on 2-planes graphics
* @details 2-bit palette graphics 4 colors in 2 planes (GF_PLANE2). The mode is functionally similar to the 2-bit color
* graphics mode, but the individual pixel bits are stored in 2 separate color planes. This mode is similar to the CGA
* graphics mode of PC computers. The individual planes correspond to two separate monochrome graphics modes. Each byte
* of the plane contains 8 pixels (the first pixel in the highest bit). The parameter 'plane' is the relative offset of
* the second plane from the first plane, given by the parameter 'data'. The function requires a palette translation table,
* which is generated by the GenPal4Plane() function.
* @note To scroll image, set virtual dimension wrapx and wrapy, then shift offx and offy.
* @param segm Segment to configure
* @param data Pointer to data buffer
* @param plane Offset of 2nd graphics plane (in bytes), size of one graphics plane
* @param trans Pointer to 4-color palette translation table (generated with GenPal4Plane function)
* @param wb Number of bytes between lines
*/
void ScreenSegmPlane2(sSegm* segm, const void* data, int plane, const void* trans, int wb);
// set video segment to 2x4 bit color attribute per 8x8 pixel sample graphics
// data = pointer to data buffer with mono pixels
// attr = pointer to color attributes
// pal = pointer to 16-color palette table
// wb = pitch - number of bytes between lines
// To scroll image, set virtual dimension wrapx and wrapy, then shift offx and offy.
/**
* @brief Set video segment to 2x4 bit color attribute per 8x8 pixel sample graphics
* @details Graphical mode with attributes (GF_ATTRIB8). This mode is known from ZX Spectrum computers. The 'data' parameter
* is a pointer to the pixel data. This corresponds to the monochrome display mode, where each bit distinguishes whether
* foreground or background color is used. The 'attr' parameter is a pointer to an array of color attributes. The color
* attribute is a byte, where the lower 4 bits represent the foreground color and the upper 4 bits the background color.
* The attribute is converted to a colored pixel using the palette table 'pal', which is an array of 16 bytes of colors.
* Each attribute specifies the foreground and background colors for a group of 8 x 8 pixels. Thus, for every 8 bytes of pixels,
* there is 1 byte of color attributes. The 'wb' parameter here specifies the line width in bytes for both the pixel array and
* the attribute array. The difference is that the address in the attributes array is not incremented after each line, but after
* 8 lines.<br /><br />
* Although there is no program in the PicoVGA library utilities that prepares an image in attribute mode, there is an internal
* function Attr8Conv that converts an image in 16 colors to attribute mode. Thus, the image is attached to the program as a
* 16-color image, and the conversion function is used to prepare a copy in RAM.
* @note To scroll image, set virtual dimension wrapx and wrapy, then shift offx and offy.
* @param segm Segment to configure
* @param data Pointer to data buffer with mono pixels
* @param attr Pointer to color attributes
* @param pal Pointer to 16-color palette table
* @param wb Number of bytes between lines
*/
void ScreenSegmAttrib8(sSegm* segm, const void* data, const void* attr, const u8* pal, int wb);
// set video segment to horizontal progress indicator GF_PROGRESS
// data = pointer to buffer with values 0..255 of 4-pixels in rows
// sample1 = scanline sample < data
// sample2 = scanline sample >= data
/**
* @brief Set video segment to horizontal progress indicator GF_PROGRESS
* @details Progress indicator (GF_PROGRESS). Progress indicator is a horizontal indicator. The parameter 'data' is an array of
* bytes of length corresponding to the height of the segment. The byte value indicates the line length in multiples of 4 pixels.
* Thus, a value of 0 to 255 represents an indicator length of 0 to 1020 pixels. For the first part of the indicator (< data)
* the colour gradient 'sample1' is displayed, for the second part (>= data) 'sample2' is displayed.
* @param segm Segment to configure
* @param data Pointer to buffer with values 0..255 of 4-pixels in rows
* @param sample1 Scanline sample < data
* @param sample2 Scanline sample >= data
*/
void ScreenSegmProgress(sSegm* segm, const void* data, const void* sample1, const void* sample2);
// set video segment to 8-bit graphics with 2D matrix transformation
// data = pointer to image data (width and height of image must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// xbits = number of bits of image width (image width must be power of 2 and must be = pitch width bytes)
// ybits = number of bits of image height (image height must be power of 2)
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to 8-bit graphics with 2D matrix transformation
* @details 8-bit graphics with 2D matrix transformation. This segment displays an 8-bit image with transformations - rotate,
* scale, skew and shift. The image must have width and height as a power of 2. The width and height of the image are specified
* using the xbits and ybits parameters as the number of bits of the dimension. For example, for a 512 x 256 pixel image,
* xbits = 9, ybits = 8. The 'mat' parameter is a pointer to an array of 6 integer transformation matrix parameters - see the
* Transformation matrix section. The segment does not support parameters for image shifting and wrapping, they must be left at
* default values.
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param data Pointer to image data (width and height of image must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param xbits Number of bits of image width (image width must be power of 2 and must be = pitch width bytes)
* @param ybits Number of bits of image height (image height must be power of 2)
*/
void ScreenSegmGraph8Mat(sSegm* segm, const void* data, const int* mat, u16 xbits, u16 ybits);
// set video segment to 8-bit graphics with perspective projection
// data = pointer to image data (width and height of image must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// xbits = number of bits of image width (image width must be power of 2 and must be = pitch width bytes)
// ybits = number of bits of image height (image height must be power of 2)
// horiz = horizon offset
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to 8-bit graphics with perspective projection
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param data Pointer to image data (width and height of image must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param xbits Number of bits of image width (image width must be power of 2 and must be = pitch width bytes)
* @param ybits Number of bits of image height (image height must be power of 2)
* @param horiz Horizon offset
*/
void ScreenSegmGraph8Persp(sSegm* segm, const void* data, const int* mat, u16 xbits, u16 ybits, u16 horiz);
// set video segment to tiles with perspective
// map = pointer to tile map with tile indices (width and height must be power of 2)
// tiles = pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// mapwbits = number of bits of tile map width
// maphbits = number of bits of tile map height
// tilebits = number of bits of tile width and height
// horizon = horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to tiles with perspective
* @details Tile graphics with 3D perspective. Similar to the previous function, it is used to display terrain with 3D projection.
* It uses tile definition instead of 8-bit graphics. This allows the display of very large terrains. The 'map' parameter is a
* pointer to a map of tiles - tile indices 0 to 255. The width and height of the map must be powers of 2 and are specified as the
* number of mapwbits and maphbits. Tiles must have a square dimension, which must also be a power of 2. The tile dimension is
* specified by the tilebits parameter as the number of dimension bits. The 'tiles' parameter is a pointer to an image with a
* pattern of tiles arranged in 1 column of tiles. The 'horizon' parameter specifies the horizon offset over the segment boundary
* / 4. A positive number represents the horizon offset, a negative number will invert the perspective (can be used to display
* the sky). A zero value turns off the perspective - in this case the function is similar to the function for displaying an image
* with a transformation matrix (the array of tiles can be rotated, skewed, etc).
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param map Pointer to tile map with tile indices (width and height must be power of 2)
* @param tiles Pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param mapwbits Number of bits of tile map width
* @param maphbits Number of bits of tile map height
* @param tilebits Number of bits of tile width and height
* @param horizon Horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
*/
void ScreenSegmTilePersp(sSegm* segm, const u8* map, const u8* tiles, const int* mat,
u8 mapwbits, u8 maphbits, u8 tilebits, s8 horizon);
// set video segment to tiles with perspective, 1.5 pixels
// map = pointer to tile map with tile indices (width and height must be power of 2)
// tiles = pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// mapwbits = number of bits of tile map width
// maphbits = number of bits of tile map height
// tilebits = number of bits of tile width and height
// horizon = horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to tiles with perspective, 1.5 pixels
* @details Similar to ScreenSegmTilePersp(), but the pixels are rendered 1.5 pixels wide. This function can be used if
* the previous function does not keep up with the rendering speed.
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param map Pointer to tile map with tile indices (width and height must be power of 2)
* @param tiles Pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param mapwbits Number of bits of tile map width
* @param maphbits Number of bits of tile map height
* @param tilebits Number of bits of tile width and height
* @param horizon Horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
*/
void ScreenSegmTilePersp15(sSegm* segm, const u8* map, const u8* tiles, const int* mat,
u8 mapwbits, u8 maphbits, u8 tilebits, s8 horizon);
// set video segment to tiles with perspective, double pixels
// map = pointer to tile map with tile indices (width and height must be power of 2)
// tiles = pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// mapwbits = number of bits of tile map width
// maphbits = number of bits of tile map height
// tilebits = number of bits of tile width and height
// horizon = horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to tiles with perspective, double pixels
* @details Similar to ScreenSegmTilePersp(), but the pixels are rendered 2 pixels wide. This function can be used if
* the previous function does not keep up with the rendering speed.
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param map Pointer to tile map with tile indices (width and height must be power of 2)
* @param tiles Pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param mapwbits Number of bits of tile map width
* @param maphbits Number of bits of tile map height
* @param tilebits Number of bits of tile width and height
* @param horizon Horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
*/
void ScreenSegmTilePersp2(sSegm* segm, const u8* map, const u8* tiles, const int* mat,
u8 mapwbits, u8 maphbits, u8 tilebits, s8 horizon);
// set video segment to tiles with perspective, triple pixels
// map = pointer to tile map with tile indices (width and height must be power of 2)
// tiles = pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// mapwbits = number of bits of tile map width
// maphbits = number of bits of tile map height
// tilebits = number of bits of tile width and height
// horizon = horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to tiles with perspective, triple pixels
* @details Similar to ScreenSegmTilePersp(), but the pixels are rendered 3 pixels wide. This function can be used if
* the previous function does not keep up with the rendering speed.
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param map Pointer to tile map with tile indices (width and height must be power of 2)
* @param tiles Pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param mapwbits Number of bits of tile map width
* @param maphbits Number of bits of tile map height
* @param tilebits Number of bits of tile width and height
* @param horizon Horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
*/
void ScreenSegmTilePersp3(sSegm* segm, const u8* map, const u8* tiles, const int* mat,
u8 mapwbits, u8 maphbits, u8 tilebits, s8 horizon);
// set video segment to tiles with perspective, quadruple pixels
// map = pointer to tile map with tile indices (width and height must be power of 2)
// tiles = pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
// mat = pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
// mapwbits = number of bits of tile map width
// maphbits = number of bits of tile map height
// tilebits = number of bits of tile width and height
// horizon = horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
// Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
/**
* @brief Set video segment to tiles with perspective, quadruple pixels
* @details Similar to ScreenSegmTilePersp(), but the pixels are rendered 4 pixels wide. This function can be used if
* the previous function does not keep up with the rendering speed.
* @note Use default settings of parameters: offx = 0, offy = 0, wrapx = segment width, wrapy = segment height
* @param segm Segment to configure
* @param map Pointer to tile map with tile indices (width and height must be power of 2)
* @param tiles Pointer to 1 column of square tiles, 1 pixel = 8 bits (width and height must be power of 2)
* @param mat Pointer to array of 6 matrix integer parameters m11, m12...m23 (exported with ExportInt function)
* @param mapwbits Number of bits of tile map width
* @param maphbits Number of bits of tile map height
* @param tilebits Number of bits of tile width and height
* @param horizon Horizon offset/4 (0=do not use perspective projection, <0=vertical flip to display ceiling)
*/
void ScreenSegmTilePersp4(sSegm* segm, const u8* map, const u8* tiles, const int* mat,
u8 mapwbits, u8 maphbits, u8 tilebits, s8 horizon);

View File

@@ -8,10 +8,20 @@
#ifndef _VGA_VMODE_H
#define _VGA_VMODE_H
//!@addtogroup VideoMode Video mode configuration
//!@brief Structures and functions for video modes
//!@details The video mode can be initialized either simply by the Video function or in more detail by the other functions.
//!@{
//! @addtogroup VideoMode
//! @brief Structures and functions for configuring video modes
//! @details The sVgaCfg structure contains the required properties of the video mode: the display resolution,
//! the minimum processor frequency and the timing of the sVideo signal, possibly also the required overlay mode.
//! You can first call the VgaCfgDef() function, which presets the structure to the default parameters. The VgaCfg()
//! function prepares the sVmode descriptor structure, which is later passed to the VgaInitReq() function.
//! At this point no operations are taking place only the necessary settings are being calculated. After the calculation,
//! some items of the sVmode structure can be adjusted. In the library there are global structures Cfg and Vmode that can
//! be used for the function. The required screen resolution and signal timing are two independent properties.
//! For timing, you are limited only by the number of video lines of the image, but otherwise you can set any screen resolution
//! within them. For example, for PAL and NTSC video, you can set a VGA video resolution. To make the program versatile so that
//! it can be run on both a VGA monitor and a TV, use a VGA resolution of 640x480 or 320x240 (or 512x400 and 256x192, due to RAM
//! limitations). When changing the display, just select VGA/PAL or NTSC timing, the resolution does not change for the program.
//! @{
#define VIDEO_NAME_LEN 5 //!< length of video timing name
@@ -232,22 +242,16 @@ void VgaPrintCfg(const sVmode* vmode);
/**
* @brief Calculate the structure for setting up the video mode.
* @details The sVgaCfg structure contains the required properties of the video mode: the display resolution,
* the minimum processor frequency and the timing of the sVideo signal, possibly also the required overlay mode.
* You can first call the VgaCfgDef function, which presets the structure to the default parameters. The VgaCfg
* function prepares the sVmode descriptor structure, which is later passed to the init function.
* At this point no operations are taking place only the necessary settings are being calculated. After the calculation,
* some items of the sVmode structure can be adjusted. In the library there are global structures Cfg and Vmode that can
* be used for the function. The required screen resolution and signal timing are two independent properties.
* For timing, you are limited only by the number of video lines of the image, but otherwise you can set any screen resolution
* within them. For example, for PAL and NTSC video, you can set a VGA video resolution. To make the program versatile so that
* it can be run on both a VGA monitor and a TV, use a VGA resolution of 640x480 or 320x240 (or 512x400 and 256x192, due to RAM
* limitations). When changing the display, just select VGA/PAL or NTSC timing, the resolution does not change for the program.
* @param cfg Source configuration structure
* @param vmode Destination videomode setup for driver
*/
void VgaCfg(const sVgaCfg* cfg, sVmode* vmode);
//! @}
//! @addtogroup VideoInit
//! @{
/**
* @brief Simplified initialization of the video mode
* @details This function incorporates all the video initialization and configuration functions -- this one call initializes the
@@ -267,6 +271,7 @@ void VgaCfg(const sVgaCfg* cfg, sVmode* vmode);
*/
void Video(u8 dev, u8 res, u8 form, u8* buf, const void* buf2 = FontBoldB8x16);
//!@}
//! @}
#endif // _VGA_VMODE_H