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 hflip(lua::state
& L
, lua::parameters
& P
);
60 int vflip(lua::state
& L
, lua::parameters
& P
);
61 int hash(lua::state
& L
, lua::parameters
& P
);
62 template<bool scaled
, bool porterduff
> int blit(lua::state
& L
, lua::parameters
& P
);
63 template<bool scaled
> int blit_priority(lua::state
& L
, lua::parameters
& P
);
64 int save_png(lua::state
& L
, lua::parameters
& P
);
65 int _save_png(lua::state
& L
, lua::parameters
& P
, bool is_method
);
66 int sample_texture(lua::state
& L
, lua::parameters
& P
);
71 lua_dbitmap(lua::state
& L
, uint32_t w
, uint32_t h
);
72 static size_t overcommit(uint32_t w
, uint32_t h
) {
73 return lua::overcommit_std_align
+ sizeof(framebuffer::color
) * (size_t)w
* h
;
78 framebuffer::color
* pixels
;
79 std::vector
<char> save_png() const;
81 static int create(lua::state
& L
, lua::parameters
& P
);
82 template<bool outside
, bool clip
> int draw(lua::state
& L
, lua::parameters
& P
);
83 int pset(lua::state
& L
, lua::parameters
& P
);
84 int pget(lua::state
& L
, lua::parameters
& P
);
85 int size(lua::state
& L
, lua::parameters
& P
);
86 int hflip(lua::state
& L
, lua::parameters
& P
);
87 int vflip(lua::state
& L
, lua::parameters
& P
);
88 int hash(lua::state
& L
, lua::parameters
& P
);
89 template<bool scaled
, bool porterduff
> int blit(lua::state
& L
, lua::parameters
& P
);
90 int save_png(lua::state
& L
, lua::parameters
& P
);
91 int adjust_transparency(lua::state
& L
, lua::parameters
& P
);
92 int _save_png(lua::state
& L
, lua::parameters
& P
, bool is_method
);
93 int sample_texture(lua::state
& L
, lua::parameters
& P
);
96 struct lua_loaded_bitmap
101 std::vector
<int64_t> bitmap
;
102 std::vector
<int64_t> palette
;
103 static struct lua_loaded_bitmap
load(std::istream
& stream
);
104 static struct lua_loaded_bitmap
load(const std::string
& name
);
105 template<bool png
> static int load(lua::state
& L
, lua::parameters
& P
);
106 template<bool png
> static int load_str(lua::state
& L
, lua::parameters
& P
);
109 template<bool T
> class lua_bitmap_holder
112 lua_bitmap_holder(lua_bitmap
& _b
, lua_palette
& _p
) : b(_b
), p(_p
) {};
113 size_t stride() { return b
.width
; }
116 p
.palette_mutex
.lock();
118 pallim
= p
.color_count
;
122 p
.palette_mutex
.unlock();
124 void draw(size_t bmpidx
, typename
framebuffer::fb
<T
>::element_t
& target
)
126 uint16_t i
= b
.pixels
[bmpidx
];
128 palette
[i
].apply(target
);
133 framebuffer::color
* palette
;
137 template<bool T
> class lua_dbitmap_holder
140 lua_dbitmap_holder(lua_dbitmap
& _d
) : d(_d
) {};
141 size_t stride() { return d
.width
; }
144 void draw(size_t bmpidx
, typename
framebuffer::fb
<T
>::element_t
& target
)
146 d
.pixels
[bmpidx
].apply(target
);
153 template<bool T
, class B
> void lua_bitmap_composite(struct framebuffer::fb
<T
>& scr
, int32_t xp
,
154 int32_t yp
, const range
& X
, const range
& Y
, const range
& sX
, const range
& sY
, bool outside
, B bmp
) throw()
156 if(!X
.size() || !Y
.size()) return;
157 size_t stride
= bmp
.stride();
160 for(uint32_t r
= Y
.low(); r
!= Y
.high(); r
++) {
161 typename
framebuffer::fb
<T
>::element_t
* rptr
= scr
.rowptr(yp
+ r
);
162 size_t eptr
= xp
+ X
.low();
163 uint32_t xmin
= X
.low();
164 bool cut
= outside
&& sY
.in(r
);
165 if(cut
&& sX
.in(xmin
)) {
167 eptr
+= (sX
.high() - X
.low());
169 for(uint32_t c
= xmin
; c
< X
.high(); c
++, eptr
++) {
170 if(__builtin_expect(cut
&& c
== sX
.low(), 0)) {
173 //Don't write outside the framebuffer space if there is no right gap.
174 if(c
>= X
.high()) break;
176 bmp
.draw(r
* stride
+ c
, rptr
[eptr
]);