diff --git a/Common/Context.h b/Common/Context.h index ab570ec0080f58d69f0b4ef8930069f646500dc4..5fcef16d91dee9b0e8129c05089e8d450ae7bf80 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -219,13 +219,13 @@ class CTX { }solver; // print options struct{ - int fileFormat, epsQuality, epsBackground, epsCompress, epsPS3Shading; + int fileFormat, epsQuality, epsCompress, epsPS3Shading; int epsOcclusionCulling, epsBestRoot; double epsLineWidthFactor, epsPointSizeFactor; int jpegQuality, jpegSmoothing, geoLabels, text, texAsEquation; int gifDither, gifSort, gifInterlace, gifTransparent; int posElementary, posElement, posGamma, posEta, posRho, posDisto; - int compositeWindows, deleteTmpFiles; + int compositeWindows, deleteTmpFiles, background; } print; // color options struct{ diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp index 7e14e143719b873b114bf336ac3884897d27f057..7495bd0875d3d3a777dabd6260e5b7fbf940db10 100644 --- a/Common/CreateFile.cpp +++ b/Common/CreateFile.cpp @@ -158,7 +158,7 @@ static PixelBuffer *GetCompositePixelBuffer(GLenum format, GLenum type) } #endif -void CreateOutputFile(std::string fileName, int format) +void CreateOutputFile(std::string fileName, int format, bool redraw) { if(fileName.empty()) fileName = GetDefaultFileName(format); @@ -166,17 +166,15 @@ void CreateOutputFile(std::string fileName, int format) int oldFormat = CTX::instance()->print.fileFormat; CTX::instance()->print.fileFormat = format; CTX::instance()->printing = 1; + bool error = false; - if(format != FORMAT_AUTO) + if(redraw) Msg::StatusBar(2, true, "Writing '%s'...", fileName.c_str()); - bool printEndMessage = true; - switch (format) { case FORMAT_AUTO: - CreateOutputFile(fileName, GuessFileFormatFromFileName(fileName)); - printEndMessage = false; + CreateOutputFile(fileName, GuessFileFormatFromFileName(fileName), false); break; case FORMAT_OPT: @@ -310,17 +308,12 @@ void CreateOutputFile(std::string fileName, int format) FILE *fp = fopen(fileName.c_str(), "wb"); if(!fp){ Msg::Error("Unable to open file '%s'", fileName.c_str()); + error = true; break; } - int oldGradient = CTX::instance()->bgGradient; - if(format == FORMAT_GIF && CTX::instance()->print.gifTransparent) - CTX::instance()->bgGradient = 0; - PixelBuffer *buffer = GetCompositePixelBuffer(GL_RGB, GL_UNSIGNED_BYTE); - CTX::instance()->bgGradient = oldGradient; - if(format == FORMAT_PPM) create_ppm(fp, buffer); else if(format == FORMAT_YUV) @@ -330,10 +323,7 @@ void CreateOutputFile(std::string fileName, int format) CTX::instance()->print.gifDither, CTX::instance()->print.gifSort, CTX::instance()->print.gifInterlace, - CTX::instance()->print.gifTransparent, - CTX::instance()->unpackRed(CTX::instance()->color.bg), - CTX::instance()->unpackGreen(CTX::instance()->color.bg), - CTX::instance()->unpackBlue(CTX::instance()->color.bg)); + CTX::instance()->print.gifTransparent); else if(format == FORMAT_JPEG) create_jpeg(fp, buffer, CTX::instance()->print.jpegQuality, CTX::instance()->print.jpegSmoothing); @@ -355,6 +345,7 @@ void CreateOutputFile(std::string fileName, int format) FILE *fp = fopen(fileName.c_str(), "wb"); if(!fp){ Msg::Error("Unable to open file '%s'", fileName.c_str()); + error = true; break; } std::string base = SplitFileName(fileName)[1]; @@ -362,9 +353,6 @@ void CreateOutputFile(std::string fileName, int format) GLint height = FlGui::instance()->getCurrentOpenglWindow()->h(); GLint viewport[4] = {0, 0, width, height}; - int oldGradient = CTX::instance()->bgGradient; - if(!CTX::instance()->print.epsBackground) CTX::instance()->bgGradient = 0; - PixelBuffer buffer(width, height, GL_RGB, GL_FLOAT); if(CTX::instance()->print.epsQuality == 0) @@ -383,7 +371,7 @@ void CreateOutputFile(std::string fileName, int format) GL2PS_SIMPLE_LINE_OFFSET | GL2PS_SILENT | (CTX::instance()->print.epsOcclusionCulling ? GL2PS_OCCLUSION_CULL : 0) | (CTX::instance()->print.epsBestRoot ? GL2PS_BEST_ROOT : 0) | - (CTX::instance()->print.epsBackground ? GL2PS_DRAW_BACKGROUND : 0) | + (CTX::instance()->print.background ? GL2PS_DRAW_BACKGROUND : 0) | (CTX::instance()->print.epsCompress ? GL2PS_COMPRESS : 0) | (CTX::instance()->print.epsPS3Shading ? 0 : GL2PS_NO_PS3_SHADING); @@ -417,7 +405,6 @@ void CreateOutputFile(std::string fileName, int format) res = gl2psEndPage(); } - CTX::instance()->bgGradient = oldGradient; fclose(fp); } break; @@ -429,6 +416,7 @@ void CreateOutputFile(std::string fileName, int format) FILE *fp = fopen(fileName.c_str(), "w"); if(!fp){ Msg::Error("Unable to open file '%s'", fileName.c_str()); + error = true; break; } std::string base = SplitFileName(fileName)[1]; @@ -460,6 +448,7 @@ void CreateOutputFile(std::string fileName, int format) FILE *fp = fopen(parFileName.c_str(), "w"); if(!fp){ Msg::Error("Unable to open file '%s'", parFileName.c_str()); + error = true; break; } int numViews = (int)opt_post_nb_views(0, GMSH_GET, 0), numSteps = 0; @@ -475,10 +464,11 @@ void CreateOutputFile(std::string fileName, int format) sprintf(tmp, ".gmsh-%06d.ppm", (int)frames.size()); frames.push_back(tmp); } - status_play_manual(!CTX::instance()->post.animCycle, 0); + status_play_manual(!CTX::instance()->post.animCycle, 0, false); for(unsigned int i = 0; i < frames.size(); i++){ - CreateOutputFile(CTX::instance()->homeDir + frames[i], FORMAT_PPM); - status_play_manual(!CTX::instance()->post.animCycle, CTX::instance()->post.animStep); + CreateOutputFile(CTX::instance()->homeDir + frames[i], FORMAT_PPM, false); + status_play_manual(!CTX::instance()->post.animCycle, + CTX::instance()->post.animStep, false); } int repeat = (int)(CTX::instance()->post.animDelay * 24); if(repeat < 1) repeat = 1; @@ -505,8 +495,9 @@ void CreateOutputFile(std::string fileName, int format) try{ mpeg_encode_main(2, args); } - catch (const char *error){ - Msg::Error("mpeg_encode: %s", error); + catch (const char *msg){ + Msg::Error("%s", msg); + error = true; } if(opt_print_delete_tmp_files(0, GMSH_GET, 0)){ UnlinkFile(parFileName); @@ -520,17 +511,18 @@ void CreateOutputFile(std::string fileName, int format) #endif default: - Msg::Error("Unknown output file format %d", format); - printEndMessage = false; + Msg::Error("Unknown output file format"); + error = true; break; } - if(printEndMessage) Msg::StatusBar(2, true, "Done writing '%s'", fileName.c_str()); - CTX::instance()->print.fileFormat = oldFormat; CTX::instance()->printing = 0; + if(redraw && !error) + Msg::StatusBar(2, true, "Done writing '%s'", fileName.c_str()); + #if defined(HAVE_OPENGL) - drawContext::global()->draw(); + if(redraw) drawContext::global()->draw(); #endif } diff --git a/Common/CreateFile.h b/Common/CreateFile.h index 37304f6be61a79d9e7cbd6ec15cc6dd06a755548..7b6d67883d3ccdb5845564bdd023784464c201e5 100644 --- a/Common/CreateFile.h +++ b/Common/CreateFile.h @@ -10,6 +10,6 @@ int GuessFileFormatFromFileName(std::string fileName); std::string GetDefaultFileName(int format); -void CreateOutputFile(std::string fileName, int format); +void CreateOutputFile(std::string fileName, int format, bool redraw=true); #endif diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 016a7600023833cf35b03b6e89f713d16bbabaad..075cf12384be46e48aa9ef54f55b4ab1e833884c 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -1366,14 +1366,15 @@ StringXNumber ViewOptions_Number[] = { } ; StringXNumber PrintOptions_Number[] = { + { F|O, "Background" , opt_print_background , 0. , + "Print background?" }, + { F|O, "CompositeWindows" , opt_print_composite_windows , 0. , "Composite all window tiles in the same output image (for bitmap output only)" }, { F|O, "DeleteTemporaryFiles" , opt_print_delete_tmp_files , 1. , "Delete temporary files used during printing" }, - { F|O, "EpsBackground" , opt_print_eps_background , 1. , - "Save image background in PostScript/PDF output" }, { F|O, "EpsBestRoot" , opt_print_eps_best_root , 1. , "Try to minimize primitive splitting in BSP tree sorted PostScript/PDF output" }, { F|O, "EpsCompress" , opt_print_eps_compress , 0. , diff --git a/Common/Options.cpp b/Common/Options.cpp index e61cd42844c291ea3133d87eb4bfbb0b2b6eb48e..58bfd6e0abdfc5aeac48a8fbab81e0b03224a11a 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -7746,13 +7746,6 @@ double opt_print_eps_best_root(OPT_ARGS_NUM) return CTX::instance()->print.epsBestRoot; } -double opt_print_eps_background(OPT_ARGS_NUM) -{ - if(action & GMSH_SET) - CTX::instance()->print.epsBackground = (int)val; - return CTX::instance()->print.epsBackground; -} - double opt_print_eps_line_width_factor(OPT_ARGS_NUM) { if(action & GMSH_SET) @@ -7858,6 +7851,13 @@ double opt_print_gif_transparent(OPT_ARGS_NUM) return CTX::instance()->print.gifTransparent; } +double opt_print_background(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->print.background = (int)val; + return CTX::instance()->print.background; +} + double opt_print_text(OPT_ARGS_NUM) { if(action & GMSH_SET) diff --git a/Common/Options.h b/Common/Options.h index b576f0712671017659ec5108f76e6e1a3282f2b6..7979e94e0790fd08e9bf3229cd0a82b069ad47eb 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -577,7 +577,6 @@ double opt_print_eps_ps3shading(OPT_ARGS_NUM); double opt_print_eps_quality(OPT_ARGS_NUM); double opt_print_eps_occlusion_culling(OPT_ARGS_NUM); double opt_print_eps_best_root(OPT_ARGS_NUM); -double opt_print_eps_background(OPT_ARGS_NUM); double opt_print_eps_line_width_factor(OPT_ARGS_NUM); double opt_print_eps_point_size_factor(OPT_ARGS_NUM); double opt_print_jpeg_quality(OPT_ARGS_NUM); @@ -593,6 +592,7 @@ double opt_print_gif_dither(OPT_ARGS_NUM); double opt_print_gif_sort(OPT_ARGS_NUM); double opt_print_gif_interlace(OPT_ARGS_NUM); double opt_print_gif_transparent(OPT_ARGS_NUM); +double opt_print_background(OPT_ARGS_NUM); double opt_print_text(OPT_ARGS_NUM); double opt_print_tex_as_equation(OPT_ARGS_NUM); double opt_print_composite_windows(OPT_ARGS_NUM); diff --git a/Common/onelab.h b/Common/onelab.h index 2fa9b05f6bbe36ac3fa8e8a82aae5a6520bc20ee..8f49f54bacb0788a7452208e791f6eeed8421bea 100644 --- a/Common/onelab.h +++ b/Common/onelab.h @@ -494,10 +494,11 @@ namespace onelab{ const std::string &client=""){ return _get(ps, name, client, _regions); } bool get(std::vector<function> &ps, const std::string &name="", const std::string &client=""){ return _get(ps, name, client, _functions); } - // check if at least one parameter depends on the given client - int NumParam(){ + unsigned int getNumParameters() + { return _numbers.size() + _strings.size() + _regions.size() + _functions.size(); } + // check if at least one parameter depends on the given client bool hasClient(const std::string &client) const { std::set<parameter*> ps; @@ -633,7 +634,7 @@ namespace onelab{ { return _parameterSpace.toChar(client); } - int NumParam(){ return _parameterSpace.NumParam();} + unsigned int getNumParameters(){ return _parameterSpace.getNumParameters(); } }; class localClient : public client{ diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp index 162159ab421268ba0bda0edf056e89e0daa34a66..7f5fb23d668117345fef65060d3ea50459227c96 100644 --- a/Fltk/FlGui.cpp +++ b/Fltk/FlGui.cpp @@ -194,6 +194,12 @@ FlGui::FlGui(int argc, char **argv) : _openedThroughMacFinder(false) if(CTX::instance()->display.size()) Fl::display(CTX::instance()->display.c_str()); +#if 0 // dark scheme... not bad, but needs work + Fl::background(60, 60, 60); + Fl::background2(120, 120, 120); + Fl::foreground(200, 200, 200); +#endif + // add global shortcuts Fl::add_handler(globalShortcut); diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp index b49431fad557f4fe351d4718c32db767b59aa2ae..1b0a4482401357cd7ede28b57357b57a0d922b37 100644 --- a/Fltk/fileDialogs.cpp +++ b/Fltk/fileDialogs.cpp @@ -183,14 +183,14 @@ int genericBitmapFileDialog(const char *name, const char *title, int format) { struct _genericBitmapFileDialog{ Fl_Window *window; - Fl_Check_Button *b[2]; + Fl_Check_Button *b[3]; Fl_Button *ok, *cancel; }; static _genericBitmapFileDialog *dialog = NULL; if(!dialog){ dialog = new _genericBitmapFileDialog; - int h = 3 * WB + 3 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 4 * BH, w = 2 * BB + 3 * WB, y = WB; dialog->window = new Fl_Double_Window(w, h); dialog->window->box(GMSH_WINDOW_BOX); dialog->window->set_modal(); @@ -198,8 +198,11 @@ int genericBitmapFileDialog(const char *name, const char *title, int format) (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH; dialog->b[0]->type(FL_TOGGLE_BUTTON); dialog->b[1] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; + (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; dialog->b[1]->type(FL_TOGGLE_BUTTON); + dialog->b[2] = new Fl_Check_Button + (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; + dialog->b[2]->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); dialog->window->end(); @@ -208,7 +211,8 @@ int genericBitmapFileDialog(const char *name, const char *title, int format) dialog->window->label(title); dialog->b[0]->value(CTX::instance()->print.text); - dialog->b[1]->value(CTX::instance()->print.compositeWindows); + dialog->b[1]->value(CTX::instance()->print.background); + dialog->b[2]->value(CTX::instance()->print.compositeWindows); dialog->window->show(); while(dialog->window->shown()){ @@ -218,7 +222,8 @@ int genericBitmapFileDialog(const char *name, const char *title, int format) if (!o) break; if (o == dialog->ok) { opt_print_text(0, GMSH_SET | GMSH_GUI, (int)dialog->b[0]->value()); - opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); + opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); + opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[2]->value()); CreateOutputFile(name, format); dialog->window->hide(); return 1; @@ -288,14 +293,14 @@ int jpegFileDialog(const char *name) struct _jpegFileDialog{ Fl_Window *window; Fl_Value_Slider *s[2]; - Fl_Check_Button *b[2]; + Fl_Check_Button *b[3]; Fl_Button *ok, *cancel; }; static _jpegFileDialog *dialog = NULL; if(!dialog){ dialog = new _jpegFileDialog; - int h = 3 * WB + 5 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 6 * BH, w = 2 * BB + 3 * WB, y = WB; dialog->window = new Fl_Double_Window(w, h, "JPEG Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->window->set_modal(); @@ -315,8 +320,11 @@ int jpegFileDialog(const char *name) (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH; dialog->b[0]->type(FL_TOGGLE_BUTTON); dialog->b[1] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; + (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; dialog->b[1]->type(FL_TOGGLE_BUTTON); + dialog->b[2] = new Fl_Check_Button + (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; + dialog->b[2]->type(FL_TOGGLE_BUTTON); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); dialog->window->end(); @@ -326,7 +334,8 @@ int jpegFileDialog(const char *name) dialog->s[0]->value(CTX::instance()->print.jpegQuality); dialog->s[1]->value(CTX::instance()->print.jpegSmoothing); dialog->b[0]->value(CTX::instance()->print.text); - dialog->b[1]->value(CTX::instance()->print.compositeWindows); + dialog->b[1]->value(CTX::instance()->print.background); + dialog->b[2]->value(CTX::instance()->print.compositeWindows); dialog->window->show(); while(dialog->window->shown()){ @@ -338,7 +347,8 @@ int jpegFileDialog(const char *name) opt_print_jpeg_quality(0, GMSH_SET | GMSH_GUI, (int)dialog->s[0]->value()); opt_print_jpeg_smoothing(0, GMSH_SET | GMSH_GUI, (int)dialog->s[1]->value()); opt_print_text(0, GMSH_SET | GMSH_GUI, (int)dialog->b[0]->value()); - opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); + opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); + opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[2]->value()); CreateOutputFile(name, FORMAT_JPEG); dialog->window->hide(); return 1; @@ -359,7 +369,7 @@ int mpegFileDialog(const char *name) struct _mpegFileDialog{ Fl_Window *window; Fl_Round_Button *b[2]; - Fl_Check_Button *c[2]; + Fl_Check_Button *c[3]; Fl_Value_Input *v[2]; Fl_Button *ok, *cancel; }; @@ -367,7 +377,7 @@ int mpegFileDialog(const char *name) if(!dialog){ dialog = new _mpegFileDialog; - int h = 3 * WB + 7 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 8 * BH, w = 2 * BB + 3 * WB, y = WB; dialog->window = new Fl_Double_Window(w, h, "MPEG Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->window->set_modal(); @@ -397,13 +407,17 @@ int mpegFileDialog(const char *name) dialog->v[1]->align(FL_ALIGN_RIGHT); dialog->c[0] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; + (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; dialog->c[0]->type(FL_TOGGLE_BUTTON); dialog->c[1] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Delete temporary files"); y += BH; + (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; dialog->c[1]->type(FL_TOGGLE_BUTTON); + dialog->c[2] = new Fl_Check_Button + (WB, y, 2 * BB + WB, BH, "Delete temporary files"); y += BH; + dialog->c[2]->type(FL_TOGGLE_BUTTON); + dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); dialog->window->end(); @@ -414,8 +428,9 @@ int mpegFileDialog(const char *name) dialog->b[1]->value(CTX::instance()->post.animCycle); dialog->v[0]->value(CTX::instance()->post.animDelay); dialog->v[1]->value(CTX::instance()->post.animStep); - dialog->c[0]->value(CTX::instance()->print.compositeWindows); - dialog->c[1]->value(CTX::instance()->print.deleteTmpFiles); + dialog->c[0]->value(CTX::instance()->print.background); + dialog->c[1]->value(CTX::instance()->print.compositeWindows); + dialog->c[2]->value(CTX::instance()->print.deleteTmpFiles); dialog->window->show(); while(dialog->window->shown()){ @@ -427,8 +442,9 @@ int mpegFileDialog(const char *name) opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); opt_post_anim_delay(0, GMSH_SET | GMSH_GUI, dialog->v[0]->value()); opt_post_anim_step(0, GMSH_SET | GMSH_GUI, (int)dialog->v[1]->value()); - opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->c[0]->value()); - opt_print_delete_tmp_files(0, GMSH_SET | GMSH_GUI, (int)dialog->c[1]->value()); + opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->c[0]->value()); + opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->c[1]->value()); + opt_print_delete_tmp_files(0, GMSH_SET | GMSH_GUI, (int)dialog->c[2]->value()); CreateOutputFile(name, FORMAT_MPEG); dialog->window->hide(); return 1; @@ -448,14 +464,14 @@ int gifFileDialog(const char *name) { struct _gifFileDialog{ Fl_Window *window; - Fl_Check_Button *b[6]; + Fl_Check_Button *b[7]; Fl_Button *ok, *cancel; }; static _gifFileDialog *dialog = NULL; if(!dialog){ dialog = new _gifFileDialog; - int h = 3 * WB + 7 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 8 * BH, w = 2 * BB + 3 * WB, y = WB; dialog->window = new Fl_Double_Window(w, h, "GIF Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->window->set_modal(); @@ -470,8 +486,10 @@ int gifFileDialog(const char *name) dialog->b[4] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH; dialog->b[5] = new Fl_Check_Button + (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; + dialog->b[6] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; - for(int i = 0; i < 6; i++){ + for(int i = 0; i < 7; i++){ dialog->b[i]->type(FL_TOGGLE_BUTTON); } dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); @@ -485,7 +503,8 @@ int gifFileDialog(const char *name) dialog->b[2]->value(CTX::instance()->print.gifSort); dialog->b[3]->value(CTX::instance()->print.gifTransparent); dialog->b[4]->value(CTX::instance()->print.text); - dialog->b[5]->value(CTX::instance()->print.compositeWindows); + dialog->b[5]->value(CTX::instance()->print.background); + dialog->b[6]->value(CTX::instance()->print.compositeWindows); dialog->window->show(); while(dialog->window->shown()){ @@ -499,7 +518,8 @@ int gifFileDialog(const char *name) opt_print_gif_sort(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value()); opt_print_gif_transparent(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value()); opt_print_text(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value()); - opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value()); + opt_print_background(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value()); + opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, dialog->b[6]->value()); CreateOutputFile(name, FORMAT_GIF); dialog->window->hide(); return 1; @@ -581,15 +601,15 @@ int gl2psFileDialog(const char *name, const char *title, int format) dialog->b[0] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Compress"); y += BH; dialog->b[1] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; - dialog->b[2] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Remove hidden primitives"); y += BH; - dialog->b[3] = new Fl_Check_Button + dialog->b[2] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Optimize BSP tree"); y += BH; - dialog->b[4] = new Fl_Check_Button + dialog->b[3] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Use level 3 shading"); y += BH; - dialog->b[5] = new Fl_Check_Button + dialog->b[4] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH; + dialog->b[5] = new Fl_Check_Button + (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; for(int i = 0; i < 6; i++){ dialog->b[i]->type(FL_TOGGLE_BUTTON); } @@ -602,11 +622,11 @@ int gl2psFileDialog(const char *name, const char *title, int format) dialog->window->label(title); dialog->c->value(CTX::instance()->print.epsQuality); dialog->b[0]->value(CTX::instance()->print.epsCompress); - dialog->b[1]->value(CTX::instance()->print.epsBackground); - dialog->b[2]->value(CTX::instance()->print.epsOcclusionCulling); - dialog->b[3]->value(CTX::instance()->print.epsBestRoot); - dialog->b[4]->value(CTX::instance()->print.epsPS3Shading); - dialog->b[5]->value(CTX::instance()->print.text); + dialog->b[1]->value(CTX::instance()->print.epsOcclusionCulling); + dialog->b[2]->value(CTX::instance()->print.epsBestRoot); + dialog->b[3]->value(CTX::instance()->print.epsPS3Shading); + dialog->b[4]->value(CTX::instance()->print.text); + dialog->b[5]->value(CTX::instance()->print.background); activate_gl2ps_choices(format, CTX::instance()->print.epsQuality, dialog->b); @@ -624,11 +644,11 @@ int gl2psFileDialog(const char *name, const char *title, int format) if (o == dialog->ok) { opt_print_eps_quality(0, GMSH_SET | GMSH_GUI, dialog->c->value()); opt_print_eps_compress(0, GMSH_SET | GMSH_GUI, dialog->b[0]->value()); - opt_print_eps_background(0, GMSH_SET | GMSH_GUI, dialog->b[1]->value()); - opt_print_eps_occlusion_culling(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value()); - opt_print_eps_best_root(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value()); - opt_print_eps_ps3shading(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value()); - opt_print_text(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value()); + opt_print_eps_occlusion_culling(0, GMSH_SET | GMSH_GUI, dialog->b[1]->value()); + opt_print_eps_best_root(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value()); + opt_print_eps_ps3shading(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value()); + opt_print_text(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value()); + opt_print_background(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value()); CreateOutputFile(name, format); dialog->window->hide(); return 1; diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp index 474fa605fc1d3f0c16461a6cc9e4f2c8913e674f..6ef2986580c07c4fe325b1642a3cab2228db442c 100644 --- a/Fltk/graphicWindow.cpp +++ b/Fltk/graphicWindow.cpp @@ -321,7 +321,7 @@ void status_options_cb(Fl_Widget *w, void *data) static int stop_anim = 0, view_in_cycle = -1; -void status_play_manual(int time, int incr) +void status_play_manual(int time, int incr, bool redraw) { // avoid firing this routine recursively (can happen e.g when // keeping the finger down on the arrow key: if the system generates @@ -371,7 +371,7 @@ void status_play_manual(int time, int incr) opt_view_visible(i, GMSH_SET | GMSH_GUI, (i == view_in_cycle)); } } - drawContext::global()->draw(); + if(redraw) drawContext::global()->draw(); busy = false; } diff --git a/Fltk/graphicWindow.h b/Fltk/graphicWindow.h index 865043487b74054d8ad9a63167fd5fbb572f9f0b..9b1f96b4d16df695b926da363759980220baddf6 100644 --- a/Fltk/graphicWindow.h +++ b/Fltk/graphicWindow.h @@ -47,7 +47,7 @@ class graphicWindow{ void status_xyz1p_cb(Fl_Widget *w, void *data); void status_options_cb(Fl_Widget *w, void *data); -void status_play_manual(int time, int incr); +void status_play_manual(int time, int incr, bool redraw=true); void message_cb(Fl_Widget *w, void *data); #endif diff --git a/Fltk/openglWindow.cpp b/Fltk/openglWindow.cpp index 6814e4b242ea272a82276dd88b2dae5d8a3cb83b..379af979468af564ab8293344522f482081aed0f 100644 --- a/Fltk/openglWindow.cpp +++ b/Fltk/openglWindow.cpp @@ -192,11 +192,14 @@ void openglWindow::draw() } else{ // draw the whole scene - glClearColor - ((GLclampf)(CTX::instance()->unpackRed(CTX::instance()->color.bg) / 255.), - (GLclampf)(CTX::instance()->unpackGreen(CTX::instance()->color.bg) / 255.), - (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), - 0.0F); + if(CTX::instance()->printing && !CTX::instance()->print.background) + glClearColor(1.0F, 1.0F, 1.0F, 0.0F); + else + glClearColor + ((GLclampf)(CTX::instance()->unpackRed(CTX::instance()->color.bg) / 255.), + (GLclampf)(CTX::instance()->unpackGreen(CTX::instance()->color.bg) / 255.), + (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), + 0.0F); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); if(CTX::instance()->camera && !CTX::instance()->stereo){ diff --git a/Graphics/PixelBuffer.h b/Graphics/PixelBuffer.h index c07eba7f3d191c4cacdc9ae5bcca0789a1c2f45e..f707084cf8de5e393601419aa0c759f1c82dd2d1 100644 --- a/Graphics/PixelBuffer.h +++ b/Graphics/PixelBuffer.h @@ -96,6 +96,8 @@ class PixelBuffer{ void fill(int offscreen) { if(!offscreen){ + // workaround double buffering issues by redrawing twice + drawContext::global()->drawCurrentOpenglWindow(true); drawContext::global()->drawCurrentOpenglWindow(true); glFinish(); glPixelStorei(GL_PACK_ALIGNMENT, 1); diff --git a/Graphics/drawContext.cpp b/Graphics/drawContext.cpp index a4dd4ec4e1e158c641e9231e725281cbcbf46d7a..d1efb9f56a1eb073ddebf95d777503aca05a5105 100644 --- a/Graphics/drawContext.cpp +++ b/Graphics/drawContext.cpp @@ -496,8 +496,9 @@ void drawContext::initProjection(int xpick, int ypick, int wpick, int hpick) (GLdouble)wpick, (GLdouble)hpick, (GLint *)viewport); // draw background if not in selection mode - if(render_mode != GMSH_SELECT && (CTX::instance()->bgGradient || - CTX::instance()->bgImageFileName.size())){ + if(render_mode != GMSH_SELECT && + (CTX::instance()->bgGradient || CTX::instance()->bgImageFileName.size()) && + (!CTX::instance()->printing || CTX::instance()->print.background)){ glDisable(GL_DEPTH_TEST); glPushMatrix(); glLoadIdentity(); diff --git a/Graphics/gl2gif.cpp b/Graphics/gl2gif.cpp index 7b870f64459797d7f8b6a9370af27d473c55cbdd..21151dc2d6e664249149f5a38b512e1c65346ceb 100644 --- a/Graphics/gl2gif.cpp +++ b/Graphics/gl2gif.cpp @@ -1147,7 +1147,7 @@ static void GIFEncode(FILE * fp, void create_gif(FILE * outfile, PixelBuffer *buffer, int dither, int sort, int interlace, - int transparency, int bg_r, int bg_g, int bg_b) + int transparency) { int i, j, k, transparent, rows, cols; @@ -1438,9 +1438,9 @@ void create_gif(FILE * outfile, PixelBuffer *buffer, static_cht = ppm_colorhisttocolorhash(chv, static_nbcolors); ppm_freecolorhist(chv); - /* figure out the transparent colour index */ + /* figure out the transparent colour index, assuming the background is white */ if(transparency) { - PPM_ASSIGN(transcolor, bg_r, bg_g, bg_b); + PPM_ASSIGN(transcolor, 255, 255, 255); transparent = ppm_lookupcolor(static_cht, &transcolor); if(transparent == -1) transparent = closestcolor(transcolor); diff --git a/Graphics/gl2gif.h b/Graphics/gl2gif.h index 923991dbc618b0c102a2a0de3f0a90c418479672..c10394c7a58a2d5bf0496fc7bf8320965f24d37c 100644 --- a/Graphics/gl2gif.h +++ b/Graphics/gl2gif.h @@ -58,7 +58,7 @@ typedef colorhist_list* colorhash_table; void create_gif(FILE *outfile, PixelBuffer *buffer, int dither, int sort, int interlace, - int transparency, int r, int g, int b); + int transparency); #endif diff --git a/Post/PViewVertexArrays.cpp b/Post/PViewVertexArrays.cpp index 97990fdc2e23ead89a58a6685ce6a4a8e47881f3..9a9aab480d52619c9e7add97c667360684373773 100644 --- a/Post/PViewVertexArrays.cpp +++ b/Post/PViewVertexArrays.cpp @@ -1383,12 +1383,12 @@ class initPView { p->va_vectors->finalize(); p->va_ellipses->finalize(); - Msg::Info("%d vertices in vertex arrays (%g Mb)", p->va_points->getNumVertices() + - p->va_lines->getNumVertices() + p->va_triangles->getNumVertices() + - p->va_vectors->getNumVertices() + p->va_ellipses->getNumVertices(), - p->va_points->getMemoryInMb() + - p->va_lines->getMemoryInMb() + p->va_triangles->getMemoryInMb() + - p->va_vectors->getMemoryInMb() + p->va_ellipses->getMemoryInMb()); + Msg::Debug("%d vertices in vertex arrays (%g Mb)", p->va_points->getNumVertices() + + p->va_lines->getNumVertices() + p->va_triangles->getNumVertices() + + p->va_vectors->getNumVertices() + p->va_ellipses->getNumVertices(), + p->va_points->getMemoryInMb() + + p->va_lines->getMemoryInMb() + p->va_triangles->getMemoryInMb() + + p->va_vectors->getMemoryInMb() + p->va_ellipses->getMemoryInMb()); p->setChanged(false); }