From 260bb2e4e1306aa2525968185c814e3b2fcc3ba0 Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Sat, 15 Jul 2017 17:50:05 -0400 Subject: [PATCH 1/7] Add ability to load raw data from a string --- .../computercraft/lua/rom/apis/paintutils.lua | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index 615a12862..1d9238cc2 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -9,25 +9,48 @@ for n=1,16 do tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1) end -function loadImage( sPath ) +function loadImage( sPath, bLoadRawData ) if type( sPath ) ~= "string" then error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 ) end + if bLoadRawData ~= nil and type(bLoadRawData) ~= "boolean" then + error( "bad argument #2 (expected nil or boolean, got " .. type( sPath ) .. ")" ) + end - local tImage = {} - if fs.exists( sPath ) then - local file = io.open(sPath, "r" ) + local function parseLine( tImageArg, sLine ) + local tLine = {} + for x=1,sLine:len() do + tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0 + end + table.insert( tImageArg, tLine ) + return tImageArg + end + + if fs.exists( sPath ) and not bLoadRawData then + local tImage = {} + local file = io.open( sPath, "r" ) local sLine = file:read() while sLine do - local tLine = {} - for x=1,sLine:len() do - tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0 - end - table.insert( tImage, tLine ) + tImage = parseLine( tImage, sLine ) sLine = file:read() end file:close() return tImage + else + if bLoadRawData then + local function split( str, delim ) -- modified split function from https://codea.io/talk/discussion/2118/split-a-string-by-return-newline + if string.find( str, delim ) == nil then return { str } end + local result, pat, lastpos = {}, "(.-)" .. delim .. "()", nil + for part, pos in string.gfind( str, pat ) do table.insert( result, part ); lastpos = pos; end + table.insert( result, string.sub( str, lastpos ) ) + return result + end + local tImage = {} + for _, sLine in pairs( split( sPath, "\n" ) ) do -- read each line like original file handling did + tImage = parseLine( tImage, sLine ) + end + return tImage + end end return nil end From 71d024a76cf881caa171d861c1ebc87e946487ef Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Sat, 15 Jul 2017 18:27:52 -0400 Subject: [PATCH 2/7] Move raw data parsing to paintutils.drawImage --- .../computercraft/lua/rom/apis/paintutils.lua | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index 1d9238cc2..facdb1b43 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -9,48 +9,49 @@ for n=1,16 do tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1) end -function loadImage( sPath, bLoadRawData ) +local function parseLine( tImageArg, sLine ) + local tLine = {} + for x=1,sLine:len() do + tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0 + end + table.insert( tImageArg, tLine ) + return tImageArg +end + +function parseImage( sRawData ) + if type( sRawData ) ~= "string" then + error ( "bad argument #1 (expected string, got " .. type( sRawData ) .. ")" ) + end + local function split( str, delim ) -- modified split function from https://codea.io/talk/discussion/2118/split-a-string-by-return-newline + if string.find( str, delim ) == nil then return { str } end + local result, pat, lastpos = {}, "(.-)" .. delim .. "()", nil + for part, pos in string.gfind( str, pat ) do table.insert( result, part ); lastpos = pos; end + table.insert( result, string.sub( str, lastpos ) ) + return result + end + local tImage = {} + for _, sLine in pairs( split( sPath, "\n" ) ) do -- read each line like original file handling did + tImage = parseLine( tImage, sLine ) + end + return tImage +end + +function loadImage( sPath ) if type( sPath ) ~= "string" then error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 ) end - if bLoadRawData ~= nil and type(bLoadRawData) ~= "boolean" then - error( "bad argument #2 (expected nil or boolean, got " .. type( sPath ) .. ")" ) - end - local function parseLine( tImageArg, sLine ) - local tLine = {} - for x=1,sLine:len() do - tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0 - end - table.insert( tImageArg, tLine ) - return tImageArg - end - if fs.exists( sPath ) and not bLoadRawData then local tImage = {} local file = io.open( sPath, "r" ) local sLine = file:read() + local sContent = "" while sLine do - tImage = parseLine( tImage, sLine ) + sContent = sContent .. sLine .. "\n" sLine = file:read() end file:close() - return tImage - else - if bLoadRawData then - local function split( str, delim ) -- modified split function from https://codea.io/talk/discussion/2118/split-a-string-by-return-newline - if string.find( str, delim ) == nil then return { str } end - local result, pat, lastpos = {}, "(.-)" .. delim .. "()", nil - for part, pos in string.gfind( str, pat ) do table.insert( result, part ); lastpos = pos; end - table.insert( result, string.sub( str, lastpos ) ) - return result - end - local tImage = {} - for _, sLine in pairs( split( sPath, "\n" ) ) do -- read each line like original file handling did - tImage = parseLine( tImage, sLine ) - end - return tImage - end + return parseImage( sContent ) -- delegate parsing of images to parseImage function as suggested by @SquidDev in discussion of PR #378 end return nil end From 11060596b10426169165903ef49d71c350db5c88 Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Sat, 15 Jul 2017 18:31:42 -0400 Subject: [PATCH 3/7] Remove legacy bHandleRawData check and fix file loading While the check (most likely) wouldn't break anything, it's better to fix it and not worry then to not fix it and find out it breaks image loading. Also fixes how files are loaded. --- .../assets/computercraft/lua/rom/apis/paintutils.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index facdb1b43..2d00ea570 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -41,17 +41,17 @@ function loadImage( sPath ) error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 ) end - if fs.exists( sPath ) and not bLoadRawData then + if fs.exists( sPath ) then local tImage = {} local file = io.open( sPath, "r" ) local sLine = file:read() local sContent = "" while sLine do - sContent = sContent .. sLine .. "\n" + sContent = sContent .. "\n" .. sLine sLine = file:read() end file:close() - return parseImage( sContent ) -- delegate parsing of images to parseImage function as suggested by @SquidDev in discussion of PR #378 + return parseImage( sContent:sub(2) ) -- remove first newline and delegate parsing of images to parseImage function as suggested by @SquidDev in discussion of PR #378 end return nil end From ee20d7bed21d4a32b8f057bcc3c43151307cb4f0 Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Sun, 16 Jul 2017 02:08:54 -0400 Subject: [PATCH 4/7] Fix line split Also fixes a typo. --- .../assets/computercraft/lua/rom/apis/paintutils.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index 2d00ea570..45c40e8b2 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -20,17 +20,10 @@ end function parseImage( sRawData ) if type( sRawData ) ~= "string" then - error ( "bad argument #1 (expected string, got " .. type( sRawData ) .. ")" ) - end - local function split( str, delim ) -- modified split function from https://codea.io/talk/discussion/2118/split-a-string-by-return-newline - if string.find( str, delim ) == nil then return { str } end - local result, pat, lastpos = {}, "(.-)" .. delim .. "()", nil - for part, pos in string.gfind( str, pat ) do table.insert( result, part ); lastpos = pos; end - table.insert( result, string.sub( str, lastpos ) ) - return result + error( "bad argument #1 (expected string, got " .. type( sRawData ) .. ")" ) end local tImage = {} - for _, sLine in pairs( split( sPath, "\n" ) ) do -- read each line like original file handling did + for sLine in ( sRawData .. "\n" ):gmatch( "(.-)\n" ) do -- read each line like original file handling did tImage = parseLine( tImage, sLine ) end return tImage From af847818d26d4df23623ce4967842d3608fde239 Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Sun, 16 Jul 2017 02:10:42 -0400 Subject: [PATCH 5/7] Remove some context from comment I agree with SquidDev, I went a bit too far with the whole context thing. --- .../resources/assets/computercraft/lua/rom/apis/paintutils.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index 45c40e8b2..c8005cd58 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -44,7 +44,7 @@ function loadImage( sPath ) sLine = file:read() end file:close() - return parseImage( sContent:sub(2) ) -- remove first newline and delegate parsing of images to parseImage function as suggested by @SquidDev in discussion of PR #378 + return parseImage( sContent:sub(2) ) -- remove first newline and delegate image parse to parseImage end return nil end From f785b0a488e343aca642ab5d839508fccc4e8608 Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Mon, 17 Jul 2017 01:16:36 -0400 Subject: [PATCH 6/7] Update paintutils.lua --- .../assets/computercraft/lua/rom/apis/paintutils.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index c8005cd58..89d8efff2 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -37,14 +37,9 @@ function loadImage( sPath ) if fs.exists( sPath ) then local tImage = {} local file = io.open( sPath, "r" ) - local sLine = file:read() - local sContent = "" - while sLine do - sContent = sContent .. "\n" .. sLine - sLine = file:read() - end + local sContent = file:readAll() file:close() - return parseImage( sContent:sub(2) ) -- remove first newline and delegate image parse to parseImage + return parseImage( sContent ) -- delegate image parse to parseImage end return nil end From 2c91c7962fc71bed973775da83a0cd3f10effece Mon Sep 17 00:00:00 2001 From: MineRobber___T Date: Mon, 17 Jul 2017 01:49:14 -0400 Subject: [PATCH 7/7] Remove unused tImage table and slightly clean code --- .../assets/computercraft/lua/rom/apis/paintutils.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua index 89d8efff2..d5544498a 100644 --- a/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/assets/computercraft/lua/rom/apis/paintutils.lua @@ -15,7 +15,6 @@ local function parseLine( tImageArg, sLine ) tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0 end table.insert( tImageArg, tLine ) - return tImageArg end function parseImage( sRawData ) @@ -24,7 +23,7 @@ function parseImage( sRawData ) end local tImage = {} for sLine in ( sRawData .. "\n" ):gmatch( "(.-)\n" ) do -- read each line like original file handling did - tImage = parseLine( tImage, sLine ) + parseLine( tImage, sLine ) end return tImage end @@ -35,7 +34,6 @@ function loadImage( sPath ) end if fs.exists( sPath ) then - local tImage = {} local file = io.open( sPath, "r" ) local sContent = file:readAll() file:close()