00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdlib.h>
00022 #include <tcl.h>
00023 #include "config.h"
00024 #include "utilities.h"
00025 #include "VMDApp.h"
00026
00027 #define CHECK_RENDER(x) if (!app->filerender_valid(x)) { delete [] extstr; Tcl_AppendResult(interp, "No render method: ", x, NULL); return TCL_ERROR; }
00028
00029 int text_cmd_render(ClientData cd, Tcl_Interp *interp, int argc,
00030 const char *argv[]) {
00031 VMDApp *app = (VMDApp *)cd;
00032
00033 if (argc >= 3) {
00034 char *extstr = NULL;
00035 if (argc > 3)
00036 extstr = combine_arguments(argc, argv, 3);
00037
00038 if (!strupncmp(argv[1], "options", CMDLEN)) {
00039 const char *opt = app->filerender_option(argv[2], NULL);
00040 if (!opt) {
00041 Tcl_AppendResult(interp, "render:\n",
00042 "No rendering method '", argv[2], "' available.", NULL);
00043 return TCL_ERROR;
00044 }
00045 if (extstr == NULL) {
00046 Tcl_AppendResult(interp, opt, NULL);
00047 } else {
00048 app->filerender_option(argv[2], extstr);
00049 delete [] extstr;
00050 }
00051 return TCL_OK;
00052
00053 } else if (!strupncmp(argv[1], "default", CMDLEN)) {
00054 const char *opt = app->filerender_default_option(argv[2]);
00055 if (!opt) {
00056 Tcl_AppendResult(interp, "render:\n", "No rendering method '",
00057 argv[2], "' available.", NULL);
00058 return TCL_ERROR;
00059 }
00060 Tcl_AppendResult(interp, opt, NULL);
00061 return TCL_OK;
00062
00063 } else if (!strupncmp(argv[1], "hasaa", CMDLEN)) {
00064 CHECK_RENDER(argv[2])
00065 Tcl_SetObjResult(interp, Tcl_NewIntObj(app->filerender_has_antialiasing(argv[2])));
00066 return TCL_OK;
00067
00068 } else if (!strupncmp(argv[1], "aasamples", CMDLEN)) {
00069 int aasamples = -1;
00070 if (argc ==4) {
00071 if (Tcl_GetInt(interp, argv[3], &aasamples) != TCL_OK)
00072 return TCL_ERROR;
00073 }
00074 CHECK_RENDER(argv[2])
00075 Tcl_SetObjResult(interp, Tcl_NewIntObj(app->filerender_aasamples(argv[2], aasamples)));
00076 return TCL_OK;
00077
00078 } else if (!strupncmp(argv[1], "aosamples", CMDLEN)) {
00079 int aosamples = -1;
00080 if (argc ==4) {
00081 if (Tcl_GetInt(interp, argv[3], &aosamples) != TCL_OK)
00082 return TCL_ERROR;
00083 }
00084 CHECK_RENDER(argv[2])
00085 Tcl_SetObjResult(interp, Tcl_NewIntObj(app->filerender_aosamples(argv[2], aosamples)));
00086 return TCL_OK;
00087
00088 } else if (!strupncmp(argv[1], "imagesize", CMDLEN)) {
00089 int w=0, h=0;
00090 CHECK_RENDER(argv[2])
00091 if (argc == 4) {
00092 int listn;
00093 const char **listelem;
00094 if (Tcl_SplitList(interp, argv[3], &listn, &listelem) != TCL_OK) {
00095 return TCL_ERROR;
00096 }
00097 if (listn != 2) {
00098 Tcl_SetResult(interp, (char *) "Image size list must have two elements", TCL_STATIC);
00099 Tcl_Free((char *)listelem);
00100 }
00101 if (Tcl_GetInt(interp, listelem[0], &w) != TCL_OK ||
00102 Tcl_GetInt(interp, listelem[1], &h) != TCL_OK) {
00103 Tcl_Free((char *)listelem);
00104 return TCL_ERROR;
00105 }
00106 Tcl_Free((char *)listelem);
00107 } else if (argc != 3 && argc > 4) {
00108 Tcl_SetResult(interp, (char *) "Usage: render imagesize <method> {width height}", TCL_STATIC);
00109 return TCL_ERROR;
00110 }
00111 if (!app->filerender_imagesize(argv[2], &w, &h)) {
00112 Tcl_SetResult(interp, (char *) "Unable to set/get image size.", TCL_STATIC);
00113 return TCL_ERROR;
00114 }
00115 char tmpstring[128] = { 0 };
00116 sprintf(tmpstring, "%d %d", w, h);
00117 Tcl_SetResult(interp, tmpstring, TCL_VOLATILE);
00118 return TCL_OK;
00119
00120 } else if (!strupncmp(argv[1], "hasimagesize", CMDLEN)) {
00121 int rc = app->filerender_has_imagesize(argv[2]);
00122 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
00123 return TCL_OK;
00124
00125 } else if (!strupncmp(argv[1], "aspectratio", CMDLEN)) {
00126 CHECK_RENDER(argv[2])
00127 double daspect = -1;
00128 if (argc == 4) {
00129 if (Tcl_GetDouble(interp, argv[3], &daspect) != TCL_OK)
00130 return TCL_ERROR;
00131 }
00132 float aspect = (float)daspect;
00133 if (!app->filerender_aspectratio(argv[2], &aspect)) {
00134 Tcl_SetResult(interp, (char *) "Unable to get aspect ratio.", TCL_STATIC);
00135 return TCL_ERROR;
00136 }
00137 Tcl_SetObjResult(interp, Tcl_NewDoubleObj(aspect));
00138 return TCL_OK;
00139
00140 } else if (!strupncmp(argv[1], "formats", CMDLEN)) {
00141 CHECK_RENDER(argv[2])
00142 int n = app->filerender_numformats(argv[2]);
00143 for (int i=0; i<n; i++) {
00144 Tcl_AppendElement(interp, app->filerender_get_format(argv[2], i));
00145 }
00146 return TCL_OK;
00147
00148 } else if (!strupncmp(argv[1], "format", CMDLEN)) {
00149 CHECK_RENDER(argv[2])
00150 if (argc == 3) {
00151 Tcl_AppendElement(interp, app->filerender_cur_format(argv[2]));
00152 return TCL_OK;
00153 }
00154 if (app->filerender_set_format(argv[2], argv[3]))
00155 return TCL_OK;
00156 Tcl_AppendResult(interp, "Unable to set render output format to ",
00157 argv[3], NULL);
00158 return TCL_ERROR;
00159
00160 } else {
00161 app->display_update();
00162 int retval = app->filerender_render(argv[1], argv[2], extstr);
00163 if(extstr)
00164 delete [] extstr;
00165 return retval ? TCL_OK : TCL_ERROR;
00166 }
00167 } else if (argc == 2) {
00168 for (int i=0; i<app->filerender_num(); i++)
00169 Tcl_AppendElement(interp, app->filerender_name(i));
00170 return TCL_OK;
00171 }
00172
00173
00174 Tcl_AppendResult(interp, "render usage:\n",
00175 "render list\n",
00176 "render hasaa <method>\n",
00177 "render aasamples <method> [aasamples]\n",
00178 "render aosamples <method> [aosamples]\n",
00179
00180
00181 "render formats <method>\n",
00182 "render format <method> <format>\n",
00183 "render options <method> <new default exec command>\n",
00184 "render default <method>\n",
00185 "render <method> <filename> [exec command]\n",
00186 NULL);
00187 return TCL_ERROR;
00188 }
00189
00190
00191
00192
00193
00194 #if defined(VMDTK) && !defined(_MSC_VER)
00195 #include <tk.h>
00196 #include "DisplayDevice.h"
00197 int text_cmd_tkrender(ClientData cd, Tcl_Interp *interp, int argc,
00198 const char *argv[]) {
00199 if (!Tcl_PkgPresent(interp, "Tk", TK_VERSION, 0)) {
00200 Tcl_SetResult(interp, (char *) "Tk not available.", TCL_STATIC);
00201 return TCL_ERROR;
00202 }
00203 if (argc != 2) {
00204 Tcl_SetResult(interp, (char *) "tkrender usage:\ntkrender <photo handle>\n", TCL_STATIC);
00205 return TCL_ERROR;
00206 }
00207 Tk_PhotoHandle handle = Tk_FindPhoto(interp, argv[1]);
00208 if (!handle) {
00209 Tcl_AppendResult(interp, "photo handle '", argv[1], "' has not been created.", NULL);
00210 return TCL_ERROR;
00211 }
00212
00213 int xs=0, ys=0;
00214 DisplayDevice *display = ((VMDApp *)cd)->display;
00215 display->update(TRUE);
00216 unsigned char *img = display->readpixels_rgb3u(xs, ys);
00217 display->update(TRUE);
00218
00219 if (!img) {
00220 Tcl_SetResult(interp, (char *) "Error reading pixel data from display device.", TCL_STATIC);
00221 return TCL_ERROR;
00222 }
00223
00224
00225
00226 Tk_PhotoImageBlock blk = {
00227 img+3*xs*(ys-1),
00228 xs,
00229 ys,
00230 -3*xs,
00231 3,
00232 {0,1,2,3}
00233 };
00234
00235
00236
00237
00238
00239
00240 Tk_PhotoSetSize(interp, handle, xs, ys);
00241 Tk_PhotoPutBlock(interp, handle, &blk, 0, 0, xs, ys, TK_PHOTO_COMPOSITE_SET);
00242
00243 free(img);
00244 return TCL_OK;
00245 }
00246
00247 #endif
00248
00249