Upload UI
[lsnes.git] / src / lua / gui-circle.cpp
blob96b044e0f252c02ff9ec886f5f9e8fdc46a531de
1 #include "lua/internal.hpp"
2 #include "library/framebuffer.hpp"
4 namespace
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)
12 radius = _radius;
13 radius2 = static_cast<uint64_t>(_radius) * _radius;
14 if(_thickness > _radius)
15 iradius2 = 0;
16 else
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;
39 if(fd2 > radius2)
40 continue;
41 else if(fd2 >= iradius2)
42 outline.apply(rptr[eptr]);
43 else
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); }
50 void clone(render_queue& q) const throw(std::bad_alloc) { q.clone_helper(this); }
51 private:
52 int32_t x;
53 int32_t y;
54 int32_t radius;
55 uint64_t radius2;
56 uint64_t iradius2;
57 premultiplied_color outline;
58 premultiplied_color fill;
61 function_ptr_luafun gui_rectangle(lua_func_misc, "gui.circle", [](lua_state& L, const std::string& fname)
62 -> int {
63 if(!lua_render_ctx)
64 return 0;
65 int64_t outline = 0xFFFFFFU;
66 int64_t fill = -1;
67 uint32_t thickness = 1;
68 int32_t x = L.get_numeric_argument<int32_t>(1, fname.c_str());
69 int32_t y = L.get_numeric_argument<int32_t>(2, fname.c_str());
70 uint32_t radius = L.get_numeric_argument<uint32_t>(3, fname.c_str());
71 L.get_numeric_argument<uint32_t>(4, thickness, fname.c_str());
72 L.get_numeric_argument<int64_t>(5, outline, fname.c_str());
73 L.get_numeric_argument<int64_t>(6, fill, fname.c_str());
74 premultiplied_color poutline(outline);
75 premultiplied_color pfill(fill);
76 lua_render_ctx->queue->create_add<render_object_circle>(x, y, radius, poutline, pfill, thickness);
77 return 0;
78 });