Atlas.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. -------------------------------------------------------------------------------
  2. -- Spine Runtimes Software License v2.5
  3. --
  4. -- Copyright (c) 2013-2016, Esoteric Software
  5. -- All rights reserved.
  6. --
  7. -- You are granted a perpetual, non-exclusive, non-sublicensable, and
  8. -- non-transferable license to use, install, execute, and perform the Spine
  9. -- Runtimes software and derivative works solely for personal or internal
  10. -- use. Without the written permission of Esoteric Software (see Section 2 of
  11. -- the Spine Software License Agreement), you may not (a) modify, translate,
  12. -- adapt, or develop new applications using the Spine Runtimes or otherwise
  13. -- create derivative works or improvements of the Spine Runtimes or (b) remove,
  14. -- delete, alter, or obscure any trademarks or any copyright, trademark, patent,
  15. -- or other intellectual property or proprietary rights notices on or in the
  16. -- Software, including any copy thereof. Redistributions in binary or source
  17. -- form must include this license and terms.
  18. --
  19. -- THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
  20. -- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  21. -- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  22. -- EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. -- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  24. -- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF
  25. -- USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  26. -- IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  27. -- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  28. -- POSSIBILITY OF SUCH DAMAGE.
  29. -------------------------------------------------------------------------------
  30. local Atlas = {}
  31. function Atlas.parse(atlasPath, atlasBase)
  32. local function parseIntTuple4( l )
  33. local a,b,c,d = string.match( l , " ? ?%a+: ([+-]?%d+), ?([+-]?%d+), ?([+-]?%d+), ?([+-]?%d+)" )
  34. a,b,c,d = tonumber( a ), tonumber( b ), tonumber( c ), tonumber( d )
  35. return a and b and c and d and {a, b, c ,d}
  36. end
  37. local function parseIntTuple2( l )
  38. local a,b = string.match( l , " ? ?%a+: ([+-]?%d+), ?([+-]?%d+)" )
  39. a,b = tonumber( a ), tonumber( b )
  40. return a and b and {a, b}
  41. end
  42. if not atlasPath then
  43. error("Error: " .. atlasPath .. ".atlas" .. " doesn't exist!")
  44. return nil
  45. end
  46. local atlasLines = spine.utils.readFile( atlasPath, atlasBase )
  47. if not atlasLines then
  48. error("Error: " .. atlasPath .. ".atlas" .. " unable to read!")
  49. return nil
  50. end
  51. local pages = {}
  52. local it = string.gmatch(atlasLines, "(.-)\r?\n") -- iterate over lines
  53. for l in it do
  54. if #l == 0 then
  55. l = it()
  56. if l then
  57. local page = { name = l }
  58. l = it()
  59. page.size = parseIntTuple2( l )
  60. if page.size then
  61. l = it()
  62. end
  63. page.format = string.match( l, "%a+: (.+)" )
  64. page.filter = {string.match( it(), "%a+: (.+),(.+)" )}
  65. page.wrap = string.match( it(), "%a+: (.+)" )
  66. page.regions = {}
  67. table.insert( pages, page )
  68. else
  69. break
  70. end
  71. else
  72. local region = {name = l}
  73. region.rotate = string.match( it(), "%a+: (.+)" ) == "true"
  74. region.xy = parseIntTuple2( it() )
  75. region.size = parseIntTuple2( it() )
  76. l = it()
  77. region.splits = parseIntTuple4(l)
  78. if region.splits then
  79. l = it()
  80. region.pad = parseIntTuple4(l)
  81. if region.pad then
  82. l = it()
  83. end
  84. end
  85. region.orig = parseIntTuple2( l )
  86. region.offset = parseIntTuple2( it() )
  87. region.index = tonumber( string.match( it() , "%a+: ([+-]?%d+)" ) )
  88. table.insert( pages[#pages].regions, region )
  89. end
  90. end
  91. return pages
  92. end
  93. return Atlas