/*
 * Copyright (c) 2007-2009 by Oleg Trifonov <otrifonow@gmail.com>
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of either the GNU General Public License version 2
 * or the GNU Lesser General Public License version 2.1, both as
 * published by the Free Software Foundation.
 */
#ifndef _TR_IMAGE_H_
#define _TR_IMAGE_H_

#include "trTypes.h"
#include "trStream.h"

class TrImage {
public:
   TrImage();
   TrImage(const TrImage &img) { iCopyFrom(img); };
   ~TrImage();
   
   UInt32 GetWidth() const { return iWidth; };
   UInt32 GetHeight() const { return iHeight; };
   UInt32 GetiBitDepth() const { return iBitDepth; };
   BytePtr GetData() const { return iData; };
   UInt32 GetDataSize() const { return iRowBytes*iHeight; };
   bool IsAlphaSupport() const { return iAlpha; };
   
   virtual TColor GetPixel(UInt32 x, UInt32 y) const;
   virtual void SetPixel(UInt32 x, UInt32 y, TColor value);
   virtual TColor GetPixelColor(UInt32 x, UInt32 y) const;
   virtual TColor GetPixelAlpha(UInt32 x, UInt32 y) const;
   virtual void SetPixelColor(UInt32 x, UInt32 y, TColor value);
   virtual void SetPixelAlpha(UInt32 x, UInt32 y, TColor value);

   virtual bool Create(UInt32 width, UInt32 height, TColor color, UInt32 bpp);
   virtual bool Load(TrStream *stream) = 0;
   virtual bool Save(TrStream *stream) const  = 0;
   virtual bool LoadFile(const char* fileName);
   virtual bool SaveFile(const char* fileName) const;

   virtual TrImage& operator = (const TrImage &img);

protected:
   UInt32 iWidth;    // ширина рисунка
   UInt32 iHeight;   // высота рисунка
   BytePtr iData;    // массив точек
   UInt32 iBitDepth; // бит на точку
   bool   iAlpha;    // альфа-канал поддерживается
   UInt32 iRowBytes; // байт в строке рисунка

   virtual void iCopyFrom(const TrImage &img);

};



class TrPngImage: public TrImage {
public:
   TrPngImage();
   TrPngImage(const TrImage &img) { iCopyFrom(img); };

   virtual bool Load(TrStream *stream);   
   virtual bool Save(TrStream *stream) const;

   UInt32 GetChannels() const { return iChannels; };
   UInt32 GetColorType() const { return iColorType; };

protected:
   UInt32 iChannels;    // кол-во каналов на пиксель  
     // может быть: 1 (GRAY, PALETTE), 2 (GRAY_ALPHA), 3 (RGB), 4 (RGB_ALPHA или RGB + filler byte)
   UInt32 iColorType;   // описывает какие каналы присутствуют:
	  // PNG_COLOR_TYPE_GRAY, PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE,
	  // PNG_COLOR_TYPE_RGB, PNG_COLOR_TYPE_RGB_ALPHA...

   virtual void iCopyFrom(const TrImage &img);
};



class TrJpgImage: public TrImage {
public:
   TrJpgImage();
   TrJpgImage(const TrImage &img) { iCopyFrom(img); };

   virtual bool Load(TrStream *stream);   
   virtual bool Save(TrStream *stream) const { return Save(stream, 100); };
   virtual bool Save(TrStream *stream, int quality) const;  // quality: 0..100  

};


#endif // _TR_IMAGE_H_