From e2c5c643d81da3f3a3b9238249da01a763a46dc1 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Sun, 23 Nov 2025 18:04:39 -0500 Subject: [PATCH] [TD]convert transparency to alpha channel --- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 74 ++++++++++++++++--- .../TechDraw/Gui/ViewProviderDrawingView.h | 7 ++ 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index 51906c2273..8cee4e87d2 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -25,7 +25,11 @@ #include #include +#include +#include #include +#include +#include #include #include #include @@ -75,7 +79,6 @@ ViewProviderDrawingView::~ViewProviderDrawingView() void ViewProviderDrawingView::attach(App::DocumentObject *pcFeat) { -// Base::Console().message("VPDV::attach(%s)\n", pcFeat->getNameInDocument()); ViewProviderDocumentObject::attach(pcFeat); //NOLINTBEGIN @@ -209,11 +212,8 @@ void ViewProviderDrawingView::startRestoring() void ViewProviderDrawingView::finishRestoring() { - if (Visibility.getValue()) { - show(); - } else { - hide(); - } + fixColorAlphaValues(); + Gui::ViewProviderDocumentObject::finishRestoring(); } @@ -290,10 +290,10 @@ Gui::MDIView *ViewProviderDrawingView::getMDIView() const void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) { -// Base::Console().message("VPDV::onGuiRepaint(%s) - this: %x\n", dv->getNameInDocument(), this); Gui::Document* guiDoc = Gui::Application::Instance->getDocument(getViewObject()->getDocument()); - if (!guiDoc) + if (!guiDoc) { return; + } std::vector pages = getViewObject()->findAllParentPages(); if (pages.size() > 1) { @@ -351,9 +351,7 @@ void ViewProviderDrawingView::onProgressMessage(const TechDraw::DrawView* dv, const std::string featureName, const std::string text) { -// Q_UNUSED(featureName) Q_UNUSED(dv) -// Q_UNUSED(text) showProgressMessage(featureName, text); } @@ -481,7 +479,6 @@ TechDraw::DrawView* ViewProviderDrawingView::getViewObject() const //! handled by the undo mechanism, but the QGraphicsScene parentage is not reset. void ViewProviderDrawingView::fixSceneDependencies() { - Base::Console().message("VPDV::fixSceneDependencies()\n"); auto page = getViewProviderPage(); if (!page) { return; @@ -526,3 +523,58 @@ std::vector ViewProviderDrawingView::claimChildren() const return temp; } + +//! convert old style transparency values in PropertyColor to new style alpha channel values +void ViewProviderDrawingView::fixColorAlphaValues() +{ + if (!Preferences::fixColorAlphaOnLoad() || + checkMiniumumDocumentVersion(1, 1)) { + return; + } + + // check every PropertyColor for transparency vs alpha + std::vector allProperties; + getPropertyList(allProperties); + + constexpr double alphaNone{0.0}; + constexpr double alphaFull{1.0}; + + for (auto& prop : allProperties) { + auto* colorProp = freecad_cast(prop); + if (colorProp) { + // Here we are assuming that transparent colors are not used/need not be converted. + // To invert more generally, colorOut.a = 1 - colorIn.a;, but we would need a different + // mechanism to determine when to do the conversion. + Base::Color colorTemp = colorProp->getValue(); + if (colorTemp.a == alphaNone) { + colorTemp.a = alphaFull; + colorProp->setValue(colorTemp); + } + } + } +} + + +//! true if document toBeChecked was written by a program with version >= minMajor.minMinor. +//! note that we can not check point releases as only the major and minor are recorded in the Document.xml +//! file. +//! (ex ) +bool ViewProviderDrawingView::checkMiniumumDocumentVersion(App::Document* toBeChecked, + int minMajor, + int minMinor) +{ + const char* docVersionText = toBeChecked->getProgramVersion(); + int docMajor{0}; + int docMinor{0}; + // stole this bit from App::AttachExtension. + // NOLINTNEXTLINE + if (sscanf(docVersionText, "%d.%d", &docMajor, &docMinor) != 2) { + Base::Console().warning("Failed to retrieve document version number for %s\n", + toBeChecked ? toBeChecked->getName() : "noname"); + return false; // ?? should we fail here? the file appears broken. + } + + return std::tie(docMajor, docMinor) >= std::tie(minMajor, minMinor); +} + + diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index 195026c57d..247fa61018 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -28,11 +28,13 @@ #include +#include #include #include #include "ViewProviderDrawingViewExtension.h" + namespace TechDraw { class DrawView; } @@ -102,6 +104,11 @@ public: virtual void fixSceneDependencies(); std::vector claimChildren() const override; + void fixColorAlphaValues(); + bool checkMiniumumDocumentVersion(int minMajor, int minMinor) const + { return checkMiniumumDocumentVersion(this->getDocument()->getDocument(), minMajor, minMinor); } + static bool checkMiniumumDocumentVersion(App::Document* toBeChecked, int minMajor, int minMinor); + private: void multiParentPaint(std::vector& pages);