diff options
Diffstat (limited to 'src/osd/windows/drawgdi.c')
-rw-r--r-- | src/osd/windows/drawgdi.c | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/src/osd/windows/drawgdi.c b/src/osd/windows/drawgdi.c new file mode 100644 index 00000000000..05f1138c11f --- /dev/null +++ b/src/osd/windows/drawgdi.c @@ -0,0 +1,215 @@ +//============================================================ +// +// drawgdi.c - Win32 GDI drawing +// +// Copyright (c) 1996-2007, Nicola Salmoria and the MAME Team. +// Visit http://mamedev.org for licensing and usage restrictions. +// +//============================================================ + +// standard windows headers +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +// MAME headers +#include "mamecore.h" + +// MAMEOS headers +#include "window.h" + + + +//============================================================ +// TYPE DEFINITIONS +//============================================================ + +/* gdi_info is the information for the current screen */ +typedef struct _gdi_info gdi_info; +struct _gdi_info +{ + BITMAPINFO bminfo; + RGBQUAD colors[256]; + UINT8 * bmdata; + size_t bmsize; +}; + + + +//============================================================ +// PROTOTYPES +//============================================================ + +// core functions +static void drawgdi_exit(void); +static int drawgdi_window_init(win_window_info *window); +static void drawgdi_window_destroy(win_window_info *window); +static const render_primitive_list *drawgdi_window_get_primitives(win_window_info *window); +static int drawgdi_window_draw(win_window_info *window, HDC dc, int update); + +// rendering +static void drawgdi_rgb888_draw_primitives(const render_primitive *primlist, void *dstdata, UINT32 width, UINT32 height, UINT32 pitch); + + + +//============================================================ +// drawgdi_init +//============================================================ + +int drawgdi_init(win_draw_callbacks *callbacks) +{ + // fill in the callbacks + callbacks->exit = drawgdi_exit; + callbacks->window_init = drawgdi_window_init; + callbacks->window_get_primitives = drawgdi_window_get_primitives; + callbacks->window_draw = drawgdi_window_draw; + callbacks->window_destroy = drawgdi_window_destroy; + return 0; +} + + + +//============================================================ +// drawgdi_exit +//============================================================ + +static void drawgdi_exit(void) +{ +} + + + +//============================================================ +// drawgdi_window_init +//============================================================ + +static int drawgdi_window_init(win_window_info *window) +{ + gdi_info *gdi; + int i; + + // allocate memory for our structures + gdi = malloc_or_die(sizeof(*gdi)); + memset(gdi, 0, sizeof(*gdi)); + window->drawdata = gdi; + + // fill in the bitmap info header + gdi->bminfo.bmiHeader.biSize = sizeof(gdi->bminfo.bmiHeader); + gdi->bminfo.bmiHeader.biPlanes = 1; + gdi->bminfo.bmiHeader.biCompression = BI_RGB; + gdi->bminfo.bmiHeader.biSizeImage = 0; + gdi->bminfo.bmiHeader.biXPelsPerMeter = 0; + gdi->bminfo.bmiHeader.biYPelsPerMeter = 0; + gdi->bminfo.bmiHeader.biClrUsed = 0; + gdi->bminfo.bmiHeader.biClrImportant = 0; + + // initialize the palette to a gray ramp + for (i = 0; i < 256; i++) + { + gdi->bminfo.bmiColors[i].rgbRed = i; + gdi->bminfo.bmiColors[i].rgbGreen = i; + gdi->bminfo.bmiColors[i].rgbBlue = i; + gdi->bminfo.bmiColors[i].rgbReserved = i; + } + + return 0; +} + + + +//============================================================ +// drawgdi_window_destroy +//============================================================ + +static void drawgdi_window_destroy(win_window_info *window) +{ + gdi_info *gdi = window->drawdata; + + // skip if nothing + if (gdi == NULL) + return; + + // free the bitmap memory + if (gdi->bmdata != NULL) + free(gdi->bmdata); + free(gdi); + window->drawdata = NULL; +} + + + +//============================================================ +// drawgdi_window_get_primitives +//============================================================ + +static const render_primitive_list *drawgdi_window_get_primitives(win_window_info *window) +{ + RECT client; + GetClientRect(window->hwnd, &client); + render_target_set_bounds(window->target, rect_width(&client), rect_height(&client), winvideo_monitor_get_aspect(window->monitor)); + return render_target_get_primitives(window->target); +} + + + +//============================================================ +// drawgdi_window_draw +//============================================================ + +static int drawgdi_window_draw(win_window_info *window, HDC dc, int update) +{ + gdi_info *gdi = window->drawdata; + int width, height, pitch; + RECT bounds; + + // we don't have any special resize behaviors + if (window->resize_state == RESIZE_STATE_PENDING) + window->resize_state = RESIZE_STATE_NORMAL; + + // get the target bounds + GetClientRect(window->hwnd, &bounds); + + // compute width/height/pitch of target + width = rect_width(&bounds); + height = rect_height(&bounds); + pitch = (width + 3) & ~3; + + // make sure our temporary bitmap is big enough + if (pitch * height * 4 > gdi->bmsize) + { + gdi->bmsize = pitch * height * 4 * 2; + gdi->bmdata = realloc(gdi->bmdata, gdi->bmsize); + } + + // draw the primitives to the bitmap + osd_lock_acquire(window->primlist->lock); + drawgdi_rgb888_draw_primitives(window->primlist->head, gdi->bmdata, width, height, pitch); + osd_lock_release(window->primlist->lock); + + // fill in bitmap-specific info + gdi->bminfo.bmiHeader.biWidth = pitch; + gdi->bminfo.bmiHeader.biHeight = -height; + gdi->bminfo.bmiHeader.biBitCount = 32; + + // blit to the screen + StretchDIBits(dc, 0, 0, width, height, + 0, 0, width, height, + gdi->bmdata, &gdi->bminfo, DIB_RGB_COLORS, SRCCOPY); + return 0; +} + + + +//============================================================ +// SOFTWARE RENDERING +//============================================================ + +#define FUNC_PREFIX(x) drawgdi_rgb888_##x +#define PIXEL_TYPE UINT32 +#define SRCSHIFT_R 0 +#define SRCSHIFT_G 0 +#define SRCSHIFT_B 0 +#define DSTSHIFT_R 16 +#define DSTSHIFT_G 8 +#define DSTSHIFT_B 0 + +#include "rendersw.c" |