void InnerGlowStyle::operator() (Pixels destPixels, Pixels maskPixels)
{
  if (!active)
    return;

  SharedTable <Colour> table;
  
  if (reverse)
    table = colours.withReversedStops().createLookupTable ();
  else
    table = colours.createLookupTable ();

#if 1
  // Anti-Aliased
  //
  DistanceTransform::Meijster::calculateAntiAliased (
    RenderPixelAntiAliased (
      destPixels,
      opacity,
      choke,
      size,
      table),
    GetMask (maskPixels),
    maskPixels.getWidth (),
    maskPixels.getHeight (),
    DistanceTransform::Meijster::EuclideanMetric ());
#else
  // Regular
  //
  DistanceTransform::Meijster::calculate (
    RenderPixel (
      destPixels,
      opacity,
      choke,
      size,
      table),
    TestMask (maskPixels),
    maskPixels.getWidth (),
    maskPixels.getHeight (),
    DistanceTransform::Meijster::EuclideanMetric ());
#endif
}
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
}
Beispiel #3
0
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);
    }
  }
}
Beispiel #4
0
void StrokeStyle::operator () (Pixels destPixels, Pixels maskPixels)
{
  if (!active)
    return;

  if (type != typeGradient)// || gradient.style != GradientFill::styleShapeBurst)
  {
    //
    // Calculate mask using distance transform
    //

    Image matteImage (
      Image::SingleChannel,
      maskPixels.getBounds ().getWidth (),
      maskPixels.getBounds ().getHeight (),
      false);

    Pixels mattePixels (matteImage);

    switch (pos)
    {
    case posInner:
      DistanceTransform::Meijster::calculateAntiAliased (
        RenderMask (Pixels::Map2D (mattePixels), size),
        Inside (maskPixels),
        maskPixels.getWidth (),
        maskPixels.getHeight (),
        DistanceTransform::Meijster::EuclideanMetric ());
      break;

    case posOuter:
      DistanceTransform::Meijster::calculateAntiAliased (
        RenderMask (Pixels::Map2D (mattePixels), size),
        Outside (maskPixels),
        maskPixels.getWidth (),
        maskPixels.getHeight (),
        DistanceTransform::Meijster::EuclideanMetric ());
      break;

    case posCentre:
      break;

    default:
      jassertfalse;
      break;
    };

    //
    // Apply fill using mask
    //

    switch (type)
    {
    case typeColour:
      BlendMode::apply (
        mode,
        Pixels::Iterate2 (destPixels, mattePixels),
        BlendProc::RGB::MaskFill (colour, opacity));
      break;

    case typeGradient:
      break;

    case typePattern:
      break;

    default:
      jassertfalse;
      break;
    };
  }
  else
  {
    //
    // Special case for shape burst gradients
    //
    SharedTable <Colour> colourTable = gradient.colours.createLookupTable ();

    switch (pos)
    {
    case posInner:
      {
        DistanceTransform::Meijster::calculateAntiAliased (
          RenderShapeBurst (Pixels::Map2D (destPixels), size, colourTable),
          Inside (maskPixels),
          maskPixels.getWidth (),
          maskPixels.getHeight (),
          DistanceTransform::Meijster::EuclideanMetric ());
      }
      break;

    case posOuter:
      {
        DistanceTransform::Meijster::calculateAntiAliased (
          RenderShapeBurst (Pixels::Map2D (destPixels), size, colourTable),
          Outside (maskPixels),
          maskPixels.getWidth (),
          maskPixels.getHeight (),
          DistanceTransform::Meijster::EuclideanMetric ());
      }
      break;

    case posCentre:
      {
      }
      break;

    default:
      jassertfalse;
      break;
    };
  }
}