summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/drawgdi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/drawgdi.cpp')
-rw-r--r--src/osd/modules/render/drawgdi.cpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/osd/modules/render/drawgdi.cpp b/src/osd/modules/render/drawgdi.cpp
new file mode 100644
index 00000000000..ccbbc6c03eb
--- /dev/null
+++ b/src/osd/modules/render/drawgdi.cpp
@@ -0,0 +1,183 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+//============================================================
+//
+// drawgdi.c - Win32 GDI drawing
+//
+//============================================================
+
+// standard windows headers
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+// MAME headers
+#include "emu.h"
+#include "rendersw.inc"
+
+// MAMEOS headers
+#include "window.h"
+
+
+//============================================================
+// TYPE DEFINITIONS
+//============================================================
+
+class renderer_gdi : public osd_renderer
+{
+public:
+ renderer_gdi(osd_window *window)
+ : osd_renderer(window, FLAG_NONE), bmdata(NULL), bmsize(0) { }
+
+ virtual ~renderer_gdi() { }
+
+ virtual int create();
+ virtual render_primitive_list *get_primitives();
+ virtual int draw(const 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);
+
+//============================================================
+// drawnone_create
+//============================================================
+
+static osd_renderer *drawgdi_create(osd_window *window)
+{
+ return global_alloc(renderer_gdi(window));
+}
+
+
+//============================================================
+// drawgdi_init
+//============================================================
+
+int drawgdi_init(running_machine &machine, osd_draw_callbacks *callbacks)
+{
+ // fill in the callbacks
+ memset(callbacks, 0, sizeof(*callbacks));
+ callbacks->exit = drawgdi_exit;
+ callbacks->create = drawgdi_create;
+ return 0;
+}
+
+
+
+//============================================================
+// drawgdi_exit
+//============================================================
+
+static void drawgdi_exit(void)
+{
+}
+
+
+
+//============================================================
+// drawgdi_window_init
+//============================================================
+
+int renderer_gdi::create()
+{
+ // fill in the bitmap info header
+ 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;
+}
+
+
+
+//============================================================
+// drawgdi_window_destroy
+//============================================================
+
+void renderer_gdi::destroy()
+{
+ // free the bitmap memory
+ if (bmdata != NULL)
+ global_free_array(bmdata);
+}
+
+
+
+//============================================================
+// drawgdi_window_get_primitives
+//============================================================
+
+render_primitive_list *renderer_gdi::get_primitives()
+{
+ RECT client;
+ GetClientRect(window().m_hwnd, &client);
+ window().target()->set_bounds(rect_width(&client), rect_height(&client), window().aspect());
+ return &window().target()->get_primitives();
+}
+
+
+
+//============================================================
+// drawgdi_window_draw
+//============================================================
+
+int renderer_gdi::draw(const int update)
+{
+ 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;
+
+ // get the target bounds
+ GetClientRect(window().m_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 > 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, bmdata, width, height, pitch);
+ window().m_primlist->release_lock();
+
+ // fill in bitmap-specific info
+ bminfo.bmiHeader.biWidth = pitch;
+ bminfo.bmiHeader.biHeight = -height;
+
+ // blit to the screen
+ StretchDIBits(window().m_dc, 0, 0, width, height,
+ 0, 0, width, height,
+ bmdata, &bminfo, DIB_RGB_COLORS, SRCCOPY);
+ return 0;
+}