4 #include "../Graphics/Bitmap.h"
5 #include "../Graphics/Color.h"
6 #include "../Containers/Image.h"
12 namespace Gorgon {
namespace CGI {
18 template<
int S_ = 8,
class P_= Geometry::Po
intf,
class F_ = Sol
idFill<>>
21 int minx = std::max((
int)floor(
float(location.X) - radius), 0);
22 int maxx = std::min((
int)ceil(
float(location.X) + radius), target.
GetWidth());
24 int miny = std::max((
int)floor(
float(location.Y) - radius), 0);
25 int maxy = std::min((
int)ceil(
float(location.Y) + radius), target.
GetHeight());
27 Float r2 = radius * radius;
30 float cury = float(miny+0.5) - location.Y;
31 for(
int y=miny; y<maxy; y++, cury++) {
32 float curx = float(minx+0.5) - location.X;
33 for(
int x=minx; x<maxx; x++, curx++) {
34 if(cury*cury + curx*curx < r2) {
37 target.
SetRGBAAt(x, y, fill({curx, cury}, {x, y}, cur, 1.f));
43 Float s2 = sqrt(2.0f);
44 Float ri2 = (radius-s2/2) * (radius-s2/2);
45 Float ro = (radius+s2/2);
49 for(
int y=miny-1; y<maxy+1; y++, cury++) {
51 for(
int x=minx-1; x<maxx+1; x++, curx++) {
52 Float d = cury*cury + curx*curx;
57 target.
SetRGBAAt(x, y, fill({curx, cury}, {x, y}, cur, 1.f));
61 Float a = (ro-sqrt(d))/s2;
65 target.
SetRGBAAt(x, y, fill({curx, cury}, {x, y}, cur, a));
72 template<
int S_ = 8,
class P_ = Geometry::Po
intf,
class F_ = Sol
idFill<>>
75 Circle<S_, P_, F_>(target.
GetData(), location, radius, fill);
84 template<
int S_ = 8,
class P_= Geometry::Po
intf,
class F_ = Sol
idFill<>>
90 int minx = std::max((
int)floor(
float(location.X) - radius), 0);
91 int maxx = std::min((
int)ceil(
float(location.X) + radius), target.
GetWidth());
93 int miny = std::max((
int)floor(
float(location.Y) - radius), 0);
94 int maxy = std::min((
int)ceil(
float(location.Y) + radius), target.
GetHeight());
96 Float r2 = inner * inner;
97 Float br2 = radius * radius;
100 float cury = float(miny+0.5) - location.Y;
101 for(
int y=miny; y<maxy; y++, cury++) {
102 float curx = float(minx+0.5) - location.X;
103 for(
int x=minx; x<maxx; x++, curx++) {
104 auto d = cury*cury + curx*curx;
105 if(d < br2 && d > r2) {
108 target.
SetRGBAAt(x, y, fill({curx, cury}, {x, y}, cur, 1.f));
114 Float s2 = sqrt(2.0f);
115 Float ri = (inner-s2/2);
117 Float ro = (inner+s2/2);
120 Float ri2br = (radius-s2/2) * (radius-s2/2);
121 Float robr = (radius+s2/2);
122 Float ro2br = robr * robr;
125 for(
int y=miny-1; y<maxy+1; y++, cury++) {
127 for(
int x=minx-1; x<maxx+1; x++, curx++) {
128 Float d = cury*cury + curx*curx;
130 if(d > ro2 && d < ri2br) {
133 target.
SetRGBAAt(x, y, fill({curx, cury}, {x, y}, cur, 1.f));
135 else if(d > ri2 && d < ro2br) {
139 Float a1 = (robr-d)/s2;
143 Float a2 = (d-ri)/s2;
147 target.
SetRGBAAt(x, y, fill({curx, cury}, {x, y}, cur, a1*a2));
154 template<
int S_ = 8,
class P_ = Geometry::Po
intf,
class F_ = Sol
idFill<>>
157 Circle<S_, P_, F_>(target.
GetData(), location, radius, border, fill);