/* graphics.lua */
static const char* graphics_lua = R"(
jin.graphics = jin.graphics or {} 

local jg = jin.graphics

jg.RenderMode = {
    FILL = 1, 
    LINE = 2,
}

jg.SpriteOrigin = {
    TOPLEFT = 0,
    TOPCENTER = 1,
    TOPRIGHT = 2,
    MIDDLELEFT = 3,
    MIDDLECENTER = 4,
    MIDDLERIGHT = 5,
    BOTTOMLEFT = 6,
    BOTTOMCENTER = 7,
    BOTTOMRIGHT = 8
}

jg.SpriteMode = {
    SINGLE = 1,
    RANDOM = 2,
    ANIMATED = 3
}

-- built in shaders
jg.Shaders = {
	Font = nil, 
	Texture = nil, 
	Sprite = nil, 
	SpriteSheet = nil,
	Default = nil
}

local function compileBuiltInShaders() 
	jg.Shaders.Font = jg.newShader([[
		#VERTEX_SHADER
		Vertex vert(Vertex v)
		{
			return v;
		}
		#END_VERTEX_SHADER
		#FRAGMENT_SHADER
		Color frag(Color col, Texture tex, Vertex v)
		{
			return Color(col.rgb, texel(tex, v.uv).a);
		}
		#END_FRAGMENT_SHADER
	]])
	jg.Shaders.Texture = jg.newShader([[
		#VERTEX_SHADER
		Vertex vert(Vertex v)
		{
			return v;
		}
		#END_VERTEX_SHADER
		#FRAGMENT_SHADER
		Color frag(Color col, Texture tex, Vertex v)
		{
			return col * texel(tex, v.uv);
		}
		#END_FRAGMENT_SHADER
	]])
	jg.Shaders.Sprite = jg.newShader([[
		#VERTEX_SHADER
		Vertex vert(Vertex v)
		{
			return v;
		}
		#END_VERTEX_SHADER
		#FRAGMENT_SHADER
		Color frag(Color col, Texture tex, Vertex v)
		{
			return col * texel(tex, v.uv);
		}
		#END_FRAGMENT_SHADER
	]])
	jg.Shaders.SpriteSheet = jg.newShader([[
		#VERTEX_SHADER
		Vertex vert(Vertex v)
		{
			return v;
		}
		#END_VERTEX_SHADER
		#FRAGMENT_SHADER
		Color frag(Color col, Texture tex, Vertex v)
		{
			return col * texel(tex, v.uv);
		}
		#END_FRAGMENT_SHADER
	]])
	jg.Shaders.Default = jg.newShader([[
		#VERTEX_SHADER
		Vertex vert(Vertex v)
		{
			return v;
		}
		#END_VERTEX_SHADER
		#FRAGMENT_SHADER
		Color frag(Color col, Texture tex, Vertex v)
		{
			return col * texel(tex, v.uv);
		}
		#END_FRAGMENT_SHADER
	]])
end

local _init = jg.init
local initialized = false
jg.init = function(setting) 
    if initialized then 
        return initialized
    end
    initialized = _init(setting)
    if initialized then 
        compileBuiltInShaders()
        jg.useShader(jg.Shaders.Default)
    end
    return initialized 
end

jg.unuseShader = function()
    jg.useShader(jg.Shaders.Default)
end

-- Reset all attributes to default value.
jg.reset = function()
    jg.setColor(255, 255, 255, 255)
    jg.setClearColor(0, 0, 0, 255)
    jg.clear()
    jg.unsetFont()
    jg.unuseShader()
end

)";