/////////////////////////////////////////////////////////////
// CINEMA 4D SDK                                           //
/////////////////////////////////////////////////////////////
// (c) MAXON Computer GmbH, all rights reserved            //
/////////////////////////////////////////////////////////////

#ifndef	__X4D_EFFECT_MATRIX_UTILS__
#define	__X4D_EFFECT_MATRIX_UTILS__

#include "x4d_filter.h"

struct WEIGHT_FMATRIX
{
	Int32		no_matrix_columns;
	Int32		no_matrix_rows;
	Int32		x_origin;
	Int32		y_origin;
	Float32	matrix_values[VARIABLE_ARRAY_SIZE];
};

#define	MAXTRIX_MAX_COLUMNS	15	// maximum number of maxtrix columns
#define	MAXTRIX_MAX_ROWS		15	// maximum number of maxtrix rows

struct WEIGHT_FMATRIX_3x3
{
	Int32		no_matrix_columns;
	Int32		no_matrix_rows;
	Int32		x_origin;
	Int32		y_origin;
	Float32	matrix_values[3][3];
};

struct WEIGHT_FMATRIX_5x5
{
	Int32		no_matrix_columns;
	Int32		no_matrix_rows;
	Int32		x_origin;
	Int32		y_origin;
	Float32	matrix_values[5][5];
};

struct WEIGHT_FMATRIX_7x7
{
	Int32		no_matrix_columns;
	Int32		no_matrix_rows;
	Int32		x_origin;
	Int32		y_origin;
	Float32	matrix_values[7][7];
};

struct WEIGHT_FMATRIX_MAX
{
	Int32		no_matrix_columns;
	Int32		no_matrix_rows;
	Int32		x_origin;
	Int32		y_origin;
	Float32	matrix_values[MAXTRIX_MAX_COLUMNS * MAXTRIX_MAX_ROWS];
};

typedef void* MATRIX_REF;

extern MATRIX_REF new_effect_matrix(const WEIGHT_FMATRIX* input_matrix, Int32 color_space, UInt32 px_format, Float32 opacity, Bool scale_matrix, Float64 angle);
extern Int32 delete_effect_matrix(MATRIX_REF emr);
extern void update_effect_matrix(MATRIX_REF emr, Int32 color_space, UInt32 px_format);
extern Int32 apply_matrix_effect(MATRIX_REF emr, void** src_rows, void* dst, Int32 width);
extern Int32 get_effect_matrix_info(MATRIX_REF _emr, Int32* no_columns, Int32* no_rows, Int32* x_origin, Int32* y_origin);

#endif
