/*

    eboard - chess client
    http://www.bergo.eng.br/eboard
    https://github.com/fbergo/eboard
    Copyright (C) 2000-2016 Felipe Bergo
    fbergo/at/gmail/dot/com

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/

#ifndef CIMG_H
#define CIMG_H 1

#include "eboard.h" // hati type

#define t0(a) (((a)>>16)&0xff)
#define t1(a) (((a)>>8)&0xff)
#define t2(a) ((a)&0xff)
#define triplet(a,b,c) ((((a)&0xff)<<16)|(((b)&0xff)<<8)|((c)&0xff))

class Blitter {
 public:
  void bitblt(rgbptr src,rgbptr dest,int sx,int sy,int sw,
	      int dx,int dy,int dw,int w,int h);
  void bitblt_a(rgbptr src,rgbptr dest,int sx,int sy,int sw,
		int dx,int dy,int dw,int w,int h, rgbptr alpha);
};

class ColorSpace {
 public:

  int RGB2YCbCr(int triplet);
  int YCbCr2RGB(int triplet);
  int lighter(int triplet);
  int darker(int triplet);

  int pixr(int triplet);
  int pixg(int triplet);
  int pixb(int triplet);
  int pixel(int r,int g,int b);

};

class CImg : public Blitter {
 public:
  CImg(int w,int h);
  CImg(const char *filename);
  CImg(CImg *src);
  virtual ~CImg();

  void fill(int color);
  void set(int x,int y, int color);
  int  get(int x,int y);
  void crop(int x,int y,int w,int h);

  CImg *alphaScale(rgbptr alpha, int nw,int nh, bool extruded);
  CImg *scale(int nw, int nh);

  void  writeP6(const char *path);

  int W,H;
  int rowlen;
  hati *data;
  int ok;

 private:
  void alloc(int w,int h);
};

#endif
