/**
* \file vdp_tile.h
* \brief VDP General Tile / Tilemap operations
* \author Stephane Dallongeville
* \date 08/2011
*
* This unit provides methods to manipulate VDP tiles and tilemap :
* - upload tiles to VDP memory
* - upload tiles to VDP memory from bitmap data
* - clear / fill / set tile map data
*/
#ifndef _VDP_TILE_H_
#define _VDP_TILE_H_
#include "vdp.h"
#include "dma.h"
/**
* \brief
* Bit shift for the tile priority attribute in tilemap data.
*/
#define TILE_ATTR_PRIORITY_SFT 15
/**
* \brief
* Bit shift for the tile palette attribute in tilemap data.
*/
#define TILE_ATTR_PALETTE_SFT 13
/**
* \brief
* Bit shift for the tile V flip attribute in tilemap data.
*/
#define TILE_ATTR_VFLIP_SFT 12
/**
* \brief
* Bit shift for the tile H flip attribute in tilemap data.
*/
#define TILE_ATTR_HFLIP_SFT 11
/**
* \brief
* Mask for the tile priority attribute in tilemap data.
*/
#define TILE_ATTR_PRIORITY_MASK (1 << TILE_ATTR_PRIORITY_SFT)
/**
* \brief
* Mask for the tile palette attribute in tilemap data.
*/
#define TILE_ATTR_PALETTE_MASK (3 << TILE_ATTR_PALETTE_SFT)
/**
* \brief
* Mask for the tile V flip attribute in tilemap data.
*/
#define TILE_ATTR_VFLIP_MASK (1 << TILE_ATTR_VFLIP_SFT)
/**
* \brief
* Mask for the tile H flip attribute in tilemap data.
*/
#define TILE_ATTR_HFLIP_MASK (1 << TILE_ATTR_HFLIP_SFT)
/**
* \brief
* Mask for the tile attributes (priority, palette and flip) in tilemap data.
*/
#define TILE_ATTR_MASK (TILE_ATTR_PRIORITY_MASK | TILE_ATTR_PALETTE_MASK | TILE_ATTR_VFLIP_MASK | TILE_ATTR_HFLIP_MASK)
/**
* \brief
* Encode tile attributes for tilemap data.
*
* \param pal
* Palette index
* \param prio
* Tile priority
* \param flipV
* Vertical flip
* \param flipH
* Horizontal flip
*/
#define TILE_ATTR(pal, prio, flipV, flipH) (((flipH) << TILE_ATTR_HFLIP_SFT) + ((flipV) << TILE_ATTR_VFLIP_SFT) + ((pal) << TILE_ATTR_PALETTE_SFT) + ((prio) << TILE_ATTR_PRIORITY_SFT))
/**
* \brief
* Encode tile attributes for tilemap data.
*
* \param pal
* Palette index
* \param prio
* Tile priority
* \param flipV
* Vertical flip
* \param flipH
* Horizontal flip
* \param index
* Tile index
*/
#define TILE_ATTR_FULL(pal, prio, flipV, flipH, index) (((flipH) << TILE_ATTR_HFLIP_SFT) + ((flipV) << TILE_ATTR_VFLIP_SFT) + ((pal) << TILE_ATTR_PALETTE_SFT) + ((prio) << TILE_ATTR_PRIORITY_SFT) + (index))
/**
* \brief
* Tile set structure which contains tiles definition.
* Use the unpackTileSet() method to unpack if compression is enabled.
*
* \param compression
* compression type, accepted values:
* COMPRESSION_NONE
* COMPRESSION_APLIB
* COMPRESSION_LZ4W
* \param numTile
* number of tile in the tiles buffer.
* \param tiles
* Tiles data (packed or not depending compression field).
*/
typedef struct
{
u16 compression;
u16 numTile;
u32 *tiles;
} TileSet;
/**
* \brief
* TileMap structure which contains tilemap background definition.
* Use the unpackTileMap() method to unpack if compression is enabled.
* \param compression
* compression type, accepted values:
* COMPRESSION_NONE
* COMPRESSION_APLIB
* COMPRESSION_LZ4W
* \param w
* tilemap width in tile.
* \param h
* tilemap height in tile.
* \param tilemap
* Tilemap data.
*/
typedef struct
{
u16 compression;
u16 w;
u16 h;
u16 *tilemap;
} TileMap;
/**
* \brief
* Return the VRAM tilemap address for the specified plane position
*
* \param plane
* Plane we want to get the VRAM tilemap address for a given position.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param x
* X position (in tile).
* \param y
* Y position (in tile).
*/
u16 VDP_getPlaneAddress(VDPPlane plane, u16 x, u16 y);
/**
* \brief
* Load tile data (pattern) in VRAM.
*
* \param data
* Pointer to tile data.
* \param index
* Tile index where start tile data load (use TILE_USER_INDEX as base user index).
* \param num
* Number of tile to load.
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Transfert rate:
* ~90 bytes per scanline in software (during blanking)
* ~190 bytes per scanline in hardware (during blanking)
*/
void VDP_loadTileData(const u32 *data, u16 index, u16 num, TransferMethod tm);
/**
* \brief
* Load tile data (pattern) in VRAM.
*
* \param tileset
* Pointer to TileSet structure.
* The TileSet is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param index
* Tile index where start tile data load (use TILE_USER_INDEX as base user index).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* \return
* FALSE if there is not enough memory to unpack the specified TileSet (only if compression was enabled).
*
* Transfert rate:
* ~90 bytes per scanline in software (during blanking)
* ~190 bytes per scanline in hardware (during blanking)
*/
bool VDP_loadTileSet(const TileSet *tileset, u16 index, TransferMethod tm);
/**
* \brief
* Load font tile data in VRAM.
* Note that you should prefer the VDP_loadFont(..) method to this one (easier to use).
*
* \param font
* Pointer to font tile data.
* \param length
* Number of characters of the font (max = FONT_LEN).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* This fonction permits to replace system font by user font.
* The font tile data are loaded to TILE_FONT_INDEX and can contains FONT_LEN characters at max.
* Each character should fit in one tile (8x8 pixels bloc).
* See also VDP_loadFont(..) and VDP_loadTileData(..)
*/
void VDP_loadFontData(const u32 *font, u16 length, TransferMethod tm);
/**
* \brief
* Load font from the specified Font tileset in VRAM.
*
* \param font
* TileSet containing the font (should be 16*6 characters font, see SGDK default font at res\image\font_default.png).
* The TileSet is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* \return
* FALSE if there is not enough memory to unpack the specified font (only if compression was enabled).
*
* This fonction permits to replace system font by user font.
* The font tile data are loaded to TILE_FONT_INDEX and can contains FONT_LEN characters at max.
* Each character should fit in one tile (8x8 pixels bloc).
* See also VDP_loadFontData(..)
*/
bool VDP_loadFont(const TileSet *font, TransferMethod tm);
/**
* \brief
* Load the default Font tileset in VRAM.
*
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* \return
* FALSE if there is not enough memory to unpack the specified font (only if compression was enabled).
*
* The font tile data are loaded to TILE_FONT_INDEX and can contains FONT_LEN characters at max.
* Each character should fit in one tile (8x8 pixels bloc).
* See also VDP_loadFontData(..)
*/
bool VDP_loadDefaultFont(TransferMethod tm);
/**
* \brief
* Load 4bpp bitmap tile data in VRAM.
*
* \param data
* Pointer to 4bpp bitmap tile data.
* \param index
* Tile index where start tile data load (use TILE_USER_INDEX as base user index).
* \param w
* Width of bitmap region to load (in tile).
* \param h
* Heigh of bitmap region to load (in tile).
* \param bmp_w
* Width of bitmap (in tile), it can differ from 'w' parameter.
*
* This function does "on the fly" 4bpp bitmap conversion to tile data and transfert them to VRAM.
* It's very helpful when you use bitmap images but the conversion eats sometime so you should use it only for static screen only.
* For "in-game" condition you should use VDP_loadTileData() method with converted tile data.
* See also VDP_loadBMPTileDataEx().
*/
void VDP_loadBMPTileData(const u32 *data, u16 index, u16 w, u16 h, u16 bmp_w);
/**
* \brief
* Load 4bpp bitmap tile data in VRAM.
*
* \param data
* Pointer to 4bpp bitmap tile data.
* \param index
* Tile index where start tile data load (use TILE_USER_INDEX as base user index).
* \param x
* X start position of bitmap region to load (in tile).
* \param y
* Y start position of bitmap region to load (in tile).
* \param w
* Width of bitmap region to load (in tile).
* \param h
* Heigh of bitmap region to load (in tile).
* \param bmp_w
* Width of bitmap (in tile), it can differ from 'w' parameter.
*
* This function does "on the fly" 4bpp bitmap conversion to tile data and transfert them to VRAM.
* It's very helpful when you use bitmap images but the conversion eats sometime so you should use it only for static screen only.
* For "in-game" condition you should use VDP_loadTileData() method with converted tile data.
* See also VDP_loadBMPTileData()
*/
void VDP_loadBMPTileDataEx(const u32 *data, u16 index, u16 x, u16 y, u16 w, u16 h, u16 bmp_w);
/**
* \brief
* Fill tile data in VRAM.
*
* \param value
* Value (byte) used to fill VRAM tile data.
* \param index
* Tile index where start tile data fill (use TILE_USER_INDEX as base user index).
* \param num
* Number of tile to fill.
* \param wait
* Wait the operation to complete when set to TRUE otherwise it returns immediately
* but then you will require to wait for DMA completion (#DMA_waitCompletion()) before accessing the VDP.
*
* This function is generally used to clear tile data in VRAM.
*/
void VDP_fillTileData(u8 value, u16 index, u16 num, bool wait);
/**
* \brief
* Clear tilemap.
*
* \param planeAddr
* Plane address where we want to clear tilemap.
* Accepted values are:
* - VDP_BG_A
* - VDP_BG_B
* - VDP_WINDOW
* \param ind
* Tile index where to start clear.
* \param num
* Number of tile to clear.
* \param wait
* Wait the operation to complete when set to TRUE otherwise it returns immediately
* but then you will require to wait for DMA completion (#DMA_waitCompletion()) before accessing the VDP.
*
* \see VDP_clearTileMapRect()
* \see VDP_fillTileMap()
*/
void VDP_clearTileMap(u16 planeAddr, u16 ind, u16 num, bool wait);
/**
* \brief
* Fill tilemap.
*
* \param planeAddr
* Plane address where we want to fill tilemap.
* Accepted values are:
* - VDP_BG_A
* - VDP_BG_B
* - VDP_WINDOW
* \param tile
* Tile attributes (see TILE_ATTR_FULL() and TILE_ATTR() macros).
* \param ind
* tile index where to start fill.
* \param num
* Number of tile to fill.
*
* \see VDP_fillTileMapRect()
*/
void VDP_fillTileMap(u16 planeAddr, u16 tile, u16 ind, u16 num);
/**
* \brief
* Set tilemap data at specified index.
*
* \param planeAddr
* Plane address where we want to set tilemap data.
* Accepted values are:
* - VDP_BG_A
* - VDP_BG_B
* - VDP_WINDOW
* \param data
* Tile attributes data (see TILE_ATTR_FULL() and TILE_ATTR() macros).
* \param ind
* Tile index where to start to set tilemap data.
* \param num
* Number of tile to set.
* \param vramStep
* VRAM address increment after each write (default value = 2)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Set the specified tilemap with specified tile attributes values.
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapDataEx(..) which allow to override base tile attributes though the 'basetile' parameter.
*
* \see VDP_setTileMapDataEx().
* \see VDP_setTileMapDataRect().
*/
void VDP_setTileMapData(u16 planeAddr, const u16 *data, u16 ind, u16 num, u16 vramStep, TransferMethod tm);
/**
* \brief
* Set tilemap data at specified index (extended version).
*
* \param planeAddr
* Plane where we want to set tilemap data.
* Accepted values are:
* - VDP_BG_A
* - VDP_BG_B
* - VDP_WINDOW
* \param data
* Tile attributes data (see TILE_ATTR_FULL() and TILE_ATTR() macros).
* \param basetile
* Base tile index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param ind
* Tile index where to start to set tilemap data.
* \param num
* Number of tile to set.
* \param vramStep
* VRAM address increment after each write (default value = 2).
*
* Set the specified tilemap with specified tile attributes values.
* Unlike #VDP_setTileMapData(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMapData(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
*
* \see VDP_setTileMapData()
* \see VDP_setTileMapDataRectEx()
*/
void VDP_setTileMapDataEx(u16 planeAddr, const u16 *data, u16 basetile, u16 ind, u16 num, u16 vramStep);
/**
* \brief
* Set tilemap data (single position).
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tile
* tile attributes (see TILE_ATTR_FULL() and TILE_ATTR() macros).
* \param x
* X position (in tile).
* \param y
* y position (in tile).
*
* Set the specified tilemap position (tilemap wrapping supported) with given tile attributes.
*/
void VDP_setTileMapXY(VDPPlane plane, u16 tile, u16 x, u16 y);
/**
* \brief
* Clear specified region of tilemap.
*
* \param plane
* Plane where we want to clear tilemap region.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
*
* \see VDP_clearTileMap() (faster method)
*/
void VDP_clearTileMapRect(VDPPlane plane, u16 x, u16 y, u16 w, u16 h);
/**
* \brief
* Fill speficied region of tilemap.
*
* \param plane
* Plane where we want to fill tilemap region.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tile
* tile attributes (see TILE_ATTR_FULL() and TILE_ATTR() macros).
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
*
* Fill the specified tilemap region with specified tile attributes value.
*
* \see VDP_fillTileMap() (faster method)
* \see VDP_fillTileMapRectInc()
*/
void VDP_fillTileMapRect(VDPPlane plane, u16 tile, u16 x, u16 y, u16 w, u16 h);
/**
* \brief
* Fill tilemap with index auto increment at specified region.
*
* \param plane
* Plane where we want to fill tilemap region.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param basetile
* Base tile attributes (see TILE_ATTR_FULL() and TILE_ATTR() macros).
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
*
* Set the specified tilemap region with specified tile attributes value.
* The function auto increments tile index in tile attributes like this:
* tilemap line 0 : basetile, basetile+1, basetile+2, basetile+3, ...
* tilemap line 1 : basetile+w, basetile+w+1, basetile+w+2, ...
* ...
* So this function is convenient to display generated image or simulate a frame buffer.
*
* \see also VDP_fillTileMapRect()
*/
void VDP_fillTileMapRectInc(VDPPlane plane, u16 basetile, u16 x, u16 y, u16 w, u16 h);
/**
* \brief
* Set tilemap data for specified region.
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Source tilemap data containing tile attributes (see TILE_ATTR_FULL() macro).
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
* \param wm
* Source tilemap width (in tile).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Set the specified tilemap region (tilemap wrapping supported) with specified tile attributes values.
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapDataRectEx(..) which allow to override base tile attributes though the 'basetile' parameter.
*
* \see VDP_setTileMapDataRectEx().
* \see VDP_setTileMapData().
*/
void VDP_setTileMapDataRect(VDPPlane plane, const u16 *data, u16 x, u16 y, u16 w, u16 h, u16 wm, TransferMethod tm);
/**
* \brief
* Set tilemap data for specified region (extended version).
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Source tilemap data containing tile attributes (see TILE_ATTR_FULL() macro).
* \param basetile
* Base index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
* \param wm
* Source tilemap width (in tile).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* But i highly discourage of using DMA here as VDP_setTileMapDataRectEx(..) requires to prepare data in a temporary buffer first
* to use DMA, resulting in a slower process than using CPU. However DMA_QUEUE is very useful as it wil prepare the data
* and transfer the data as fast as possible during VBlank.
*
* Set the specified tilemap region (tilemap wrapping supported) with specified tile attributes values.
* Unlike #VDP_setTileMapDataRect(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMapDataRect(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
*
* \see VDP_setTileMapDataRect()
* \see VDP_setTileMapDataEx()
*/
void VDP_setTileMapDataRectEx(VDPPlane plane, const u16 *data, u16 basetile, u16 x, u16 y, u16 w, u16 h, u16 wm, TransferMethod tm);
/**
* \brief
* Set a row of tilemap data.
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Source tilemap data containing tile attributes (see TILE_ATTR_FULL() macro).
* \param row
* Plane row we want to set data
* \param x
* Row X start position (in tile)
* \param w
* Row width to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Set a row of tilemap data (tilemap wrapping supported) with given tile attributes values.
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapDataRowEx(..) which allow to override base tile attributes though the 'basetile' parameter.
*
* \see VDP_setTileMapDataRowPartEx()
* \see VDP_setTileMapDataRow()
*/
void VDP_setTileMapDataRow(VDPPlane plane, const u16 *data, u16 row, u16 x, u16 w, TransferMethod tm);
/**
* \brief
* Set a row of tilemap data - extended version.
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Source tilemap data containing tile attributes (see TILE_ATTR_FULL() macro).
* \param basetile
* Base index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param row
* Plane row we want to set data
* \param x
* Row X start position (in tile)
* \param w
* Row width to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* But i highly discourage of using DMA here as VDP_setTileMapDataRowEx(..) requires to prepare data in a temporary buffer first
* to use DMA, resulting in a slower process than using CPU. However DMA_QUEUE is very useful as it wil prepare the data
* and transfer the data as fast as possible during VBlank.
*
* Set a row of tilemap data (tilemap wrapping supported) with given tile attributes values.
* Unlike #VDP_setTileMapDataRow(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMapDataRow(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
*
* \see VDP_setTileMapDataRowPart()
* \see VDP_setTileMapDataRow()
*/
void VDP_setTileMapDataRowEx(VDPPlane plane, const u16 *data, u16 basetile, u16 row, u16 x, u16 w, TransferMethod tm);
/**
* \brief
* Set a complete column of pre-arranged tilemap data (not supported when plane width is set to 128).
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Prepared tile attributes data (see TILE_ATTR_FULL() macro).
* Column data are already arranged to be transferred as a single contiguous data block.
* \param column
* Plane column we want to set data
* \param y
* Column Y start position (in tile)
* \param h
* Column height to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Set a complete column of tilemap data with given tile attributes values.
* This method is faster than #VDP_setTileMapDataColumn(..) or #VDP_setTileMapDataColumnEx(..) as it assumes
* that data buffer is properly prepared and arranged to be directly copied as it.
* WARNING: this function doesn't work when plane width is set to 128 (see #VDP_setPlaneSize(..) method).
*
* \see VDP_setTileMapDataRowFast()
* \see VDP_setTileMapDataColumn()
* \see VDP_setTileMapData()
*/
void VDP_setTileMapDataColumnFast(VDPPlane plane, u16* data, u16 column, u16 y, u16 h, TransferMethod tm);
/**
* \brief
* Set a column of tilemap data (not supported when plane width is set to 128).
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Source tilemap data containing tile attributes (see TILE_ATTR_FULL() macro).
* \param column
* Plane column we want to set data
* \param y
* Column Y start position (in tile)
* \param h
* Column height to update (in tile)
* \param wm
* Source tilemap width (in tile).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Set a column of tilemap data (tilemap wrapping supported) with given tile attributes values.
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base tile attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapDataColumnEx(..) which allow to override base tile attributes though the 'basetile' parameter.
* WARNING: this function doesn't work when plane width is set to 128 (see #VDP_setPlaneSize(..) method)
*
* \see VDP_setTileMapDataColumnPartEx()
* \see VDP_setTileMapDataColumn()
*/
void VDP_setTileMapDataColumn(VDPPlane plane, const u16 *data, u16 column, u16 y, u16 h, u16 wm, TransferMethod tm);
/**
* \brief
* Set a column of tilemap data - extended version (not supported when plane width is set to 128).
*
* \param plane
* Plane where we want to set tilemap data.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param data
* Source tilemap data containing tile attributes (see TILE_ATTR_FULL() macro).
* \param basetile
* Base index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param column
* Plane column we want to set data
* \param y
* Column Y start position (in tile)
* \param h
* Column height to update (in tile)
* \param wm
* Source tilemap width (in tile).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* But i highly discourage of using DMA here as VDP_setTileMapDataColumnEx(..) requires to prepare data in a temporary buffer first
* to use DMA, resulting in a slower process than using CPU. However DMA_QUEUE is very useful as it wil prepare the data
* and transfer the data as fast as possible during VBlank.
*
* Set a column of tilemap data (tilemap wrapping supported) with given tile attributes values.
* Unlike #VDP_setTileMapDataColumn(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMapDataColumn(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
* WARNING: this function doesn't work when plane width is set to 128 (see #VDP_setPlaneSize(..) method)
*
* \see VDP_setTileMapDataColumnPart()
* \see VDP_setTileMapDataColumnEx()
* \see VDP_setTileMapData()
*/
void VDP_setTileMapDataColumnEx(VDPPlane plane, const u16 *data, u16 basetile, u16 column, u16 y, u16 h, u16 wm, TransferMethod tm);
/**
* \brief
* Load tilemap region.
*
* \param plane
* Plane where we want to load tilemap.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tilemap
* Source tilemap to load.
* The TileMap is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Load the specified tilemap region at equivalent plane position (tilemap wrapping supported).
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapEx(..) which allow to override base tile attributes though the 'basetile' parameter.
*
* \see VDP_setTileMapData()
* \see VDP_setTileMapDataEx()
*/
bool VDP_setTileMap(VDPPlane plane, const TileMap *tilemap, u16 x, u16 y, u16 w, u16 h, TransferMethod tm);
/**
* \brief
* Load tilemap region at specified plane position.
*
* \param plane
* Plane where we want to load tilemap.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tilemap
* Source tilemap to load.
* The TileMap is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param basetile
* Base index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param xp
* Plane X destination position (in tile).
* \param yp
* Plane Y destination position (in tile).
* \param x
* Region X start position (in tile).
* \param y
* Region Y start position (in tile).
* \param w
* Region Width (in tile).
* \param h
* Region Heigh (in tile).
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* But i highly discourage of using DMA here as VDP_setTileMapEx(..) requires to prepare data in a temporary buffer first
* to use DMA, resulting in a slower process than using CPU. However DMA_QUEUE is very useful as it wil prepare the data
* and transfer the data as fast as possible during VBlank.
*
* Load the specified tilemap region at specified plane position (tilemap wrapping supported).
* Unlike #VDP_setTileMap(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMap(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
*
* \see VDP_setTileMapDataRect()
* \see VDP_setTileMapDataRectEx()
*/
bool VDP_setTileMapEx(VDPPlane plane, const TileMap *tilemap, u16 basetile, u16 xp, u16 yp, u16 x, u16 y, u16 w, u16 h, TransferMethod tm);
/**
* \brief
* Load tilemap row.
*
* \param plane
* Plane where we want to load tilemap.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tilemap
* Source tilemap to set row from.
* The TileMap is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param row
* Plane row we want to set data
* \param x
* Source tilemap X start position (in tile).
* \param w
* Row width to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Load a complete row of data from tilemap at equivalent plane position (wrapped around if needed).
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapRowEx(..) which allow to override base tile attributes though the 'basetile' parameter.
*
* \see VDP_setTileMapRowEx()
* \see VDP_setMapColumn()
* \see VDP_setTileMapDataRow()
*/
bool VDP_setTileMapRow(VDPPlane plane, const TileMap *tilemap, u16 row, u16 x, u16 w, TransferMethod tm);
/**
* \brief
* Load tilemap row (extended version).
*
* \param plane
* Plane where we want to load tilemap.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tilemap
* Source tilemap to set row from.
* The TileMap is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param basetile
* Base index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param row
* Plane row we want to set data
* \param x
* Source tilemap X start position (in tile)
* \param y
* Source tilemap Y / row position (in tile), can be different that plane row if desired.
* \param w
* Row width to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* But i highly discourage of using DMA here as VDP_setTileMapRowEx(..) requires to prepare data in a temporary buffer first
* to use DMA, resulting in a slower process than using CPU. However DMA_QUEUE is very useful as it wil prepare the data
* and transfer the data as fast as possible during VBlank.
*
* Load a complete row of data from tilemap at equivalent plane position (wrapped around if needed).
* Unlike #VDP_setTileMapRow(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMapRow(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
*
* \see VDP_setTileMapRow()
* \see VDP_setMapColumnEx()
* \see VDP_setTileMapDataRowEx()
*/
bool VDP_setTileMapRowEx(VDPPlane plane, const TileMap *tilemap, u16 basetile, u16 row, u16 x, u16 y, u16 w, TransferMethod tm);
/**
* \brief
* Load tilemap column (not supported when plane width is set to 128).
*
* \param plane
* Plane where we want to load tilemap.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tilemap
* Source tilemap to set column from.
* The TileMap is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param column
* Plane column we want to set data
* \param y
* Source tilemap Y start position (in tile).
* \param h
* Column height to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
*
* Load a complete column of data from tilemap at equivalent plane position (wrapped around if needed).
* You can use this method when you are using the 'mapbase' parameter on your resource definition to set the base attributes
* (palette, priority and base tile index) so you don't need to provide them here.
* This method is faster than using #VDP_setTileMapColumnEx(..) which allow to override base tile attributes though the 'basetile' parameter.
* WARNING: this function doesn't work when plane width is set to 128 (see #VDP_setPlaneSize(..) method)
*
* \see VDP_setTileMapColumnEx()
* \see VDP_setMapRow()
* \see VDP_setTileMapDataColumn()
*/
bool VDP_setTileMapColumn(VDPPlane plane, const TileMap *tilemap, u16 column, u16 y, u16 h, TransferMethod tm);
/**
* \brief
* Load tilemap column - extended version (not supported when plane width is set to 128).
*
* \param plane
* Plane where we want to load tilemap.
* Accepted values are:
* - BG_A
* - BG_B
* - WINDOW
* \param tilemap
* Source tilemap to set column from.
* The TileMap is unpacked "on-the-fly" if needed (require some memory).
* Using DMA_QUEUE for packed resource is unsafe as the resource will be released and eventually
* can be overwritten before DMA operation so use DMA_QUEUE_COPY in that case or unpack the resource first.
* \param basetile
* Base index and flag for tile attributes (see TILE_ATTR_FULL() macro).
* \param column
* Plane column we want to set data
* \param x
* Source tilemap X / column position (in tile), can be different than plane column if desired.
* \param y
* Source tilemap Y start position (in tile).
* \param h
* Column height to update (in tile)
* \param tm
* Transfer method.
* Accepted values are:
* - CPU
* - DMA
* - DMA_QUEUE
* - DMA_QUEUE_COPY
* But i highly discourage of using DMA here as VDP_setTileMapColumnEx(..) requires to prepare data in a temporary buffer first
* to use DMA, resulting in a slower process than using CPU. However DMA_QUEUE is very useful as it wil prepare the data
* and transfer the data as fast as possible during VBlank.
*
* Load a complete column of data from tilemap at equivalent plane position (wrapped around if needed).
* Unlike #VDP_setTileMapColumn(..) this method let you to override the base tile attributes (priority, palette and base index)
* at the expense of more computation time. If you want faster tilemap processing (using #VDP_setTileMapColumn(..)), you can use
* the 'mapbase' parameter when declaring your IMAGE resource to set base tile attributes but then you have fixed/static tile allocation.
* WARNING: this function doesn't work when plane width is set to 128 (see #VDP_setPlaneSize(..) method)
*
* \see VDP_setTileMapColumn()
* \see VDP_setMapRowEx()
* \see VDP_setTileMapDataColumnEx()
*/
bool VDP_setTileMapColumnEx(VDPPlane plane, const TileMap *tilemap, u16 basetile, u16 column, u16 x, u16 y, u16 h, TransferMethod tm);
/**
* \deprecated
* Use #VDP_setTileMap() instead.
*/
bool VDP_setMap(VDPPlane plane, const TileMap *tilemap, u16 basetile, u16 x, u16 y);
/**
* \deprecated
* Use #VDP_setTileMapEx() instead.
*/
bool VDP_setMapEx(VDPPlane plane, const TileMap *tilemap, u16 basetile, u16 x, u16 y, u16 xm, u16 ym, u16 wm, u16 hm);
#endif // _VDP_TILE_H_