#ifndef TOONZ_HOSTIF_H__
#define TOONZ_HOSTIF_H__
#include <stdint.h>
#include <stddef.h>
#include "toonz_plugin.h"
#include "toonz_params.h"
#define TOONZ_PLUGIN_CLASS_MODIFIER_MASK (0xffUL << (32 - 8))
#define TOONZ_PLUGIN_CLASS_MODIFIER_GEOMETRIC (1UL << (32 - 1))
#define TOONZ_PLUGIN_CLASS_POSTPROCESS_ (0x10UL)
#define TOONZ_PLUGIN_CLASS_POSTPROCESS_SLAB (TOONZ_PLUGIN_CLASS_POSTPROCESS_ | 0UL)
#define TOONZ_PORT_TYPE_RASTER (0)
#if defined(_MSC_VER)
#pragma pack(push, 1)
#endif
static const toonz_UUID toonz_uuid_node__ = {0xCC14EA21, 0x13D8, 0x4A3B, 0x9375, 0xAA4F68C9DDDD};
static const toonz_UUID toonz_uuid_port__ = {0x2F89A423, 0x1D2D, 0x433F, 0xB93E, 0xCFFD83745F6F};
static const toonz_UUID toonz_uuid_tile__ = {0x882BD525, 0x937E, 0x427C, 0x9D68, 0x4ECA651F6562};
static const toonz_UUID toonz_uuid_fx_node__ = {0x26F9FC53, 0x632B, 0x422F, 0x87A0, 0x8A4547F55474};
static const toonz_UUID toonz_uuid_param__ = {0x2E3E4A55, 0x8539, 0x4520, 0xA266, 0x15D32189EC4D};
static const toonz_UUID toonz_uuid_setup__ = {0xcfde9107, 0xc59d, 0x414c, 0xae4a, 0x3d115ba97933};
#define TOONZ_UUID_NODE (&toonz_uuid_node__)
#define TOONZ_UUID_PORT (&toonz_uuid_port__)
#define TOONZ_UUID_TILE (&toonz_uuid_tile__)
#define TOONZ_UUID_FXNODE (&toonz_uuid_fx_node__)
#define TOONZ_UUID_PARAM (&toonz_uuid_param__)
#define TOONZ_UUID_SETUP (&toonz_uuid_setup__)
/* Host Interface */
struct toonz_host_interface_t_ {
toonz_if_version_t ver;
int (*query_interface)(const toonz_UUID *, void **);
void (*release_interface)(void *);
} TOONZ_PACK;
typedef toonz_host_interface_t_ toonz_host_interface_t;
struct toonz_rect_t_ {
double x0;
double y0;
double x1;
double y1;
} TOONZ_PACK;
typedef struct toonz_rect_t_ toonz_rect_t;
typedef void *toonz_param_handle_t;
struct toonz_param_interface_t_ {
toonz_if_version_t ver;
int (*get_type)(toonz_param_handle_t param, double frame, int *type, int *counts);
int (*get_value)(toonz_param_handle_t param, double frame, int *pcounts, void *pvalue);
int (*set_value)(toonz_param_handle_t param, double frame, int counts, const void *pvalue);
int (*get_string_value)(toonz_param_handle_t param, int *wholesize, int rcvbufsize, char *pvalue);
int (*get_spectrum_value)(toonz_param_handle_t param, double frame, double x, toonz_param_spectrum_t *pvalue);
} TOONZ_PACK;
typedef toonz_param_interface_t_ toonz_param_interface_t;
typedef void *toonz_fxnode_handle_t;
typedef void *toonz_port_handle_t;
struct toonz_port_interface_t_ {
toonz_if_version_t ver;
int (*is_connected)(toonz_port_handle_t port, int *is_connected);
int (*get_fx)(toonz_port_handle_t port, toonz_fxnode_handle_t *fxnode);
} TOONZ_PACK;
typedef toonz_port_interface_t_ toonz_port_interface_t;
typedef void *toonz_tile_handle_t;
struct toonz_tile_interface_t_ {
toonz_if_version_t ver;
int (*get_raw_address_unsafe)(toonz_tile_handle_t handle, void **);
int (*get_raw_stride)(toonz_tile_handle_t handle, int *stride);
int (*get_element_type)(toonz_tile_handle_t handle, int *element);
int (*copy_rect)(toonz_tile_handle_t handle, int left, int top, int width, int height, void *dst, int dststride);
int (*create_from)(toonz_tile_handle_t handle, toonz_tile_handle_t *newhandle);
int (*create)(toonz_tile_handle_t *newhandle);
int (*destroy)(toonz_tile_handle_t handle);
int (*get_rectangle)(toonz_tile_handle_t handle, toonz_rect_t *rect);
int (*safen)(toonz_tile_handle_t handle);
} TOONZ_PACK;
/* Pixel types of tile
Correspond to TRaster32P/64P/GR8P/GR16P/GRDP/YUV422P
*/
enum {
TOONZ_TILE_TYPE_NONE,
TOONZ_TILE_TYPE_32P,
TOONZ_TILE_TYPE_64P,
TOONZ_TILE_TYPE_GR8P,
TOONZ_TILE_TYPE_GR16P,
TOONZ_TILE_TYPE_GRDP,
TOONZ_TILE_TYPE_YUV422P,
};
typedef void *toonz_node_handle_t;
struct toonz_node_interface_t_ {
toonz_if_version_t ver;
int (*get_input_port)(toonz_node_handle_t node, const char *name, toonz_port_handle_t *port);
int (*get_rect)(toonz_rect_t *rect, double *x0, double *y0, double *x1, double *y1);
int (*set_rect)(toonz_rect_t *rect, double x0, double y0, double x1, double y1);
int (*get_param)(toonz_node_handle_t node, const char *name, toonz_param_handle_t *param);
int (*set_user_data)(toonz_node_handle_t node, void *user_data);
int (*get_user_data)(toonz_node_handle_t node, void **user_data);
} TOONZ_PACK;
typedef toonz_node_interface_t_ toonz_node_interface_t;
typedef void *toonz_handle_t;
typedef toonz_tile_interface_t_ toonz_tile_interface_t;
struct toonz_affine_t_ {
double a11;
double a12;
double a13;
double a21;
double a22;
double a23;
} TOONZ_PACK;
typedef toonz_affine_t_ toonz_affine_t;
typedef void *toonz_node_handle_t;
struct toonz_rendering_setting_t_ {
toonz_if_version_t ver;
/** コピー元の TRenderSettings のスタック上アドレス */
const void *context;
/** エフェクトが描画された後に適用されるアフィン変換 */
toonz_affine_t affine;
/** 出力フレームのためのガンマ修飾子 */
double gamma;
/** 入力の fps を変動させる変数 */
double time_stretch_from;
/** 出力の fps を変動させる変数 */
double time_stretch_to;
/** stereoscpy(ステレオ投影?)のためのカメラのx軸方向のシフト量 (単位は inch) */
double stereo_scopic_shift;
/**
出力フレームで要求される bits per pixel の値。
この値は適切なタイプのタイルと共に付随しなければならない。
*/
int bpp;
/**
描画プロセスの間のタイルのキャッシュされる最大サイズ(MegaByte単位)。
タイルのFxの計算の再分割のために予測キャッシュマネージャに用いられる(?)
*/
int max_tile_size;
/** アフィン変換におけるフィルタの品質 */
int quality;
/** ??? */
int field_prevalence;
/** ステレオ投影(3D効果)が用いられているかどうか */
int stereoscopic;
/** 描画インスタンスが swatch viewer から発生したものかどうか */
int is_swatch;
/** 描画リクエストの際にユーザーが手動でキャッシュするかどうか */
int user_cachable;
/** 縮小を必ず考慮しなければならないかどうか */
int apply_shrink_to_viewer;
/** カメラサイズ */
toonz_rect_t camera_box;
/** 途中で Preview の計算がキャンセルされた時のフラグ */
volatile int *is_canceled;
} TOONZ_PACK;
typedef toonz_rendering_setting_t_ toonz_rendering_setting_t;
struct toonz_nodal_rasterfx_handler_t_ {
toonz_if_version_t ver;
void (*do_compute)(toonz_node_handle_t node, const toonz_rendering_setting_t *, double frame, toonz_tile_handle_t tile);
int (*do_get_bbox)(toonz_node_handle_t node, const toonz_rendering_setting_t *, double frame, toonz_rect_t *rect);
int (*can_handle)(toonz_node_handle_t node, const toonz_rendering_setting_t *, double frame);
size_t (*get_memory_requirement)(toonz_node_handle_t node, const toonz_rendering_setting_t *, double frame, const toonz_rect_t *rect);
void (*on_new_frame)(toonz_node_handle_t node, const toonz_rendering_setting_t *, double frame);
void (*on_end_frame)(toonz_node_handle_t node, const toonz_rendering_setting_t *, double frame);
int (*create)(toonz_node_handle_t node);
int (*destroy)(toonz_node_handle_t node);
int (*setup)(toonz_node_handle_t node);
int (*start_render)(toonz_node_handle_t node);
int (*end_render)(toonz_node_handle_t node);
void *reserved_ptr_[5];
} TOONZ_PACK;
typedef toonz_nodal_rasterfx_handler_t_ toonz_nodal_rasterfx_handler_t;
struct toonz_fxnode_interface_t_ {
toonz_if_version_t ver;
/* TRasterFx の振る舞い */
int (*get_bbox)(toonz_fxnode_handle_t fxnode, const toonz_rendering_setting_t *, double frame, toonz_rect_t *rect, int *get_bbox);
int (*can_handle)(toonz_fxnode_handle_t fxnode, const toonz_rendering_setting_t *, double frame, int *can_handle);
/* TFx の振る舞い */
int (*get_input_port_count)(toonz_fxnode_handle_t fxnode, int *count);
int (*get_input_port)(toonz_fxnode_handle_t fxnode, int index, toonz_port_handle_t *port);
int (*compute_to_tile)(toonz_fxnode_handle_t fxnode, const toonz_rendering_setting_t *, double frame, const toonz_rect_t *rect, toonz_tile_handle_t intile, toonz_tile_handle_t outtile);
} TOONZ_PACK;
typedef struct toonz_fxnode_interface_t_ toonz_fxnode_interface_t;
struct toonz_setup_interface_t_ {
toonz_if_version_t ver;
int (*set_parameter_pages)(toonz_node_handle_t node, int num, toonz_param_page_t *pages);
int (*set_parameter_pages_with_error)(toonz_node_handle_t node, int num, toonz_param_page_t *pages, int *reason, void **position);
int (*add_input_port)(toonz_node_handle_t node, const char *name, int type);
} TOONZ_PACK;
typedef struct toonz_setup_interface_t_ toonz_setup_interface_t;
#if defined(_MSC_VER)
#pragma pack(pop)
#endif
#if defined(__cplusplus)
namespace toonz
{
typedef toonz_rendering_setting_t rendering_setting_t;
typedef toonz_affine_t affine_t;
typedef toonz_rect_t rect_t;
typedef toonz_param_handle_t param_handle_t;
typedef toonz_node_handle_t node_handle_t;
typedef toonz_port_handle_t port_handle_t;
typedef toonz_tile_handle_t tile_handle_t;
typedef toonz_rendering_setting_t rendering_setting_t;
typedef toonz_fxnode_handle_t fxnode_handle_t;
typedef toonz_param_interface_t param_interface_t;
typedef toonz_node_interface_t node_interface_t;
typedef toonz_host_interface_t host_interface_t;
typedef toonz_tile_interface_t tile_interface_t;
typedef toonz_port_interface_t port_interface_t;
typedef toonz_nodal_rasterfx_handler_t nodal_rasterfx_handler_t;
typedef toonz_fxnode_interface_t fxnode_interface_t;
typedef toonz_setup_interface_t setup_interface_t;
}
#endif
#endif