diff --git a/src/Gui/DlgSettingsImage.ui b/src/Gui/DlgSettingsImage.ui index ea478962b0..5dcf0ffb0d 100644 --- a/src/Gui/DlgSettingsImage.ui +++ b/src/Gui/DlgSettingsImage.ui @@ -61,11 +61,6 @@ Black - - - Transparent - - diff --git a/src/Gui/Thumbnail.cpp b/src/Gui/Thumbnail.cpp index ac0d4490ed..9aeab3660e 100644 --- a/src/Gui/Thumbnail.cpp +++ b/src/Gui/Thumbnail.cpp @@ -92,7 +92,7 @@ void Thumbnail::SaveDocFile (Base::Writer &writer) const } else { try { - this->viewer->savePicture(this->size, this->size, View3DInventorViewer::Current, img); + this->viewer->savePicture(this->size, this->size, QColor(), img); } catch (...) { this->createThumbnailFromFramebuffer(img); diff --git a/src/Gui/View3DInventor.cpp b/src/Gui/View3DInventor.cpp index cd3abf6c97..3e5f56e1e0 100644 --- a/src/Gui/View3DInventor.cpp +++ b/src/Gui/View3DInventor.cpp @@ -518,7 +518,8 @@ void View3DInventor::print(QPrinter* printer) ps = SoVectorizeAction::A4; break; } - _viewer->saveGraphic(ps,View3DInventorViewer::White,&action); + QColor c = Qt::white; + _viewer->saveGraphic(ps,c,&action); out->closeFile(); QSvgRenderer svg; if (svg.load(QString::fromUtf8(tmp.c_str()))) { @@ -537,7 +538,7 @@ void View3DInventor::print(QPrinter* printer) } else { try { - _viewer->savePicture(rect.width(), rect.height(), View3DInventorViewer::White, img); + _viewer->savePicture(rect.width(), rect.height(), QColor(Qt::white), img); } catch (...) { previewFromFramebuffer(rect, img); diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 3ac38d7bc3..504532ab0e 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -796,7 +796,7 @@ void View3DInventorViewer::setSceneGraph(SoNode* root) } } -void View3DInventorViewer::savePicture(int w, int h, int eBackgroundType, QImage& img) const +void View3DInventorViewer::savePicture(int w, int h, const QColor& bg, QImage& img) const { // if no valid color use the current background bool useBackground = false; @@ -813,9 +813,8 @@ void View3DInventorViewer::savePicture(int w, int h, int eBackgroundType, QImage renderer.setViewportRegion(vp); SoCallback* cb = 0; - // if we use transparency then we must not set a background color - switch (eBackgroundType) { - case Current: + // for an invalid color use the viewer's current background color + if (!bg.isValid()) { if (backgroundroot->findChild(pcBackGround) == -1) { const QColor col = this->backgroundColor(); renderer.setBackgroundColor(SbColor(col.redF(), col.greenF(), col.blueF())); @@ -825,22 +824,9 @@ void View3DInventorViewer::savePicture(int w, int h, int eBackgroundType, QImage cb = new SoCallback; cb->setCallback(clearBufferCB); } - break; - - case White: - renderer.setBackgroundColor(SbColor(1.0, 1.0, 1.0)); - break; - - case Black: - renderer.setBackgroundColor(SbColor(0.0, 0.0, 0.0)); - break; - - case Transparent: - renderer.setComponents(SoFCOffscreenRenderer::RGB_TRANSPARENCY); - break; - - default: - break; + } + else { + renderer.setBackgroundColor(SbColor(bg.redF(), bg.greenF(), bg.blueF())); } SoSeparator* root = new SoSeparator; @@ -888,29 +874,10 @@ void View3DInventorViewer::savePicture(int w, int h, int eBackgroundType, QImage } } -void View3DInventorViewer::saveGraphic(int pagesize, int eBackgroundType, SoVectorizeAction* va) const +void View3DInventorViewer::saveGraphic(int pagesize, const QColor& bgcolor, SoVectorizeAction* va) const { - const QColor col = this->backgroundColor(); - - switch(eBackgroundType) { - case Current: - va->setBackgroundColor(true, SbColor(col.redF(), col.greenF(), col.blueF())); - break; - - case White: - va->setBackgroundColor(true, SbColor(1.0, 1.0, 1.0)); - break; - - case Black: - va->setBackgroundColor(true, SbColor(0.0, 0.0, 0.0)); - break; - - case Transparent: - break; // not supported - - default: - break; - } + if (bgcolor.isValid()) + va->setBackgroundColor(true, SbColor(bgcolor.redF(), bgcolor.greenF(), bgcolor.blueF())); float border = 10.0f; SbVec2s vpsize = this->getSoRenderManager()->getViewportRegion().getViewportSizePixels(); @@ -1069,9 +1036,9 @@ bool View3DInventorViewer::dumpToFile(const char* filename, bool binary) const Base::FileInfo fi(filename); // Write VRML V2.0 - if(fi.hasExtension("wrl") || fi.hasExtension("vrml") || fi.hasExtension("wrz")) { + if (fi.hasExtension("wrl") || fi.hasExtension("vrml") || fi.hasExtension("wrz")) { // If 'wrz' is set then force compression - if(fi.hasExtension("wrz")) + if (fi.hasExtension("wrz")) binary = true; SoToVRML2Action tovrml2; @@ -1081,7 +1048,7 @@ bool View3DInventorViewer::dumpToFile(const char* filename, bool binary) const std::string buffer = SoFCDB::writeNodesToString(vrmlRoot); vrmlRoot->unref(); // release the memory as soon as possible - if(binary) { + if (binary) { // We want to write compressed VRML but Coin 2.4.3 doesn't do it even though // SoOutput::getAvailableCompressionMethods() delivers a string list that // contains 'GZIP'. setCompression() was called directly after opening the file, @@ -1091,7 +1058,7 @@ bool View3DInventorViewer::dumpToFile(const char* filename, bool binary) const Base::ofstream str(fi, std::ios::out | std::ios::binary); zipios::GZIPOutputStream gzip(str); - if(gzip) { + if (gzip) { gzip << buffer; gzip.close(); ret = true; @@ -1107,11 +1074,12 @@ bool View3DInventorViewer::dumpToFile(const char* filename, bool binary) const } } } - else if(fi.hasExtension("idtf") || fi.hasExtension("svg")) { - int ps=4, t=2; + else if (fi.hasExtension("idtf") || fi.hasExtension("svg")) { + int ps=4; + QColor c = Qt::white; std::auto_ptr vo; - if(fi.hasExtension("svg")) { + if (fi.hasExtension("svg")) { vo = std::auto_ptr(new SoFCVectorizeSVGAction()); } else if(fi.hasExtension("idtf")) { @@ -1123,13 +1091,13 @@ bool View3DInventorViewer::dumpToFile(const char* filename, bool binary) const SoVectorOutput* out = vo->getOutput(); - if(!out || !out->openFile(filename)) { + if (!out || !out->openFile(filename)) { std::ostringstream a_out; a_out << "Cannot open file '" << filename << "'"; throw Base::Exception(a_out.str()); } - saveGraphic(ps,t,vo.get()); + saveGraphic(ps,c,vo.get()); out->closeFile(); } else { @@ -1137,7 +1105,7 @@ bool View3DInventorViewer::dumpToFile(const char* filename, bool binary) const std::string buffer = SoFCDB::writeNodesToString(pcViewProviderRoot); Base::ofstream str(Base::FileInfo(filename), std::ios::out); - if(str) { + if (str) { str << buffer; str.close(); ret = true; diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index c4b0311bdb..e844ed4e63 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -76,13 +76,6 @@ class GuiExport View3DInventorViewer : public Quarter::SoQTQuarterAdaptor, publi typedef Quarter::SoQTQuarterAdaptor inherited; public: - /// Background modes for the savePicture() method - enum eBackgroundType { - Current = 0, /**< Use the current viewer Background */ - Black = 1, /**< Black background */ - White = 2, /**< White background */ - Transparent = 3, /**< Transparent background */ - }; /// Pick modes for picking points in the scene enum SelectionMode { Lasso = 0, /**< Select objects using a lasso. */ @@ -204,8 +197,8 @@ public: * Creates an image with width \a w and height \a h of the current scene graph * and exports the rendered scenegraph to an image. */ - void savePicture(int w, int h, int eBackgroundType, QImage&) const; - void saveGraphic(int pagesize, int eBackgroundType, SoVectorizeAction* va) const; + void savePicture(int w, int h, const QColor&, QImage&) const; + void saveGraphic(int pagesize, const QColor&, SoVectorizeAction* va) const; //@} /** * Writes the current scenegraph to an Inventor file, either in ascii or binary. diff --git a/src/Gui/View3DPy.cpp b/src/Gui/View3DPy.cpp index c0d67134b6..c9a61a3204 100644 --- a/src/Gui/View3DPy.cpp +++ b/src/Gui/View3DPy.cpp @@ -26,6 +26,7 @@ #ifndef __InventorAll__ # include "InventorAll.h" # include +# include # include # include # include @@ -655,29 +656,15 @@ Py::Object View3DInventorPy::isAnimationEnabled(const Py::Tuple& args) return Py::Boolean(ok ? true : false); } -void View3DInventorPy::createImageFromFramebuffer(int backgroundType, int width, int height, QImage& img) +void View3DInventorPy::createImageFromFramebuffer(int width, int height, const QColor& bgcolor, QImage& img) { QGLFramebufferObject fbo(width, height, QGLFramebufferObject::Depth); const QColor col = _view->getViewer()->backgroundColor(); bool on = _view->getViewer()->hasGradientBackground(); - switch(backgroundType){ - case 0: // Current - break; - case 1: // Black - _view->getViewer()->setBackgroundColor(QColor(0,0,0)); - _view->getViewer()->setGradientBackground(false); - break; - case 2: // White - _view->getViewer()->setBackgroundColor(QColor(255,255,255)); - _view->getViewer()->setGradientBackground(false); - break; - case 3: // Transparent - _view->getViewer()->setBackgroundColor(QColor(255,255,255)); - _view->getViewer()->setGradientBackground(false); - break; - default: - break; + if (bgcolor.isValid()) { + _view->getViewer()->setBackgroundColor(bgcolor); + _view->getViewer()->setGradientBackground(false); } _view->getViewer()->renderToFramebuffer(&fbo); @@ -688,46 +675,30 @@ void View3DInventorPy::createImageFromFramebuffer(int backgroundType, int width, Py::Object View3DInventorPy::saveImage(const Py::Tuple& args) { - char *cFileName,*cImageType="Current",*cComment="$MIBA"; - int w=-1,h=-1,t; + char *cFileName,*cColor="Current",*cComment="$MIBA"; + int w=-1,h=-1; - if (!PyArg_ParseTuple(args.ptr(), "s|iiss",&cFileName,&w,&h,&cImageType,&cComment)) + if (!PyArg_ParseTuple(args.ptr(), "s|iiss",&cFileName,&w,&h,&cColor,&cComment)) throw Py::Exception(); -#ifdef __GNUC__ - if (strcasecmp(cImageType,"Current")==0) - t=0; - else if(strcasecmp(cImageType,"Black")==0) - t=1; - else if(strcasecmp(cImageType,"White")==0) - t=2; - else if(strcasecmp(cImageType,"Transparent")==0) - t=3; - else - throw Py::Exception("Parameter 4 have to be (Current|Black|White|Transparent)"); -#else - if (_stricmp(cImageType,"Current")==0) - t=0; - else if(_stricmp(cImageType,"Black")==0) - t=1; - else if(_stricmp(cImageType,"White")==0) - t=2; - else if(_stricmp(cImageType,"Transparent")==0) - t=3; - else - throw Py::Exception("Parameter 4 have to be (Current|Black|White|Transparent)"); -#endif + QColor bg; + QString colname = QString::fromLatin1(cColor); + if (colname.compare(QLatin1String("Current"), Qt::CaseInsensitive)) + bg = QColor(); // assign an invalid color here + else + bg.setNamedColor(colname); + QImage img; if (App::GetApplication().GetParameterGroupByPath ("User parameter:BaseApp/Preferences/Document")->GetBool("DisablePBuffers",false)) { - createImageFromFramebuffer(t, w, h, img); + createImageFromFramebuffer(w, h, bg, img); } else { try { - _view->getViewer()->savePicture(w, h, t, img); + _view->getViewer()->savePicture(w, h, bg, img); } catch (const Base::Exception&) { - createImageFromFramebuffer(t, w, h, img); + createImageFromFramebuffer(w, h, bg, img); } } @@ -741,9 +712,10 @@ Py::Object View3DInventorPy::saveImage(const Py::Tuple& args) Py::Object View3DInventorPy::saveVectorGraphic(const Py::Tuple& args) { char* filename; - int ps=4, t=2; + int ps=4; + char* name="white"; - if (!PyArg_ParseTuple(args.ptr(), "s|ii",&filename,&ps,&t)) + if (!PyArg_ParseTuple(args.ptr(), "s|is",&filename,&ps,&name)) throw Py::Exception(); std::auto_ptr vo; @@ -769,7 +741,14 @@ Py::Object View3DInventorPy::saveVectorGraphic(const Py::Tuple& args) throw Py::Exception(a_out.str()); } - _view->getViewer()->saveGraphic(ps,t,vo.get()); + QColor bg; + QString colname = QString::fromLatin1(name); + if (colname.compare(QLatin1String("Current"), Qt::CaseInsensitive)) + bg = _view->getViewer()->backgroundColor(); + else + bg.setNamedColor(colname); + + _view->getViewer()->saveGraphic(ps,bg,vo.get()); out->closeFile(); return Py::None(); } diff --git a/src/Gui/View3DPy.h b/src/Gui/View3DPy.h index 77cf3c180c..2e5ec0363c 100644 --- a/src/Gui/View3DPy.h +++ b/src/Gui/View3DPy.h @@ -113,7 +113,7 @@ private: typedef PyObject* (*method_varargs_handler)(PyObject *_self, PyObject *_args); static method_varargs_handler pycxx_handler; static PyObject *method_varargs_ext_handler(PyObject *_self, PyObject *_args); - void createImageFromFramebuffer(int backgroundType, int width, int height, QImage&); + void createImageFromFramebuffer(int width, int height, const QColor&, QImage&); private: std::list callbacks;