/*

  Heffer - Lewpen's 2D graphics lib

  Heffer.H

  Deep Red/Lewpen

*/

#include <windows.h>

#ifndef __HEFFER_H
#define __HEFFER_H



//---- ERROR CONSTANTS -------------------------------------------------------//

#define HEFFER_STARTUP                0x00010000
#define HEFFER_SHUTDOWN               0x00020000
#define HEFFER_LOADBITMAPRESOURCE     0x00130000
#define HEFFER_LOADTARGARESOURCE      0x00140000
#define HEFFER_CREATEIMAGE            0x00150000
#define HEFFER_REGIONFROMIMAGE        0x00510000

#define HEFFER_FILTER_BLUR            0x00610000

#define HEFFER_CREATEIMAGE_ALPHAMASK  0x00710000
#define HEFFER_CREATEIMAGE_OUTERGLOW  0x00720000

#define HEFFER_LOADFONTRESOURCE       0x00910000

#define HEFFER_ERROR_LOADRESOURCE     0x00000001
#define HEFFER_ERROR_LOCKRESOURCE     0x00000002
#define HEFFER_ERROR_MAGIC            0x00000003
#define HEFFER_ERROR_NULLPTR          0x00000004
#define HEFFER_ERROR_FORMAT           0x00000005
#define HEFFER_ERROR_MALLOC           0x00000006



//---- COLOUR CONSTANTS ------------------------------------------------------//

#define HEFFER_WHITE   0x00FFFFFF
#define HEFFER_RED     0x00FF0000
#define HEFFER_GREEN   0x0000FF00
#define HEFFER_BLUE    0x000000FF

#define HEFFER_BGR(b, g, r)       (((b)<<16)|((g)<<8)|(r))
#define HEFFER_ABGR(a, b, g, r)   (((a)<<24)|((b)<<16)|((g)<<8)|(r))



//---- PUBLIC TYPES ----------------------------------------------------------//



//---- HEFFER_IMAGEFILE

#define HEFFER_IMAGEFILE_MAGIC (('H'<<24)|('i'<<16)|('f'<<8)|('1'))

typedef struct _HEFFER_IMAGEFILE {

  DWORD magic;
  WORD w, y;

} HEFFER_IMAGEFILE;



//---- HEFFER_IMAGE

typedef struct HEFFER_TAG_IMAGE {

  int w, h, bufw;
  int ox, oy;

  char format, bpp;
  int size;

  unsigned char *buf;

  int x1, y1, x2, y2;  //  Clipping region
  
  char dirty_size;
  char *dirty;

} HEFFER_IMAGE;



#define HEFFER_FORMAT_BGR24  0
#define HEFFER_FORMAT_ABGR32 2

#define HEFFER_BLIT_FULLSIZE 0x0000001



//---- HEFFER_FONT

typedef struct HEFFER_TAG_FONT {
  int magic;
  int flags;
  int x[256], w[256], bufw, h;
  unsigned char buf[1];
} HEFFER_FONT;



#define HEFFER_FONT_MAGIC (('k'<<24)+('t'<<16)+('2'<<8)+('y'))

#define HEFFER_ALIGN_LEFT    0x00000001
#define HEFFER_ALIGN_HCENTER 0x00000002
#define HEFFER_ALIGN_RIGHT   0x00000004
#define HEFFER_ALIGN_TOP     0x00000008
#define HEFFER_ALIGN_VCENTER 0x00000010
#define HEFFER_ALIGN_BOTTOM  0x00000020

#define HEFFER_UNICODE       0x80000000



//---- HEFFER_TRIANGLE

//  X,Y,Z,  Red,Green,Blue,Alpha,  Texture U,Texture V,  Diffuse,Specular;

typedef struct _HEFFER_TRIANGLE {
  float x1, y1, z1, r1, g1, b1, a1, u1, v1, d1, s1;
  float x2, y2, z2, r2, g2, b2, a2, u2, v2, d2, s2;
  float x3, y3, z3, r3, g3, b3, a3, u3, v3, d3, s3;
}



//---- PUBLIC MACROS ---------------------------------------------------------//

#define Heffer_BlitImage(imdest, imsrc, x, y) Heffer_Blit(imdest, x, y, -1, -1, imsrc, 0, 0, HEFFER_BLIT_FULLSIZE)



//---- PUBLIC FUNCTION PROTOS ------------------------------------------------//

BOOL Heffer_Startup();
BOOL Heffer_Shutdown();
HEFFER_IMAGE *Heffer_LoadBitmapResource(HINSTANCE hInst, char *name);
HEFFER_IMAGE *Heffer_LoadTargaResource(HINSTANCE hInst, char *name);
HEFFER_IMAGE *Heffer_CreateImage(int w, int h, char format);
HEFFER_IMAGE *Heffer_DuplicateImage(HEFFER_IMAGE *imsrc);
BOOL Heffer_DeleteImage(HEFFER_IMAGE *im);

void Heffer_Clip_Set(HEFFER_IMAGE *im, int x1, int y1, int x2, int y2, BOOL combine);
void Heffer_Clip_None(HEFFER_IMAGE *im);
void Heffer_Clip_Get(HEFFER_IMAGE *im, int *x1, int *y1, int *x2, int *y2);

void Heffer_Image_Display(HDC dc, HEFFER_IMAGE *im, int x, int y, BOOL d);
void Heffer_Image_DisplayRect(HDC dc, int dx, int dy, int w, int h, HEFFER_IMAGE *im, int sx, int sy);
BOOL Heffer_GetImage(HEFFER_IMAGE *imdest, int dx, int dy, int w, int h, HDC dc, int sx, int sy, int flags);
void Heffer_Blit(HEFFER_IMAGE *imsrc, int dx, int dy, int w, int h, HEFFER_IMAGE *imdest, int sx, int sy, int flags);
void Heffer_AlphaBlit(HEFFER_IMAGE *imsrc, int dx, int dy, int w, int h, HEFFER_IMAGE *imdest, int sx, int sy, unsigned char alpha, int flags);
void Heffer_SoftLightBlit(HEFFER_IMAGE *imdest, int dx, int dy, int w, int h, HEFFER_IMAGE *imsrc, int sx, int sy, unsigned char alpha, int flags);

void Heffer_FillImage(HEFFER_IMAGE *im, int col);

void Heffer_AlphaRect(HEFFER_IMAGE *imdest, int dx, int dy, int w, int h, int col);
void Heffer_FillRect(HEFFER_IMAGE *im, int x, int y, int w, int h, int col);

void Heffer_DarkenRect(HEFFER_IMAGE *im, int x, int y, int w, int h);
void Heffer_BlurRect(HEFFER_IMAGE *im, int x, int y, int w, int h);

void Heffer_DrawDot(HEFFER_IMAGE *im, int x, int y, int col);
void Heffer_PutPixel(HEFFER_IMAGE *im, int x, int y, int col);
int Heffer_GetPixel(HEFFER_IMAGE *im, int x, int y);
void Heffer_DrawLine(HEFFER_IMAGE *im, int x1, int y1, int x2, int y2, int col);
void Heffer_DrawRing(HEFFER_IMAGE *im, float x1, float y1, float x2, float y2, int col);
void Heffer_Tri(HEFFER_IMAGE *im, double x1, double y1, double x2, double y2, double x3, double y3, int col);
void Heffer_AATri(HEFFER_IMAGE *im, double x1, double y1, double x2, double y2, double x3, double y3, int col);

HRGN Heffer_RegionFromImage(HEFFER_IMAGE *im, int col);

BOOL Heffer_Filter_Blur(HEFFER_IMAGE *im, int r, int ox, int oy);

HEFFER_IMAGE *Heffer_CreateImage_AlphaMask(HEFFER_IMAGE *imsrc, int col);
HEFFER_IMAGE *Heffer_CreateImage_DropShadow(HEFFER_IMAGE *imsrc, int col, int x, int y, int blur);
HEFFER_IMAGE *Heffer_CreateImage_OuterGlow(HEFFER_IMAGE *imsrc, int col, int blur, unsigned char intens);

HEFFER_FONT *Heffer_LoadFontResource(HINSTANCE hInst, char *name);

void Heffer_GetTextSize(HEFFER_FONT *font, char *t, int *wp, int *hp);
void Heffer_TextOut(HEFFER_IMAGE *im, int x, int y, HEFFER_FONT *font, char *text, int col, int flags);
void Heffer_TextOutBorder(HEFFER_IMAGE *im, int x, int y, HEFFER_FONT *font, char *t, int col, int bcol, int flags);
void Heffer_DrawText(HEFFER_IMAGE *im, int x1, int y1, int x2, int y2, HEFFER_FONT *font, char *t, int col, int flags);

void Heffer_AlphaMerge(HEFFER_IMAGE *imdest, HEFFER_IMAGE *imsrc1, HEFFER_IMAGE *imsrc2, int alpha);
void Heffer_DistortNAll(HEFFER_IMAGE *imdest, HEFFER_IMAGE *imsrc1, HEFFER_IMAGE *imsrc2, unsigned char *distortx, unsigned char *distorty, int alpha);



//---- END OF FILE -----------------------------------------------------------//

#endif


