[Libreoffice-commits] core.git: 5 commits - filter/qa filter/source include/sal include/test test/source vcl/qa
Jan Holesovsky
kendy at collabora.com
Tue Jun 10 10:33:39 PDT 2014
filter/qa/cppunit/data/pict/clipping-problem.pct |binary
filter/qa/cppunit/filters-pict-test.cxx | 35 +++++++++++
filter/source/graphicfilter/ipict/ipict.cxx | 69 ++++++++++++++++++++---
filter/source/graphicfilter/ipict/ipict.hxx | 25 ++++++++
include/sal/log-areas.dox | 1
include/test/mtfxmldump.hxx | 13 +++-
include/test/xmltesttools.hxx | 5 +
test/source/mtfxmldump.cxx | 44 +++++++++++++-
vcl/qa/cppunit/wmf/wmfimporttest.cxx | 30 ++--------
9 files changed, 179 insertions(+), 43 deletions(-)
New commits:
commit 71457cb2cb61f20ef569d1600b430ef41a878ec9
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Jun 10 19:27:40 2014 +0200
pct import: Unit test for the clipping import fix.
Change-Id: I8f9df1d92c86c087e37f77209f413ff8c1c6358f
diff --git a/filter/qa/cppunit/data/pict/clipping-problem.pct b/filter/qa/cppunit/data/pict/clipping-problem.pct
new file mode 100644
index 0000000..37fe66c
Binary files /dev/null and b/filter/qa/cppunit/data/pict/clipping-problem.pct differ
diff --git a/filter/qa/cppunit/filters-pict-test.cxx b/filter/qa/cppunit/filters-pict-test.cxx
index 7ba0145..0512b9b 100644
--- a/filter/qa/cppunit/filters-pict-test.cxx
+++ b/filter/qa/cppunit/filters-pict-test.cxx
@@ -10,12 +10,17 @@
#include <unotest/filters-test.hxx>
#include <test/bootstrapfixture.hxx>
#include <vcl/FilterConfigItem.hxx>
+#include <test/mtfxmldump.hxx>
+#include <test/xmltesttools.hxx>
#include <tools/stream.hxx>
#include <vcl/graph.hxx>
+#include <vcl/metaactiontypes.hxx>
#include <osl/file.hxx>
#include <osl/process.h>
+#include "../../source/graphicfilter/ipict/ipict.hxx"
+
extern "C"
{
SAL_DLLPUBLIC_EXPORT bool SAL_CALL
@@ -30,6 +35,7 @@ using namespace ::com::sun::star;
class PictFilterTest
: public test::FiltersTest
, public test::BootstrapFixture
+ , public XmlTestTools
{
public:
PictFilterTest() : BootstrapFixture(true, false) {}
@@ -38,13 +44,21 @@ public:
const OUString &rURL, const OUString &,
unsigned int, unsigned int, unsigned int) SAL_OVERRIDE;
+ OUString pictURL()
+ {
+ return getURLFromSrc("/filter/qa/cppunit/data/pict/");
+ }
+
/**
* Ensure CVEs remain unbroken
*/
void testCVEs();
+ void testDontClipTooMuch();
+
CPPUNIT_TEST_SUITE(PictFilterTest);
CPPUNIT_TEST(testCVEs);
+ CPPUNIT_TEST(testDontClipTooMuch);
CPPUNIT_TEST_SUITE_END();
};
@@ -60,10 +74,29 @@ bool PictFilterTest::load(const OUString &,
void PictFilterTest::testCVEs()
{
testDir(OUString(),
- getURLFromSrc("/filter/qa/cppunit/data/pict/"),
+ pictURL(),
OUString());
}
+void PictFilterTest::testDontClipTooMuch()
+{
+ SvFileStream aFileStream(pictURL() + "clipping-problem.pct", STREAM_READ);
+ GDIMetaFile aGDIMetaFile;
+ pict::ReadPictFile(aFileStream, aGDIMetaFile);
+
+ MetafileXmlDump dumper;
+ dumper.filterAllActionTypes();
+ dumper.filterActionType(META_CLIPREGION_ACTION, false);
+ xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile);
+
+ CPPUNIT_ASSERT (pDoc);
+
+ assertXPath(pDoc, "/metafile/clipregion[5]", "top", "0");
+ assertXPath(pDoc, "/metafile/clipregion[5]", "left", "0");
+ assertXPath(pDoc, "/metafile/clipregion[5]", "bottom", "-32767");
+ assertXPath(pDoc, "/metafile/clipregion[5]", "right", "-32767");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(PictFilterTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/filter/source/graphicfilter/ipict/ipict.cxx b/filter/source/graphicfilter/ipict/ipict.cxx
index e130429..8d3af9e 100644
--- a/filter/source/graphicfilter/ipict/ipict.cxx
+++ b/filter/source/graphicfilter/ipict/ipict.cxx
@@ -17,7 +17,6 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-
#include <string.h>
#include <osl/thread.h>
#include <vcl/bmpacc.hxx>
@@ -26,6 +25,7 @@
#include <vcl/virdev.hxx>
#include <math.h>
+#include "ipict.hxx"
#include "shape.hxx"
#include <boost/scoped_array.hpp>
@@ -1940,5 +1940,14 @@ GraphicImport( SvStream& rIStm, Graphic & rGraphic, FilterConfigItem* )
return bRet;
}
+namespace pict {
+
+SAL_DLLPUBLIC_EXPORT void ReadPictFile(SvStream &rStreamPict, GDIMetaFile& rGDIMetaFile)
+{
+ PictReader aPictReader;
+ aPictReader.ReadPict(rStreamPict, rGDIMetaFile);
+}
+
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/filter/source/graphicfilter/ipict/ipict.hxx b/filter/source/graphicfilter/ipict/ipict.hxx
new file mode 100644
index 0000000..1ba3dbe
--- /dev/null
+++ b/filter/source/graphicfilter/ipict/ipict.hxx
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_FILTER_SOURCE_GRAPHICFILTER_IPICT_HXX
+#define INCLUDED_FILTER_SOURCE_GRAPHICFILTER_IPICT_HXX
+
+class GDIMetaFile;
+class SvStream;
+
+namespace pict {
+
+/// Function to access PictReader::ReadPict for unit testing.
+void ReadPictFile(SvStream &rStreamPict, GDIMetaFile& rGDIMetaFile);
+
+}
+
+#endif // INCLUDED_FILTER_SOURCE_GRAPHICFILTER_IPICT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit ce90fa303234e9e6628bf9dfcc7f81565a639d06
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Jun 10 19:24:30 2014 +0200
MetafileXmlDump: Add dumping of META_CLIPREGION_ACTION's.
Change-Id: I4b51abf6193c33367edebc82772054875b5b9bba
diff --git a/test/source/mtfxmldump.cxx b/test/source/mtfxmldump.cxx
index 5e329a3..500fa86 100644
--- a/test/source/mtfxmldump.cxx
+++ b/test/source/mtfxmldump.cxx
@@ -167,7 +167,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
if (rTempStreamName.isEmpty())
pStream = new SvMemoryStream();
else
- pStream = new SvFileStream(rTempStreamName, STREAM_STD_READWRITE);
+ pStream = new SvFileStream(rTempStreamName, STREAM_STD_READWRITE | STREAM_TRUNC);
xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, pStream, NULL);
xmlTextWriterPtr xmlWriter = xmlNewTextWriter( xmlOutBuffer );
@@ -336,6 +336,25 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
}
break;
+ case META_CLIPREGION_ACTION:
+ {
+ const MetaClipRegionAction* pA = static_cast< const MetaClipRegionAction* >(pAction);
+
+ aWriter.startElement("clipregion");
+
+ // FIXME for now we dump only the bounding box; this is
+ // enough for the tests we have, but may need extending to
+ // dumping the real polypolygon in the future
+ Rectangle aRectangle = pA->GetRegion().GetBoundRect();
+ aWriter.attribute("top", aRectangle.Top());
+ aWriter.attribute("left", aRectangle.Left());
+ aWriter.attribute("bottom", aRectangle.Bottom());
+ aWriter.attribute("right", aRectangle.Right());
+
+ aWriter.endElement();
+ }
+ break;
+
case META_ISECTRECTCLIPREGION_ACTION:
{
MetaISectRectClipRegionAction* pMetaISectRectClipRegionAction = static_cast<MetaISectRectClipRegionAction*>(pAction);
commit 2a649539b723a01649102ff7be3cab2bbdff834d
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Jun 10 18:15:55 2014 +0200
MetafileXmlDump: No need to specify the stream, simplify the API.
Change-Id: Ia08f67e359bbd26cefdba8661f0b0c4ae2147382
diff --git a/include/test/mtfxmldump.hxx b/include/test/mtfxmldump.hxx
index 9da10c2..86ffe9d 100644
--- a/include/test/mtfxmldump.hxx
+++ b/include/test/mtfxmldump.hxx
@@ -13,23 +13,30 @@
#include <sal/config.h>
#include <test/testdllapi.hxx>
+#include <libxml/tree.h>
#include <vcl/gdimtf.hxx>
#include <vector>
class OOO_DLLPUBLIC_TEST MetafileXmlDump
{
std::vector<bool> maFilter;
- SvStream& mrStream;
public:
- MetafileXmlDump(SvStream& rStream);
+ MetafileXmlDump();
virtual ~MetafileXmlDump();
void filterActionType(const sal_uInt16 nActionType, bool bShouldFilter);
void filterAllActionTypes();
void filterNoneActionTypes();
- void dump(GDIMetaFile& rMetaFile);
+ /** The actual result that will be used for testing.
+
+ This function normally uses a SvMemoryStream for its operation; but
+ can use a physical file when a filename is specified in
+ pTempStreamName - this is useful when creating the test, to dump the
+ file for examination.
+ */
+ xmlDocPtr dumpAndParse(GDIMetaFile& rMetaFile, const OUString& rTempStreamName = OUString());
};
#endif
diff --git a/include/test/xmltesttools.hxx b/include/test/xmltesttools.hxx
index 4849ed9..058bbc2 100644
--- a/include/test/xmltesttools.hxx
+++ b/include/test/xmltesttools.hxx
@@ -27,12 +27,15 @@
class OOO_DLLPUBLIC_TEST XmlTestTools
{
+public:
+ /// Return xmlDocPtr representation of the XML stream read from pStream.
+ static xmlDocPtr parseXmlStream(SvStream* pStream);
+
protected:
XmlTestTools();
virtual ~XmlTestTools();
htmlDocPtr parseXml(utl::TempFile& aTempFile);
- htmlDocPtr parseXmlStream(SvStream* pStream);
virtual void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx);
diff --git a/test/source/mtfxmldump.cxx b/test/source/mtfxmldump.cxx
index e1a6abd..5e329a3 100644
--- a/test/source/mtfxmldump.cxx
+++ b/test/source/mtfxmldump.cxx
@@ -8,6 +8,7 @@
*/
#include <test/mtfxmldump.hxx>
+#include <test/xmltesttools.hxx>
#include <test/xmlwriter.hxx>
#include <vcl/metaact.hxx>
@@ -137,9 +138,8 @@ OUString convertLineStyleToString(LineStyle eAlign)
} // anonymous namespace
-MetafileXmlDump::MetafileXmlDump(SvStream& rStream) :
- maFilter(512, false),
- mrStream(rStream)
+MetafileXmlDump::MetafileXmlDump() :
+ maFilter(512, false)
{}
MetafileXmlDump::~MetafileXmlDump()
@@ -160,9 +160,16 @@ void MetafileXmlDump::filterNoneActionTypes()
maFilter.assign(512, false);
}
-void MetafileXmlDump::dump(GDIMetaFile& rMetaFile)
+xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString& rTempStreamName)
{
- xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, &mrStream, NULL);
+ SvStream *pStream = NULL;
+
+ if (rTempStreamName.isEmpty())
+ pStream = new SvMemoryStream();
+ else
+ pStream = new SvFileStream(rTempStreamName, STREAM_STD_READWRITE);
+
+ xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, pStream, NULL);
xmlTextWriterPtr xmlWriter = xmlNewTextWriter( xmlOutBuffer );
xmlTextWriterSetIndent( xmlWriter, 1 );
@@ -392,6 +399,14 @@ void MetafileXmlDump::dump(GDIMetaFile& rMetaFile)
aWriter.endElement();
aWriter.endDocument();
+
+ pStream->Seek(STREAM_SEEK_TO_BEGIN);
+
+ xmlDocPtr pDoc = XmlTestTools::parseXmlStream(pStream);
+
+ delete pStream;
+
+ return pDoc;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qa/cppunit/wmf/wmfimporttest.cxx b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
index 45c3cc4..cc24c769 100644
--- a/vcl/qa/cppunit/wmf/wmfimporttest.cxx
+++ b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
@@ -57,16 +57,10 @@ void WmfTest::testNonPlaceableWmf()
GDIMetaFile aGDIMetaFile;
ReadWindowMetafile(aFileStream, aGDIMetaFile);
- SvMemoryStream aStream;
-
- MetafileXmlDump dumper(aStream);
+ MetafileXmlDump dumper;
dumper.filterAllActionTypes();
dumper.filterActionType(META_POLYLINE_ACTION, false);
- dumper.dump(aGDIMetaFile);
-
- aStream.Seek(STREAM_SEEK_TO_BEGIN);
-
- xmlDocPtr pDoc = parseXmlStream(&aStream);
+ xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile);
CPPUNIT_ASSERT (pDoc);
@@ -92,16 +86,10 @@ void WmfTest::testSine()
GDIMetaFile aGDIMetaFile;
ReadWindowMetafile(aFileStream, aGDIMetaFile);
- SvMemoryStream aStream;
-
- MetafileXmlDump dumper(aStream);
+ MetafileXmlDump dumper;
dumper.filterAllActionTypes();
dumper.filterActionType(META_ISECTRECTCLIPREGION_ACTION, false);
- dumper.dump(aGDIMetaFile);
-
- aStream.Seek(STREAM_SEEK_TO_BEGIN);
-
- xmlDocPtr pDoc = parseXmlStream(&aStream);
+ xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile);
CPPUNIT_ASSERT (pDoc);
@@ -122,16 +110,10 @@ void WmfTest::testEmfProblem()
GDIMetaFile aGDIMetaFile;
ReadWindowMetafile(aFileStream, aGDIMetaFile);
- SvMemoryStream aStream;
-
- MetafileXmlDump dumper(aStream);
+ MetafileXmlDump dumper;
dumper.filterAllActionTypes();
dumper.filterActionType(META_ISECTRECTCLIPREGION_ACTION, false);
- dumper.dump(aGDIMetaFile);
-
- aStream.Seek(STREAM_SEEK_TO_BEGIN);
-
- xmlDocPtr pDoc = parseXmlStream(&aStream);
+ xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile);
CPPUNIT_ASSERT (pDoc);
commit 0048709ce4d86ce5aca116474b43d9f1c5c50de5
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Jun 10 17:13:38 2014 +0200
pct import: Reset clip region before closing the metafile.
Otherwise parts of the image are missing.
Change-Id: If9018c32807359862a9be825b0ebdaacce2d3490
diff --git a/filter/source/graphicfilter/ipict/ipict.cxx b/filter/source/graphicfilter/ipict/ipict.cxx
index 571a4aa..e130429 100644
--- a/filter/source/graphicfilter/ipict/ipict.cxx
+++ b/filter/source/graphicfilter/ipict/ipict.cxx
@@ -1901,6 +1901,7 @@ void PictReader::ReadPict( SvStream & rStreamPict, GDIMetaFile & rGDIMetaFile )
pPict->Seek(nPos);
}
+ pVirDev->SetClipRegion();
rGDIMetaFile.Stop();
delete pVirDev;
commit e7944dabfbc80363f41353efcd8fcae0d2f84afc
Author: Jan Holesovsky <kendy at collabora.com>
Date: Tue Jun 10 15:54:40 2014 +0200
pct import: Add logging.
Change-Id: Ia3fe1ff0075434d0b6903bf978c16499e07d699d
diff --git a/filter/source/graphicfilter/ipict/ipict.cxx b/filter/source/graphicfilter/ipict/ipict.cxx
index 3cbf4a2..571a4aa 100644
--- a/filter/source/graphicfilter/ipict/ipict.cxx
+++ b/filter/source/graphicfilter/ipict/ipict.cxx
@@ -371,8 +371,11 @@ Point PictReader::ReadPoint()
pPict->ReadInt16( ny ).ReadInt16( nx );
- return Point( (long)nx - aBoundingRect.Left(),
+ Point aPoint( (long)nx - aBoundingRect.Left(),
(long)ny - aBoundingRect.Top() );
+
+ SAL_INFO("filter.pict", "ReadPoint: " << aPoint);
+ return aPoint;
}
Point PictReader::ReadDeltaH(Point aBase)
@@ -458,6 +461,8 @@ void PictReader::ReadRectangle(Rectangle & rRect)
aTopLeft=ReadPoint();
aBottomRight=ReadPoint();
rRect=Rectangle(aTopLeft,aBottomRight);
+
+ SAL_INFO("filter.pict", "ReadRectangle: " << rRect);
}
@@ -1198,6 +1203,38 @@ void PictReader::ReadHeader()
pPict->SetError(SVSTREAM_FILEFORMAT_ERROR);
}
+#if OSL_DEBUG_LEVEL > 0
+static const char* operationName(sal_uInt16 nOpcode)
+{
+ // add here whatever makes the debugging easier for you, otherwise you'll
+ // see only the operation's opcode
+ switch (nOpcode)
+ {
+ case 0x0001: return "Clip";
+ case 0x0003: return "TxFont";
+ case 0x0004: return "TxFace";
+ case 0x0008: return "PnMode";
+ case 0x0009: return "PnPat";
+ case 0x000d: return "TxSize";
+ case 0x001a: return "RGBFgCol";
+ case 0x001d: return "HiliteColor";
+ case 0x0020: return "Line";
+ case 0x0022: return "ShortLine";
+ case 0x0028: return "LongText";
+ case 0x0029: return "DHText";
+ case 0x002a: return "DVText";
+ case 0x002c: return "fontName";
+ case 0x002e: return "glyphState";
+ case 0x0031: return "paintRect";
+ case 0x0038: return "frameSameRect";
+ case 0x0070: return "framePoly";
+ case 0x0071: return "paintPoly";
+ case 0x00a1: return "LongComment";
+ default: return "";
+ }
+}
+#endif
+
sal_uLong PictReader::ReadData(sal_uInt16 nOpcode)
{
sal_uInt16 nUSHORT;
@@ -1213,6 +1250,10 @@ sal_uLong PictReader::ReadData(sal_uInt16 nOpcode)
default: break;
}
+#if OSL_DEBUG_LEVEL > 0
+ SAL_INFO("filter.pict", "Operation: 0x" << OUString::number(nOpcode, 16) << " [" << operationName(nOpcode) << "]");
+#endif
+
switch(nOpcode) {
case 0x0000: // NOP
@@ -1228,16 +1269,16 @@ sal_uLong PictReader::ReadData(sal_uInt16 nOpcode)
// I do that because the clipping is often used to clean a region,
// before drawing some text and also to draw this text.
// So using a too small region can lead to clip the end of the text ;
- // but this can be discutable...
- aRect.setWidth(aRect.getWidth()+1);
+ // but this can be discutable...
+ aRect.setWidth(aRect.getWidth()+1);
aRect.setHeight(aRect.getHeight()+1);
pVirDev->SetClipRegion( Region( aRect ) );
break;
}
case 0x0002: // BkPat
- nDataSize=eActBackPattern.read(*pPict);
- eActMethod=PDM_UNDEFINED;
- break;
+ nDataSize = eActBackPattern.read(*pPict);
+ eActMethod = PDM_UNDEFINED;
+ break;
case 0x0003: // TxFont
pPict->ReadUInt16( nUSHORT );
@@ -1305,12 +1346,12 @@ sal_uLong PictReader::ReadData(sal_uInt16 nOpcode)
break;
case 0x0009: // PnPat
- nDataSize=eActPenPattern.read(*pPict);
+ nDataSize=eActPenPattern.read(*pPict);
eActMethod=PDM_UNDEFINED;
break;
case 0x000a: // FillPat
- nDataSize=eActFillPattern.read(*pPict);
+ nDataSize=eActFillPattern.read(*pPict);
eActMethod=PDM_UNDEFINED;
break;
diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox
index 38d72fc..2fe2c91 100644
--- a/include/sal/log-areas.dox
+++ b/include/sal/log-areas.dox
@@ -172,6 +172,7 @@ certain functionality.
@li @c filter.ms - escher import/export
@li @c filter.odfflatxml
@li @c filter.os2met
+ at li @c filter.pict
@li @c filter.tiff
@li @c filter.xslt - xslt import/export
@li @c oox.cscode - see oox/source/drawingml/customshapes/README
More information about the Libreoffice-commits
mailing list