/*============================================================================*/
/*  Palette operations							      */
/*============================================================================*/

#include "equates.h"

UWORD NewColor;
extern UWORD *ColorPTR,CurrGadg;
extern struct Window *PaletteWindow,*ToolWindow;
extern long ForeColor,BackColor,OutlineColor,DrawMode;
extern struct RastPort *VRastPort;
extern struct PropInfo *TempProp;
extern struct Screen *MPaintScreen;
extern int MaxColor;
extern USHORT ConvertToPot16();
struct Gadget *FindGadget();

/*----------------------------------------------------------------------------*/

Palette_IncRed(TempColor)
UWORD TempColor;
{
    NewColor = 0xf00 & TempColor;  /*mask off blue & green */
    if(NewColor != 0xf00)
	NewColor += 0x100;
    NewColor = (TempColor & 0x0ff) | NewColor;
    return(NewColor);
}

/*----------------------------------------------------------------------------*/

Palette_IncGreen(TempColor)
UWORD TempColor;
{
    NewColor = 0x0f0 & TempColor;  /*mask off blue & red */
    if(NewColor != 0xf0)
	NewColor += 0x10;
    NewColor = (TempColor & 0xf0f) | NewColor;
    return(NewColor);
}

/*----------------------------------------------------------------------------*/

Palette_IncBlue(TempColor)
UWORD TempColor;
{
    NewColor = 0x00f & TempColor;  /*mask off red & green */
    if(NewColor != 0xf)
    NewColor++;
    NewColor = (TempColor & 0xff0) | NewColor;
    return(NewColor);
}

/*----------------------------------------------------------------------------*/

Palette_DecRed(TempColor)
UWORD TempColor;
{
    NewColor = 0xf00 & TempColor;  /*mask off blue & green */
    if(NewColor)
	NewColor -= 0x100;
    NewColor = (TempColor & 0x0ff) | NewColor;
    return(NewColor);
}

/*----------------------------------------------------------------------------*/

Palette_DecGreen(TempColor)
UWORD TempColor;
{
    NewColor = 0x0f0 & TempColor;  /*mask off blue & red */
    if(NewColor)
	NewColor -= 0x10;
    NewColor = (TempColor & 0xf0f) | NewColor;
    return(NewColor);
}

/*----------------------------------------------------------------------------*/

Palette_DecBlue(TempColor)
UWORD TempColor;
{
    NewColor = 0x00f & TempColor;  /*mask off red & green */
    if(NewColor)
	NewColor--;
    NewColor = (TempColor & 0xff0) | NewColor;
    return(NewColor);
}

/*============================================================================*/

Palette_SetRed(TempColor,TempVal)
UWORD TempColor,TempVal;
{
    TempVal &= 0xf;
    return((TempColor & 0x0ff) | (TempVal << 8));
}

/*----------------------------------------------------------------------------*/

Palette_SetGreen(TempColor,TempVal)
UWORD TempColor,TempVal;
{
    TempVal &= 0xf;
    return((TempColor & 0xf0f) | (TempVal << 4));
}

/*----------------------------------------------------------------------------*/

Palette_SetBlue(TempColor,TempVal)
UWORD TempColor,TempVal;
{
    TempVal &= 0xf;
    return((TempColor & 0xff0) | TempVal);
}


/*============================================================================*/

UpdatePropGadgets()
{
    if(PaletteWindow)
     {
	ModifyProp(FindGadget(PaletteWindow->FirstGadget,(USHORT)PALETTE_GADG_PROP_RED),
		   PaletteWindow,(long)NULL,(long)AUTOKNOB|FREEVERT,
		   (long)-1,
		   (long)ConvertToPot16((ColorPTR[ForeColor] & 0xf00) >> 8),
		   (long)-1,(long)BODYVALUE);

	ModifyProp(FindGadget(PaletteWindow->FirstGadget,(USHORT)PALETTE_GADG_PROP_GREEN),
		   PaletteWindow,(long)NULL,(long)AUTOKNOB|FREEVERT,
		   (long)-1,
		   (long)ConvertToPot16((ColorPTR[ForeColor] & 0xf0) >> 4),
		   (long)-1,(long)BODYVALUE);

	ModifyProp(FindGadget(PaletteWindow->FirstGadget,(USHORT)PALETTE_GADG_PROP_BLUE),
		   PaletteWindow,(long)NULL,(long)AUTOKNOB|FREEVERT,
		   (long)-1,
		   (long)ConvertToPot16((ColorPTR[ForeColor] & 0xf)),
		   (long)-1,(long)BODYVALUE);
     }
}

/*============================================================================*/

SetForeColorNoPropUpdate(color)
long color;
{
    ForeColor = color;
    SetAPen(VRastPort,(long)ForeColor);
    if(ToolWindow)
     {
	SetAPen(ToolWindow->RPort,(long)ForeColor);
	RectFill(ToolWindow->RPort,10L,(long)TOOL_COLOR_HEIGHT,40L,(long)TOOL_COLOR_HEIGHT+7);
     }
    if(PaletteWindow)
     {
	SetAPen(PaletteWindow->RPort,(long)ForeColor);
	RectFill(PaletteWindow->RPort,10L,60L,40L,67L);
     }
}

/*----------------------------------------------------------------------------*/

SetForeColor(color)
long color;
{
    SetForeColorNoPropUpdate(color);
    UpdatePropGadgets();
}

/*============================================================================*/

SetBackColor(color)
long color;
{
    BackColor = color;
    SetBPen(VRastPort,(long)BackColor);
    if(ToolWindow)
     {
	SetAPen(ToolWindow->RPort,(long)BackColor);
	RectFill(ToolWindow->RPort,50L,(long)TOOL_COLOR_HEIGHT,80L,(long)TOOL_COLOR_HEIGHT+7);
     }
}

/*============================================================================*/

UpdateColor()
{
    switch(CurrGadg)
     {
	case PALETTE_GADG_PROP_RED:
	    ColorPTR[ForeColor] = Palette_SetRed(ColorPTR[ForeColor],PotConvert16(TempProp->VertPot));
	    break;
	case PALETTE_GADG_PROP_GREEN:
	    ColorPTR[ForeColor] = Palette_SetGreen(ColorPTR[ForeColor],PotConvert16(TempProp->VertPot));
	    break;
	case PALETTE_GADG_PROP_BLUE:
	    ColorPTR[ForeColor] = Palette_SetBlue(ColorPTR[ForeColor],PotConvert16(TempProp->VertPot));
	    break;
     }
    LoadRGB4(&MPaintScreen->ViewPort,ColorPTR,MaxColor);
}

/*============================================================================*/

