Author: fschmid
Date: Sat May  9 08:37:22 2015
New Revision: 20066

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=20066
Log:
Better handling of DropShadows when the Object has no fill.

Modified:
    trunk/Scribus/scribus/pageitem.cpp
    trunk/Scribus/scribus/pageitem.h
    trunk/Scribus/scribus/pdflib_core.cpp
    trunk/Scribus/scribus/scpainter.cpp

Modified: trunk/Scribus/scribus/pageitem.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=20066&path=/trunk/Scribus/scribus/pageitem.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem.cpp (original)
+++ trunk/Scribus/scribus/pageitem.cpp Sat May  9 08:37:22 2015
@@ -43,7 +43,6 @@
 #include "canvas.h"
 #include "cmsettings.h"
 #include "colorblind.h"
-#include "commonstrings.h"
 #include "desaxe/saxXML.h"
 #include "marks.h"
 #include "pageitem_arc.h"
@@ -2338,11 +2337,30 @@
        p->setupPolygon(&sh);
        p->setBrush(tmp);
        p->setFillMode(ScPainter::Solid);
-       p->setStrokeMode(ScPainter::Solid);
-       p->setPen(tmp, lwCorr, PLineArt, PLineEnd, PLineJoin);
        p->fillPath();
-       p->strokePath();
+       if (hasStroke())
+       {
+               p->setStrokeMode(ScPainter::Solid);
+               p->setPen(tmp, lwCorr, PLineArt, PLineEnd, PLineJoin);
+               p->strokePath();
+       }
        p->blur(m_softShadowBlurRadius * sc);
+       if (!hasFill())
+       {
+               sh = PoLine.copy();
+               p->setupPolygon(&sh);
+               p->setBrush(tmp);
+               p->setFillMode(ScPainter::Solid);
+               p->setBlendModeFill(19);
+               p->fillPath();
+               if (hasStroke())
+               {
+                       p->setBlendModeStroke(19);
+                       p->setStrokeMode(ScPainter::Solid);
+                       p->setPen(tmp, lwCorr, PLineArt, PLineEnd, PLineJoin);
+                       p->strokePath();
+               }
+       }
        p->endLayer();
        p->restore();
 }

Modified: trunk/Scribus/scribus/pageitem.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=20066&path=/trunk/Scribus/scribus/pageitem.h
==============================================================================
--- trunk/Scribus/scribus/pageitem.h (original)
+++ trunk/Scribus/scribus/pageitem.h Sat May  9 08:37:22 2015
@@ -38,6 +38,7 @@
 
 #include "scribusapi.h"
 #include "annotation.h"
+#include "commonstrings.h"
 #include "colormgmt/sccolormgmtstructs.h"
 #include "desaxe/saxio.h"
 #include "observable.h"
@@ -1193,6 +1194,8 @@
        QString getItemTextSaxed(int selStart, int selLength); ///< used by 
notes frames to get content of notes from itemText
        bool groupClipping() { return m_groupClips; }
        void setGroupClipping(bool val) { m_groupClips = val; }
+       bool hasFill() { return ((fillColor() != CommonStrings::None) || 
(GrType != 0)); }
+       bool hasStroke() { return ((lineColor() != CommonStrings::None) || 
(GrTypeStroke != 0) || (!NamedLStyle.isEmpty()) || 
(!patternStrokeVal.isEmpty())); }
 
                // End public functions
 

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=20066&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp Sat May  9 08:37:22 2015
@@ -3521,19 +3521,57 @@
        maxSize = qMin(3000.0, maxSize * (softShadowDPI / 72.0));
        bool savedShadow = ite->hasSoftShadow();
        ite->setHasSoftShadow(false);
+       bool tmpFillNeeded = false;
+       if (!ite->hasFill())
+       {
+               tmpFillNeeded = true;
+               ite->setFillColor("White");
+       }
        QImage imgC = ite->DrawObj_toImage(maxSize, PageItem::NoRotation);
+       imgC = 
imgC.copy(-pixelRadius,-pixelRadius,imgC.width()+2*pixelRadius,imgC.height()+2*pixelRadius);
 // Add border
+       ScPainter *p = new ScPainter(&imgC, imgC.width(), imgC.height(), 1, 0);
+       p->setZoomFactor(softShadowDPI / 72.0);
+       p->save();
+       p->blur(pixelRadius);
+       p->restore();
+       p->end();
+       delete p;
+       if (tmpFillNeeded)
+       {
+               ScPainter *p = new ScPainter(&imgC, imgC.width(), 
imgC.height(), 1, 0);
+               p->setZoomFactor(softShadowDPI / 72.0);
+               p->save();
+               FPointArray sh = ite->PoLine.copy();
+               p->setupPolygon(&sh);
+               p->setBrush(Qt::white);
+               p->setFillMode(ScPainter::Solid);
+               p->setBlendModeFill(19);
+               p->fillPath();
+               if (ite->hasStroke())
+               {
+                       p->setBlendModeStroke(19);
+                       p->setStrokeMode(ScPainter::Solid);
+                       p->setPen(Qt::white);
+                       p->setLineWidth(ite->lineWidth());
+                       p->strokePath();
+               }
+               p->restore();
+               p->end();
+               delete p;
+       }
+
        ite->setHasSoftShadow(savedShadow);
-
-       imgC = 
imgC.copy(-pixelRadius,-pixelRadius,imgC.width()+2*pixelRadius,imgC.height()+2*pixelRadius);
 // Add border
+       if (tmpFillNeeded)
+               ite->setFillColor(CommonStrings::None);
        ScImage img = imgC.alphaChannel().convertToFormat(QImage::Format_RGB32);
-
+/*
        ImageEffect eff;
        ScImageEffectList el;
        eff.effectCode = ScImage::EF_BLUR;
        eff.effectParameters = QString("%1 1.0").arg(pixelRadius);
        el.append(eff);
        img.applyEffect(el,ite->doc()->PageColors,false);
-
+*/
        uint maskObj = newObject();
        StartObj(maskObj);
        PutDoc("<<\n/Type /XObject\n/Subtype /Image\n");

Modified: trunk/Scribus/scribus/scpainter.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=20066&path=/trunk/Scribus/scribus/scpainter.cpp
==============================================================================
--- trunk/Scribus/scribus/scpainter.cpp (original)
+++ trunk/Scribus/scribus/scpainter.cpp Sat May  9 08:37:22 2015
@@ -540,6 +540,8 @@
                cairo_set_operator(m_cr, CAIRO_OPERATOR_DEST_IN);
        else if (blendMode == 18)
                cairo_set_operator(m_cr, CAIRO_OPERATOR_DEST_OUT);
+       else if (blendMode == 19)
+               cairo_set_operator(m_cr, CAIRO_OPERATOR_CLEAR);
        else
                cairo_set_operator(m_cr, CAIRO_OPERATOR_OVER);
 }


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to