| |
| |
| #include "trop.h" |
| #include "traster.h" |
| |
| #include "tspectrumparam.h" |
| |
| #include "gradients.h" |
| |
| |
| |
| namespace { |
| template <class T> |
| void doComputeRadialT(TRasterPT<T> ras, TPointD posTrasf, |
| const TSpectrumT<T> &spectrum, double period, |
| double count, double cycle, const TAffine &aff) { |
| int j; |
| double maxRadius = period * count; |
| double freq = 1.0 / period; |
| ras->lock(); |
| for (j = 0; j < ras->getLy(); j++) { |
| TPointD posAux = posTrasf; |
| T *pix = ras->pixels(j); |
| T *endPix = pix + ras->getLx(); |
| while (pix < endPix) { |
| double radius = norm(posAux); |
| double t = 1; |
| if (radius < maxRadius) { |
| t = (radius + cycle) * freq; |
| t -= floor(t); |
| } |
| |
| *pix++ = spectrum.getPremultipliedValue(t); |
| posAux.x += aff.a11; |
| posAux.y += aff.a21; |
| } |
| posTrasf.x += aff.a12; |
| posTrasf.y += aff.a22; |
| } |
| ras->unlock(); |
| } |
| } |
| |
| |
| |
| void multiRadial(const TRasterP &ras, TPointD posTrasf, |
| const TSpectrumParamP colors, double period, double count, |
| double cycle, const TAffine &aff, double frame) { |
| if ((TRaster32P)ras) |
| doComputeRadialT<TPixel32>(ras, posTrasf, colors->getValue(frame), period, |
| count, cycle, aff); |
| else if ((TRaster64P)ras) |
| doComputeRadialT<TPixel64>(ras, posTrasf, colors->getValue64(frame), period, |
| count, cycle, aff); |
| else |
| throw TException("MultiRadialGradientFx: unsupported Pixel Type"); |
| } |
| |
| |
| |
| namespace { |
| template <class T> |
| void doComputeLinearT(TRasterPT<T> ras, TPointD posTrasf, |
| const TSpectrumT<T> &spectrum, double period, |
| double count, double w_amplitude, double w_freq, |
| double w_phase, double cycle, const TAffine &aff) { |
| double shift = 0; |
| double maxRadius = period * count / 2.; |
| double freq = 1.0 / period; |
| int j; |
| ras->lock(); |
| for (j = 0; j < ras->getLy(); j++) { |
| TPointD posAux = posTrasf; |
| |
| |
| |
| T *pix = ras->pixels(j); |
| T *endPix = pix + ras->getLx(); |
| while (pix < endPix) { |
| if (w_amplitude) shift = w_amplitude * sin(w_freq * posAux.y + w_phase); |
| double radius = posAux.x + shift; |
| double t = 1; |
| if (fabs(radius) < maxRadius) { |
| t = (radius + maxRadius + cycle) * freq; |
| t -= floor(t); |
| } else if (radius < 0) |
| t = 0; |
| double polinomfactor = (-2 * t + 3) * (t * t); |
| |
| *pix++ = spectrum.getPremultipliedValue(polinomfactor); |
| posAux.x += aff.a11; |
| posAux.y += aff.a21; |
| } |
| posTrasf.x += aff.a12; |
| posTrasf.y += aff.a22; |
| } |
| ras->unlock(); |
| } |
| } |
| |
| |
| void multiLinear(const TRasterP &ras, TPointD posTrasf, |
| const TSpectrumParamP colors, double period, double count, |
| double amplitude, double freq, double phase, double cycle, |
| const TAffine &aff, double frame) { |
| if ((TRaster32P)ras) |
| doComputeLinearT<TPixel32>(ras, posTrasf, colors->getValue(frame), period, |
| count, amplitude, freq, phase, cycle, aff); |
| else if ((TRaster64P)ras) |
| doComputeLinearT<TPixel64>(ras, posTrasf, colors->getValue64(frame), period, |
| count, amplitude, freq, phase, cycle, aff); |
| else |
| throw TException("MultiLinearGradientFx: unsupported Pixel Type"); |
| } |
| |