summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/windows/drawgdi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/windows/drawgdi.c')
-rw-r--r--src/osd/windows/drawgdi.c113
1 files changed, 58 insertions, 55 deletions
diff --git a/src/osd/windows/drawgdi.c b/src/osd/windows/drawgdi.c
index 2ace10c26dd..c01f333fe5f 100644
--- a/src/osd/windows/drawgdi.c
+++ b/src/osd/windows/drawgdi.c
@@ -18,47 +18,61 @@
#include "window.h"
-
//============================================================
// TYPE DEFINITIONS
//============================================================
-/* gdi_info is the information for the current screen */
-struct gdi_info
+class renderer_gdi : public osd_renderer
{
+public:
+ renderer_gdi(win_window_info *window)
+ : osd_renderer(window, FLAG_NONE), bmdata(NULL), bmsize(0) { }
+
+ virtual ~renderer_gdi() { }
+
+ virtual int init();
+ virtual render_primitive_list *get_primitives();
+ virtual int draw(HDC dc, int update);
+ virtual void save() {};
+ virtual void record() {};
+ virtual void toggle_fsfx() {};
+ virtual void destroy();
+
+private:
+ /* gdi_info is the information for the current screen */
BITMAPINFO bminfo;
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 render_primitive_list *drawgdi_window_get_primitives(win_window_info *window);
-static int drawgdi_window_draw(win_window_info *window, HDC dc, int update);
+//============================================================
+// drawnone_create
+//============================================================
+
+static osd_renderer *drawgdi_create(win_window_info *window)
+{
+ return global_alloc(renderer_gdi(window));
+}
//============================================================
// drawgdi_init
//============================================================
-int drawgdi_init(running_machine &machine, win_draw_callbacks *callbacks)
+int drawgdi_init(running_machine &machine, osd_draw_callbacks *callbacks)
{
// fill in the callbacks
memset(callbacks, 0, sizeof(*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;
+ callbacks->create = drawgdi_create;
return 0;
}
@@ -78,22 +92,19 @@ static void drawgdi_exit(void)
// drawgdi_window_init
//============================================================
-static int drawgdi_window_init(win_window_info *window)
+int renderer_gdi::init()
{
- // allocate memory for our structures
- gdi_info *gdi = global_alloc_clear(gdi_info);
- window->m_drawdata = gdi;
// fill in the bitmap info header
- gdi->bminfo.bmiHeader.biSize = sizeof(gdi->bminfo.bmiHeader);
- gdi->bminfo.bmiHeader.biPlanes = 1;
- gdi->bminfo.bmiHeader.biBitCount = 32;
- 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;
+ bminfo.bmiHeader.biSize = sizeof(bminfo.bmiHeader);
+ bminfo.bmiHeader.biPlanes = 1;
+ bminfo.bmiHeader.biBitCount = 32;
+ bminfo.bmiHeader.biCompression = BI_RGB;
+ bminfo.bmiHeader.biSizeImage = 0;
+ bminfo.bmiHeader.biXPelsPerMeter = 0;
+ bminfo.bmiHeader.biYPelsPerMeter = 0;
+ bminfo.bmiHeader.biClrUsed = 0;
+ bminfo.bmiHeader.biClrImportant = 0;
return 0;
}
@@ -104,19 +115,12 @@ static int drawgdi_window_init(win_window_info *window)
// drawgdi_window_destroy
//============================================================
-static void drawgdi_window_destroy(win_window_info *window)
+void renderer_gdi::destroy()
{
- gdi_info *gdi = (gdi_info *)window->m_drawdata;
-
- // skip if nothing
- if (gdi == NULL)
- return;
// free the bitmap memory
- if (gdi->bmdata != NULL)
- global_free_array(gdi->bmdata);
- global_free(gdi);
- window->m_drawdata = NULL;
+ if (bmdata != NULL)
+ global_free_array(bmdata);
}
@@ -125,12 +129,12 @@ static void drawgdi_window_destroy(win_window_info *window)
// drawgdi_window_get_primitives
//============================================================
-static render_primitive_list *drawgdi_window_get_primitives(win_window_info *window)
+render_primitive_list *renderer_gdi::get_primitives()
{
RECT client;
- GetClientRect(window->m_hwnd, &client);
- window->m_target->set_bounds(rect_width(&client), rect_height(&client), window->m_monitor->get_aspect());
- return &window->m_target->get_primitives();
+ GetClientRect(window().m_hwnd, &client);
+ window().m_target->set_bounds(rect_width(&client), rect_height(&client), window().m_monitor->get_aspect());
+ return &window().m_target->get_primitives();
}
@@ -139,18 +143,17 @@ static render_primitive_list *drawgdi_window_get_primitives(win_window_info *win
// drawgdi_window_draw
//============================================================
-static int drawgdi_window_draw(win_window_info *window, HDC dc, int update)
+int renderer_gdi::draw(HDC dc, int update)
{
- gdi_info *gdi = (gdi_info *)window->m_drawdata;
int width, height, pitch;
RECT bounds;
// we don't have any special resize behaviors
- if (window->m_resize_state == RESIZE_STATE_PENDING)
- window->m_resize_state = RESIZE_STATE_NORMAL;
+ if (window().m_resize_state == RESIZE_STATE_PENDING)
+ window().m_resize_state = RESIZE_STATE_NORMAL;
// get the target bounds
- GetClientRect(window->m_hwnd, &bounds);
+ GetClientRect(window().m_hwnd, &bounds);
// compute width/height/pitch of target
width = rect_width(&bounds);
@@ -158,25 +161,25 @@ static int drawgdi_window_draw(win_window_info *window, HDC dc, int update)
pitch = (width + 3) & ~3;
// make sure our temporary bitmap is big enough
- if (pitch * height * 4 > gdi->bmsize)
+ if (pitch * height * 4 > bmsize)
{
- gdi->bmsize = pitch * height * 4 * 2;
- global_free_array(gdi->bmdata);
- gdi->bmdata = global_alloc_array(UINT8, gdi->bmsize);
+ bmsize = pitch * height * 4 * 2;
+ global_free_array(bmdata);
+ bmdata = global_alloc_array(UINT8, bmsize);
}
// draw the primitives to the bitmap
- window->m_primlist->acquire_lock();
- software_renderer<UINT32, 0,0,0, 16,8,0>::draw_primitives(*window->m_primlist, gdi->bmdata, width, height, pitch);
- window->m_primlist->release_lock();
+ window().m_primlist->acquire_lock();
+ software_renderer<UINT32, 0,0,0, 16,8,0>::draw_primitives(*window().m_primlist, bmdata, width, height, pitch);
+ window().m_primlist->release_lock();
// fill in bitmap-specific info
- gdi->bminfo.bmiHeader.biWidth = pitch;
- gdi->bminfo.bmiHeader.biHeight = -height;
+ bminfo.bmiHeader.biWidth = pitch;
+ bminfo.bmiHeader.biHeight = -height;
// blit to the screen
StretchDIBits(dc, 0, 0, width, height,
0, 0, width, height,
- gdi->bmdata, &gdi->bminfo, DIB_RGB_COLORS, SRCCOPY);
+ bmdata, &bminfo, DIB_RGB_COLORS, SRCCOPY);
return 0;
}