1 #include "lua/internal.hpp"
2 #include "library/framebuffer.hpp"
6 struct render_object_circle
: public render_object
8 render_object_circle(int32_t _x
, int32_t _y
, uint32_t _radius
,
9 premultiplied_color _outline
, premultiplied_color _fill
, uint32_t _thickness
) throw()
10 : x(_x
), y(_y
), outline(_outline
), fill(_fill
)
13 radius2
= static_cast<uint64_t>(_radius
) * _radius
;
14 if(_thickness
> _radius
)
17 iradius2
= static_cast<uint64_t>(_radius
- _thickness
) *
18 (_radius
- _thickness
);
20 ~render_object_circle() throw() {}
21 template<bool X
> void op(struct framebuffer
<X
>& scr
) throw()
23 outline
.set_palette(scr
);
24 fill
.set_palette(scr
);
25 uint32_t originx
= scr
.get_origin_x();
26 uint32_t originy
= scr
.get_origin_y();
27 int32_t xmin
= -radius
;
28 int32_t xmax
= radius
;
29 int32_t ymin
= -radius
;
30 int32_t ymax
= radius
;
31 clip_range(originx
, scr
.get_width(), x
, xmin
, xmax
);
32 clip_range(originy
, scr
.get_height(), y
, ymin
, ymax
);
33 for(int32_t r
= ymin
; r
< ymax
; r
++) {
34 uint64_t pd2
= static_cast<int64_t>(r
) * r
;
35 typename framebuffer
<X
>::element_t
* rptr
= scr
.rowptr(y
+ r
+ originy
);
36 size_t eptr
= x
+ xmin
+ originx
;
37 for(int32_t c
= xmin
; c
< xmax
; c
++, eptr
++) {
38 uint64_t fd2
= pd2
+ static_cast<int64_t>(c
) * c
;
41 else if(fd2
>= iradius2
)
42 outline
.apply(rptr
[eptr
]);
44 fill
.apply(rptr
[eptr
]);
48 void operator()(struct framebuffer
<true>& scr
) throw() { op(scr
); }
49 void operator()(struct framebuffer
<false>& scr
) throw() { op(scr
); }
56 premultiplied_color outline
;
57 premultiplied_color fill
;
60 function_ptr_luafun
gui_rectangle(LS
, "gui.circle", [](lua_state
& L
, const std::string
& fname
) -> int {
63 int64_t outline
= 0xFFFFFFU
;
65 uint32_t thickness
= 1;
66 int32_t x
= L
.get_numeric_argument
<int32_t>(1, fname
.c_str());
67 int32_t y
= L
.get_numeric_argument
<int32_t>(2, fname
.c_str());
68 uint32_t radius
= L
.get_numeric_argument
<uint32_t>(3, fname
.c_str());
69 L
.get_numeric_argument
<uint32_t>(4, thickness
, fname
.c_str());
70 L
.get_numeric_argument
<int64_t>(5, outline
, fname
.c_str());
71 L
.get_numeric_argument
<int64_t>(6, fill
, fname
.c_str());
72 premultiplied_color
poutline(outline
);
73 premultiplied_color
pfill(fill
);
74 lua_render_ctx
->queue
->create_add
<render_object_circle
>(x
, y
, radius
, poutline
, pfill
, thickness
);