Difference between revisions of "Top Solo"

From CDOT Wiki
Jump to: navigation, search
(Overview)
(Modified Makefile for Profiling)
Line 300: Line 300:
  
 
                   gmic
 
                   gmic
 
 
  
  
Line 349: Line 347:
  
 
endif
 
endif
 
 
  
  
Line 358: Line 354:
  
 
#--------------------------------------------------
 
#--------------------------------------------------
 
 
  
  
Line 373: Line 367:
  
 
endif
 
endif
 
 
  
  
Line 380: Line 372:
  
 
CIMG_DEBUG_CFLAGS = -Dcimg_verbosity=3 -Dcimg_strict_warnings -g
 
CIMG_DEBUG_CFLAGS = -Dcimg_verbosity=3 -Dcimg_strict_warnings -g
 
 
  
  
Line 389: Line 379:
  
 
CIMG_VT100_CFLAGS = -Dcimg_use_vt100
 
CIMG_VT100_CFLAGS = -Dcimg_use_vt100
 
 
  
  
Line 404: Line 392:
  
 
endif
 
endif
 
 
  
  
Line 419: Line 405:
  
 
endif
 
endif
 
 
  
  
Line 428: Line 412:
  
 
CIMG_OPENCV_LDFLAGS = -lcv -lhighgui
 
CIMG_OPENCV_LDFLAGS = -lcv -lhighgui
 
 
  
  
Line 435: Line 417:
  
 
CIMG_NODISPLAY_CFLAGS = -Dcimg_display=0
 
CIMG_NODISPLAY_CFLAGS = -Dcimg_display=0
 
 
  
  
Line 448: Line 428:
  
 
CIMG_X11_LDFLAGS = -L$(X11PATH)/lib -lpthread -lX11
 
CIMG_X11_LDFLAGS = -L$(X11PATH)/lib -lpthread -lX11
 
 
  
  
Line 459: Line 437:
  
 
CIMG_XSHM_LDFLAGS = # -lXext
 
CIMG_XSHM_LDFLAGS = # -lXext
 
 
 
  
 
# Flags to enable GDI32 display (Windows native).
 
# Flags to enable GDI32 display (Windows native).
Line 468: Line 443:
  
 
CIMG_GDI32_LDFLAGS = -lgdi32
 
CIMG_GDI32_LDFLAGS = -lgdi32
 
 
  
  
Line 481: Line 454:
  
 
CIMG_XRANDR_LDFLAGS = -lXrandr
 
CIMG_XRANDR_LDFLAGS = -lXrandr
 
 
  
  
Line 492: Line 463:
  
 
CIMG_PNG_LDFLAGS = -lpng -lz
 
CIMG_PNG_LDFLAGS = -lpng -lz
 
 
  
  
Line 503: Line 472:
  
 
CIMG_JPEG_LDFLAGS = -ljpeg
 
CIMG_JPEG_LDFLAGS = -ljpeg
 
 
  
  
Line 514: Line 481:
  
 
CIMG_TIFF_LDFLAGS = -ltiff
 
CIMG_TIFF_LDFLAGS = -ltiff
 
 
  
  
Line 525: Line 490:
  
 
CIMG_MINC2_LDFLAGS = -lminc_io -lvolume_io2 -lminc2 -lnetcdf -lhdf5 -lz -L${HOME}/local/lib
 
CIMG_MINC2_LDFLAGS = -lminc_io -lvolume_io2 -lminc2 -lnetcdf -lhdf5 -lz -L${HOME}/local/lib
 
 
  
  
Line 536: Line 499:
  
 
CIMG_EXR_LDFLAGS = -lIlmImf -lHalf
 
CIMG_EXR_LDFLAGS = -lIlmImf -lHalf
 
 
  
  
Line 547: Line 508:
  
 
CIMG_FFMPEG_LDFLAGS = -lavcodec -lavformat -lswscale
 
CIMG_FFMPEG_LDFLAGS = -lavcodec -lavformat -lswscale
 
 
  
  
Line 558: Line 517:
  
 
CIMG_ZLIB_LDFLAGS = -lz
 
CIMG_ZLIB_LDFLAGS = -lz
 
 
  
  
Line 569: Line 526:
  
 
CIMG_MAGICK_LDFLAGS = `Magick++-config --ldflags` `Magick++-config --libs`
 
CIMG_MAGICK_LDFLAGS = `Magick++-config --ldflags` `Magick++-config --libs`
 
 
  
  
Line 588: Line 543:
  
 
endif
 
endif
 
 
  
  
Line 599: Line 552:
  
 
CIMG_LAPACK_LDFLAGS = -lblas -lg2c -llapack
 
CIMG_LAPACK_LDFLAGS = -lblas -lg2c -llapack
 
 
  
  
Line 610: Line 561:
  
 
CIMG_BOARD_LDFLAGS = -lboard
 
CIMG_BOARD_LDFLAGS = -lboard
 
 
  
  
Line 617: Line 566:
  
 
CIMG_SOLARIS_LDFLAGS = -R$(X11PATH)/lib -lrt -lnsl -lsocket
 
CIMG_SOLARIS_LDFLAGS = -R$(X11PATH)/lib -lrt -lnsl -lsocket
 
 
  
  
Line 628: Line 575:
  
 
endif
 
endif
 
 
  
  
Line 725: Line 670:
  
 
@read CHOICE; echo; $(MAKE) $$CHOICE; echo; echo "> Next time, you can bypass the menu by typing directly 'make $$CHOICE'"; echo;
 
@read CHOICE; echo; $(MAKE) $$CHOICE; echo; echo "> Next time, you can bypass the menu by typing directly 'make $$CHOICE'"; echo;
 
 
  
  
 
all: $(CIMG_FILES)
 
all: $(CIMG_FILES)
 
 
  
  
Line 743: Line 684:
  
 
endif
 
endif
 
 
  
  
Line 752: Line 691:
  
 
$(CC) -o gmic_gimp.o -c gmic.cpp -Dcimg_build -Dgmic_gimp -Dgmic_float_only $(CIMG_OPT_CFLAGS) $(CIMG_FFTW3_CFLAGS) $(CIMG_PNG_CFLAGS)
 
$(CC) -o gmic_gimp.o -c gmic.cpp -Dcimg_build -Dgmic_gimp -Dgmic_float_only $(CIMG_OPT_CFLAGS) $(CIMG_FFTW3_CFLAGS) $(CIMG_PNG_CFLAGS)
 
 
  
  
Line 813: Line 750:
  
 
$(CC) -o gmic_double.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_double $(CFLAGS) $(CONF_CFLAGS)
 
$(CC) -o gmic_double.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_double $(CFLAGS) $(CONF_CFLAGS)
 
 
  
  
Line 824: Line 759:
  
 
gmic_uint.o gmic_int.o gmic_float.o gmic_double.o $(CFLAGS) $(CONF_CFLAGS) $(CONF_LDFLAGS) $(LDFLAGS)
 
gmic_uint.o gmic_int.o gmic_float.o gmic_double.o $(CFLAGS) $(CONF_CFLAGS) $(CONF_LDFLAGS) $(LDFLAGS)
 
 
  
  
Line 831: Line 764:
  
 
$(CC) -o $(EXEPFX)gmic gmic.cpp -Dgmic_main -Dgmic_float_only -Dcimg_build -Dcimg_use_fftw3 -Dcimg_use_png -Dcimg_display=1 -I/usr/X11R6/include -g -W -Wall -ansi -pedantic -L/usr/X11R6/lib -lX11 -lpthread -lfftw3 -lpng -lz
 
$(CC) -o $(EXEPFX)gmic gmic.cpp -Dgmic_main -Dgmic_float_only -Dcimg_build -Dcimg_use_fftw3 -Dcimg_use_png -Dcimg_display=1 -I/usr/X11R6/include -g -W -Wall -ansi -pedantic -L/usr/X11R6/lib -lX11 -lpthread -lfftw3 -lpng -lz
 
 
  
  
Line 840: Line 771:
  
 
endif
 
endif
 
 
  
  
Line 867: Line 796:
  
 
all
 
all
 
 
  
  
Line 894: Line 821:
  
 
all
 
all
 
 
  
  
Line 923: Line 848:
  
 
all
 
all
 
 
 
  
 
mlinux:
 
mlinux:
Line 942: Line 864:
  
 
all
 
all
 
 
 
  
 
Mlinux:
 
Mlinux:
Line 1,009: Line 928:
  
 
all $(CIMG_EXTRA_FILES)
 
all $(CIMG_EXTRA_FILES)
 
 
  
  
Line 1,038: Line 955:
  
 
all
 
all
 
 
  
  
Line 1,067: Line 982:
  
 
all
 
all
 
 
  
  
Line 1,098: Line 1,011:
  
 
all
 
all
 
 
  
  
Line 1,213: Line 1,124:
  
 
all
 
all
 
 
  
  
Line 1,259: Line 1,168:
  
 
all
 
all
 
 
  
  
Line 1,446: Line 1,353:
  
 
all $(CIMG_EXTRA_FILES)
 
all $(CIMG_EXTRA_FILES)
 
 
 
 
#-----------------
 
 
# End of makefile
 
 
#-----------------
 
 
  
 
</pre></big>
 
</pre></big>

Revision as of 15:43, 7 February 2013

Top Solo

Overview

team name - classical DoTA reference


CImage is a free and open source cross platform Image Processing solution written in C++:

Links Supporting Project:

CImage

GitHub

Shayan's Blog

Assignment 1

I am going to try and profile and optimize the following function from the CImg Library. This function creates triangles on the screen and allows the user to make them clump up by clicking the mouse buttons.

Compilation with profiling on Mac OSX:


g++ -o CImg_demo CImg_demo.cpp -O2 -g -pg -I.. -Wall -W -ansi -pedantic -Dcimg_use_vt100 -I/usr/X11R6/include -lm -L/usr/X11R6/lib -lpthread -lX11



// Item : Filled Triangles

//-------------------------

void* item_filled_triangles() {

	

   // Size

   const int SIZE = 100;



  // Create a colored 640x480 background image which consists of different color shades.

  CImg<float> background(640,480,1,3);

  cimg_forXY(background,x,y) background.fillC(x,y,0,

                                              x*std::cos(6.0*y/background.height()) + y*std::sin(9.0*x/background.width()),

                                              x*std::sin(8.0*y/background.height()) - y*std::cos(11.0*x/background.width()),

                                              x*std::cos(13.0*y/background.height()) - y*std::sin(8.0*x/background.width()));

  background.normalize(0,180);



  // Init images and create display window.

  CImg<unsigned char> img0(background), img;

  unsigned char white[] = { 255, 255, 255 }, color[100][3];

  CImgDisplay disp(img0,"[#6] - Filled Triangles (Click to shrink)");



  // Define random properties (pos, size, colors, ..) for all triangles that will be displayed.

  float posx[SIZE], posy[SIZE], rayon[SIZE], angle[SIZE], veloc[SIZE], opacity[SIZE];

  int num = 1;

  std::srand((unsigned int)time(0));

 

  // I'm thinking of offloading these operations to the GPU

  for (int k = 0; k<SIZE; ++k) {

    posx[k] = (float)(cimg::rand()*img0.width());

    posy[k] = (float)(cimg::rand()*img0.height());

    rayon[k] = (float)(10 + cimg::rand()*50);

    angle[k] = (float)(cimg::rand()*360);

    veloc[k] = (float)(cimg::rand()*20 - 10);

    color[k][0] = (unsigned char)(cimg::rand()*255);

    color[k][1] = (unsigned char)(cimg::rand()*255);

    color[k][2] = (unsigned char)(cimg::rand()*255);

    opacity[k] = (float)(0.3 + 1.5*cimg::rand());

  }



  // Start animation loop.

  while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {

    img = img0;



	/* Maybe offload this for loop to GPU? */

    // Draw each triangle on the background image.

    for (int k = 0; k<num; ++k) {

      const int

        x0 = (int)(posx[k] + rayon[k]*std::cos(angle[k]*cimg::PI/180)),

        y0 = (int)(posy[k] + rayon[k]*std::sin(angle[k]*cimg::PI/180)),

        x1 = (int)(posx[k] + rayon[k]*std::cos((angle[k] + 120)*cimg::PI/180)),

        y1 = (int)(posy[k] + rayon[k]*std::sin((angle[k] + 120)*cimg::PI/180)),

        x2 = (int)(posx[k] + rayon[k]*std::cos((angle[k] + 240)*cimg::PI/180)),

        y2 = (int)(posy[k] + rayon[k]*std::sin((angle[k] + 240)*cimg::PI/180));

      if (k%10) img.draw_triangle(x0,y0,x1,y1,x2,y2,color[k],opacity[k]);

      else img.draw_triangle(x0,y0,x1,y1,x2,y2,img0,0,0,img0.width()-1,0,0,img.height()-1,opacity[k]);

      img.draw_triangle(x0,y0,x1,y1,x2,y2,white,opacity[k],~0U);



      // Make the triangles rotate, and check for mouse click event.

      // (to make triangles collapse or join).

      angle[k]+=veloc[k];

      if (disp.mouse_x()>0 && disp.mouse_y()>0) {

        float u = disp.mouse_x() - posx[k], v = disp.mouse_y() - posy[k];

        if (disp.button()) { u = -u; v = -v; }

        posx[k]-=0.03f*u, posy[k]-=0.03f*v;

        if (posx[k]<0 || posx[k]>=img.width()) posx[k] = (float)(cimg::rand()*img.width());

        if (posy[k]<0 || posy[k]>=img.height()) posy[k] = (float)(cimg::rand()*img.height());

      }

    }



    // Display current animation framerate, and refresh display window.

    img.draw_text(5,5,"%u frames/s",white,0,0.5f,13,(unsigned int)disp.frames_per_second());

    img0.resize(disp.display(img).resize(false).wait(20));

    if (++num>SIZE) num = SIZE;



    // Allow the user to toggle fullscreen mode, by pressing CTRL+F.

    if (disp.is_keyCTRLLEFT() && disp.is_keyF()) disp.resize(640,480,false).toggle_fullscreen(false);

  }

  return 0;

}

Initial Profile (on OpenSUSE Linux at Seneca)


Flat profile:




Each sample counts as 0.01 seconds.

  %   cumulative   self              self     total           

 time   seconds   seconds    calls  us/call  us/call  name    

 82.26      2.55     2.55  4820368     0.53     0.53  frame_dummy

 12.26      2.93     0.38                             cimg_library::CImg<unsigned char>& cimg_library::CImg<unsigned char>::draw_line<unsigned char>(int, int, int, int, unsigned char const*, float, unsigned int, bool)

  2.58      3.01     0.08    10965     7.30     7.33  cimg_library::CImg<unsigned char>& cimg_library::CImg<unsigned char>::draw_image<float, float>(int, int, int, int, cimg_library::CImg<float> const&, cimg_library::CImg<float> const&, float, float)

  1.94      3.07     0.06                             cimg_library::CImg<unsigned char>& cimg_library::CImg<unsigned char>::_draw_triangle<unsigned char>(int, int, int, int, int, int, unsigned char const*, float, float)

  0.32      3.08     0.01   298115     0.03     0.03  cimg_library::CImg<unsigned char>::is_empty() const

  0.32      3.09     0.01                             item_3d_reflection()

  0.32      3.10     0.01                             cimg_library::CImg<float>::fillC(unsigned int, unsigned int, unsigned int, double, ...)

  0.00      3.10     0.00    14040     0.00     0.00  cimg_library::CImg<float>::assign(unsigned int, unsigned int, unsigned int, unsigned int)

  0.00      3.10     0.00    13270     0.00     0.00  cimg_library::CImg<float>::assign(float const*, unsigned int, unsigned int, unsigned int, unsigned int)

  0.00      3.10     0.00     9053     0.00     0.00  cimg_library::cimg::X11_attr()

  0.00      3.10     0.00     7130     0.00     0.00  cimg_library::CImg<float>::~CImg()

  0.00      3.10     0.00     2305     0.00     0.00  cimg_library::CImg<float>::move_to(cimg_library::CImg<float>&)

  0.00      3.10     0.00     1793     0.00     0.00  cimg_library::CImg<float>& cimg_library::CImg<float>::assign<float>(cimg_library::CImg<float> const&, bool)

  0.00      3.10     0.00     1024     0.00     0.00  cimg_library::CImg<unsigned long>::CImg(unsigned int, unsigned int, unsigned int, unsigned int)

  0.00      3.10     0.00     1000     0.00     0.53  cimg_library::CImgDisplay& cimg_library::CImgDisplay::render<unsigned char>(cimg_library::CImg<unsigned char> const&, bool)

  0.00      3.10     0.00     1000     0.00    80.40  cimg_library::CImg<unsigned char>& cimg_library::CImg<unsigned char>::_draw_text<unsigned char, unsigned char, float>(int, int, char const*, unsigned char const*, unsigned char const*, float, cimg_library::CImgList<float> const&)

  0.00      3.10     0.00     1000     0.00     0.00  cimg_library::CImg<unsigned char>::assign(unsigned int, unsigned int, unsigned int, unsigned int)

  0.00      3.10     0.00     1000     0.00    81.11  cimg_library::CImg<unsigned char>& cimg_library::CImg<unsigned char>::draw_text<unsigned char, unsigned char>(int, int, char const*, unsigned char const*, unsigned char const*, float, unsigned int, ...)

  0.00      3.10     0.00      769     0.00     0.70  cimg_library::CImg<float>::resize(int, int, int, int, int, unsigned int, float, float, float, float)

  0.00      3.10     0.00      769     0.00     0.00  cimg_library::CImg<float>::CImg(cimg_library::CImg<float> const&)

  0.00      3.10     0.00      769     0.00     0.70  cimg_library::CImg<float>::get_resize(int, int, int, int, int, unsigned int, float, float, float, float) const

  0.00      3.10     0.00      768     0.00     0.00  cimg_library::CImg<unsigned long>::fill(unsigned long)

  0.00      3.10     0.00      702     0.00     0.00  cimg_library::CImg<float>::draw_image(int, int, int, int, cimg_library::CImg<float> const&, float)

  0.00      3.10     0.00      513     0.00     0.00  cimg_library::CImg<float>::assign(unsigned int, unsigned int, unsigned int, unsigned int, float)

  0.00      3.10     0.00      512     0.00     0.00  cimg_library::CImgList<float>::insert(cimg_library::CImg<float> const&, unsigned int, bool)

  0.00      3.10     0.00      189     0.00     0.00  cimg_library::CImg<float>::CImg(unsigned int, unsigned int, unsigned int, unsigned int)

  0.00      3.10     0.00      189     0.00     0.00  cimg_library::CImg<float>::get_crop(int, int, int, int, int, int, int, int, bool) const

  0.00      3.10     0.00       67     0.00     0.00  cimg_library::CImg<float>::CImg(unsigned int, unsigned int, unsigned int, unsigned int, float)

  0.00      3.10     0.00        6     0.00     0.00  cimg_library::CImgList<float>::assign(unsigned int)

  0.00      3.10     0.00        3     0.00     0.35  cimg_library::CImgDisplay::_handle_events(_XEvent const*)

  0.00      3.10     0.00        2     0.00     0.00  cimg_library::CImgList<float>::assign(cimg_library::CImgList<float> const&, bool)

  0.00      3.10     0.00        2     0.00     0.00  cimg_library::CImgList<float>::~CImgList()

  0.00      3.10     0.00        1     0.00     0.00  _GLOBAL__sub_I__Z22item_blurring_gradientv

  0.00      3.10     0.00        1     0.00     0.00  cimg_library::CImgDisplay::_map_window()

  0.00      3.10     0.00        1     0.00     0.00  cimg_library::CImgDisplay::_assign(unsigned int, unsigned int, char const*, unsigned int, bool, bool)

  0.00      3.10     0.00        1     0.00     0.00  cimg_library::CImg<unsigned char>::~CImg()

  0.00      3.10     0.00        1     0.00   136.13  cimg_library::CImgList<float>::font(unsigned int, bool)

  0.00      3.10     0.00        1     0.00   136.13  cimg_library::CImgList<float>::_font(unsigned int const*, unsigned int, unsigned int, bool)

  0.00      3.10     0.00        1     0.00     0.00  cimg_library::CImgList<float>& cimg_library::CImgList<float>::insert<float>(cimg_library::CImgList<float> const&, unsigned int, bool)

  0.00      3.10     0.00        1     0.00     0.00  cimg_library::CImgList<float>::CImgList(cimg_library::CImgList<float> const&)

  0.00      3.10     0.00        1     0.00   136.13  cimg_library::CImgList<float>::get_crop_font() const

Modified Makefile for Profiling



CIMG_FILES = CImg_demo


# Files which requires external libraries to run.

CIMG_EXTRA_FILES = use_jpeg_buffer \

                   gmic_gimp \

                   gmic


#---------------------------------

# Set correct variables and paths

#---------------------------------

CIMG_VERSION = 1.5.4

X11PATH      = /usr/X11R6

CC           = g++

EXEPFX       =

CCVER       = $(CC)

ifeq ($(CC),g++)

CCVER        = `$(CC) -v 2>&1 | tail -n 1`

endif

ifeq ($(CC),clang++)

CCVER        = `$(CC) -v 2>&1 | head -n 1`

endif

ifeq ($(CC),icc)

CCVER        = "icc \( `$(CC) -v 2>&1`\)"

CFLAGS       = -I..

LDFLAGS      =

else

# ADDED PROFILING CALLS HERE #

'''CFLAGS       = -I.. -Wall -W -O2 -g -pg''' 

'''LDFLAGS      = -lm -pg'''

endif


#--------------------------------------------------

# Set compilation flags allowing to customize CImg

#--------------------------------------------------


# Flags to enable strict code standards

ifeq ($(CC),icc)

CIMG_ANSI_CFLAGS = -ansi

else

CIMG_ANSI_CFLAGS = -ansi -pedantic

endif


# Flags to enable code debugging.

CIMG_DEBUG_CFLAGS = -Dcimg_verbosity=3 -Dcimg_strict_warnings -g


# Flags to enable color output messages.

# (requires a VT100 compatible terminal)

CIMG_VT100_CFLAGS = -Dcimg_use_vt100


# Flags to enable code optimization by the compiler.

ifeq ($(CC),icc)

CIMG_OPT_CFLAGS = -O3 -ipo -no-prec-div

else

CIMG_OPT_CFLAGS = -O3 -fno-tree-pre

endif


# Flags to enable OpenMP support.

ifeq ($(CC),icc)

CIMG_OPENMP_CFLAGS = -Dcimg_use_openmp -openmp -i-static

else

CIMG_OPENMP_CFLAGS = -Dcimg_use_openmp -fopenmp

endif


# Flags to enable OpenCV support.

CIMG_OPENCV_CFLAGS = -Dcimg_use_opencv -I/usr/include/opencv

CIMG_OPENCV_LDFLAGS = -lcv -lhighgui


# Flags used to disable display capablities of CImg

CIMG_NODISPLAY_CFLAGS = -Dcimg_display=0


# Flags to enable the use of the X11 library.

# (X11 is used by CImg to handle display windows)

# !!! For 64bits systems : replace -L$(X11PATH)/lib by -L$(X11PATH)/lib64 !!!

CIMG_X11_CFLAGS = -I$(X11PATH)/include

CIMG_X11_LDFLAGS = -L$(X11PATH)/lib -lpthread -lX11


# Flags to enable fast image display, using the XSHM library (when using X11).

# !!! Seems to randomly crash when used on MacOSX and 64bits systems, so use it only when necessary !!!

CIMG_XSHM_CFLAGS = # -Dcimg_use_xshm

CIMG_XSHM_LDFLAGS = # -lXext

# Flags to enable GDI32 display (Windows native).

CIMG_GDI32_CFLAGS = -mwindows

CIMG_GDI32_LDFLAGS = -lgdi32


# Flags to enable screen mode switching, using the XRandr library (when using X11).

# ( http://www.x.org/wiki/Projects/XRandR )

# !!! Not supported by the X11 server on MacOSX, so do not use it on MacOSX !!!

CIMG_XRANDR_CFLAGS = -Dcimg_use_xrandr

CIMG_XRANDR_LDFLAGS = -lXrandr


# Flags to enable native support for PNG image files, using the PNG library.

# ( http://www.libpng.org/ )

CIMG_PNG_CFLAGS = -Dcimg_use_png

CIMG_PNG_LDFLAGS = -lpng -lz


# Flags to enable native support for JPEG image files, using the JPEG library.

# ( http://www.ijg.org/ )

CIMG_JPEG_CFLAGS = -Dcimg_use_jpeg

CIMG_JPEG_LDFLAGS = -ljpeg


# Flags to enable native support for TIFF image files, using the TIFF library.

# ( http://www.libtiff.org/ )

CIMG_TIFF_CFLAGS = -Dcimg_use_tiff

CIMG_TIFF_LDFLAGS = -ltiff


# Flags to enable native support for MINC2 image files, using the MINC2 library.

# ( http://en.wikibooks.org/wiki/MINC/Reference/MINC2.0_Users_Guide )

CIMG_MINC2_CFLAGS = -Dcimg_use_minc2 -I${HOME}/local/include

CIMG_MINC2_LDFLAGS = -lminc_io -lvolume_io2 -lminc2 -lnetcdf -lhdf5 -lz -L${HOME}/local/lib


# Flags to enable native support for EXR image files, using the OpenEXR library.

# ( http://www.openexr.com/ )

CIMG_EXR_CFLAGS = -Dcimg_use_openexr -I/usr/include/OpenEXR

CIMG_EXR_LDFLAGS = -lIlmImf -lHalf


# Flags to enable native support for various video files, using the FFMPEG library.

# ( http://www.ffmpeg.org/ )

CIMG_FFMPEG_CFLAGS = -Dcimg_use_ffmpeg -D__STDC_CONSTANT_MACROS -I/usr/include/libavcodec -I/usr/include/libavformat -I/usr/include/libswscale -I/usr/include/ffmpeg

CIMG_FFMPEG_LDFLAGS = -lavcodec -lavformat -lswscale


# Flags to enable native support for compressed .cimgz files, using the Zlib library.

# ( http://www.zlib.net/ )

CIMG_ZLIB_CFLAGS = -Dcimg_use_zlib

CIMG_ZLIB_LDFLAGS = -lz


# Flags to enable native support of most classical image file formats, using the Magick++ library.

# ( http://www.imagemagick.org/Magick++/ )

CIMG_MAGICK_CFLAGS = -Dcimg_use_magick `Magick++-config --cppflags` `Magick++-config --cxxflags`

CIMG_MAGICK_LDFLAGS = `Magick++-config --ldflags` `Magick++-config --libs`


# Flags to enable faster Discrete Fourier Transform computation, using the FFTW3 library

# ( http://www.fftw.org/ )

CIMG_FFTW3_CFLAGS = -Dcimg_use_fftw3

ifeq ($(MSYSTEM),MINGW32)

CIMG_FFTW3_LDFLAGS = -lfftw3-3

else

CIMG_FFTW3_LDFLAGS = -lfftw3

endif


# Flags to enable the use of LAPACK routines for matrix computation

# ( http://www.netlib.org/lapack/ )

CIMG_LAPACK_CFLAGS = -Dcimg_use_lapack

CIMG_LAPACK_LDFLAGS = -lblas -lg2c -llapack


# Flags to enable the use of the Board library

# ( http://libboard.sourceforge.net/ )

CIMG_BOARD_CFLAGS = -Dcimg_use_board -I/usr/include/board

CIMG_BOARD_LDFLAGS = -lboard


# Flags to compile on Sun Solaris

CIMG_SOLARIS_LDFLAGS = -R$(X11PATH)/lib -lrt -lnsl -lsocket


# Flags to compile GIMP plug-ins.

ifeq ($(MSYSTEM),MINGW32)

CIMG_GIMP_CFLAGS = -mwindows

endif


#-------------------------

# Define Makefile entries

#-------------------------

.cpp:

	@echo

	@echo "** Compiling '$* ($(CIMG_VERSION))' with '$(CCVER)'"

	@echo

	$(CC) -o $(EXEPFX)$* $< $(CFLAGS) $(CONF_CFLAGS) $(LDFLAGS) $(CONF_LDFLAGS)

ifeq ($(STRIP_EXE),true)

ifeq ($(MSYSTEM),MINGW32)

	strip $(EXEPFX)$*.exe

else

	strip $(EXEPFX)$*

endif

endif

menu:

	@echo

	@echo "CImg Library $(CIMG_VERSION) : Examples"

	@echo "-----------------------------"

	@echo "  > linux    : Linux/BSD target, X11 display, optimizations disabled."

	@echo "  > dlinux   : Linux/BSD target, X11 display, debug mode."

	@echo "  > olinux   : Linux/BSD target, X11 display, optimizations enabled."

	@echo "  > mlinux   : Linus/BSD target, no display, minimal features, optimizations enabled."

	@echo "  > Mlinux   : Linux/BSD target, X11 display, maximal features, optimizations enabled."

	@echo

	@echo "  > solaris  : Sun Solaris target, X11 display, optimizations disabled."

	@echo "  > dsolaris : Sun Solaris target, X11 display, debug mode."

	@echo "  > osolaris : Sun Solaris target, X11 display, optimizations enabled."

	@echo "  > msolaris : Sun Solaris target, no display, minimal features, optimizations enabled."

	@echo "  > Msolaris : Sun Solaris target, X11 display, maximal features, optimizations enabled."

	@echo

	@echo "  > macosx   : MacOSX target, X11 display, optimizations disabled."

	@echo "  > dmacosx  : MacOSX target, X11 display, debug mode."

	@echo "  > omacosx  : MacOSX target, X11 display, optimizations enabled."

	@echo "  > mmacosx  : MacOSX target, no display, minimal features, optimizations enabled."

	@echo "  > Mmacosx  : MacOSX target, X11 display, maximal features, optimizations enabled."

	@echo

	@echo "  > windows  : Windows target, GDI32 display, optimizations disabled."

	@echo "  > dwindows : Windows target, GDI32 display, debug mode."

	@echo "  > owindows : Windows target, GDI32 display, optimizations enabled."

	@echo "  > mwindows : Windows target, no display, minimal features, optimizations enabled."

	@echo "  > Mwindows : Windows target, GDI32 display, maximal features, optimizations enabled."

	@echo

	@echo "  > clean    : Clean generated files."

	@echo

	@echo "Choose your option :"

	@read CHOICE; echo; $(MAKE) $$CHOICE; echo; echo "> Next time, you can bypass the menu by typing directly 'make $$CHOICE'"; echo;


all: $(CIMG_FILES)


clean:

	rm -rf *.exe *.o *~ \#* $(CIMG_FILES) $(CIMG_EXTRA_FILES)

ifneq ($(EXEPFX),)

	rm -f $(EXEPFX)*

endif


# Specific targets for the 'gmic_gimp' plug-in for GIMP.

gmic_gimp.o: gmic.cpp gmic_def.h

	$(CC) -o gmic_gimp.o -c gmic.cpp -Dcimg_build -Dgmic_gimp -Dgmic_float_only $(CIMG_OPT_CFLAGS) $(CIMG_FFTW3_CFLAGS) $(CIMG_PNG_CFLAGS)


gmic_gimp: gmic_gimp.o gmic_gimp.cpp

	$(CC) -o $(EXEPFX)gmic_gimp gmic_gimp.cpp gmic_gimp.o -Dcimg_build `gimptool-2.0 --cflags` `gimptool-2.0 --libs` $(CIMG_GIMP_CFLAGS) $(CIMG_OPT_FLAGS) $(CIMG_FFTW3_LDFLAGS) $(CIMG_PNG_LDFLAGS) -lpthread




# Specific targets for 'gmic'.

gmic_def: gmic_def.gmic

	cd ../../gmic/src && $(MAKE) def




gmic_bool.o: gmic.cpp

	@echo

	@echo "** Compiling 'gmic ($(CIMG_VERSION))' with '$(CCVER)'"

	@echo

	$(CC) -o gmic_bool.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_bool $(CFLAGS) $(CONF_CFLAGS)

gmic_uchar.o: gmic.cpp

	$(CC) -o gmic_uchar.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_uchar $(CFLAGS) $(CONF_CFLAGS)

gmic_char.o: gmic.cpp

	$(CC) -o gmic_char.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_char $(CFLAGS) $(CONF_CFLAGS)

gmic_ushort.o: gmic.cpp

	$(CC) -o gmic_ushort.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_ushort $(CFLAGS) $(CONF_CFLAGS)

gmic_short.o: gmic.cpp

	$(CC) -o gmic_short.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_short $(CFLAGS) $(CONF_CFLAGS)

gmic_uint.o: gmic.cpp

	$(CC) -o gmic_uint.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_uint $(CFLAGS) $(CONF_CFLAGS)

gmic_int.o: gmic.cpp

	$(CC) -o gmic_int.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_int $(CFLAGS) $(CONF_CFLAGS)

gmic_float.o: gmic.cpp

	$(CC) -o gmic_float.o -c gmic.cpp -Dgmic_main -Dcimg_build -Dgmic_split_compilation -Dgmic_float $(CFLAGS) $(CONF_CFLAGS)

gmic_double.o: gmic.cpp

	$(CC) -o gmic_double.o -c gmic.cpp -Dcimg_build -Dgmic_split_compilation -Dgmic_double $(CFLAGS) $(CONF_CFLAGS)


gmic: gmic_bool.o gmic_uchar.o gmic_char.o gmic_ushort.o gmic_short.o gmic_uint.o gmic_int.o gmic_float.o gmic_double.o gmic_def.h

	$(CC) -o $(EXEPFX)gmic -Dcimg_build -Dgmic_split_compilation \

		 gmic_bool.o gmic_uchar.o gmic_char.o gmic_ushort.o gmic_short.o \

		 gmic_uint.o gmic_int.o gmic_float.o gmic_double.o $(CFLAGS) $(CONF_CFLAGS) $(CONF_LDFLAGS) $(LDFLAGS)


gmic_minimal:

	$(CC) -o $(EXEPFX)gmic gmic.cpp -Dgmic_main -Dgmic_float_only -Dcimg_build -Dcimg_use_fftw3 -Dcimg_use_png -Dcimg_display=1 -I/usr/X11R6/include -g -W -Wall -ansi -pedantic -L/usr/X11R6/lib -lX11 -lpthread -lfftw3 -lpng -lz


ifeq ($(STRIP_EXE),true)

	strip $(EXEPFX)gmic

endif


# Linux/BSD/Mac OSX targets, with X11 display.

linux:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS)" \

all


dlinux:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_DEBUG_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS)" \

all


olinux:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_OPT_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS)" \

"STRIP_EXE=true" \

all

mlinux:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_NODISPLAY_CFLAGS) \

$(CIMG_OPT_CFLAGS)" \

"STRIP_EXE=true" \

all

Mlinux:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_OPT_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS) \

$(CIMG_XRANDR_CFLAGS) \

$(CIMG_TIFF_CFLAGS) \

$(CIMG_MINC2_CFLAGS) \

$(CIMG_EXR_CFLAGS) \

$(CIMG_PNG_CFLAGS) \

$(CIMG_JPEG_CFLAGS) \

$(CIMG_ZLIB_CFLAGS) \

$(CIMG_OPENCV_CFLAGS) \

$(CIMG_MAGICK_CFLAGS) \

$(CIMG_FFTW3_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS) \

$(CIMG_XRANDR_LDFLAGS) \

$(CIMG_TIFF_LDFLAGS) \

$(CIMG_MINC2_LDFLAGS) \

$(CIMG_EXR_LDFLAGS) \

$(CIMG_PNG_LDFLAGS) \

$(CIMG_JPEG_LDFLAGS) \

$(CIMG_ZLIB_LDFLAGS) \

$(CIMG_OPENCV_LDFLAGS) \

$(CIMG_MAGICK_LDFLAGS) \

$(CIMG_FFTW3_LDFLAGS)" \

"STRIP_EXE=true" \

all $(CIMG_EXTRA_FILES)


# Sun Solaris targets, with X11 display.

solaris:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_SOLARIS_LDFLAGS) \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS)" \

all


dsolaris:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_DEBUG_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_SOLARIS_LDFLAGS) \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS)" \

all


osolaris:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_OPT_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_SOLARIS_LDFLAGS) \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS)" \

"STRIP_EXE=true" \

all


msolaris:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_NODISPLAY_CFLAGS) \

$(CIMG_OPT_CFLAGS)" \

"STRIP_EXE=true" \

all




Msolaris:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_OPT_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_XSHM_CFLAGS) \

$(CIMG_XRANDR_CFLAGS) \

$(CIMG_TIFF_CFLAGS) \

$(CIMG_MINC2_CFLAGS) \

$(CIMG_EXR_CFLAGS) \

$(CIMG_PNG_CFLAGS) \

$(CIMG_JPEG_CFLAGS) \

$(CIMG_ZLIB_CFLAGS) \

$(CIMG_OPENCV_CFLAGS) \

$(CIMG_MAGICK_CFLAGS) \

$(CIMG_FFTW3_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_SOLARIS_LDFLAGS) \

$(CIMG_X11_LDFLAGS) \

$(CIMG_XSHM_LDFLAGS) \

$(CIMG_XRANDR_LDFLAGS) \

$(CIMG_TIFF_LDFLAGS) \

$(CIMG_MINC2_LDFLAGS) \

$(CIMG_EXR_LDFLAGS) \

$(CIMG_PNG_LDFLAGS) \

$(CIMG_JPEG_LDFLAGS) \

$(CIMG_ZLIB_LDFLAGS) \

$(CIMG_OPENCV_LDFLAGS) \

$(CIMG_MAGICK_LDFLAGS) \

$(CIMG_FFTW3_LDFLAGS)" \

"STRIP_EXE=true" \

all $(CIMG_EXTRA_FILES)




# MacOsX targets, with X11 display.

macosx:

	@$(MAKE) \

"CONF_CFLAGS = \

$(PROFILE) \

$(PROFILE2) \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS)" \

all


dmacosx:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_DEBUG_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS)" \

all




omacosx:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_OPT_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS)" \

all


mmacosx:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_ANSI_CFLAGS) \

$(CIMG_NODISPLAY_CFLAGS) \

$(CIMG_OPT_CFLAGS)" \

all




Mmacosx:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_OPT_CFLAGS) \

$(CIMG_VT100_CFLAGS) \

$(CIMG_X11_CFLAGS) \

$(CIMG_TIFF_CFLAGS) \

$(CIMG_MINC2_CFLAGS) \

$(CIMG_EXR_CFLAGS) \

$(CIMG_PNG_CFLAGS) \

$(CIMG_JPEG_CFLAGS) \

$(CIMG_ZLIB_CFLAGS) \

$(CIMG_OPENCV_CFLAGS) \

$(CIMG_MAGICK_CFLAGS) \

$(CIMG_FFTW3_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_X11_LDFLAGS) \

$(CIMG_TIFF_LDFLAGS) \

$(CIMG_MINC2_LDFLAGS) \

$(CIMG_EXR_LDFLAGS) \

$(CIMG_PNG_LDFLAGS) \

$(CIMG_JPEG_LDFLAGS) \

$(CIMG_ZLIB_LDFLAGS) \

$(CIMG_OPENCV_LDFLAGS) \

$(CIMG_MAGICK_LDFLAGS) \

$(CIMG_FFTW3_LDFLAGS)" \

all $(CIMG_EXTRA_FILES)




# Windows targets, with GDI32 display.

windows:

	@$(MAKE) \

"CONF_CFLAGS = " \

"CONF_LDFLAGS = \

$(CIMG_GDI32_LDFLAGS)" \

all




dwindows:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_DEBUG_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_GDI32_LDFLAGS)" \

all




owindows:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_OPT_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_GDI32_LDFLAGS)" \

"STRIP_EXE=true" \

all




mwindows:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_NODISPLAY_CFLAGS) \

$(CIMG_OPT_CFLAGS)" \

"STRIP_EXE=true" \

all




Mwindows:

	@$(MAKE) \

"CONF_CFLAGS = \

$(CIMG_OPT_CFLAGS) \

$(CIMG_TIFF_CFLAGS) \

$(CIMG_PNG_CFLAGS) \

$(CIMG_JPEG_CFLAGS) \

$(CIMG_ZLIB_CFLAGS) \

$(CIMG_OPENCV_CFLAGS) \

$(CIMG_FFTW3_CFLAGS)" \

"CONF_LDFLAGS = \

$(CIMG_GDI32_LDFLAGS) \

$(CIMG_TIFF_LDFLAGS) \

$(CIMG_PNG_LDFLAGS) \

$(CIMG_JPEG_LDFLAGS) \

$(CIMG_ZLIB_LDFLAGS) \

$(CIMG_OPENCV_LDFLAGS) \

$(CIMG_FFTW3_LDFLAGS)" \

"STRIP_EXE=true" \

all $(CIMG_EXTRA_FILES)

Build Instructions

make <platform> eg: macosx, linux etc.

Assignment 2

Assignment 3