170 lines
5.1 KiB
C
170 lines
5.1 KiB
C
/***************************************************************************
|
|
|
|
bitmap.h
|
|
|
|
Core bitmap routines.
|
|
|
|
Copyright Nicola Salmoria and the MAME Team.
|
|
Visit http://mamedev.org for licensing and usage restrictions.
|
|
|
|
***************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#ifndef __BITMAP_H__
|
|
#define __BITMAP_H__
|
|
|
|
#include "osdcore.h"
|
|
#include "palette.h"
|
|
|
|
|
|
/***************************************************************************
|
|
TYPE DEFINITIONS
|
|
***************************************************************************/
|
|
|
|
/* bitmap_format describes the various bitmap formats we use */
|
|
enum _bitmap_format
|
|
{
|
|
BITMAP_FORMAT_INVALID = 0, /* invalid format */
|
|
BITMAP_FORMAT_INDEXED8, /* 8bpp indexed */
|
|
BITMAP_FORMAT_INDEXED16, /* 16bpp indexed */
|
|
BITMAP_FORMAT_INDEXED32, /* 32bpp indexed */
|
|
BITMAP_FORMAT_RGB15, /* 15bpp 5-5-5 RGB */
|
|
BITMAP_FORMAT_RGB32, /* 32bpp 8-8-8 RGB */
|
|
BITMAP_FORMAT_ARGB32, /* 32bpp 8-8-8-8 ARGB */
|
|
BITMAP_FORMAT_YUY16, /* 16bpp 8-8 Y/Cb, Y/Cr in sequence */
|
|
BITMAP_FORMAT_LAST
|
|
};
|
|
typedef enum _bitmap_format bitmap_format;
|
|
|
|
|
|
/* rectangles describe a bitmap portion */
|
|
typedef struct _rectangle rectangle;
|
|
struct _rectangle
|
|
{
|
|
int min_x; /* minimum X, or left coordinate */
|
|
int max_x; /* maximum X, or right coordinate (inclusive) */
|
|
int min_y; /* minimum Y, or top coordinate */
|
|
int max_y; /* maximum Y, or bottom coordinate (inclusive) */
|
|
};
|
|
|
|
|
|
/* bitmaps describe a rectangular array of pixels */
|
|
typedef struct _bitmap_t bitmap_t;
|
|
struct _bitmap_t
|
|
{
|
|
void * alloc; /* pointer to allocated pixel memory */
|
|
void * base; /* pointer to pixel (0,0) (adjusted for padding) */
|
|
int rowpixels; /* pixels per row (including padding) */
|
|
int width; /* width of the bitmap */
|
|
int height; /* height of the bitmap */
|
|
bitmap_format format; /* format of the bitmap */
|
|
int bpp; /* bits per pixel */
|
|
palette_t * palette; /* optional palette */
|
|
};
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
MACROS
|
|
***************************************************************************/
|
|
|
|
/* Macros for accessing bitmap pixels */
|
|
#define BITMAP_ADDR(bitmap, type, y, x) \
|
|
((type *)(bitmap)->base + (y) * (bitmap)->rowpixels + (x))
|
|
|
|
#define BITMAP_ADDR8(bitmap, y, x) BITMAP_ADDR(bitmap, UINT8, y, x)
|
|
#define BITMAP_ADDR16(bitmap, y, x) BITMAP_ADDR(bitmap, UINT16, y, x)
|
|
#define BITMAP_ADDR32(bitmap, y, x) BITMAP_ADDR(bitmap, UINT32, y, x)
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
FUNCTION PROTOTYPES
|
|
***************************************************************************/
|
|
|
|
|
|
/* ----- bitmap allocation ----- */
|
|
|
|
/* allocate a new bitmap of the given dimensions and format */
|
|
bitmap_t *bitmap_alloc(int width, int height, bitmap_format format);
|
|
|
|
/* allocate a new bitmap with additional slop on the borders */
|
|
bitmap_t *bitmap_alloc_slop(int width, int height, int xslop, int yslop, bitmap_format format);
|
|
|
|
/* wrap a bitmap object around an existing array of data */
|
|
bitmap_t *bitmap_wrap(void *base, int width, int height, int rowpixels, bitmap_format format);
|
|
|
|
/* associate a palette with a bitmap */
|
|
void bitmap_set_palette(bitmap_t *bitmap, palette_t *palette);
|
|
|
|
/* free allocated data for a bitmap */
|
|
void bitmap_free(bitmap_t *bitmap);
|
|
|
|
|
|
|
|
/* ----- bitmap drawing ----- */
|
|
|
|
/* fill a bitmap with a single color, clipping to the given rectangle */
|
|
void bitmap_fill(bitmap_t *dest, const rectangle *clip, rgb_t color);
|
|
|
|
|
|
|
|
/* ----- bitmap utilities ----- */
|
|
|
|
/* return the number of bits per pixel for a given bitmap format */
|
|
int bitmap_format_to_bpp(bitmap_format format);
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
INLINE FUNCTIONS
|
|
***************************************************************************/
|
|
|
|
/*-------------------------------------------------
|
|
sect_rect - compute the intersection of two
|
|
rectangles
|
|
-------------------------------------------------*/
|
|
|
|
INLINE void sect_rect(rectangle *dst, const rectangle *src)
|
|
{
|
|
if (src->min_x > dst->min_x) dst->min_x = src->min_x;
|
|
if (src->max_x < dst->max_x) dst->max_x = src->max_x;
|
|
if (src->min_y > dst->min_y) dst->min_y = src->min_y;
|
|
if (src->max_y < dst->max_y) dst->max_y = src->max_y;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------
|
|
union_rect - compute the union of two
|
|
rectangles
|
|
-------------------------------------------------*/
|
|
|
|
INLINE void union_rect(rectangle *dst, const rectangle *src)
|
|
{
|
|
if (src->min_x < dst->min_x) dst->min_x = src->min_x;
|
|
if (src->max_x > dst->max_x) dst->max_x = src->max_x;
|
|
if (src->min_y < dst->min_y) dst->min_y = src->min_y;
|
|
if (src->max_y > dst->max_y) dst->max_y = src->max_y;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------
|
|
plot_box - draw a filled rectangle into a
|
|
bitmap of arbitrary depth
|
|
-------------------------------------------------*/
|
|
|
|
INLINE void plot_box(bitmap_t *bitmap, int x, int y, int width, int height, UINT32 color)
|
|
{
|
|
rectangle clip;
|
|
clip.min_x = x;
|
|
clip.min_y = y;
|
|
clip.max_x = x + width - 1;
|
|
clip.max_y = y + height - 1;
|
|
bitmap_fill(bitmap, &clip, color);
|
|
}
|
|
|
|
|
|
#endif /* __BITMAP_H__ */
|