1 #ifndef _lua__bitmap__hpp__included__
2 #define _lua__bitmap__hpp__included__
7 #include "core/window.hpp"
8 #include "library/lua-base.hpp"
9 #include "library/lua-class.hpp"
10 #include "library/lua-params.hpp"
11 #include "library/framebuffer.hpp"
12 #include "library/range.hpp"
13 #include "library/threads.hpp"
14 #include "library/string.hpp"
18 std::vector
<framebuffer::color
> lcolors
;
19 framebuffer::color
* colors
;
20 framebuffer::color
* scolors
;
21 lua_palette(lua::state
& L
);
23 const static size_t reserved_colors
= 32;
24 static size_t overcommit() {
25 return lua::overcommit_std_align
+ reserved_colors
* sizeof(framebuffer::color
);
28 threads::lock palette_mutex
;
30 static int create(lua::state
& L
, lua::parameters
& P
);
31 static int load(lua::state
& L
, lua::parameters
& P
);
32 static int load_str(lua::state
& L
, lua::parameters
& P
);
33 int set(lua::state
& L
, lua::parameters
& P
);
34 int get(lua::state
& L
, lua::parameters
& P
);
35 int hash(lua::state
& L
, lua::parameters
& P
);
36 int debug(lua::state
& L
, lua::parameters
& P
);
37 int adjust_transparency(lua::state
& L
, lua::parameters
& P
);
38 void adjust_palette_size(size_t newsize
);
39 void push_back(const framebuffer::color
& c
);
44 lua_bitmap(lua::state
& L
, uint32_t w
, uint32_t h
);
45 static size_t overcommit(uint32_t w
, uint32_t h
) {
46 return lua::overcommit_std_align
+ sizeof(uint16_t) * (size_t)w
* h
;
52 std::vector
<char> save_png(const lua_palette
& pal
) const;
54 static int create(lua::state
& L
, lua::parameters
& P
);
55 template<bool outside
, bool clip
> int draw(lua::state
& L
, lua::parameters
& P
);
56 int pset(lua::state
& L
, lua::parameters
& P
);
57 int pget(lua::state
& L
, lua::parameters
& P
);
58 int size(lua::state
& L
, lua::parameters
& P
);
59 int hash(lua::state
& L
, lua::parameters
& P
);
60 template<bool scaled
, bool porterduff
> int blit(lua::state
& L
, lua::parameters
& P
);
61 template<bool scaled
> int blit_priority(lua::state
& L
, lua::parameters
& P
);
62 int save_png(lua::state
& L
, lua::parameters
& P
);
63 int _save_png(lua::state
& L
, lua::parameters
& P
, bool is_method
);
64 int sample_texture(lua::state
& L
, lua::parameters
& P
);
69 lua_dbitmap(lua::state
& L
, uint32_t w
, uint32_t h
);
70 static size_t overcommit(uint32_t w
, uint32_t h
) {
71 return lua::overcommit_std_align
+ sizeof(framebuffer::color
) * (size_t)w
* h
;
76 framebuffer::color
* pixels
;
77 std::vector
<char> save_png() const;
79 static int create(lua::state
& L
, lua::parameters
& P
);
80 template<bool outside
, bool clip
> int draw(lua::state
& L
, lua::parameters
& P
);
81 int pset(lua::state
& L
, lua::parameters
& P
);
82 int pget(lua::state
& L
, lua::parameters
& P
);
83 int size(lua::state
& L
, lua::parameters
& P
);
84 int hash(lua::state
& L
, lua::parameters
& P
);
85 template<bool scaled
, bool porterduff
> int blit(lua::state
& L
, lua::parameters
& P
);
86 int save_png(lua::state
& L
, lua::parameters
& P
);
87 int adjust_transparency(lua::state
& L
, lua::parameters
& P
);
88 int _save_png(lua::state
& L
, lua::parameters
& P
, bool is_method
);
89 int sample_texture(lua::state
& L
, lua::parameters
& P
);
92 struct lua_loaded_bitmap
97 std::vector
<int64_t> bitmap
;
98 std::vector
<int64_t> palette
;
99 static struct lua_loaded_bitmap
load(std::istream
& stream
);
100 static struct lua_loaded_bitmap
load(const std::string
& name
);
101 template<bool png
> static int load(lua::state
& L
, lua::parameters
& P
);
102 template<bool png
> static int load_str(lua::state
& L
, lua::parameters
& P
);
105 template<bool T
> class lua_bitmap_holder
108 lua_bitmap_holder(lua_bitmap
& _b
, lua_palette
& _p
) : b(_b
), p(_p
) {};
109 size_t stride() { return b
.width
; }
112 p
.palette_mutex
.lock();
114 pallim
= p
.color_count
;
118 p
.palette_mutex
.unlock();
120 void draw(size_t bmpidx
, typename
framebuffer::fb
<T
>::element_t
& target
)
122 uint16_t i
= b
.pixels
[bmpidx
];
124 palette
[i
].apply(target
);
129 framebuffer::color
* palette
;
133 template<bool T
> class lua_dbitmap_holder
136 lua_dbitmap_holder(lua_dbitmap
& _d
) : d(_d
) {};
137 size_t stride() { return d
.width
; }
140 void draw(size_t bmpidx
, typename
framebuffer::fb
<T
>::element_t
& target
)
142 d
.pixels
[bmpidx
].apply(target
);
149 template<bool T
, class B
> void lua_bitmap_composite(struct framebuffer::fb
<T
>& scr
, int32_t xp
,
150 int32_t yp
, const range
& X
, const range
& Y
, const range
& sX
, const range
& sY
, bool outside
, B bmp
) throw()
152 if(!X
.size() || !Y
.size()) return;
153 size_t stride
= bmp
.stride();
156 for(uint32_t r
= Y
.low(); r
!= Y
.high(); r
++) {
157 typename
framebuffer::fb
<T
>::element_t
* rptr
= scr
.rowptr(yp
+ r
);
158 size_t eptr
= xp
+ X
.low();
159 uint32_t xmin
= X
.low();
160 bool cut
= outside
&& sY
.in(r
);
161 if(cut
&& sX
.in(xmin
)) {
163 eptr
+= (sX
.high() - X
.low());
165 for(uint32_t c
= xmin
; c
< X
.high(); c
++, eptr
++) {
166 if(__builtin_expect(cut
&& c
== sX
.low(), 0)) {
170 bmp
.draw(r
* stride
+ c
, rptr
[eptr
]);