/***************************************************************************************
 *
 *  WRITEPAD(r): Handwriting Recognition Engine (HWRE) and components.
 *  Copyright (c) 2001-2017 PhatWare (r) Corp. All rights reserved.
 *
 *  Licensing and other inquires: <developer@phatware.com>
 *  Developer: Stan Miasnikov, et al. (c) PhatWare Corp. <http://www.phatware.com>
 *
 *  WRITEPAD HWRE is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 *  AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 *  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 *  FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL PHATWARE CORP.
 *  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL,
 *  INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
 *  INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, SAVINGS
 *  OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR NOT PHATWARE CORP.
 *  HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 *  ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 *  POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 *  See the GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with WritePad.  If not, see <http://www.gnu.org/licenses/>.
 *
 **************************************************************************************/

#ifndef __ink_wrapper_h__
#define __ink_wrapper_h__

#include <stdio.h>
#include "RecognizerApi.h"

#define LF_FONT_BOLD		0x00000001
#define LF_FONT_ITALIC		0x00000002
#define LF_FONT_UNDERSCORE	0x00000004
#define LF_FONT_STRIKE		0x00000008

#define OBJECTFLAG_POSITIONLOCKED   0x00010000
#define OBJECTFLAG_SIZELOCKED       0x00020000
#define OBJECTFLAG_CONTENTLOCKED    0x00040000
#define OBJECTFLAG_LOCKED           0x00070000
#define OBJECTFLAG_GROUPED          0x00100000

#if defined(__cplusplus)
extern "C"
{
#endif
	
	typedef void * INK_DATA_PTR;
		
	typedef struct __ImageAttributes
	{
		CGRect		imagerect;
		int			iZOrder;
		int			nIndex;
		void *		pData;
		UInt32		nDataSize;
		void *		userData;
		UInt32		flags;
	} ImageAttributes;

	typedef struct __TextAttributes
	{
		CGRect		textrect;
		int			iZOrder;
		int			nIndex;
		LPCUSTR		pUnicodeText;
		UInt32		nTextLength;
		LPUSTR		pFontName;
		int 		fontSize;
		UInt32		fontAttributes;
		UInt32		alignment;
		COLORREF	fontColor;
		COLORREF	backColor;
		void *		userData;
        UInt32      flags;
	} TextAttributes;
    
	// Ink data API
	INK_DATA_PTR	INK_InitData(void);
	void			INK_FreeData( INK_DATA_PTR pData );
	void			INK_Erase( INK_DATA_PTR pData );
	int 			INK_StrokeCount( INK_DATA_PTR pData, BOOL selectedOnly );
	BOOL			INK_DeleteStroke( INK_DATA_PTR pData, int nStroke );
	SHAPETYPE		INK_RecognizeShape( CGStroke pStroke, int nStrokeCnt, SHAPETYPE inType );
	int 			INK_AddStroke( INK_DATA_PTR pData, CGStroke pStroke, int nStrokeCnt, float fWidth, COLORREF color );
	int				INK_GetStroke( INK_DATA_PTR pData, int nStroke, CGPoint ** ppoints, float * pfWidth, COLORREF * color );
    int             INK_GetStrokeP( INK_DATA_PTR pData, int nStroke, CGStroke * ppoints, float * pfWidth, COLORREF * pColor );
	BOOL			INK_GetStrokeRect( INK_DATA_PTR pData, int nStroke, CGRect * rect, BOOL bAddWidth );
	BOOL			INK_GetDataRect( INK_DATA_PTR pData, CGRect * rect, BOOL selectedOnly );
	int 			INK_AddEmptyStroke( INK_DATA_PTR pData, float fWidth, COLORREF color );
	int 			INK_AddPixelToStroke( INK_DATA_PTR pData, int nStroke, float x, float y, int p );
    BOOL            INK_GetStrokePointP( INK_DATA_PTR pData, int nStroke, int nPoint, float * pX, float * pY, int *pP );
    BOOL            INK_GetStrokePoint( INK_DATA_PTR pData, int nStroke, int nPoint, float * pX, float * pY );
	INK_DATA_PTR	INK_CreateCopy( INK_DATA_PTR pData );
	void			INK_SortInk( INK_DATA_PTR pData );
	void			INK_Undo( INK_DATA_PTR pData );
	void			INK_Redo( INK_DATA_PTR pData );
    void            INK_EnableUndo( INK_DATA_PTR pData, BOOL enable );
	BOOL			INK_CanRedo( INK_DATA_PTR pData );
	BOOL			INK_CanUndo( INK_DATA_PTR pData );
	BOOL			INK_SelectAllStrokes( INK_DATA_PTR pData, BOOL bSelect );
	BOOL			INK_DeleteSelectedStrokes( INK_DATA_PTR pData, BOOL bAll );
	void			INK_SetStrokesRecognizable( INK_DATA_PTR pData, BOOL bSet, BOOL bSelectedOnly );
	void			INK_SetStrokeRecognizable( INK_DATA_PTR pData, int nStroke, BOOL bSet );
	void			INK_SelectStroke( INK_DATA_PTR pData, int nStroke, BOOL bSelect );
	BOOL			INK_IsStrokeRecognizable( INK_DATA_PTR pData, int nStroke );
	BOOL			INK_IsStrokeSelected( INK_DATA_PTR pData, int nStroke );
	void			INK_SetUndoLevels( INK_DATA_PTR pData, int levels );
	int				INK_Serialize( INK_DATA_PTR pData, BOOL bWrite, FILE * pFile, void ** ppData, long * pcbSize, BOOL skipImages, BOOL savePressure );
	BOOL			INK_Paste( INK_DATA_PTR pData, const void * pRawData, long cbSize, CGPoint atPosition );
	BOOL			INK_Copy( INK_DATA_PTR pData, void ** ppRawData, long * pcbSize );
	BOOL			INK_MoveStroke( INK_DATA_PTR pData, int nStroke, float xOffset, float yOffset, CGRect * pRect, BOOL recordUndo );
	void			INK_ChangeSelZOrder( INK_DATA_PTR pData, int iDepth, BOOL bFwd );
	BOOL			INK_IsShapeRecognitionEnabled( INK_DATA_PTR pData );
	void			INK_EnableShapeRecognition( INK_DATA_PTR pData, BOOL bEnable );
	int				INK_FindStrokeByPoint( INK_DATA_PTR pData, CGPoint thePoint, float proximity );
	int				INK_SelectStrokesInRect( INK_DATA_PTR pData, CGRect selRect );
	void			INK_EmptyUndoBuffer( INK_DATA_PTR pData );
    BOOL             INK_CurveIntersectsStroke( INK_DATA_PTR pData, int nStroke, const CGStroke points, int nPointCount );
	BOOL			INK_SetStrokeWidthAndColor( INK_DATA_PTR pData, int nStroke, COLORREF color, float fWidth );
    int             INK_DeleteIntersectedStrokes( INK_DATA_PTR pData, const CGStroke points, int nPointCount );
	BOOL			INK_ResizeStroke( INK_DATA_PTR pData, int nStroke, float x0, float y0, float scalex, float scaley, BOOL bReset, CGRect * pRect, BOOL recordUndo );
    
    int             INK_GetStrokeZOrder( INK_DATA_PTR pData, int nStroke );
    BOOL            INK_SetStrokeZOrder( INK_DATA_PTR pData, int nStroke, int iZOrder );
	
	// image support
	int				INK_AddImage( INK_DATA_PTR pData, const ImageAttributes * pImage ); 
	int				INK_SetImage( INK_DATA_PTR pData, int nImageIndex, const ImageAttributes * pImage ); 
	BOOL			INK_SetImageUserData( INK_DATA_PTR pData, int nImageIndex, void * userData ); 
	BOOL			INK_DeleteImage( INK_DATA_PTR pData, int nImageIndex );
	BOOL			INK_GetImage( INK_DATA_PTR pData, int nImageIndex, ImageAttributes * pAttrib );
	int				INK_GetImageFromPoint( INK_DATA_PTR pData, CGPoint point, ImageAttributes * pAttrib );
	BOOL			INK_DeleteAllImages( INK_DATA_PTR pData );
	int				INK_CountImages( INK_DATA_PTR pData );
	BOOL			INK_SetImageFrame( INK_DATA_PTR pData, int nImageIndex, CGRect frame );

	// text support
	BOOL			INK_AddText( INK_DATA_PTR pData, const TextAttributes * pText ); 
	BOOL			INK_SetText( INK_DATA_PTR pData, int nTextIndex, const TextAttributes * pText ); 
	BOOL			INK_SetTextUserData( INK_DATA_PTR pData, int nTextIndex, void * userData ); 
	BOOL			INK_DeleteText( INK_DATA_PTR pData, int nTextIndex );
	BOOL			INK_GetText( INK_DATA_PTR pData, int nTextIndex, TextAttributes * pText );
	int				INK_GetTextFromPoint( INK_DATA_PTR pData, CGPoint point, TextAttributes * pText );
	BOOL			INK_DeleteAllTexts( INK_DATA_PTR pData, BOOL bRecordUndo );
	int				INK_CountTexts( INK_DATA_PTR pData );
	BOOL			INK_SetTextFrame( INK_DATA_PTR pData, int nTextIndex, CGRect frame );
	
#if defined(__cplusplus)
}
#endif

#endif
