@startuml
skinparam Shadowing false
skinparam LineType ortho
skinparam ArrowColor black
skinparam nodesep 15
skinparam ranksep 30

skinparam class {
    BackgroundColor WhiteSmoke
    BorderColor black
}

enum primitive_type
{
	LINE
	QUAD
}

package SDL {
	class SDL_Renderer
	class SDL_Texture
	class SDL_Rect
	
}

class renderer_sdl2 {
	-SDL_Renderer sdl_renderer
	
	+int create()
	+render_primitive[] get_primitives()    
	+int draw(const int update)
	{static} +void init(running_machine machine)
	{static} +void exit()
}

class render_primitive {
	+render_bounds bounds
	+primitive_type type
	+render_color color
	+render_texinfo texture
	+render_quad_texuv texcoords
}

class osd_renderer {
    -osd_window  m_window
    +osd_window assert_window()
    {abstract} +int create()
    {abstract} +render_primitive[] get_primitives()
    {abstract} +int draw(const int update)
    {static} +osd_renderer make_for_type(int mode, osd_window window, int extra_flags)
}

class osd_window {
    +HDC m_dc
    +render_primitive[] m_primlist
    +osd_renderer renderer()        
    {abstract} +render_target target()    
    {abstract} +running_machine machine()
    {abstract} +void update()    
}

entity DirectX
entity OpenGL

renderer_ogl -u-|> osd_renderer
renderer_ogl -d- OpenGL
renderer_d3d9 -u-|> osd_renderer
renderer_d3d9 -d- DirectX
renderer_sdl2 -u-|> osd_renderer
renderer_sdl2 -- SDL_Renderer
renderer_sdl2 -- SDL_Texture
renderer_sdl2 -- SDL_Rect

osd_renderer -u- osd_window
osd_window -l- render_primitive
render_primitive -d- primitive_type
@enduml
