100 lines
2.9 KiB
Lua
100 lines
2.9 KiB
Lua
--- Standardized error message formatter
|
|
---@param module string -- Module name (e.g., "Color", "Theme", "Units")
|
|
---@param message string -- Error message
|
|
---@return string -- Formatted error message
|
|
local function formatError(module, message)
|
|
return string.format("[FlexLove.%s] %s", module, message)
|
|
end
|
|
|
|
local ImageDataReader = {}
|
|
|
|
---@param imagePath string
|
|
---@return love.ImageData
|
|
function ImageDataReader.loadImageData(imagePath)
|
|
if not imagePath then
|
|
error(formatError("ImageDataReader", "Image path cannot be nil"))
|
|
end
|
|
|
|
local success, result = pcall(function()
|
|
return love.image.newImageData(imagePath)
|
|
end)
|
|
|
|
if not success then
|
|
error(formatError("ImageDataReader", "Failed to load image data from '" .. imagePath .. "': " .. tostring(result)))
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
--- Extract all pixels from a specific row
|
|
---@param imageData love.ImageData
|
|
---@param rowIndex number -- 0-based row index
|
|
---@return table -- Array of {r, g, b, a} values (0-255 range)
|
|
function ImageDataReader.getRow(imageData, rowIndex)
|
|
if not imageData then
|
|
error(formatError("ImageDataReader", "ImageData cannot be nil"))
|
|
end
|
|
|
|
local width = imageData:getWidth()
|
|
local height = imageData:getHeight()
|
|
|
|
if rowIndex < 0 or rowIndex >= height then
|
|
error(formatError("ImageDataReader", string.format("Row index %d out of bounds (height: %d)", rowIndex, height)))
|
|
end
|
|
|
|
local pixels = {}
|
|
for x = 0, width - 1 do
|
|
local r, g, b, a = imageData:getPixel(x, rowIndex)
|
|
table.insert(pixels, {
|
|
r = math.floor(r * 255 + 0.5),
|
|
g = math.floor(g * 255 + 0.5),
|
|
b = math.floor(b * 255 + 0.5),
|
|
a = math.floor(a * 255 + 0.5),
|
|
})
|
|
end
|
|
|
|
return pixels
|
|
end
|
|
|
|
--- Extract all pixels from a specific column
|
|
---@param imageData love.ImageData
|
|
---@param colIndex number -- 0-based column index
|
|
---@return table -- Array of {r, g, b, a} values (0-255 range)
|
|
function ImageDataReader.getColumn(imageData, colIndex)
|
|
if not imageData then
|
|
error(formatError("ImageDataReader", "ImageData cannot be nil"))
|
|
end
|
|
|
|
local width = imageData:getWidth()
|
|
local height = imageData:getHeight()
|
|
|
|
if colIndex < 0 or colIndex >= width then
|
|
error(formatError("ImageDataReader", string.format("Column index %d out of bounds (width: %d)", colIndex, width)))
|
|
end
|
|
|
|
local pixels = {}
|
|
for y = 0, height - 1 do
|
|
local r, g, b, a = imageData:getPixel(colIndex, y)
|
|
table.insert(pixels, {
|
|
r = math.floor(r * 255 + 0.5),
|
|
g = math.floor(g * 255 + 0.5),
|
|
b = math.floor(b * 255 + 0.5),
|
|
a = math.floor(a * 255 + 0.5),
|
|
})
|
|
end
|
|
|
|
return pixels
|
|
end
|
|
|
|
--- Check if a pixel is black with full alpha (9-patch marker)
|
|
---@param r number -- Red (0-255)
|
|
---@param g number -- Green (0-255)
|
|
---@param b number -- Blue (0-255)
|
|
---@param a number -- Alpha (0-255)
|
|
---@return boolean
|
|
function ImageDataReader.isBlackPixel(r, g, b, a)
|
|
return r == 0 and g == 0 and b == 0 and a == 255
|
|
end
|
|
|
|
return ImageDataReader
|