--[[
CScreen v1.3 by CodeNMore
A simple way to make resolution-independent Love2D games
Tested for LOVE 0.10.1
See: https://github.com/CodeNMore/CScreen
Zlib License:
Copyright (c) 2016 CodeNMore
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be appreciated
but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
--]]

local CScreen = {}
local rx, ry, ctr = 800, 600, true
local rxv, ryv, fsv, fsvr = 800, 600, 1.0, 1.0
local tx, ty, rwf, rhf = 0, 0, 800, 600
local cr, cg, cb, ca = 0, 0, 0, 255

-- Initializes CScreen with the initial size values
function CScreen.init(tw, th, cntr)
	rx = tw or 800
	ry = th or 600
	ctr = cntr or false
	CScreen.update(love.graphics.getWidth(), love.graphics.getHeight())
end

-- Draws letterbox borders
function CScreen.cease()
	if ctr then
		local pr, pg, pb, pa = love.graphics.getColor()
		love.graphics.setColor(cr, cg, cb, ca)
		love.graphics.scale(fsvr, fsvr)

		if tx ~= 0 then
			love.graphics.rectangle("fill", -tx, 0, tx, rhf)
			love.graphics.rectangle("fill", rxv, 0, tx, rhf)
		elseif ty ~= 0 then
			love.graphics.rectangle("fill", 0, -ty, rwf, ty)
			love.graphics.rectangle("fill", 0, ryv, rwf, ty)
		end

		love.graphics.setColor(pr, pg, pb, pa)
	end
end

-- Scales and centers all graphics properly
function CScreen.apply()
	if ctr then
		love.graphics.translate(tx, ty)
	end
	love.graphics.scale(fsv, fsv)
end

-- Updates CScreen when the window size changes
function CScreen.update(w, h)
	local sx = w / rx
	local sy = h / ry
	fsv = math.min(sx, sy)
	fsvr = 1 / fsv
	-- Centering
	if ctr and fsv == sx then -- Vertically
		tx = 0
		ty = (h / 2) - (ry * fsv / 2)
	elseif ctr and fsv == sy then -- Horizontally
		ty = 0
		tx = (w / 2) - (rx * fsv / 2)
	end
	-- Variable sets
	rwf = w
	rhf = h
	rxv = rx * fsv
	ryv = ry * fsv
end

-- Convert from window coordinates to target coordinates
function CScreen.project(x, y)
	return math.floor((x - tx) / fsv), math.floor((y - ty) / fsv)
end

-- Change letterbox color
function CScreen.setColor(r, g, b, a)
	cr = r
	cg = g
	cb = b
	ca = a
end

-- Return the table for use
return CScreen
