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",
00057 "No rendering method '", 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];
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])) return TCL_OK;
00155 Tcl_AppendResult(interp,
00156 "Unable to set render output format to ", argv[3], NULL);
00157 return TCL_ERROR;
00158
00159 } else {
00160 app->display_update();
00161 int retval = app->filerender_render(argv[1], argv[2], extstr);
00162 if(extstr)
00163 delete [] extstr;
00164 return retval ? TCL_OK : TCL_ERROR;
00165 }
00166 } else if (argc == 2) {
00167 for (int i=0; i<app->filerender_num(); i++)
00168 Tcl_AppendElement(interp, app->filerender_name(i));
00169 return TCL_OK;
00170 }
00171
00172
00173 Tcl_AppendResult(interp, "render usage:\n",
00174 "render list\n",
00175 "render hasaa <method>\n",
00176 "render aasamples <method> [aasamples]\n",
00177 "render aosamples <method> [aosamples]\n",
00178
00179
00180 "render formats <method>\n",
00181 "render format <method> <format>\n",
00182 "render options <method> <new default exec command>\n",
00183 "render default <method>\n",
00184 "render <method> <filename> [exec command]\n",
00185 NULL);
00186 return TCL_ERROR;
00187 }
00188
00189
00190
00191
00192
00193 #if defined(VMDTK) && !defined(_MSC_VER)
00194 #include <tk.h>
00195 #include "DisplayDevice.h"
00196 int text_cmd_tkrender(ClientData cd, Tcl_Interp *interp, int argc,
00197 const char *argv[]) {
00198 if (!Tcl_PkgPresent(interp, "Tk", TK_VERSION, 0)) {
00199 Tcl_SetResult(interp, "Tk not available.", TCL_STATIC);
00200 return TCL_ERROR;
00201 }
00202 if (argc != 2) {
00203 Tcl_SetResult(interp, "tkrender usage:\ntkrender <photo handle>\n",
00204 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(xs, ys);
00217 display->update(TRUE);
00218
00219 if (!img) {
00220 Tcl_SetResult(interp, "Error reading pixel data from display device.",
00221 TCL_STATIC);
00222 return TCL_ERROR;
00223 }
00224
00225
00226
00227 Tk_PhotoImageBlock blk = {
00228 img+3*xs*(ys-1),
00229 xs,
00230 ys,
00231 -3*xs,
00232 3,
00233 {0,1,2,3}
00234 };
00235
00236
00237
00238
00239
00240
00241 #if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION < 5
00242 Tk_PhotoSetSize(handle, xs, ys);
00243 Tk_PhotoPutBlock(handle, &blk, 0, 0, xs, ys, TK_PHOTO_COMPOSITE_SET);
00244 #else
00245 Tk_PhotoSetSize(interp, handle, xs, ys);
00246 Tk_PhotoPutBlock(interp, handle, &blk, 0, 0, xs, ys, TK_PHOTO_COMPOSITE_SET);
00247 #endif
00248 free(img);
00249 return TCL_OK;
00250 }
00251
00252 #endif
00253
00254