| 208 | return ; |
| 209 | } |
| 210 | void plotLineAA(int x0, int y0, int x1, int y1,rgbf power,const std::function<rgbf(rgbf,int,int,int,int)>& setPixelAA) |
| 211 | { |
| 212 | int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; |
| 213 | int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; |
| 214 | int err = dx-dy, e2, x2; /* error value e_xy */ |
| 215 | int ed = dx+dy == 0 ? 1 : sqrt((float)dx*dx+(float)dy*dy); |
| 216 | int rdx=0; |
| 217 | int rdy=0; |
| 218 | int lrdx,lrdy; |
| 219 | rgbf sumPower; |
| 220 | for ( ; ; ){ /* pixel loop */ |
| 221 | float strsum=0; |
| 222 | float str=1-abs(err-dx+dy)/(float)ed; |
| 223 | strsum=str; |
| 224 | sumPower=setPixelAA(power*str,rdx,rdy,x0,y0); |
| 225 | e2 = err; x2 = x0; |
| 226 | lrdx=rdx; |
| 227 | lrdy=rdy; |
| 228 | rdx=rdy=0; |
| 229 | if (2*e2 >= -dx) { /* x step */ |
| 230 | if (x0 == x1) break; |
| 231 | |
| 232 | if (e2+dy < ed) |
| 233 | { |
| 234 | str=1-(e2+dy)/(float)ed; |
| 235 | sumPower+=setPixelAA(power*str,lrdx,lrdy,x0,y0+sy); |
| 236 | strsum+=str; |
| 237 | } |
| 238 | err -= dy; x0 += sx; rdx=sx; |
| 239 | } |
| 240 | if (2*e2 <= dy) { /* y step */ |
| 241 | if (y0 == y1) break; |
| 242 | |
| 243 | if (dx-e2 < ed) |
| 244 | { |
| 245 | str=1-(dx-e2)/(float)ed; |
| 246 | sumPower+=setPixelAA(power*str,lrdx,lrdy,x2+sx,y0); |
| 247 | strsum+=str; |
| 248 | } |
| 249 | err += dx; y0 += sy; rdy=sy; |
| 250 | } |
| 251 | if(strsum<0.001f) |
| 252 | return; |
| 253 | sumPower=sumPower/strsum; |
| 254 | if(sumPower.dot(sumPower)<0.00001f) |
| 255 | return; |
| 256 | power=sumPower; |
| 257 | } |
| 258 | } |
| 259 | rgbf blendMax(const rgbf& a,const rgbf& b) |
| 260 | { |
| 261 | return rgbf(std::max(a.r,b.r),std::max(a.g,b.g),std::max(a.b,b.b)); |