void OuterGlowStyle::operator() (Pixels destPixels, Pixels stencilPixels) { if (!active) return; //int const width = stencilPixels.getWidth (); //int const height = stencilPixels.getHeight (); SharedTable <Colour> table = colours.createLookupTable (); Map2D <int> dist (stencilPixels.getWidth (), stencilPixels.getHeight ()); Map2D <int> temp (stencilPixels.getWidth (), stencilPixels.getHeight ()); if (precise) { LayerStyles::DistanceMap () ( Pixels::Map2D (stencilPixels), temp, stencilPixels.getWidth (), stencilPixels.getHeight (), size); #if 0 DistanceTransform::Meijster::calculateAntiAliased ( RenderPixelAntiAliased ( destPixels, opacity, spread, size, table), GetMask (stencilPixels), stencilPixels.getWidth (), stencilPixels.getHeight (), DistanceTransform::Meijster::EuclideanMetric ()); #endif for (int y = 0; y < temp.getRows (); ++y) { for (int x = 0; x < temp.getCols (); ++x) { int const v = temp (x, y); if (v > 0) temp (x, y) = (255 - v) * 256; } } } else { // "Softer" LayerStyles::BoxBlurAndDilateSettings bd (size, spread); LayerStyles::GrayscaleDilation () ( Pixels::Map2D (stencilPixels), stencilPixels.getWidth (), stencilPixels.getHeight (), dist, stencilPixels.getWidth (), stencilPixels.getHeight (), 0, 0, bd.getDilatePixels ()); BoxBlur () (dist, temp, temp.getCols (), temp.getRows (), bd.getBoxBlurRadius ()); } // Fill // PixelARGB c (0); for (int y = 0; y < temp.getRows (); ++y) { for (int x = 0; x < temp.getCols (); ++x) { int const v = (temp (x, y) + 128) / 256; PixelRGB& dest (*((PixelRGB*)destPixels.getPixelPointer (x, y))); c.setAlpha (uint8(v)); dest.blend (c); } } }
void BevelEmbossStyle::operator() (Pixels destPixels, Pixels maskPixels) { jassert (destPixels.isRGB ()); jassert (maskPixels.getBounds () == destPixels.getBounds ()); if (!active) return; // Calculate the distance transform on the mask. // typedef double T; Map2D <T> distMap (maskPixels.getWidth (), maskPixels.getHeight ()); switch (kind) { case kindOuterBevel: #if 1 DistanceTransform::Meijster::calculateAntiAliased ( AntiAliased::Output <Map2D <T> > (distMap, size), AntiAliased::GetMaskOuter (maskPixels), maskPixels.getWidth (), maskPixels.getHeight (), DistanceTransform::Meijster::EuclideanMetric ()); #else DistanceTransform::Meijster::calculate ( Normal::OutputOuter <Map2D <T> > (distMap, size), Normal::GetOuter (maskPixels), maskPixels.getWidth (), maskPixels.getHeight (), DistanceTransform::Meijster::EuclideanMetric ()); #endif break; case kindInnerBevel: #if 1 DistanceTransform::Meijster::calculateAntiAliased ( AntiAliased::Output <Map2D <T> > (distMap, size), AntiAliased::GetMaskInner (maskPixels), maskPixels.getWidth (), maskPixels.getHeight (), DistanceTransform::Meijster::EuclideanMetric ()); #else DistanceTransform::Meijster::calculate ( Normal::OutputInner <Map2D <T> > (distMap, size), Normal::GetInner (maskPixels), maskPixels.getWidth (), maskPixels.getHeight (), DistanceTransform::Meijster::EuclideanMetric ()); #endif break; case kindEmboss: case kindPillowEmboss: case kindStrokeEmboss: default: jassertfalse; break; } #if 0 { for (int y = 0; y < destPixels.getWidth (); ++y) { for (int x = 0; x < destPixels.getHeight (); ++x) { PixelRGB& dest (*((PixelRGB*)destPixels.getPixelPointer (x, y))); T t = distMap (x, y) * 255 / size; uint8 v = uint8 (t + 0.5); dest.getRed () = v; dest.getGreen () = v; dest.getBlue () = v; } } } #else // Apply a softening to the transform. // #if 0 if (technique == techniqueChiselSoft) { if (soften > 0) { RadialImageConvolutionKernel k (soften + 1); k.createGaussianBlur (); distImage = k.createConvolvedImage (distImage); distPixels = Pixels (distImage); } } #endif Image hiImage ( Image::SingleChannel, destPixels.getCols (), destPixels.getRows (), true); Image loImage ( Image::SingleChannel, destPixels.getCols (), destPixels.getRows (), true); Pixels hiPixels (hiImage); Pixels loPixels (loImage); LightingTransform::calculate <T> ( LightingTransform::PixelShader (hiPixels, loPixels), distMap, 10 - depth, lightAngle, lightElevation); // Apply a softening to the masks. // #if 0 if (technique == techniqueSmooth) { if (soften > 0) { RadialImageConvolutionKernel k (soften + 1); k.createGaussianBlur (); hiImage = k.createConvolvedImage (hiImage); hiPixels = Pixels (hiImage); loImage = k.createConvolvedImage (loImage); loPixels = Pixels (loImage); Pixels::Iterate2 (hiPixels, maskPixels) (BlendProc::Gray::CopyMode <BlendMode::multiply> ()); Pixels::Iterate2 (loPixels, maskPixels) (BlendProc::Gray::CopyMode <BlendMode::multiply> ()); } } #endif // Render highlights. // BlendMode::apply ( hilightMode, Pixels::Iterate2 (destPixels, hiPixels), BlendProc::RGB::MaskFill (hilightColour, hilightOpacity)); // Render shadows. // BlendMode::apply ( shadowMode, Pixels::Iterate2 (destPixels, loPixels), BlendProc::RGB::MaskFill (shadowColour, shadowOpacity)); #endif }