/*
        image.h (bitmap graphics object)

        V1.00 - 181096  Kimmo Teräväinen
        -----   ------  ----------------
        V0.01   181096  Started
        V0.05   201096  Oleelisimmat metodit kirjoitettu ja testattu
        V0.06   211096  cPiste & cSize periytyvät cAlkioR2:sessa
                        (R²-tason alkio)
        V0.07   031196  cPiste -> cPoint, caKuvio -> caImage
        V0.08   031196  Siirretty Cpoint ja cSize määrittelyt pois.
        V0.10   141196  Bitmap-image olio (AmigaOS versio)
        V0.11   181196  Windows versio (osittainen testaamaton)
                191196  BUG: AmigaOS - Minterm failure. Imagen maskaus ei
                        toimi.
        V0.15   261196  Windows versio toimii melkein
        V0.16   051196  BUG FIXED: (win) BitBlt oli annettu paikka koon
                        sijasta

NOTE:   cImage is message and bitmap graphics object. It is inherated from
      TWindow class in Windows and from my own MsgRectangle class in Amiga.

*/
#ifndef DC1_POKER_IMAGE
#define DC1_POKER_IMAGE

#include "poker.h"
#include "point.h"

#ifdef _Windows

#include <owl/owlpch.h>
#include "poker.rh"

class cImage : public TWindow {
  const TBitmap *gfx;
  cPoint data,mask;
protected:
  void SetMask(const cPoint &p) { mask=p; } // Maski
  void SetData(const cPoint &p) { data=p; } // BitMap Kuva
  void SetMask(int nx,int ny)   { const cPoint p(nx,ny); mask=p; }
  void SetData(int nx,int ny)   { const cPoint p(nx,ny); data=p; }
public:
  cImage(TWindow *parent,const TBitmap *graph,const cPoint &nmask,const cPoint &ndata,int a=0,int b=0,int c=0,int d=0) :
    data(ndata), mask(nmask), gfx(graph),
    TWindow(parent)
  {
    Attr.Style |= WS_CHILD;
    Attr.X=a; Attr.Y=b; Attr.W=c; Attr.H=d;
    parent->CreateChildren();
  }
  cImage(TWindow *parent,const TBitmap *graph,int a=0,int b=0,int c=0,int d=0) :
    gfx(graph),
    data(0,0), mask(0,0),
    TWindow(parent)
  {
    Attr.Style |= WS_CHILD;
    Attr.X=a; Attr.Y=b; Attr.W=c; Attr.H=d;
    parent->CreateChildren();
    Hide();
  }

  virtual void Draw(TDC &dc) {
    if(Visible())
    {
      TMemoryDC memDC(dc);
      memDC.SelectObject(*gfx);
      dc.BitBlt(0,0,Attr.W,Attr.H,memDC,mask.X(),mask.Y(),SRCAND);  // (mask)
      dc.BitBlt(0,0,Attr.W,Attr.H,memDC,data.X(),data.Y(),SRCPAINT); // (data)
    }
  }
  virtual void Draw() { TClientDC dc(*this); Draw(dc); }

  virtual void Show() { TWindow::Show(SW_SHOW); }
  virtual void Hide() { TWindow::Show(SW_HIDE); }

  virtual void MoveTo(const cPoint &pos) {
    MoveWindow(pos.X(),pos.Y(),Attr.W,Attr.H,TRUE);
  }

  int  Visible() const { return IsWindowVisible(); }

  void Dummy() {} // Jotta ESC tai RETURN ei aiheuta yllätyksiä...

  virtual void Clicked() {};
  virtual void Paint(TDC &dc,bool,TRect &) { Draw(dc); }
  virtual void EvLButtonDown(uint, TPoint &) { Clicked(); }
  virtual void EvLButtonDblClk(uint, TPoint &) { Clicked(); }

  DECLARE_RESPONSE_TABLE(cImage);
};

#else

#include <inline++/graphics.h>
#include <inline++/intuition.h>
#include <inline++/dos.h>
#include <graphics/gfx.h>
#include <intuition/intuition.h>
#include "rect.h"

extern UBYTE gfxpens[256];

class cImage : public cMsgRectangle {
  Window *wnd;
  const BitMap *gfx;
  cPoint data,mask;
  int visible;
protected:
  void SetMask(const cPoint &p) { mask=p; } // Maski
  void SetData(const cPoint &p) { data=p; } // BitMap Kuva
  void SetMask(int nx,int ny)   { const cPoint p(nx,ny); mask=p; }
  void SetData(int nx,int ny)   { const cPoint p(nx,ny); data=p; }
public:
  cImage(Window *Wnd,const BitMap *graph,const cPoint &nmask,const cPoint &ndata,int a=0,int b=0,int c=0,int d=0) :
    cMsgRectangle(a+Wnd->BorderLeft,b+Wnd->BorderTop,c,d),
    data(ndata),mask(nmask),
    wnd(Wnd),
    gfx(graph),
    visible(FALSE)
  {
  }
  cImage(Window *Wnd,const BitMap *graph,int a=0,int b=0,int c=0,int d=0) :
    cMsgRectangle(a+Wnd->BorderLeft,b+Wnd->BorderTop,c,d),
    data(0,0),mask(0,0),
    wnd(Wnd),
    gfx(graph),
    visible(FALSE)
  {
  }

  virtual void Draw() const {
    if(visible) {
//      BltBitMapRastPort(gfx,mask.X(),mask.Y(),wnd->RPort,Left(),Top(),Width(),Height(),0x2a);
      BltBitMapRastPort(gfx,data.X(),data.Y(),wnd->RPort,Left(),Top(),Width(),Height(),0xc0);
    }
  }

  virtual void Show() { visible=TRUE;  Draw(); }
  virtual void Hide() {
    if(visible) {
      SetAPen(wnd->RPort,gfxpens[0]); SetDrMd(wnd->RPort,JAM1);
      RectFill(wnd->RPort,Left(),Top(),Right(),Bottom());
      visible=FALSE;
    }
  }

  virtual void MoveTo(const cPoint &pos) {
    if(visible) {
      Hide();
      cRectangle::MoveTo(pos);
      Show();
    } else cRectangle::MoveTo(pos);
  }

  int  Visible() const { return visible; }

  virtual void Clicked() {};

  virtual int Active() const { return FALSE; }

  virtual int IDCMP(const IntuiMessage *msg) {
    if((!visible) || (msg->Class!=MOUSEBUTTONS)) return IDCMP_NOT_DONE;
    if(!Inside(msg->MouseX,msg->MouseY)) return IDCMP_NOT_DONE;
    if(msg->Code==SELECTDOWN) Clicked();
    return IDCMP_DONE;
  }
};

typedef BitMap TBitmap;
typedef Window TWindow;


#endif

#endif