#ifndef CLIB_AEPLUGIN_PROTOS_H
#define CLIB_AEPLUGIN_PROTOS_H

/*
**    $VER: ae_plugin_protos.h 1.0 (18.12.96)
**    Include Release 1.0
**
**    (C) Copyright 1992-1996 A. Pratsch
**        All Rights Reserved
**
**    This library does all necessary things to automatically create
**    plugins with simple GUIs for arteffect. It covers all the
**    message communication necessary.
*/

#ifndef  LIBRARIES_AEPLUGIN_H
#include <libraries/ae_plugin.h>
#endif

#ifndef GRAPHICS_GFX_H
#include <graphics/gfx.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

/*** plugin initialization & cleanup ***/
long AE_CheckCaller(long argc, char **argv);
AE_AppObjPtr AE_SetupPlugInTagList(long argc, char **argv, long type, struct TagItem *taglist);
AE_AppObjPtr AE_SetupPlugInTags(long argc, char **argv, long type,...);
void AE_ExitPlugIn(AE_AppObjPtr app);

/*** window ***/
AE_DialogPtr AE_OpenWindowTagList(AE_AppObjPtr app, struct TagItem *taglist);
AE_DialogPtr AE_OpenWindowTags(AE_AppObjPtr app,...);
void AE_CloseWindow(AE_AppObjPtr app, AE_DialogPtr dialog);
void AE_SetGadget(AE_AppObjPtr app, AE_DialogPtr dialog, ULONG id, ULONG value);
void AE_SetSlider(AE_AppObjPtr app, AE_DialogPtr dialog, ULONG id, long value, long min, long max);

/*** requester ***/
AE_DialogPtr AE_OpenRequesterTagList(AE_AppObjPtr app, struct TagItem *taglist);
AE_DialogPtr AE_OpenRequesterTags(AE_AppObjPtr app,...);
void AE_CloseRequester(AE_AppObjPtr app, AE_DialogPtr dialog);
long AE_DoRequestTagList(AE_AppObjPtr app, long type, struct TagItem *taglist);
long AE_DoRequestTags(AE_AppObjPtr app, long type,...);

/*** bitmap related ***/
void AE_SetColorMap(AE_AppObjPtr app, AE_ObjPtr obj, CLUTEntry *color, long entries);
long AE_GetColorMap(AE_AppObjPtr app, AE_ObjPtr obj, CLUTEntry *color);
void AE_SetDPI(AE_AppObjPtr app, AE_ObjPtr obj, long horiz, long vert);
long AE_GetHorizDPI(AE_AppObjPtr app, AE_ObjPtr obj);
long AE_GetVertDPI(AE_AppObjPtr app, AE_ObjPtr obj);

/*** brush related ***/
AE_ObjPtr AE_ObtainBrush(AE_AppObjPtr app);
void AE_ReleaseBrush(AE_AppObjPtr app, AE_ObjPtr obj);

AE_ObjPtr AE_AllocBitmap(AE_AppObjPtr app, long w, long h, long depth);
void AE_FreeBitmap(AE_AppObjPtr app, AE_ObjPtr obj);
void AE_SetBrush(AE_AppObjPtr app, AE_ObjPtr obj);

/*** picture related ***/
AE_ObjPtr AE_ObtainPicture(AE_AppObjPtr app);
AE_ObjPtr AE_ObtainPictureId(AE_AppObjPtr app, long id);
void AE_ReleasePicture(AE_AppObjPtr app, AE_ObjPtr obj);

/* NOTE! UpdatePicture automatically applies the stencil to the changed data, so
 * it may only be executed in the last pass of an operation (this also applies to
 * the viusal setting of the enhanced functions
 */
void AE_UpdatePicture(AE_AppObjPtr app, AE_ObjPtr obj, long x, long y, long w, long h);

AE_ObjPtr AE_AllocPicture(AE_AppObjPtr app, long w, long h, long depth);
void AE_FreePicture(AE_AppObjPtr app, AE_ObjPtr obj);
void AE_SetPicture(AE_AppObjPtr app, AE_ObjPtr obj);

/*** preview related ***/
AE_ObjPtr AE_CreatePreview(AE_AppObjPtr app);
void AE_UpdatePreview(AE_AppObjPtr app, AE_ObjPtr obj);

/*** progress related ***/
void AE_BeginOperation(AE_AppObjPtr app, AE_ObjPtr obj, char *title);
void AE_OperationProgress(AE_AppObjPtr app, AE_ObjPtr obj, long percent);
void AE_EndOperation(AE_AppObjPtr app, AE_ObjPtr obj);

/*** event related ***/
AE_EventPtr AE_GetEvent(AE_AppObjPtr app);
void AE_ReplyEvent(AE_AppObjPtr app, AE_EventPtr event);

/*** bitmap data access related ***/ 
void AE_ReadHLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_ReadVLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_ReadRHLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_ReadRVLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_WriteHLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_WriteVLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_WriteRHLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_WriteRVLine(AE_AppObjPtr app, AE_ObjPtr obj, void *buffer, long x, long y, long len, long type);
void AE_FillPixelHLine(AE_AppObjPtr app, AE_ObjPtr obj, ULONG color, long x, long y, long len);
void AE_FillPixelVLine(AE_AppObjPtr app, AE_ObjPtr obj, ULONG color, long x, long y, long len);
AE_ObjPtr AE_Duplicate(AE_AppObjPtr app, AE_ObjPtr obj, ULONG flags);

/*** enhanced functions ***/
void AE_Convolve(AE_AppObjPtr app, AE_ObjPtr obj, AE_MatrixPtr matrix, BOOL visual, long quantum);

/* if you set red_factor, green_factor and blue_factor to 0 the color values will be processed
 * directly otherwise the gray level will be converted. red_factor+green_factor+blue_factor
 * normally should be 100<<16. */
void AE_ColorProcessor(AE_AppObjPtr app, AE_ObjPtr obj, AE_ColorTable table_red, AE_ColorTable table_green,
        AE_ColorTable table_blue, long red_factor, long green_factor, long blue_factor, BOOL visual, long quantum);

void AE_ColorSpaceProcessor(AE_AppObjPtr app, AE_ObjPtr obj, AE_HueTable table_h, AE_CSpaceTable table_s,
        AE_CSpaceTable table_v, ULONG flags, BOOL visual, long quantum);

/*** special ***/
void AE_EvaluateHistogram(AE_AppObjPtr app, AE_ObjPtr obj, AE_Histogram *histo, long quantum);
ULONG AE_PolyMedian(AE_AppObjPtr app, AE_ObjPtr obj, AE_PointsPtr polygon, ULONG entries, ULONG flags);
void AE_PolyFill(AE_AppObjPtr app, AE_ObjPtr obj, AE_PointsPtr polygon, ULONG entries, ULONG color, ULONG flags);
ULONG AE_FloodMedian(AE_AppObjPtr app, AE_ObjPtr obj, void *mask, long x, long y, ULONG flags);
void AE_FloodFill(AE_AppObjPtr app, AE_ObjPtr obj, void *mask, long x, long y, long color, ULONG flags);

/*** color conversion ***/
void AE_ConvertRGBtoHSV(long r, long g, long b, long *h, long *s, long *v);
void AE_ConvertHSVtoRGB(long h, long s, long v, long *r, long *g, long *b);

/* calcHook->h_Entry: BOOL (*CalcSource)(long dx,long dy,long *sx,long *sy);
 * the hook should return TRUE if the pixel is ok, or FALSE if it is out of
 * range. You may optionally specify always TRUE when you activate the range
 * check. See libraries/aeplugin.h for further details.
 */
void AE_Distort(AE_AppObjPtr app, AE_ObjPtr source, AE_ObjPtr dest, struct Hook *calcHook, ULONG flags,
        BOOL visual, long quantum);

/*
    access cache functions, for fast cached bitmap
    access in virtual memory environments.
*/
long AE_CreateAccessCache(AE_AppObjPtr app, AE_ObjPtr obj, ULONG xStart, ULONG yStart, ULONG width,
        ULONG height, ULONG flags);

void AE_DestroyAccessCache(AE_AppObjPtr app, AE_ObjPtr obj);
long AE_GetColorChannels(AE_AppObjPtr app, AE_ObjPtr obj);
long AE_GetAlphaChannels(AE_AppObjPtr app, AE_ObjPtr obj);
UBYTE *AE_LockHLine(AE_AppObjPtr app, AE_ObjPtr obj, long line);
void AE_UnlockHLine(AE_AppObjPtr app, AE_ObjPtr obj, long line);
UBYTE *AE_LockVLine(AE_AppObjPtr app, AE_ObjPtr obj, long line);
void AE_UnlockVLine(AE_AppObjPtr app, AE_ObjPtr obj, long line);
void AE_ReadPixel(AE_AppObjPtr app, AE_ObjPtr obj, UBYTE *pixelarray, long x, long y);
void AE_WritePixel(AE_AppObjPtr app, AE_ObjPtr obj, UBYTE *pixelarray, long x, long y);

#ifdef __cplusplus
}
#endif

#endif /* CLIB_AEPLUGIN_PROTOS_H */

