// This may look like C code, but it is really -*- C++ -*-
//
// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
//
// Simple demo program for Magick++
//
// Concept and algorithms lifted from PerlMagick demo script written
// by John Christy.
//
// Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris
//

#include <Magick++.h>
#include <string>
#include <iostream>
#include <list>

using namespace std;

using namespace Magick;

#if MAGICKCORE_FREETYPE_DELEGATE
  #define MakeLabel(image, text) image.label( (text) )
#else
  #define MakeLabel(image, text)
#endif

int main( int /*argc*/, char ** argv)
{

  // Initialize ImageMagick install location for Windows
  InitializeMagick(*argv);

  const char *const p = getenv("MAGICK_FONT");
  const string MAGICK_FONT(p ? p : "");
  
  try {
    
    string srcdir("");
    if(getenv("SRCDIR") != 0)
      srcdir = getenv("SRCDIR");
    
    list<Image> montage;

    {
      //
      // Read model & smile image.
      //
      cout << "Read images ..." << endl;

      Image model( srcdir + "model.miff" );
      MakeLabel(model, "Magick++");
      model.borderColor( "black" );
      model.backgroundColor( "black" );
    
      Image smile( srcdir + "smile.miff" );
      MakeLabel(smile, "Smile");
      smile.borderColor( "black" );
    
      //
      // Create image stack.
      //
      cout << "Creating thumbnails..." << endl;
    
      // Construct initial list containing seven copies of a null image
      Image null;
      null.size( Geometry(70,70) );
      null.read( "NULL:black" );
      list<Image> images( 7, null );
    
      Image example = model;
    
      // Each of the following follow the pattern
      //  1. obtain reference to (own copy of) image
      //  2. apply label to image
      //  3. apply operation to image
      //  4. append image to container

      cout << "  add noise ..." << endl;
      MakeLabel(example, "Add Noise");
      example.addNoise( LaplacianNoise );
      images.push_back( example );

      cout << "  add noise (blue) ..." << endl;
      MakeLabel(example, "Add Noise\n(Blue Channel)");
      example.addNoiseChannel( BlueChannel, PoissonNoise );
      images.push_back( example );

#if MAGICKCORE_FREETYPE_DELEGATE
      cout << "  annotate ..." << endl;
      example = model;
      MakeLabel(example, "Annotate");
      example.density( "72x72" );
      example.fontPointsize( 18 );
      example.font(MAGICK_FONT);
      example.strokeColor( Color() );
      example.fillColor( "gold" );
      example.annotate( "Magick++", "+0+20", NorthGravity );
      images.push_back( example );
#endif

      cout << "  blur ..." << endl;
      example = model;
      MakeLabel(example, "Blur");
      example.blur( 0, 1.5 );
      images.push_back( example );

      cout << "  blur red channel ..." << endl;
      example = model;
      MakeLabel(example, "Blur Channel\n(Red Channel)");
      example.blurChannel( RedChannel, 0, 3.0 );
      images.push_back( example );

      cout << "  border ..." << endl;
      example = model;
      MakeLabel(example, "Border");
      example.borderColor( "gold" );
      example.border( Geometry(6,6) );
      images.push_back( example );

      cout << "  channel ..." << endl;
      example = model;
      MakeLabel(example, "Channel\n(Red Channel)");
      example.channel( RedChannel );
      images.push_back( example );

      cout << "  charcoal ..." << endl;
      example = model;
      MakeLabel(example, "Charcoal");
      example.charcoal( );
      images.push_back( example );

      cout << "  composite ..." << endl;
      example = model;
      MakeLabel(example, "Composite");
      example.composite( smile, "+35+65", OverCompositeOp);
      images.push_back( example );

      cout << "  contrast ..." << endl;
      example = model;
      MakeLabel(example, "Contrast");
      example.contrast( false );
      images.push_back( example );

      cout << "  convolve ..." << endl;
      example = model;
      MakeLabel(example, "Convolve");
      {
        // 3x3 matrix
        const double kernel[] = { 1, 1, 1, 1, 4, 1, 1, 1, 1 };
        example.convolve( 3, kernel );
      }
      images.push_back( example );

      cout << "  crop ..." << endl;
      example = model;
      MakeLabel(example, "Crop");
      example.crop( "80x80+25+50" );
      images.push_back( example );

      cout << "  despeckle ..." << endl;
      example = model;
      MakeLabel(example, "Despeckle");
      example.despeckle( );
      images.push_back( example );

      cout << "  draw ..." << endl;
      example = model;
      MakeLabel(example, "Draw");
      example.fillColor(Color());
      example.strokeColor( "gold" );
      example.strokeWidth( 2 );
      example.draw( DrawableCircle( 60,90, 60,120 ) );
      images.push_back( example );

      cout << "  edge ..." << endl;
      example = model;
      MakeLabel(example, "Detect Edges");
      example.edge( );
      images.push_back( example );

      cout << "  emboss ..." << endl;
      example = model;
      MakeLabel(example, "Emboss");
      example.emboss( );
      images.push_back( example );

      cout << "  equalize ..." << endl;
      example = model;
      MakeLabel(example, "Equalize");
      example.equalize( );
      images.push_back( example );
    
      cout << "  explode ..." << endl;
      example = model;
      MakeLabel(example, "Explode");
      example.backgroundColor( "#000000FF" );
      example.implode( -1 );
      images.push_back( example );

      cout << "  flip ..." << endl;
      example = model;
      MakeLabel(example, "Flip");
      example.flip( );
      images.push_back( example );

      cout << "  flop ..." << endl;
      example = model;
      MakeLabel(example, "Flop");
      example.flop();
      images.push_back( example );

      cout << "  frame ..." << endl;
      example = model;
      MakeLabel(example, "Frame");
      example.frame( );
      images.push_back( example );

      cout << "  gamma ..." << endl;
      example = model;
      MakeLabel(example, "Gamma");
      example.gamma( 1.6 );
      images.push_back( example );

      cout << "  gaussian blur ..." << endl;
      example = model;
      MakeLabel(example, "Gaussian Blur");
      example.gaussianBlur( 0.0, 1.5 );
      images.push_back( example );

      cout << "  gaussian blur channel ..." << endl;
      example = model;
      MakeLabel(example, "Gaussian Blur\n(Green Channel)");
      example.gaussianBlurChannel( GreenChannel, 0.0, 1.5 );
      images.push_back( example );
    
      cout << "  gradient ..." << endl;
      Image gradient;
      gradient.size( "130x194" );
      gradient.read( "gradient:#20a0ff-#ffff00" );
      MakeLabel(gradient, "Gradient");
      images.push_back( gradient );
    
      cout << "  grayscale ..." << endl;
      example = model;
      MakeLabel(example, "Grayscale");
      example.quantizeColorSpace( GRAYColorspace );
      example.quantize( );
      images.push_back( example );
    
      cout << "  implode ..." << endl;
      example = model;
      MakeLabel(example, "Implode");
      example.implode( 0.5 );
      images.push_back( example );

      cout << "  level ..." << endl;
      example = model;
      MakeLabel(example, "Level");
      example.level( 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
      images.push_back( example );

      cout << "  level red channel ..." << endl;
      example = model;
      MakeLabel(example, "Level Channel\n(Red Channel)");
      example.levelChannel( RedChannel, 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
      images.push_back( example );

      cout << "  median filter ..." << endl;
      example = model;
      MakeLabel(example, "Median Filter");
      example.medianFilter( );
      images.push_back( example );

      cout << "  modulate ..." << endl;
      example = model;
      MakeLabel(example, "Modulate");
      example.modulate( 110, 110, 110 );
      images.push_back( example );

      cout << "  monochrome ..." << endl;
      example = model;
      MakeLabel(example, "Monochrome");
      example.quantizeColorSpace( GRAYColorspace );
      example.quantizeColors( 2 );
      example.quantizeDither( false );
      example.quantize( );
      images.push_back( example );

      cout << "  motion blur ..." << endl;
      example = model;
      MakeLabel(example, "Motion Blur");
      example.motionBlur( 0.0, 7.0,45 );
      images.push_back( example );
    
      cout << "  negate ..." << endl;
      example = model;
      MakeLabel(example, "Negate");
      example.negate( );
      images.push_back( example );
    
      cout << "  normalize ..." << endl;
      example = model;
      MakeLabel(example, "Normalize");
      example.normalize( );
      images.push_back( example );
    
      cout << "  oil paint ..." << endl;
      example = model;
      MakeLabel(example, "Oil Paint");
      example.oilPaint( );
      images.push_back( example );

      cout << "  ordered dither 2x2 ..." << endl;
      example = model;
      MakeLabel(example, "Ordered Dither\n(2x2)");
      example.randomThreshold(2,2);
      images.push_back( example );

      cout << "  ordered dither 3x3..." << endl;
      example = model;
      MakeLabel(example, "Ordered Dither\n(3x3)");
      example.randomThreshold(3,3);
      images.push_back( example );

      cout << "  ordered dither 4x4..." << endl;
      example = model;
      MakeLabel(example, "Ordered Dither\n(4x4)");
      example.randomThreshold(4,4);
      images.push_back( example );
    
      cout << "  ordered dither red 4x4..." << endl;
      example = model;
      MakeLabel(example, "Ordered Dither\n(Red 4x4)");
      example.randomThresholdChannel(RedChannel,4,4);
      images.push_back( example );

      cout << "  plasma ..." << endl;
      Image plasma;
      plasma.size( "130x194" );
      plasma.read( "plasma:fractal" );
      MakeLabel(plasma, "Plasma");
      images.push_back( plasma );
    
      cout << "  quantize ..." << endl;
      example = model;
      MakeLabel(example, "Quantize");
      example.quantize( );
      images.push_back( example );

      cout << "  quantum operator ..." << endl;
      example = model;
      MakeLabel(example, "Quantum Operator\nRed * 0.4");
      example.evaluate( RedChannel,MultiplyEvaluateOperator,0.40 );
      images.push_back( example );

      cout << "  raise ..." << endl;
      example = model;
      MakeLabel(example, "Raise");
      example.raise( );
      images.push_back( example );
    
      cout << "  reduce noise ..." << endl;
      example = model;
      MakeLabel(example, "Reduce Noise");
      example.reduceNoise( 1.0 );
      images.push_back( example );
    
      cout << "  resize ..." << endl;
      example = model;
      MakeLabel(example, "Resize");
      example.zoom( "50%" );
      images.push_back( example );
    
      cout << "  roll ..." << endl;
      example = model;
      MakeLabel(example, "Roll");
      example.roll( "+20+10" );
      images.push_back( example );
    
      cout << "  rotate ..." << endl;
      example = model;
      MakeLabel(example, "Rotate");
      example.rotate( 45 );
      example.transparent( "black" );
      images.push_back( example );

      cout << "  scale ..." << endl;
      example = model;
      MakeLabel(example, "Scale");
      example.scale( "60%" );
      images.push_back( example );
    
      cout << "  segment ..." << endl;
      example = model;
      MakeLabel(example, "Segment");
      example.segment( 0.5, 0.25 );
      images.push_back( example );
    
      cout << "  shade ..." << endl;
      example = model;
      MakeLabel(example, "Shade");
      example.shade( 30, 30, false );
      images.push_back( example );
    
      cout << "  sharpen ..." << endl;
      example = model;
      MakeLabel(example, "Sharpen");
      example.sharpen( 0.0, 1.0 );
      images.push_back( example );
    
      cout << "  shave ..." << endl;
      example = model;
      MakeLabel(example, "Shave");
      example.shave( Geometry( 10, 10) );
      images.push_back( example );
    
      cout << "  shear ..." << endl;
      example = model;
      MakeLabel(example, "Shear");
      example.shear( 45, 45 );
      example.transparent( "black" );
      images.push_back( example );
    
      cout << "  spread ..." << endl;
      example = model;
      MakeLabel(example, "Spread");
      example.spread( 3 );
      images.push_back( example );
    
      cout << "  solarize ..." << endl;
      example = model;
      MakeLabel(example, "Solarize");
      example.solarize( );
      images.push_back( example );
    
      cout << "  swirl ..." << endl;
      example = model;
      example.backgroundColor( "#000000FF" );
      MakeLabel(example, "Swirl");
      example.swirl( 90 );
      images.push_back( example );

      cout << "  threshold ..." << endl;
      example = model;
      MakeLabel(example, "Threshold");
      example.threshold( QuantumRange/2.0 );
      images.push_back( example );

      cout << "  threshold random ..." << endl;
      example = model;
      MakeLabel(example, "Random\nThreshold");
      example.randomThreshold( (0.3*QuantumRange),
        (0.85*QuantumRange) );
      images.push_back( example );
    
      cout << "  unsharp mask ..." << endl;
      example = model;
      MakeLabel(example, "Unsharp Mask");
      //           radius_, sigma_, amount_, threshold_
      example.unsharpmask( 0.0, 1.0, 1.0, 0.05);
      images.push_back( example );
    
      cout << "  wave ..." << endl;
      example = model;
      MakeLabel(example, "Wave");
      example.alpha( true );
      example.backgroundColor( "#000000FF" );
      example.wave( 25, 150 );
      images.push_back( example );
    
      //
      // Create image montage.
      //
      cout <<  "Montage images..." << endl;

      for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) );

      MontageFramed montageOpts;
      montageOpts.geometry( "130x194+10+5>" );
      montageOpts.gravity( CenterGravity );
      montageOpts.borderColor( "green" );
      montageOpts.borderWidth( 1 );
      montageOpts.tile( "7x4" );
      montageOpts.backgroundColor( "#ffffff" );
      montageOpts.pointSize( 18 );
      montageOpts.font(MAGICK_FONT);
      montageOpts.fillColor( "#600" );
      montageOpts.strokeColor( Color() );
      montageOpts.fileName( "Magick++ Demo" );
      montageImages( &montage, images.begin(), images.end(), montageOpts );
    }

    Image& montage_image = montage.front();
    {
      // Create logo image
      cout << "Adding logo image ..." << endl;
      Image logo( "logo:" );
      logo.zoom( "45%" );

      // Composite logo into montage image
      Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0);
      montage_image.composite( logo, placement, OverCompositeOp );
    }

    for_each( montage.begin(), montage.end(), depthImage(8) );
    for_each( montage.begin(), montage.end(), alphaImage( false ) );
    for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) );

    cout << "Writing image \"demo_out.miff\" ..." << endl;
    writeImages(montage.begin(),montage.end(),"demo_out_%d.miff");

    // Uncomment following lines to display image to screen
    //    cout <<  "Display image..." << endl;
    //    montage_image.display();

  }
  catch( exception &error_ )
    {
      cout << "Caught exception: " << error_.what() << endl;
      return 1;
    }

  return 0;
}
