// This file is distributed under a BSD license. See LICENSE.txt for details.

#ifndef __GENBITMAP__
#define __GENBITMAP__

#include "_types.hpp"
#include "kdoc.hpp"

/****************************************************************************/
/****************************************************************************/

void Fade64(sU64 &r,sU64 &c0,sU64 &c1,sInt fade);

struct BilinearContext
{
  sU64 *Src;                      // image data
  sInt XShift;                    // xsize = 1 << XShift
  sInt XSize1,YSize1;             // xsize-1,ysize-1
  sU32 XAm,YAm;                   // x-andmask, y-andmask
  sInt XMax1,YMax1;
};

void BilinearSetup(BilinearContext *ctx,sU64 *src,sInt w,sInt h,sInt b);
void BilinearFilter(BilinearContext *ctx,sU64 *r,sInt u,sInt v);
//void BilinearFilter(sU64 *r,sU64 *src,sInt w,sInt h,sInt u,sInt v,sInt b);
sU64 GetColor64(sU32 c);

/****************************************************************************/

class GenBitmap : public KObject
{
public:
  GenBitmap();
  ~GenBitmap();
  void Copy(KObject *);
  KObject *Copy();

  void Init(sInt x,sInt y);
  void MakeTexture(sInt format=1);

  sBool Strip();
  sBool IsStripped();

  sU64 *Data;                     // the bitmap itself
  sInt XSize;                     // xsize
  sInt YSize;                     // ysize
  sInt Size;                      // xsize*ysize, saves some bytes of code for common loops
  sInt Format;                    // format to use when creating texture
  sInt Texture;                   // also available as texture (tm)
  sInt TexMipCount;
  sInt TexMipTresh;
  sBool Stripped;
};

/****************************************************************************/
/****************************************************************************/

GenBitmap * __stdcall Bitmap_Flat(sInt xs,sInt ys,sU32 color);
GenBitmap * __stdcall Bitmap_Format(GenBitmap *bm,sInt format,sInt count,sInt tresh);

#if sLINK_ENGINE
GenBitmap * __stdcall Bitmap_RenderTarget(sInt xs,sInt ys,sU32 format);
#endif

GenBitmap * __stdcall Bitmap_Merge(sInt mode,sInt count,GenBitmap *b0,...);
GenBitmap * __stdcall Bitmap_Color(GenBitmap *bm,sInt mode,sU32 color);
GenBitmap * __stdcall Bitmap_Range(GenBitmap *bm,sInt mode,sU32 color0,sU32 color1);
GenBitmap * __stdcall Bitmap_GlowRect(GenBitmap *bm,sF32 cx,sF32 cy,sF32 rx,sF32 ry,sF32 sx,sF32 sy,sU32 color,sF32 alpha,sF32 power,sU32 wrap,sU32 bugfix);
GenBitmap * __stdcall Bitmap_Dots(GenBitmap *bm,sU32 color0,sU32 color1,sInt count,sInt seed);
GenBitmap * __stdcall Bitmap_Blur(GenBitmap *bm,sInt order,sF32 sx,sF32 sy,sF32 amp);
GenBitmap * __stdcall Bitmap_Mask(GenBitmap *bm,GenBitmap *bb,GenBitmap *bc,sInt mask);
GenBitmap * __stdcall Bitmap_HSCB(GenBitmap *bm,sF32 h,sF32 s,sF32 c,sF32 b);
GenBitmap * __stdcall Bitmap_Rotate(GenBitmap *bm,sF32 angle,sF32 sx,sF32 sy,sF32 tx,sF32 ty,sInt border,sInt newWidth,sInt newHeight);
GenBitmap * __stdcall Bitmap_RotateMul(GenBitmap *bm,sF32 angle,sF32 sx,sF32 sy,sF32 tx,sF32 ty,sInt border,sU32 color,sInt mode,sInt count,sU32 fade);
GenBitmap * __stdcall Bitmap_Distort(GenBitmap *bm,GenBitmap *bb,sF32 dist,sInt border);
GenBitmap * __stdcall Bitmap_Normals(GenBitmap *bm,sF32 dist,sInt mode);
GenBitmap * __stdcall Bitmap_Light(GenBitmap *bm,sInt subcode,sF32 px,sF32 py,sF32 pz,sF32 da,sF32 db,
                                   sU32 diff,sU32 ambi,sF32 outer,sF32 falloff,sF32 amp);
GenBitmap * __stdcall Bitmap_Bump(GenBitmap *bm,GenBitmap *bb,sInt subcode,sF32 px,sF32 py,sF32 pz,sF32 da,sF32 db,
                                  sU32 diff,sU32 ambi,sF32 outer,sF32 falloff,sF32 amp,
                                  sU32 spec,sF32 spow,sF32 samp);
GenBitmap * __stdcall Bitmap_Text(KOp *,KEnvironment *,GenBitmap *bm,sF32 x,sF32 y,sF32 width,sF32 height,sU32 col,sU32 flags,sInt extspace,sF32 intspace,sF32 lineskip,sChar *text,sChar *font);
GenBitmap * __stdcall Bitmap_Perlin(sInt xs,sInt ys,sInt freq,sInt oct,sF32 fadeoff,sInt seed,sInt mode,sF32 amp,sF32 gamma,sU32 col0,sU32 col1);
GenBitmap * __stdcall Bitmap_Cell(sInt xs,sInt ys,sU32 col0,sU32 col1,sU32 col2,sInt count,sInt seed,sF32 amp,sF32 gamma,sInt mode,sF32 mindist,sInt percent,sF32 aspect);
GenBitmap * __stdcall Bitmap_Wavelet(GenBitmap *bm,sInt mode,sInt count);
GenBitmap * __stdcall Bitmap_Gradient(sInt xs,sInt ys,sU32 col0,sU32 col1,sF32 pos,sF32 angle,sF32 length,sInt mode);
GenBitmap * __stdcall Bitmap_Twirl(GenBitmap *bm,sF32 strength,sF32 gamma,sF32 rx,sF32 ry,sF32 cx,sF32 cy,sInt border);
GenBitmap * __stdcall Bitmap_Sharpen(GenBitmap *bm,sInt order,sF32 sx,sF32 sy,sF32 amp);

GenBitmap * __stdcall Bitmap_Import(KOp *op,sChar *filename);
GenBitmap * __stdcall Bitmap_Import2(KOp *op,sInt quality,sChar *filename);

GenBitmap * __stdcall Bitmap_ColorBalance(GenBitmap *bm,sF323 shadows,sF323 midtones,sF323 highlights);
GenBitmap * __stdcall Bitmap_Unwrap(GenBitmap *bm,sInt mode);
GenBitmap * __stdcall Bitmap_Bricks(sInt bmxs,sInt bmys,sInt color0,sInt color1,sInt colorf,sF32 fugex,sF32 fugey,sInt tx,sInt ty,sInt seed,sInt heads,sInt flags,sF32 side,sF32 colorbalance);
GenBitmap * __stdcall Bitmap_Bulge(GenBitmap *bm,sF32 warp);

#if sLINK_ENGINE
GenBitmap * __stdcall Bitmap_Render(KOp *op,class GenIPP *ipp,sInt xs,sInt ys);
GenBitmap * __stdcall Bitmap_RenderAuto(KOp *op,class GenMinMesh *mesh,sInt xs,sInt ys,sInt flags);
void _stdcall Exec_Bitmap_Render(sInt xs,sInt ys);
void _stdcall Exec_Bitmap_RenderAuto(sInt xs,sInt ys,sInt flags);
#endif

GenBitmap * __stdcall Bitmap_Export(GenBitmap *bm,sChar *filename,sInt flags);
GenBitmap * __stdcall Bitmap_Paste(GenBitmap *bm,GenBitmap *bs,sF322 pre,sF322 pos,sF322 size,sF32 angle,sInt mode);

extern sInt GenBitmapTextureSizeOffset;         // 0 = normal, -1 = smaller, 1 = large
extern sInt GenBitmapDefaultFormat;

/****************************************************************************/
/****************************************************************************/

#endif
