summaryrefslogtreecommitdiffstats
path: root/tkimg/init.c
blob: 1b8d77a3951f300d8ca7f600ce57c030c2d04714 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*

 * init.c --

 *

 *  Generic photo image type initialization, Tcl/Tk package

 *

 * Copyright (c) 2002 Andreas Kupries <andreas_kupries@users.sourceforge.net>

 *

 * $Id: init.c 274 2010-06-28 13:23:34Z nijtmans $

 *

 */

#include "tkimg.h"


#ifndef MORE_INITIALIZATION

#define MORE_INITIALIZATION /* Nothing */

#endif


/*

 * Functions exported for package management.

 */


extern DLLEXPORT int @CPACKAGE@_Init(Tcl_Interp *interp);
extern DLLEXPORT int @CPACKAGE@_SafeInit(Tcl_Interp *interp);

/*

 * Declarations of internal functions.

 */

static int ChnMatch(Tcl_Channel chan, const char *fileName,
	Tcl_Obj *format, int *widthPtr, int *heightPtr,	Tcl_Interp *interp);

static int ObjMatch(Tcl_Obj *dataObj, Tcl_Obj *format,
	int *widthPtr, int *heightPtr, Tcl_Interp *interp);

static int ChnRead(Tcl_Interp *interp, Tcl_Channel chan,
	const char *fileName, Tcl_Obj *format, Tk_PhotoHandle imageHandle,
	int destX, int destY, int width, int height, int srcX, int srcY);

static int ObjRead(Tcl_Interp *interp, Tcl_Obj *dataObj,
	Tcl_Obj *format, Tk_PhotoHandle imageHandle,
	int destX, int destY, int width, int height, int srcX, int srcY);

static int ChnWrite(Tcl_Interp *interp, const char *filename,
	Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr);

static int StringWrite(Tcl_Interp *interp, Tcl_Obj *format,
	Tk_PhotoImageBlock *blockPtr);

static Tk_PhotoImageFormat format = {
	(char *) "%PHIMGTYPE%", /* name */
	ChnMatch, /* fileMatchProc */
	ObjMatch, /* stringMatchProc */
	ChnRead, /* fileReadProc */
	ObjRead, /* stringReadProc */
	ChnWrite, /* fileWriteProc */
	StringWrite /* stringWriteProc */
};

#ifdef SECOND_FORMAT

/*

 * Declare procedures of the second format as needed. The macro we

 * check for allow us to share code between first and second

 * format. Current user of this feature: The PS/PDF combo handler

 */

#ifndef SECOND_CHNMATCH

#define SECOND_CHNMATCH ChnMatchBeta

static int ChnMatchBeta(Tcl_Channel chan, const char *fileName,
	Tcl_Obj *format, int *widthPtr, int *heightPtr, Tcl_Interp *interp);
#endif

#ifndef SECOND_OBJMATCH

#define SECOND_OBJMATCH ObjMatchBeta

static int ObjMatchBeta(Tcl_Obj *dataObj, Tcl_Obj *format,
	int *widthPtr, int *heightPtr, Tcl_Interp *interp);
#endif

#ifndef SECOND_CHNREAD

#define SECOND_CHNREAD ChnReadBeta

static int ChnReadBeta(Tcl_Interp *interp, Tcl_Channel chan,
	const char *fileName, Tcl_Obj *format, Tk_PhotoHandle imageHandle,
	int destX, int destY, int width, int height, int srcX, int srcY);
#endif

#ifndef SECOND_OBJREAD

#define SECOND_OBJREAD ChnObjReadBeta

static int ObjReadBeta(Tcl_Interp *interp, Tcl_Obj *dataObj,
	Tcl_Obj *format, Tk_PhotoHandle imageHandle,
	int destX, int destY, int width, int height, int srcX, int srcY);
#endif

#ifndef SECOND_CHNWRITE

#define SECOND_CHNWRITE ChnWriteBeta

static int ChnWriteBeta(Tcl_Interp *interp, const char *filename,
	Tcl_Obj *format, Tk_PhotoImageBlock *blockPtr);
#endif

#ifndef SECOND_STRWRITE

#define SECOND_STRWRITE StringWriteBeta

static int StringWriteBeta(Tcl_Interp *interp, Tcl_Obj *format,
	Tk_PhotoImageBlock *blockPtr);
#endif


static Tk_PhotoImageFormat format_beta = {
	(char *) "%PHIMGTYPE_BETA%", /* name */
	SECOND_CHNMATCH, /* fileMatchProc */
	SECOND_OBJMATCH, /* stringMatchProc */
	SECOND_CHNREAD, /* fileReadProc */
	SECOND_OBJREAD, /* stringReadProc */
	SECOND_CHNWRITE, /* fileWriteProc */
	SECOND_STRWRITE /* stringWriteProc */
};

#endif /* SECOND_FORMAT */



/*

 *----------------------------------------------------------------------------

 *

 * @CPACKAGE@_Init --

 *

 *  Initialisation routine for loadable module

 *

 * Results:

 *  None.

 *

 * Side effects:

 *  Creates commands in the interpreter, loads package.

 *

 *----------------------------------------------------------------------------

 */

int
@CPACKAGE@_Init(
	Tcl_Interp *interp /* Interpreter to initialise. */
) {
	if (!Tcl_InitStubs(interp, "8.3", 0)) {
		return TCL_ERROR;
	}
	if (!Tk_InitStubs(interp, "8.3", 0)) {
		return TCL_ERROR;
	}
	if (!Tkimg_InitStubs(interp, TKIMG_VERSION, 0)) {
		return TCL_ERROR;
	}

	MORE_INITIALIZATION;

	/*

	 * Register the new photo image type.

	 */

	Tk_CreatePhotoImageFormat(&format);
#ifdef SECOND_FORMAT

	Tk_CreatePhotoImageFormat(&format_beta);
#endif /* SECOND_FORMAT */


	/*

	 * At last provide the package ...

	 */

	if (Tcl_PkgProvide(interp, PACKAGE_TCLNAME, PACKAGE_VERSION) != TCL_OK) {
		return TCL_ERROR;
	}
	return TCL_OK;
}

/*

 *----------------------------------------------------------------------------

 *

 * @CPACKAGE@_SafeInit --

 *

 *  Initialisation routine for loadable module in a safe interpreter.

 *

 * Results:

 *  None.

 *

 * Side effects:

 *  Creates commands in the interpreter, loads package.

 *

 *----------------------------------------------------------------------------

 */

int
@CPACKAGE@_SafeInit(
	Tcl_Interp *interp /* Interpreter to initialise. */
) {
	return @CPACKAGE@_Init(interp);
}