Author: fschmid
Date: Sat Oct 12 10:35:58 2013
New Revision: 18546

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=18546
Log:
Added the missing drawMaskedImage function.

Modified:
    trunk/Scribus/scribus/plugins/import/pdf/slaoutput.cpp
    trunk/Scribus/scribus/plugins/import/pdf/slaoutput.h

Modified: trunk/Scribus/scribus/plugins/import/pdf/slaoutput.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=18546&path=/trunk/Scribus/scribus/plugins/import/pdf/slaoutput.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/import/pdf/slaoutput.cpp (original)
+++ trunk/Scribus/scribus/plugins/import/pdf/slaoutput.cpp Sat Oct 12 10:35:58 
2013
@@ -2587,6 +2587,141 @@
        delete[] mbuffer;
 }
 
+void SlaOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str,  
int width, int height, GfxImageColorMap *colorMap, GBool interpolate, Stream 
*maskStr, int maskWidth, int maskHeight, GBool maskInvert, GBool 
maskInterpolate)
+{
+       ImageStream * imgStr = new ImageStream(str, width, 
colorMap->getNumPixelComps(), colorMap->getBits());
+       imgStr->reset();
+       unsigned int *dest = 0;
+       unsigned char * buffer = new unsigned char[width * height * 4];
+       QImage * image = 0;
+       for (int y = 0; y < height; y++)
+       {
+               dest = (unsigned int *)(buffer + y * 4 * width);
+               Guchar * pix = imgStr->getLine();
+               colorMap->getRGBLine(pix, dest, width);
+       }
+       image = new QImage(buffer, width, height, QImage::Format_RGB32);
+       if (image == NULL || image->isNull())
+       {
+               delete imgStr;
+               delete[] buffer;
+               delete image;
+               return;
+       }
+       ImageStream *mskStr = new ImageStream(maskStr, maskWidth, 1, 1);
+       mskStr->reset();
+       Guchar *mdest = 0;
+       int invert_bit = maskInvert ? 1 : 0;
+       unsigned char * mbuffer = new unsigned char[maskWidth * maskHeight];
+       for (int y = 0; y < maskHeight; y++)
+       {
+               mdest = (Guchar *)(mbuffer + y * maskWidth);
+               Guchar * pix = mskStr->getLine();
+               for (int x = 0; x < maskWidth; x++)
+               {
+                       if (pix[x] ^ invert_bit)
+                               *mdest++ = 0;
+                       else
+                               *mdest++ = 255;
+               }
+       }
+       if ((maskWidth != width) || (maskHeight != height))
+       {
+               delete imgStr;
+               delete[] buffer;
+               delete image;
+               delete mskStr;
+               delete[] mbuffer;
+               return;
+       }
+       QImage res = image->convertToFormat(QImage::Format_ARGB32);
+       unsigned char cc, cm, cy, ck;
+       int s = 0;
+       for( int yi=0; yi < res.height(); ++yi )
+       {
+               QRgb *t = (QRgb*)(res.scanLine( yi ));
+               for(int xi=0; xi < res.width(); ++xi )
+               {
+                       cc = qRed(*t);
+                       cm = qGreen(*t);
+                       cy = qBlue(*t);
+                       ck = mbuffer[s];
+                       (*t) = qRgba(cc, cm, cy, ck);
+                       s++;
+                       t++;
+               }
+       }
+       double *ctm;
+       ctm = state->getCTM();
+       double xCoor = m_doc->currentPage()->xOffset();
+       double yCoor = m_doc->currentPage()->yOffset();
+       QRectF crect = QRectF(0, 0, width, height);
+       m_ctm = QTransform(ctm[0] / width, ctm[1] / width, -ctm[2] / height, 
-ctm[3] / height, ctm[2] + ctm[4], ctm[3] + ctm[5]);
+       QLineF cline = QLineF(0, 0, width, 0);
+       QLineF tline = m_ctm.map(cline);
+       QRectF trect = m_ctm.mapRect(crect);
+       double sx = m_ctm.m11();
+       double sy = m_ctm.m22();
+       QTransform mm = QTransform(ctm[0] / width, ctm[1] / width, -ctm[2] / 
height, -ctm[3] / height, 0, 0);
+       if ((mm.type() == QTransform::TxShear) || (mm.type() == 
QTransform::TxRotate))
+       {
+               mm.reset();
+               mm.rotate(-tline.angle());
+       }
+       else
+       {
+               mm.reset();
+               if (sx < 0)
+                       mm.scale(-1, 1);
+               if (sy < 0)
+                       mm.scale(1, -1);
+       }
+       res = res.transformed(mm);
+       int z = m_doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, 
xCoor + trect.x(), yCoor + trect.y(), trect.width(), trect.height(), 0, 
CommonStrings::None, CommonStrings::None, true);
+       PageItem* ite = m_doc->Items->at(z);
+       ite->SetRectFrame();
+       m_doc->setRedrawBounding(ite);
+       ite->Clip = FlattenPath(ite->PoLine, ite->Segments);
+       ite->setTextFlowMode(PageItem::TextFlowDisabled);
+       ite->setFillShade(100);
+       ite->setLineShade(100);
+       ite->setFillEvenOdd(false);
+       ite->setFillTransparency(1.0 - state->getFillOpacity());
+       ite->setFillBlendmode(getBlendMode(state));
+       m_doc->AdjustItemSize(ite);
+       QTemporaryFile *tempFile = new QTemporaryFile(QDir::tempPath() + 
"/scribus_temp_pdf_XXXXXX.png");
+       tempFile->setAutoRemove(false);
+       if (tempFile->open())
+       {
+               QString fileName = getLongPathName(tempFile->fileName());
+               if (!fileName.isEmpty())
+               {
+                       tempFile->close();
+                       ite->isInlineImage = true;
+                       ite->isTempFile = true;
+                       res.save(fileName, "PNG");
+                       m_doc->loadPict(fileName, ite);
+               //      ite->setImageScalingMode(false, false);
+                       m_Elements->append(ite);
+                       if (m_groupStack.count() != 0)
+                       {
+                               m_groupStack.top().Items.append(ite);
+                               applyMask(ite);
+                       }
+               }
+               else
+                       m_doc->Items->removeAll(ite);
+       }
+       else
+               m_doc->Items->removeAll(ite);
+       delete tempFile;
+       delete imgStr;
+       delete[] buffer;
+       delete image;
+       delete mskStr;
+       delete[] mbuffer;
+}
+
 void SlaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int 
width, int height, GfxImageColorMap *colorMap, GBool interpolate, int 
*maskColors, GBool inlineImg)
 {
        ImageStream * imgStr = new ImageStream(str, width, 
colorMap->getNumPixelComps(), colorMap->getBits());
@@ -3867,13 +4002,14 @@
                        PLineJoin = Qt::BevelJoin;
                        break;
        }
+       double lw = state->getLineWidth();
        double *dashPattern;
        int dashLength;
        state->getLineDash(&dashPattern, &dashLength, &DashOffset);
        QVector<double> pattern(dashLength);
        for (int i = 0; i < dashLength; ++i)
        {
-               pattern[i] = dashPattern[i];
+               pattern[i] = dashPattern[i] / lw;
        }
        DashValues = pattern;
 }

Modified: trunk/Scribus/scribus/plugins/import/pdf/slaoutput.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=18546&path=/trunk/Scribus/scribus/plugins/import/pdf/slaoutput.h
==============================================================================
--- trunk/Scribus/scribus/plugins/import/pdf/slaoutput.h (original)
+++ trunk/Scribus/scribus/plugins/import/pdf/slaoutput.h Sat Oct 12 10:35:58 
2013
@@ -227,7 +227,7 @@
                                   GBool interpolate,
                                   Stream *maskStr,
                                   int maskWidth, int maskHeight,
-                                  GBool maskInvert, GBool maskInterpolate) { 
qDebug() << "Draw Masked Image"; }
+                                  GBool maskInvert, GBool maskInterpolate); // 
{ qDebug() << "Draw Masked Image"; }
 
        //----- transparency groups and soft masks
        virtual void beginTransparencyGroup(GfxState *state, double *bbox, 
GfxColorSpace * /*blendingColorSpace*/, GBool /*isolated*/, GBool /*knockout*/, 
GBool /*forSoftMask*/);


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

Reply via email to