00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #if HAVE_CONFIG_H
00030 #include <config.h>
00031 #endif
00032 #include <tcl.h>
00033 #include <tk.h>
00034 #include <stdio.h>
00035 #include <string.h>
00036 #include <sadie.h>
00037 #include "tclsadie.h"
00038
00043 static const char atitle[] = DEFAULT_TCL_ARRAY_TITLE;
00044 static const char ixaddr[] = DEFAULT_IN_IMAGE_ADDR_INDEX;
00045 static const char ixname[] = DEFAULT_OUT_IMAGE_NAME_INDEX;
00077 int
00078 Sadie_Multi_CombineCmd (ClientData client_data, Tcl_Interp *interp,
00079 int objc, Tcl_Obj * const objv[])
00080 {
00081 IMAGE *inimg1 = NULL;
00082 IMAGE *inimg2 = NULL;
00083 IMAGE *outimg = NULL;
00084 int option;
00085 double weight1, weight2;
00086
00087 if (objc != 2)
00088 {
00089 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00090 return TCL_ERROR;
00091 }
00092 if ((GetSadieImageFromObj2 (interp, objv[1], "inimg,addr1", &inimg1)
00093 != TCL_OK)
00094 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr2", &inimg2)
00095 != TCL_OK)
00096 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00097 != TCL_OK)
00098 || (GetSadieDoubleFromObj2 (interp, objv[1], "weight1", &weight1)
00099 != TCL_OK)
00100 || (GetSadieDoubleFromObj2 (interp, objv[1], "weight2", &weight2)
00101 != TCL_OK))
00102 return TCL_ERROR;
00103 COMBINE (inimg1, inimg2, (short)option, weight1, weight2, &outimg);
00104 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00105 }
00106
00136 int
00137 Sadie_Multi_CompareCmd (ClientData client_data, Tcl_Interp *interp,
00138 int objc, Tcl_Obj * const objv[])
00139 {
00140 IMAGE *inimg1 = NULL;
00141 IMAGE *inimg2 = NULL;
00142 IMAGE *outimg = NULL;
00143 int option;
00144
00145 if (objc != 2)
00146 {
00147 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00148 return TCL_ERROR;
00149 }
00150 if ((GetSadieImageFromObj2 (interp, objv[1], "inimg,addr1", &inimg1)
00151 != TCL_OK)
00152 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr2", &inimg2)
00153 != TCL_OK)
00154 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00155 != TCL_OK))
00156 return TCL_ERROR;
00157 COMPARE (inimg1, inimg2, (short)option, &outimg);
00158 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00159 }
00160
00183 int
00184 Sadie_Multi_PCTCmd (ClientData client_data, Tcl_Interp *interp,
00185 int objc, Tcl_Obj * const objv[])
00186 {
00187 IMAGE *inimg = NULL;
00188 IMAGE *outimg = NULL;
00189 uint32_t incr;
00190
00191 if (objc != 2)
00192 {
00193 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00194 return TCL_ERROR;
00195 }
00196 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00197 != TCL_OK)
00198 || (GetSadieUintFromObj2 (interp, objv[1], "incr", &incr)
00199 != TCL_OK))
00200 return TCL_ERROR;
00201 PCT (inimg, incr, &outimg);
00202 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00203 }
00204
00223 int
00224 Sadie_Multi_PCSCmd (ClientData client_data, Tcl_Interp *interp,
00225 int objc, Tcl_Obj * const objv[])
00226 {
00227 IMAGE *inimg = NULL;
00228 IMAGE *outimg = NULL;
00229 uint32_t incr;
00230
00231 if (objc != 2)
00232 {
00233 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00234 return TCL_ERROR;
00235 }
00236 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00237 != TCL_OK)
00238 || (GetSadieUintFromObj2 (interp, objv[1], "incr", &incr)
00239 != TCL_OK))
00240 return TCL_ERROR;
00241 DECORSTR (inimg, incr, &outimg);
00242 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00243 }
00244
00262 int
00263 Sadie_Multi_RGB2HSVCmd (ClientData client_data, Tcl_Interp *interp,
00264 int objc, Tcl_Obj * const objv[])
00265 {
00266 IMAGE *inimg = NULL;
00267 IMAGE *outimg = NULL;
00268
00269 if (objc != 2)
00270 {
00271 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00272 return TCL_ERROR;
00273 }
00274 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00275 != TCL_OK))
00276 return TCL_ERROR;
00277 RGBTOHSV (inimg, &outimg);
00278 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00279 }
00280
00298 int
00299 Sadie_Multi_HSV2RGBCmd (ClientData client_data, Tcl_Interp *interp,
00300 int objc, Tcl_Obj * const objv[])
00301 {
00302 IMAGE *inimg = NULL;
00303 IMAGE *outimg = NULL;
00304
00305 if (objc != 2)
00306 {
00307 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00308 return TCL_ERROR;
00309 }
00310 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00311 != TCL_OK))
00312 return TCL_ERROR;
00313 HSVTORGB (inimg, &outimg);
00314 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00315 }
00316
00334 int
00335 Sadie_Multi_BIL2BSQCmd (ClientData client_data, Tcl_Interp *interp,
00336 int objc, Tcl_Obj * const objv[])
00337 {
00338 IMAGE *inimg = NULL;
00339 IMAGE **outband = NULL;
00340 Tcl_Obj **bandobj = NULL;
00341 size_t i, a;
00342 char imagename[SLEN];
00343 int err = TCL_OK;
00344
00345 if (objc != 2)
00346 {
00347 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00348 return TCL_ERROR;
00349 }
00350 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00351 != TCL_OK))
00352 return TCL_ERROR;
00353 outband = calloc (inimg->nbnd, sizeof (IMAGE *));
00354 if (outband == NULL)
00355 return TCL_ERROR;
00356 bandobj = calloc (inimg->nbnd, sizeof (Tcl_Obj *));
00357 if (bandobj == NULL)
00358 {
00359 free (outband);
00360 return TCL_ERROR;
00361 }
00362 BILTOBSQ (inimg, outband);
00363 for (i = 0; ((err == TCL_OK) && (i < inimg->nbnd)); i++)
00364 {
00365 snprintf (imagename, SLEN - 1, "outname%lu",
00366 (long unsigned int) (i + 1));
00367 bandobj[i] = NewSadieImageObj2 (interp, objv[1], (const char *)imagename,
00368 outband[i]);
00369 if (bandobj[i] != NULL)
00370 Tcl_IncrRefCount (bandobj[i]);
00371 else
00372 err = TCL_ERROR;
00373 }
00374 if (err == TCL_OK)
00375 Tcl_SetObjResult (interp, Tcl_NewListObj (inimg->nbnd, bandobj));
00376 for (a = 0; a < inimg->nbnd; a++)
00377 Tcl_DecrRefCount (bandobj[a]);
00378 free (bandobj);
00379 free (outband);
00380 return err;
00381 }
00382
00400 int
00401 Sadie_Multi_BSQ2BILCmd (ClientData client_data, Tcl_Interp *interp,
00402 int objc, Tcl_Obj * const objv[])
00403 {
00404 IMAGE *inband[3] = { NULL, NULL, NULL };
00405 IMAGE *outimg = NULL;
00406
00407 if (objc != 2)
00408 {
00409 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00410 return TCL_ERROR;
00411 }
00412 if ((GetSadieImageFromObj2 (interp, objv[1], "inimg,addr1", inband)
00413 != TCL_OK)
00414 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr2", inband + 1)
00415 != TCL_OK)
00416 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr3", inband + 2)
00417 != TCL_OK))
00418 return TCL_ERROR;
00419 BSQTOBIL (inband, 3, &outimg);
00420 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00421 }
00422
00424 static const char *comp_label_index[2] = { "outname1", "outname2" };
00425
00446 int
00447 Sadie_Multi_Comp2RealCmd (ClientData client_data, Tcl_Interp *interp,
00448 int objc, Tcl_Obj * const objv[])
00449 {
00450 IMAGE *inimg = NULL;
00451 IMAGE *comp_img[2] = { NULL, NULL };
00452 int option;
00453
00454 if (objc != 2)
00455 {
00456 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00457 return TCL_ERROR;
00458 }
00459 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00460 != TCL_OK)
00461 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00462 != TCL_OK))
00463 return TCL_ERROR;
00464 COM2REAL (inimg, (short)option, comp_img, comp_img + 1);
00465 return SetSadieComponentObj2 (interp, objv[1], comp_label_index, comp_img);
00466 }
00467
00488 int
00489 Sadie_Multi_Real2CompCmd (ClientData client_data, Tcl_Interp *interp,
00490 int objc, Tcl_Obj * const objv[])
00491 {
00492 IMAGE *inimg1 = NULL;
00493 IMAGE *inimg2 = NULL;
00494 IMAGE *outimg = NULL;
00495 int option;
00496
00497 if (objc != 2)
00498 {
00499 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00500 return TCL_ERROR;
00501 }
00502 if ((GetSadieImageFromObj2 (interp, objv[1], "inimg,addr1", &inimg1)
00503 != TCL_OK)
00504 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr2", &inimg2)
00505 != TCL_OK)
00506 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00507 != TCL_OK))
00508 return TCL_ERROR;
00509 REAL2COM (inimg1, inimg2, (short)option, &outimg);
00510 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00511 }
00512
00541 int
00542 Sadie_Multi_RotateCubeCmd (ClientData client_data, Tcl_Interp *interp,
00543 int objc, Tcl_Obj * const objv[])
00544 {
00545 IMAGE *inimg = NULL;
00546 IMAGE *outimg = NULL;
00547 int xdir, xaxis;
00548 int ydir, yaxis;
00549 int zdir, zaxis;
00550
00551 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00552 != TCL_OK)
00553 || (GetSadieIntFromObj2 (interp, objv[1], "x,sign", &xdir)
00554 != TCL_OK)
00555 || (GetSadieIntFromObj2 (interp, objv[1], "y,sign", &ydir)
00556 != TCL_OK)
00557 || (GetSadieIntFromObj2 (interp, objv[1], "z,sign", &zdir)
00558 != TCL_OK)
00559 || (GetSadieIntFromObj2 (interp, objv[1], "x,cubedim", &xaxis)
00560 != TCL_OK)
00561 || (GetSadieIntFromObj2 (interp, objv[1], "y,cubedim", &yaxis)
00562 != TCL_OK)
00563 || (GetSadieIntFromObj2 (interp, objv[1], "z,cubedim", &zaxis)
00564 != TCL_OK))
00565 return TCL_ERROR;
00566 ROTATECUBE (inimg, (short)xdir, (short)ydir, (short)zdir,
00567 (short)xaxis, (short)yaxis, (short)zaxis, &outimg);
00568 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00569 }
00570
00577 int
00578 Sadie_Multi_Init (Tcl_Interp *interp)
00579 {
00580 Tcl_CreateObjCommand (interp, "Sadie_Multi_Combine",
00581 Sadie_Multi_CombineCmd, NULL, NULL);
00582 Tcl_CreateObjCommand (interp, "Sadie_Multi_Compare",
00583 Sadie_Multi_CompareCmd, NULL, NULL);
00584 Tcl_CreateObjCommand (interp, "Sadie_Multi_PCT",
00585 Sadie_Multi_PCTCmd, NULL, NULL);
00586 Tcl_CreateObjCommand (interp, "Sadie_Multi_PCS",
00587 Sadie_Multi_PCSCmd, NULL, NULL);
00588 Tcl_CreateObjCommand (interp, "Sadie_Multi_RGB2HSV",
00589 Sadie_Multi_RGB2HSVCmd, NULL, NULL);
00590 Tcl_CreateObjCommand (interp, "Sadie_Multi_HSV2RGB",
00591 Sadie_Multi_HSV2RGBCmd, NULL, NULL);
00592 Tcl_CreateObjCommand (interp, "Sadie_Multi_BIL2BSQ",
00593 Sadie_Multi_BIL2BSQCmd, NULL, NULL);
00594 Tcl_CreateObjCommand (interp, "Sadie_Multi_BSQ2BIL",
00595 Sadie_Multi_BSQ2BILCmd, NULL, NULL);
00596 Tcl_CreateObjCommand (interp, "Sadie_Multi_Comp2Real",
00597 Sadie_Multi_Comp2RealCmd, NULL, NULL);
00598 Tcl_CreateObjCommand (interp, "Sadie_Multi_Real2Comp",
00599 Sadie_Multi_Real2CompCmd, NULL, NULL);
00600 Tcl_CreateObjCommand (interp, "Sadie_Multi_RotateCube",
00601 Sadie_Multi_RotateCubeCmd, NULL, NULL);
00602 return TCL_OK;
00603 }
00604