-
Notifications
You must be signed in to change notification settings - Fork 0
/
Export to C.lua
149 lines (124 loc) · 4.88 KB
/
Export to C.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
-- Create a new sprite flattened
local name = app.activeSprite.filename:match("^.+/([^.]+).+$")
local sprite = Sprite(app.activeSprite)
app.activeSprite = sprite;
for i,layer in ipairs(sprite.layers) do
if(layer.isVisible == false) then
sprite:deleteLayer(layer)
end
end
sprite:flatten();
-- Define the sprite properties
local image = app.activeImage
local w = sprite.width
local h = sprite.height
local frame_count = #(sprite.frames);
local dlg = Dialog()
dlg:label{ label="Size", text=w.."x"..h }
dlg:label{ label="Frame Count", text=frame_count }
dlg:file{ id="File",
label="Filename",
title="Export to C",
open=false,
save=true,
filename=name..".h",
filetypes={ "h"}}
dlg:button{ text="Close",
onclick=function()
dlg:close()
end }
dlg:button{ text="Export",
onclick=function()
-- Exporting sections
local header = "#include <stdint.h>\n"..
"#include <avr/pgmspace.h>\n\n"..
"// Define Sprite structure\n"..
"#ifndef _H_SPRITESTRUCT\n"..
"#define _H_SPRITESTRUCT\n\n"..
"struct Sprite\n"..
"{\n"..
" const uint16_t frameCount;\n"..
" const uint16_t width;\n"..
" const uint16_t height;\n"..
" const uint32_t *frameduration;\n"..
" const uint32_t *frames;\n"..
"};\n\n"..
"#endif\n"
local name = ("/DEADBEEF/"..dlg.data.File):match("^.+/([^.]+).+$"):gsub(" ","_")
-- local fps_define = "#define "..name:upper().."_FPS 5"
-- local frame_count_define = "#define "..name:upper().."_FRAME_COUNT "..frame_count
-- local width_define = "#define "..name:upper().."_FRAME_WIDTH "..w
-- local height_define = "#define "..name:upper().."_FRAME_HEIGHT "..h
-- Add to exported text
local file_text = "";
local frametime_text = "";
local framepixels_text = "";
file_text = file_text..header.."\n"
--file_text = file_text..fps_define.."\n"
-- file_text = file_text..frame_count_define.."\n"
-- file_text = file_text..width_define.."\n"
-- file_text = file_text..height_define.."\n"
file_text = file_text.."\n/* Data exported for "..name.."*/\n"
local variable_dec = "static const uint32_t PROGMEM "..name:lower().."_data["..frame_count.."]["..h*w.."] = {"
framepixels_text = framepixels_text..variable_dec.."\n"
frametime_text = "static const uint32_t PROGMEM "..name:lower().."_frameduration["..frame_count.."] = {"
-- Img ofset. There is only one because we flattened the sprite
local img_x = image.cel.bounds.x
local img_y = image.cel.bounds.y
--print("img offset = ("..img_x..","..img_y..")")
-- For every frame
for frameidx,frame in ipairs(sprite.frames) do
-- Define w*h output array
local output_array = {}
for i = 0, w * h - 1 do
output_array[i] = 0;
end
framepixels_text = framepixels_text.."{\n"
app.activeFrame = frameidx;
frametime_text = frametime_text..math.floor(frame.duration*1000)..", "
image = app.activeImage
-- For every pixel in the image, put it in the array
for it in image:pixels() do
local pixelValue = it() -- get pixel
-- print("("..it.x..","..it.y..") = "..pixelValue)
output_array[(it.x+img_x)+(w*(it.y+img_y))] = pixelValue;
end
for i = 0, w * h - 1 do
local pixelValue = output_array[i];
local pixel_str = string.format("0x%02X%02X%02X%02X", app.pixelColor.rgbaA(pixelValue),app.pixelColor.rgbaR(pixelValue),app.pixelColor.rgbaG(pixelValue),app.pixelColor.rgbaB(pixelValue))
framepixels_text = framepixels_text..pixel_str
if((i+1) % w ~= 0)
then
framepixels_text = framepixels_text..", "
else
framepixels_text = framepixels_text..",\n"
end
end
-- Remove last comma
framepixels_text = framepixels_text:sub(1, -3)
framepixels_text = framepixels_text.."\n},".."\n"
if(frame.next == nil)
then
framepixels_text = framepixels_text:sub(1, -3)
framepixels_text = framepixels_text.."\n};\n"
frametime_text = frametime_text:sub(1, -3)
frametime_text = frametime_text.."};\n"
end
end
file_text = file_text..frametime_text.."\n"..framepixels_text
file_text = file_text..
"const Sprite "..name.." PROGMEM = {\n"..
" "..frame_count..", // Frames\n"..
" "..w..", // Width\n"..
" "..h..", // Height\n"..
" &("..name:lower().."_frameduration[0]), // Frames duration\n"..
" &("..name:lower().."_data[0][0]) // Frames Data\n"..
"};\n"
-- print(file_text)
filewrite = io.open(dlg.data.File, "w")
filewrite:write(file_text)
filewrite:close()
dlg:close()
end }
dlg:show()
sprite:close();