Загрузка данных


slot0 = require("ffi")

function slot1(slot0, slot1, slot2)
	if slot0 < slot1 then
		return slot1
	end

	if slot2 < slot0 then
		return slot2
	end

	return slot0
end

function slot2(slot0, slot1, slot2, slot3)
	return uv0(slot0, 0, 255), uv0(slot1, 0, 255), uv0(slot2, 0, 255), uv0(slot3, 0, 255)
end

function slot3(slot0)
	return slot0 + 0.5 - (slot0 + 0.5) % 1
end

function slot4(slot0, slot1, slot2, slot3, slot4)
	slot5 = slot4 and 1 or 255

	if slot0 == nil then
		slot3 = slot5
		slot2 = slot5
		slot1 = slot5
		slot0 = slot5
	elseif slot1 == nil then
		slot3 = slot5
		slot2 = slot0
		slot1 = slot0
	elseif slot2 == nil then
		slot3 = slot1
		slot2 = slot0
		slot1 = slot0
	elseif slot3 == nil then
		slot3 = slot5
	end

	if slot4 then
		slot3 = slot3 * 255
		slot2 = slot2 * 255
		slot1 = slot1 * 255
		slot0 = slot0 * 255
	end

	return uv0(uv1(slot0), uv1(slot1), uv1(slot2), uv1(slot3))
end

function slot5(slot0)
	if slot0:sub(1, 1) == "#" then
		slot0 = slot0:sub(2)
	end

	return tonumber(slot0:sub(1, 2), 16), tonumber(slot0:sub(3, 4), 16), tonumber(slot0:sub(5, 6), 16), tonumber(slot0:sub(7, 8), 16)
end

function slot6(slot0, slot1, slot2)
	if slot2 < 0 then
		slot2 = slot2 + 1
	end

	if slot2 > 1 then
		slot2 = slot2 - 1
	end

	if slot2 < 0.16666666666666666 then
		return slot0 + (slot1 - slot0) * 6 * slot2
	end

	if slot2 < 0.5 then
		return slot1
	end

	if slot2 < 0.6666666666666666 then
		return slot0 + (slot1 - slot0) * (0.6666666666666666 - slot2) * 6
	end

	return slot0
end

function slot7(slot0, slot1, slot2, slot3)
	slot4, slot5, slot6 = nil

	if slot1 == 0 then
		slot6 = slot2
		slot5 = slot2
		slot4 = slot2
	else
		slot7 = slot2 < 0.5 and slot2 * (1 + slot1) or slot2 + slot1 - slot2 * slot1
		slot8 = 2 * slot2 - slot7
		slot4 = uv0(slot8, slot7, slot0 + 0.3333333333333333)
		slot5 = uv0(slot8, slot7, slot0)
		slot6 = uv0(slot8, slot7, slot0 - 0.3333333333333333)
	end

	return slot4 * 255, slot5 * 255, slot6 * 255, slot3
end

function slot8(slot0, slot1, slot2, slot3)
	slot4, slot5, slot6 = nil
	slot7 = math.floor(slot0 * 6)
	slot8 = slot0 * 6 - slot7
	slot10 = slot2 * (1 - slot8 * slot1)

	if slot7 % 6 == 0 then
		slot6 = slot2 * (1 - slot1)
		slot5 = slot2 * (1 - (1 - slot8) * slot1)
		slot4 = slot2
	elseif slot7 == 1 then
		slot6 = slot9
		slot5 = slot2
		slot4 = slot10
	elseif slot7 == 2 then
		slot6 = slot11
		slot5 = slot2
		slot4 = slot9
	elseif slot7 == 3 then
		slot6 = slot2
		slot5 = slot10
		slot4 = slot9
	elseif slot7 == 4 then
		slot6 = slot2
		slot5 = slot9
		slot4 = slot11
	elseif slot7 == 5 then
		slot6 = slot10
		slot5 = slot9
		slot4 = slot2
	end

	return slot4 * 255, slot5 * 255, slot6 * 255, slot3
end

function slot9(slot0, slot1, slot2, slot3)
	return string.format("%02x%02x%02x%02x", slot0, slot1, slot2, slot3)
end

function slot10(slot0, slot1, slot2, slot3)
	slot2 = slot2 / 255
	slot1 = slot1 / 255
	slot0 = slot0 / 255
	slot4 = math.max(slot0, slot1, slot2)
	slot5 = math.min(slot0, slot1, slot2)
	slot6 = (slot4 + slot5) / 2
	slot7 = 0
	slot8 = (slot4 + slot5) / 2

	if slot4 ~= slot5 then
		slot9 = slot4 - slot5
		slot7 = slot8 > 0.5 and slot9 / (2 - slot4 - slot5) or slot9 / (slot4 + slot5)

		if slot4 == slot0 then
			slot6 = (slot1 - slot2) / slot9 + (slot1 < slot2 and 6 or 0)
		elseif slot4 == slot1 then
			slot6 = (slot2 - slot0) / slot9 + 2
		elseif slot4 == slot2 then
			slot6 = (slot0 - slot1) / slot9 + 4
		end

		slot6 = slot6 / 6
	end

	return slot6, slot7, slot8, slot3
end

function slot11(slot0, slot1, slot2, slot3)
	slot2 = slot2 / 255
	slot1 = slot1 / 255
	slot0 = slot0 / 255
	slot4 = math.max(slot0, slot1, slot2)
	slot5 = math.min(slot0, slot1, slot2)
	slot6 = slot4
	slot7 = slot4 == 0 and 0 or (slot4 - slot5) / slot4
	slot8 = slot4

	if slot4 ~= slot5 then
		if slot4 == slot0 then
			slot6 = (slot1 - slot2) / (slot4 - slot5) + (slot1 < slot2 and 6 or 0)
		elseif slot4 == slot1 then
			slot6 = (slot2 - slot0) / slot9 + 2
		elseif slot4 == slot2 then
			slot6 = (slot0 - slot1) / slot9 + 4
		end

		slot6 = slot6 / 6
	end

	return slot6, slot7, slot8, slot3
end

function slot12(slot0)
	if type(slot0[1]) ~= "table" then
		for slot5, slot6 in ipairs(slot0) do
			slot0[slot5] = {
				slot6,
				(slot5 - 1) * 1 / (#slot0 - 1)
			}
		end
	end

	if #slot0 < 2 then
		error("2 or more colors required!")
	end

	if slot0[1][2] ~= 0 then
		error("First color must start at position 0!")
	end

	if slot0[#slot0][2] ~= 1 then
		error("Last color must end at position 1!")
	end

	slot1 = 0

	for slot5, slot6 in ipairs(slot0) do
		if not slot6[2] then
			error("Color doesn't have a stop property!")
		end

		if slot7 < 0 or slot7 > 1 then
			error("Color stop is out of boundaries!")
		end

		if slot1 <= slot7 then
			slot1 = slot7
		else
			error("Color stops are out of order!")
		end
	end

	return slot0
end

slot14 = {
	__index = slot14,
	__metatable = "Read only",
	color = true
}
slot15 = setmetatable({}, slot14)

function slot14.__call(slot0, slot1, slot2, slot3, slot4, slot5)
	slot1, slot2, slot3, slot4 = uv0(slot1, slot2, slot3, slot4, slot5)

	if not uv1 then
		return setmetatable({
			r = slot1,
			g = slot2,
			b = slot3,
			a = slot4
		}, uv2)
	end

	return uv1(slot1, slot2, slot3, slot4)
end

function slot14.fraction(slot0, slot1, slot2, slot3)
	return uv0(slot0, slot1, slot2, slot3, true)
end

function slot14.hex(slot0)
	slot1, slot2, slot3, slot4 = uv0(slot0)

	return uv1(slot1, slot2, slot3, slot4)
end

function slot14.hsl(slot0, slot1, slot2, slot3)
	slot4, slot5, slot6, slot7 = uv0(slot0, slot1, slot2, slot3)

	return uv1(slot4, slot5, slot6, slot7)
end

function slot14.hsv(slot0, slot1, slot2, slot3)
	slot4, slot5, slot6, slot7 = uv0(slot0, slot1, slot2, slot3)

	return uv1(slot4, slot5, slot6, slot7)
end

function slot14.to_hex(slot0)
	return uv0(slot0.r, slot0.g, slot0.b, slot0.a)
end

function slot14.to_hsl(slot0)
	return uv0(slot0.r, slot0.g, slot0.b, slot0.a)
end

function slot14.to_hsv(slot0)
	return uv0(slot0.r, slot0.g, slot0.b, slot0.a)
end

function slot14.__tostring(slot0)
	return string.format("color(%d, %d, %d, %d)", slot0.r, slot0.g, slot0.b, slot0.a)
end

function slot14.__concat(slot0, slot1)
	return tostring(slot0) .. tostring(slot1)
end

function slot14.__add(slot0, slot1)
	slot1 = uv0.is_color(slot1) and slot1 or uv0(slot1)

	return uv0(slot0.r + slot1.r, slot0.g + slot1.g, slot0.b + slot1.b, slot0.a + slot1.a)
end

function slot14.__sub(slot0, slot1)
	slot1 = uv0.is_color(slot1) and slot1 or uv0(slot1)

	return uv0(slot0.r - slot1.r, slot0.g - slot1.g, slot0.b - slot1.b, slot0.a - slot1.a)
end

function slot14.__mul(slot0, slot1)
	slot1 = uv0.is_color(slot1) and slot1 or uv0(slot1)

	return uv0(slot0.r * slot1.r, slot0.g * slot1.g, slot0.b * slot1.b, slot0.a * slot1.a)
end

function slot14.__div(slot0, slot1)
	slot1 = uv0.is_color(slot1) and slot1 or uv0(slot1)

	return uv0(slot0.r / slot1.r, slot0.g / slot1.g, slot0.b / slot1.b, slot0.a / slot1.a)
end

function slot14.__eq(slot0, slot1)
	slot1 = uv0.is_color(slot1) and slot1 or uv0(slot1)

	return slot0.r == slot1.r and slot0.g == slot1.g and slot0.b == slot1.b and slot0.a == slot1.a
end

function slot14.lerp(slot0, slot1, slot2)
	slot1 = uv0.is_color(slot1) and slot1 or uv0(slot1)

	return uv0(slot0.r + (slot1.r - slot0.r) * slot2, slot0.g + (slot1.g - slot0.g) * slot2, slot0.b + (slot1.b - slot0.b) * slot2, slot0.a + (slot1.a - slot0.a) * slot2)
end

function slot14.gamma_correct(slot0, slot1)
	return uv0(math.pow(slot0.r, slot1), math.pow(slot0.g, slot1), math.pow(slot0.b, slot1), slot0.a)
end

function slot14.grayscale(slot0)
	slot1 = (slot0.r + slot0.g + slot0.b) / 3

	return uv0(slot1, slot1, slot1, slot0.a)
end

function slot14.invert(slot0)
	return uv0(255 - slot0.r, 255 - slot0.g, 255 - slot0.b, slot0.a)
end

function slot14.rotate(slot0, slot1)
	slot2, slot3, slot4 = uv0(slot0.r, slot0.g, slot0.b, slot0.a)
	slot5, slot6, slot7 = uv1((slot2 * 360 + slot1) % 360 / 360, slot3, slot4, slot0.a)

	return uv2(slot5, slot6, slot7, slot0.a)
end

function slot14.alpha_modulate(slot0, slot1)
	return uv0(slot0.r, slot0.g, slot0.b, slot1)
end

function slot14.unpack(slot0, slot1)
	if slot1 then
		return slot0.r, slot0.g, slot0.b
	end

	return slot0.r, slot0.g, slot0.b, slot0.a
end

function slot14.clone(slot0)
	return uv0(slot0.r, slot0.g, slot0.b, slot0.a)
end

function slot15.is_color(slot0)
	return (type(slot0) == "table" or type(slot0) == "cdata") and slot0.color
end

function slot15.linear_gradient(slot0, slot1)
	slot0 = uv0(slot0)
	slot2 = 1

	while slot0[slot2 + 1][2] < slot1 do
		slot2 = slot2 + 1
	end

	return slot0[slot2][1]:lerp(slot0[slot2 + 1][1], (slot1 - slot0[slot2][2]) / (slot0[slot2 + 1][2] - slot0[slot2][2]))
end

slot0.metatype(slot0.typeof("struct { uint8_t r, g, b, a;}"), slot14)

return slot15