8 unsigned short int *border_buffer1, *border_buffer2, *bbuf_ptr1, *bbuf_ptr2;
10 void init_border (int width, int offsite)
13 border_buffer1 = (unsigned short int *)Tcl_Alloc (
14 (width + 1) * sizeof (unsigned short int));
15 border_buffer2 = (unsigned short int *)Tcl_Alloc (
16 (width + 1) * sizeof (unsigned short int));
17 *border_buffer2 = offsite;
18 for (i = 0, bbuf_ptr1 = border_buffer1; i <= width; i++, bbuf_ptr1++)
21 void new_border_row ()
23 unsigned short int *tmp;
25 border_buffer1 = border_buffer2;
27 bbuf_ptr1 = border_buffer1;
28 bbuf_ptr2 = border_buffer2;
30 } int check_border (int class)
32 *(++bbuf_ptr1) = class;
34 return *bbuf_ptr2 != class || *(bbuf_ptr1 - 1) !=
35 class || *(bbuf_ptr2 - 1) != class;
39 Tcl_Free ((char*)border_buffer1);
40 Tcl_Free ((char*)border_buffer2);
44 òÉÓÕÅÔ ÕËÁÚÁÎÎÙÊ ËÕÓÏË ÒÁÓÔÒÁ (× ÁÌØÔÅÒÎÁÔÉ×ÎÙÈ ËÏÏÒÄÉÎÁÔÁÈ)
47 int Fgis_MakePhotoImage (Tk_PhotoHandle imghandle,
48 int xl, int yb, int xr, int yt,
49 double XL, double XR, double YT, double YB,
51 int border,/* 0 - ÎÉÞÅÇÏ, 1, ÐÒÉ ÎÅÓÏ×ÐÁÄÅÎÉÉ
52 Ã×ÅÔÏ× ÐÏÓÌÅ ÒÅËÌÁÓÓÁ,
53 2 - ÐÒÉ ÎÅÓÏ×ÐÁÄÅÎÉÉ Ã×ÅÔÏ×
58 int mapmode /* 0 - wrap (x&0xFF), -1 x>255?255:x,
63 Tk_PhotoImageBlock block =
72 EPP *e = epp (handle);
73 RECLASS r = handle->reclass;
74 int width = xr - xl, height = yb - yt;
78 double W_Alt = XR - XL, H_Alt = YB - YT;
79 int x, y, row, i, j, maxclass=0;
83 ÜÔÏ ÂÕÆÅÒ ÄÌÑ ÈÒÁÎÅÎÉÑ ÐÒÏÒÉÓÏ×ÁÎÎÏÊ ÓÔÒÏËÉ
85 irow =(int *) Tcl_Alloc (width * sizeof (int));
86 max_base_class = epp_table_size (e) + 1;
88 íÁÓÓÉ× ×ÈÏÄÏ× × ÐÁÌÉÔÒÕ ÄÌÑ ËÌÁÓÓÏ× ÂÁÚÏ×ÏÇÏ ÒÁÓÔÒÁ
90 pal = (int *)Tcl_Alloc(max_base_class * sizeof (int));
92 maxclass = Fgis_RasterMax (handle);
93 for (i = 0; i < max_base_class; i++) {
109 index = index * mapmode / maxclass;
114 pal[i] = palette[index];
119 ÜÔÏ ÔÁÂÌÉÃÁ ÐÏÒÑÄËÏ×ÙÈ ÎÏÍÅÒÏ× ËÏÌÏÎÏË × epp-ÆÁÊÌÅ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ
122 coltab =(int *) Tcl_Alloc (width * sizeof (int));
123 for (i = xl, col = coltab, j = 0; i < xr; i++, j++, col++) {
124 *col = epp_col (e, W_Alt * (j + 0.5) / width + XL);
127 úÁÐÏÌÎÉÍ ÔÅ ÐÏÌÑ ÓÔÒÕËÔÕÒÙ block, ËÏÔÏÒÙÅ ÍÙ ÎÅ ÍÏÇÌÉ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ
129 block.pixelPtr = (unsigned char *) irow;
131 block.pitch = width * sizeof (int);
134 init_border (width, r[e->offsite]);
136 init_border (width, e->offsite);
139 Tk_PhotoBlank(imghandle);
140 for (y = yt, i = 0; y < yb; y++, i++) {
141 row = epp_row (e, H_Alt * (i + 0.5) / height + YT);
144 for (x = xl, j = 0, col = coltab, rp = irow; x < xr;
145 j++, col++, rp++, x++) {
146 base = epp_get (e, *col, row);
148 if (border == 1 ? check_border (r[base]) :
149 check_border (base)) {
156 Tk_PhotoPutBlock (imghandle, &block, xl, y, width, 1);
159 Tcl_Free ((char *)pal);
160 Tcl_Free ((char *)irow);
161 Tcl_Free ((char *)coltab);
166 void Fgis_PlotPatterns(Tcl_Interp *interp,
168 int xl,int yb,int xr,int yt,
169 double XL, double XR,double YT,double YB,
170 RASTER_OBJECT handle,
171 int bordermode, PATTERNS patterns,XColor* color,int mapmode)
172 { /* NOT IMPLEMENTED YET */
174 void Fgis_PlotSymbols(Tcl_Interp *interp,
176 int xl,int yb,int xr,int yt,
177 double XL,double XR,double YT,double YB,
178 RASTER_OBJECT handle,
179 PATTERNS patterns, XColor* color,
181 { /*NOT IMPLEMENTED YET*/
186 * - implementation of command fgisRasterColorImage and
189 EXPORT(int, Fgis_RasterImage) (ClientData data, Tcl_Interp *interp,
190 int argc, char **argv)
192 int listc; char **listv; /* for parsing result of $planchet bbox $item */
193 Tk_PhotoHandle imghandle=NULL;
194 int colorplot=(int)data; /* how to distinguish between color and bw */
195 char *bitmap_image=NULL;
196 enum {PATTERNS_MODE,SYMBOLS_MODE} symbolmode=PATTERNS_MODE;
199 int bordermode=((int)data)?0:1;
200 PATTERNS patterns=NULL;
201 PALETTE palette=default_palette;
202 RASTER_OBJECT raster;
204 int xl=0,yt=0,xr,yb,imgstartx,imgstarty;
207 Tk_Window canvas=Tk_NameToWindow(interp,argv[2],Tk_MainWindow(interp));
209 clr=Tk_GetColor(interp,canvas,"black");
210 if (Fgis_CkArgs(interp,argc<5,
211 argv[0],"raster planchet item ?options?"))
213 if (!Fgis_ValidPlanchet(interp,argv[2]))
215 if (Tcl_VarEval(interp,argv[2]," bbox ",argv[3],NULL)!=TCL_OK)
217 if (Tcl_SplitList(interp,interp->result,&listc,&listv)!=TCL_OK)
219 imgstartx=atol(listv[0]);
220 imgstarty=atol(listv[1]);
223 XL=Fgis_AltX(interp,argv[2],imgstartx);
224 XR=Fgis_AltX(interp,argv[2],xr+1);
225 YT=Fgis_AltY(interp,argv[2],imgstarty);
226 YB=Fgis_AltY(interp,argv[2],yb+1);
229 Tcl_Free((char *)listv);
230 if (Tcl_VarEval(interp,argv[2]," itemcget ",argv[3]," -image",NULL)!=TCL_OK)
233 imghandle=Tk_FindPhoto(interp,interp->result);
235 Tcl_AppendResult(interp,"No valid image for item ",argv[3],
236 " in planchet ", argv[2],NULL);
241 bitmap_image=stralloc(interp->result);
243 Tcl_AppendResult(interp,"No valid image for item ",argv[3],
244 " in planchet ", argv[2],NULL);
248 raster=Fgis_GetRaster(interp,argv[1]);
250 Tcl_AppendResult(interp,argv[1]," is not valid raster",NULL);
254 for(i=4;i<argc;i++) {
255 if (!strcmp(argv[i],"-palette")&&colorplot) {
256 if(!(palette=Fgis_GetPalette(interp,argv[++i])))
258 } else if (!strcmp(argv[i],"-patterns")&&!colorplot) {
259 if(!(patterns=Fgis_GetPatterns(interp,argv[++i])))
261 symbolmode=PATTERNS_MODE;
262 } else if (!strcmp(argv[i],"-symbols")&&!colorplot) {
263 if (!(patterns=Fgis_GetPatterns(interp,argv[++i])))
265 symbolmode=SYMBOLS_MODE;
267 } else if (!strcmp(argv[i],"-border")) {
270 if (!strcmp(argv[i],"base")) {
272 } else if (!strcmp(argv[i],"yes")) {
274 } else if (!strcmp(argv[i],"none")) {
276 } else if (argv[i][0]=='-') {
277 /* -border without parameter decrease i */
281 Tcl_SetResult(interp,"Invalid border option. Should be one "
282 "of none, yes, base",TCL_STATIC);
289 if (!strcmp(argv[i],"-color")) {
290 clr=Tk_GetColor(interp,canvas,argv[++i]);
291 if (!clr) return TCL_ERROR;
292 /* What range have XColor fields? */
294 bordercolor=((clr->red&0xff)<<16)|((clr->green&0xff)<<8)|
298 if (!strcmp(argv[i],"-map")) {
300 ERROR_MESSAGE("Duplicate color remapping specification",TCL_STATIC);
302 if (!strcmp(argv[i],"wrap")) {
305 if (!strcmp(argv[i],"none")) {
308 if (Fgis_GetInt(interp, argc, argv, ++i, 0, 256, &mapmode,
309 "color index") !=TCL_OK) {
313 if (!strcmp(argv[i],"-update")) {
317 ERROR_MESSAGE("List of four doubles expected",TCL_STATIC);
318 if (Fgis_GetLimits(interp,argv[i],&X1,&Y1,&X2,&Y2)!=TCL_OK)
320 x1=Fgis_PlanchetX(interp,argv[2],X1)-imgstartx;
321 x2=Fgis_PlanchetX(interp,argv[2],X2)-imgstartx;
326 if (x1>0) {xl=x1;XL=Fgis_AltX(interp,argv[2],x1+imgstartx);}
327 if (x2<xr) {xr=x2;XR=Fgis_AltX(interp,argv[2],x2+1+imgstartx);}
328 y1=Fgis_PlanchetY(interp,argv[2],Y1)-imgstarty;
329 y2=Fgis_PlanchetY(interp,argv[2],Y2)-imgstarty;
334 if (y1>0) {yt=y1;YT=Fgis_AltY(interp,argv[2],y1+imgstarty);}
335 if (y2<yb) {yb=y2;YB=Y2;Fgis_AltY(interp,argv[2],y2+1+imgstarty);}
338 Tcl_ResetResult(interp);
339 Tcl_AppendResult(interp,"Invalid option.\"",argv[i],
340 "\" Should be one of -border, -bordercolor, -map, ",
343 Tcl_AppendResult(interp,"-palette",NULL);
345 Tcl_AppendResult(interp,"-patterns, -symbols",NULL);
346 Tcl_AppendResult(interp,", -update",NULL);
353 Fgis_MakePhotoImage(imghandle,xl,yb,xr,yt,XL,XR,YT,YB,raster,bordermode,
354 palette,bordercolor,mapmode);
356 if (symbolmode==PATTERNS_MODE) {
357 Fgis_PlotPatterns(interp,bitmap_image,xl,yb,xr,yt,XL,XR,YT,YB,raster,
358 bordermode, patterns,clr,mapmode);
360 Fgis_PlotSymbols(interp,bitmap_image,xl,yb,xr,yt,XL,XR,YT,YB,raster,
361 patterns, clr, mapmode);