Fix non-integer coordinates passed to ImageData:mapPixel/setPixel/getPixel and SoundData:set/getSample.

LuaJIT does interesting things when you index into a FFI array using a non-integer value.
This commit is contained in:
Alex Szpakowski
2016-10-24 18:14:09 -03:00
parent d57ce8ae73
commit ff53e8fe71
2 changed files with 17 additions and 0 deletions
+12
View File
@@ -27,6 +27,7 @@ local ImageData = ImageData_mt.__index
local tonumber, assert, error = tonumber, assert, error
local type, pcall = type, pcall
local floor = math.floor
local function inside(x, y, w, h)
return x >= 0 and x < w and y >= 0 and y < h
@@ -126,6 +127,11 @@ function ImageData:_mapPixelUnsafe(func, ix, iy, iw, ih)
local p = objectcache[self]
local idw, idh = p.width, p.height
ix = floor(ix)
iy = floor(iy)
iw = floor(iw)
ih = floor(ih)
local pixels = p.pointer
for y=iy, iy+ih-1 do
@@ -144,6 +150,9 @@ function ImageData:getPixel(x, y)
if type(x) ~= "number" then error("bad argument #1 to ImageData:getPixel (expected number)", 2) end
if type(y) ~= "number" then error("bad argument #2 to ImageData:getPixel (expected number)", 2) end
x = floor(x)
y = floor(y)
local p = objectcache[self]
if not inside(x, y, p.width, p.height) then error("Attempt to get out-of-range pixel!", 2) end
@@ -161,6 +170,9 @@ function ImageData:setPixel(x, y, r, g, b, a)
if type(x) ~= "number" then error("bad argument #1 to ImageData:setPixel (expected number)", 2) end
if type(y) ~= "number" then error("bad argument #2 to ImageData:setPixel (expected number)", 2) end
x = floor(x)
y = floor(y)
if type(r) == "table" then
local t = r
r, g, b, a = t[1], t[2], t[3], t[4]
+5
View File
@@ -35,6 +35,7 @@ local status, ffi = pcall(require, "ffi")
if not status then return end
local tonumber, assert, error = tonumber, assert, error
local floor = math.floor
local float = ffi.typeof("float")
local datatypes = {ffi.typeof("uint8_t *"), ffi.typeof("int16_t *")}
@@ -77,6 +78,8 @@ local objectcache = setmetatable({}, {
function SoundData:getSample(i)
if type(i) ~= "number" then error("bad argument #1 to SoundData:getSample (expected number)", 2) end
i = floor(i)
local p = objectcache[self]
if not (i >= 0 and i < p.size/p.bytedepth) then
@@ -96,6 +99,8 @@ function SoundData:setSample(i, sample)
if type(i) ~= "number" then error("bad argument #1 to SoundData:setSample (expected number)", 2) end
if type(sample) ~= "number" then error("bad argument #2 to SoundData:setSample (expected number)", 2) end
i = floor(i)
local p = objectcache[self]
if not (i >= 0 and i < p.size/p.bytedepth) then