diff options
Diffstat (limited to 'src/osd/windows/drawgdi.c')
-rw-r--r-- | src/osd/windows/drawgdi.c | 113 |
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; } |