#include "MP.h"
//#include "MPobject.h"
#include <proto/datatypes.h>
#include <proto/layers.h>
#include <datatypes/datatypesclass.h>
#include <datatypes/datatypes.h>
#include <datatypes/pictureclass.h>
#include "backfill.h"
//#include "imagebackfill.h"

#define MPHOOK_OK   0
#define MPHOOK_WARN 1
#define MPHOOK_FAIL 2

//#define DEBUG_STACK
//#define DEBUG
#include <debug.h>

extern BOOL    V39;

void FreeBackfill(struct Backfill *B);

struct Backfill
{
  struct Node      bf_Node; // uses ln_Type;
  struct Screen   *bf_Screen;
  struct Hook     *bf_Hook;
};

/*
struct Backdrop
{
  struct Node bd_Node;
  struct Screen *bd_Screen;
  struct Window *bd_Window;
  BOOL   bd_Loaded;
  struct BackFillOptions  bd_BFOptions;
  struct BackFillInfo     bd_BFInfo;
};
*/

struct List BackdropList;

LONG AddBackdrop(struct Screen *Scr, struct DefaultNode *DN)
{
  struct Backfill *b;

DEBUG_CODE(DKP("AddBackdrop Scr=%8lx  DNode=%8lx\n",Scr,DN););

  if(Scr && DN && V39)
  {
    if(DN->BackdropType)
    {
      if(b=AllocVec(sizeof(*b),MEMF_CLEAR|MEMF_PUBLIC))
      {
        b->bf_Node.ln_Type=DN->BackdropType;
        b->bf_Screen=Scr;
            
DEBUG_CODE(DKP("BackdropType=%ld\n",b->bf_Node.ln_Type););
            
        switch(DN->BackdropType)
        {
          case 1:
            b->bf_Hook=Image_AllocBackfillHook(Scr,DN);
            break;
          case 2:
            b->bf_Hook=RGB_AllocBackfillHook(Scr,DN);
            break;
        }     
  
DEBUG_CODE(DKP("bf_Hook=%ld\n",b->bf_Hook););
        
        if(b->bf_Hook)
        {
          struct Hook *oldhook;
          struct Window *win;
                  
          Forbid();          
          
          oldhook=InstallLayerInfoHook(&Scr->LayerInfo,b->bf_Hook);
          
          if(0==oldhook) // if no previous hook
          {
            AddHead(&BackdropList,(struct Node *)b);
            
DEBUG_CODE(DKP("Hook Installed\n"););
            
            if(win=OpenWindowTags(0,WA_CustomScreen, Scr,
                                    WA_Left        ,0,
    		                            WA_Top         ,0,
    		                            WA_Width       ,Scr->Width,
    		                            WA_Height      ,Scr->Height,
    		                            WA_Flags       ,WFLG_BACKDROP|WFLG_BORDERLESS|WFLG_SIMPLE_REFRESH|WFLG_NOCAREREFRESH,
    		                            WA_BackFill    ,0,
                                    TAG_DONE))
            {// refresh backdrop
              CloseWindow(win);
            }
            
            Permit();
            return(MPHOOK_OK);
          }
          
DEBUG_CODE(DKP("Hook Failed\n"););
          
          InstallLayerInfoHook(&Scr->LayerInfo,oldhook);
          
          Permit();
        }
        FreeBackfill(b);
      }
    }
  }
  return(MPHOOK_FAIL);
}

void RemoveBackdrop(struct Screen *Scr)
{
  struct Backfill *b;
  
DEBUG_CODE(DKP("RemoveBackdrop Scr=%8lx\n",Scr););
  
  b=(struct Backfill *)BackdropList.lh_Head;
  
  while(b->bf_Node.ln_Succ)
  {
    if(b->bf_Screen==Scr)
    {
      struct Backfill *b2;
      
DEBUG_CODE(DKP("Removing Backdrop %8lx\n",b););
      
      InstallLayerInfoHook(&Scr->LayerInfo,0);
      
      b2=(struct Backfill *)b->bf_Node.ln_Succ;
      
      Remove((struct Node *)b);
      FreeBackfill(b);
      
      b=b2;
    }
    else
    {
      b=(struct Backfill *)b->bf_Node.ln_Succ;
    }
  }
}


void FreeBackfill(struct Backfill *B)
{
DEBUG_CODE(DKP("FreeBackfill %8lx\n",B););

  if(B->bf_Hook)
  {
    switch(B->bf_Node.ln_Type)
    {
      case 1:// Image
        Image_FreeBackfillHook(B->bf_Hook);
        break;
      case 2:// Color
        RGB_FreeBackfillHook(B->bf_Hook);
        break;
    }
  }
  FreeVec(B);
}

