// Marcin Pietrkiewicz 1TIZ

// Inlcudujemy potrzebne nam naglowki, dostarczone wraz z biblioteka
// Boost. Dodatkowo musimy w opcjach kompilatora dodac biblioteke,
// obslugujaca dany format pliku, trzeba w nia zaopatrzec sie samodzielnie. 
// W ponizszym przykladzie zastosowalem biblioteke libjpeg.lib.
#include <boost/gil/image.hpp>
#include <boost/gil/typedefs.hpp>
#include <boost/gil/extension/io/jpeg_io.hpp>
#include <boost/gil/extension/numeric/sampler.hpp>
#include <boost/gil/extension/numeric/resample.hpp>
#include <string>
#include <iostream>

// Dodajemy odpowiednie namespace.
using namespace std;
using namespace boost::gil;

int main(int argc, char* argv[])
{
    // Dla uproszczenia przykladu bedziemy obslugiwac tylko pliki graficzne
	// JPEG w formacie RGB8. Dostepne sa rozne typy, dokladny opis 
	// i wyjasnienie wszystkich typow znajduje sie np.w prezentacji na stronie
	// http://stlab.adobe.com/gil/presentation/index.htm
	rgb8_image_t img;

	// Ustawiamy zmienne lokalne: inputFile-plik wejsciowy np. "test.jpg",
	//                           outputFile-plik wyjsciowy np. "_test.jpg"
	string inputFile= argv[1];
	string outputFile= argv[2];

	// Funkcja dostarczona przez biblioteke libjpeg.lib sluzaca do wczytywania 
	//do pamieci, pliku z podanej sciezki.
    jpeg_read_image(inputFile,img);

	// Wyswietlanie menu oraz obsluga wyboru opcji.
	cout << "1. Obrot zdjecia w lewo." << endl;
	cout << "2. Obrot zdjecia w prawo." << endl;
	cout << "3. Transformata koloru CMYK8." << endl;
	cout << "4. Transformata koloru GRAY." << endl;
    cout << "5. Transformata koloru RGB8." << endl;
	int wybor=0;
	cout << "Wybor: ";
    cin >> wybor;
	switch(wybor)
	{
	case 1: 
		    // Funkcja sluzaca do zapisania obrazu z zastosowaniem odpowiednich operacji.
		    // Obrot w lewo.
		    jpeg_write_view(outputFile,rotated90ccw_view(const_view(img)));

			break;
	case 2: 
			// Obrot w prawo.
			jpeg_write_view(outputFile,rotated90cw_view(const_view(img)));

			break;
	case 3: 
			// Transformacja koloru do cmyk8.
			jpeg_write_view(outputFile,color_converted_view<cmyk8_pixel_t>(const_view(img)));

			break;
	case 4: 
			// Transformacja koloru do gray8.
			jpeg_write_view(outputFile,color_converted_view<gray8_pixel_t>(const_view(img)));

			break;
    case 5: 
			// Dla formalnosci, transformacja koloru do rgb8.
		    // W tym przypadku plik wejsciowy i wyjsciowy beda takie same.
			jpeg_write_view(outputFile,color_converted_view<rgb8_pixel_t>(const_view(img)));

			break;
	default: cout <<" Wybor poza zakresem.";
			break;
	}
}

