e66ccbecfb
Change-Id: Ida43018a83c68f5d20dbee30325b8f32099e5b1b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159713 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
590 lines
25 KiB
C++
590 lines
25 KiB
C++
/* -*- 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/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
#include <sal/config.h>
|
|
|
|
#include <string_view>
|
|
|
|
#include <test/xmltesttools.hxx>
|
|
#include <test/bootstrapfixture.hxx>
|
|
#include <vcl/gdimtf.hxx>
|
|
#include <vcl/wmf.hxx>
|
|
#include <mtftools.hxx>
|
|
|
|
using namespace css;
|
|
|
|
class WmfTest : public test::BootstrapFixture, public XmlTestTools
|
|
{
|
|
OUString maDataUrl;
|
|
|
|
OUString getFullUrl(std::u16string_view sFileName)
|
|
{
|
|
return m_directories.getURLFromSrc(maDataUrl) + sFileName;
|
|
}
|
|
|
|
public:
|
|
WmfTest()
|
|
: BootstrapFixture(true, false)
|
|
, maDataUrl("/emfio/qa/cppunit/wmf/data/")
|
|
{
|
|
}
|
|
|
|
void testEOFWmf();
|
|
void testNonPlaceableWmf();
|
|
void testTdf88163NonPlaceableWmf();
|
|
void testTdf88163PlaceableWmf();
|
|
void testSetTextAlignWmf();
|
|
void testSine();
|
|
void testEmfProblem();
|
|
void testEmfLineStyles();
|
|
void testWorldTransformFontSize();
|
|
void testBigPPI();
|
|
void testTdf93750();
|
|
void testTdf99402();
|
|
void testTdf39894Wmf();
|
|
void testTdf39894Emf();
|
|
void testETO_PDYWmf();
|
|
void testETO_PDYEmf();
|
|
void testStockObject();
|
|
|
|
CPPUNIT_TEST_SUITE(WmfTest);
|
|
CPPUNIT_TEST(testEOFWmf);
|
|
CPPUNIT_TEST(testNonPlaceableWmf);
|
|
CPPUNIT_TEST(testTdf88163NonPlaceableWmf);
|
|
CPPUNIT_TEST(testTdf88163PlaceableWmf);
|
|
CPPUNIT_TEST(testSetTextAlignWmf);
|
|
CPPUNIT_TEST(testSine);
|
|
CPPUNIT_TEST(testEmfProblem);
|
|
CPPUNIT_TEST(testEmfLineStyles);
|
|
CPPUNIT_TEST(testWorldTransformFontSize);
|
|
CPPUNIT_TEST(testBigPPI);
|
|
CPPUNIT_TEST(testTdf93750);
|
|
CPPUNIT_TEST(testTdf99402);
|
|
CPPUNIT_TEST(testTdf39894Wmf);
|
|
CPPUNIT_TEST(testTdf39894Emf);
|
|
CPPUNIT_TEST(testETO_PDYWmf);
|
|
CPPUNIT_TEST(testETO_PDYEmf);
|
|
CPPUNIT_TEST(testStockObject);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
};
|
|
|
|
void WmfTest::testEOFWmf()
|
|
{
|
|
// tdf#155887 Test META_EOF with size different than 3
|
|
// It should be properly displayed as MS Office do
|
|
SvFileStream aFileStream(getFullUrl(u"EOF.wmf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
assertXPath(pDoc, "/metafile/push"_ostr, 2);
|
|
assertXPath(pDoc, "/metafile/push[2]"_ostr, "flags"_ostr, "PushClipRegion");
|
|
assertXPath(pDoc, "/metafile/push[2]/fillcolor"_ostr, 2);
|
|
assertXPath(pDoc, "/metafile/push[2]/fillcolor[1]"_ostr, "color"_ostr, "#000000");
|
|
assertXPath(pDoc, "/metafile/push[2]/fillcolor[2]"_ostr, "color"_ostr, "#d0d0d0");
|
|
assertXPath(pDoc, "/metafile/push[2]/linecolor"_ostr, 60);
|
|
assertXPath(pDoc, "/metafile/push[2]/polyline"_ostr, 209);
|
|
assertXPath(pDoc, "/metafile/push[2]/polyline[1]/point"_ostr, 5);
|
|
assertXPath(pDoc, "/metafile/push[2]/polyline[1]/point[3]"_ostr, "x"_ostr, "16906");
|
|
assertXPath(pDoc, "/metafile/push[2]/polyline[1]/point[3]"_ostr, "y"_ostr, "12673");
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray"_ostr, 307);
|
|
}
|
|
|
|
void WmfTest::testNonPlaceableWmf()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"visio_import_source.wmf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
dumper.filterAllActionTypes();
|
|
dumper.filterActionType(MetaActionType::POLYLINE, false);
|
|
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// These values come from changes done in tdf#88163
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[1]"_ostr, "x"_ostr, "16813");
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[1]"_ostr, "y"_ostr, "1004");
|
|
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[2]"_ostr, "x"_ostr, "16813");
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[2]"_ostr, "y"_ostr, "7514");
|
|
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[3]"_ostr, "x"_ostr, "26112");
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[3]"_ostr, "y"_ostr, "7514");
|
|
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[4]"_ostr, "x"_ostr, "26112");
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[4]"_ostr, "y"_ostr, "1004");
|
|
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[5]"_ostr, "x"_ostr, "16813");
|
|
assertXPath(pDoc, "/metafile/polyline[1]/point[5]"_ostr, "y"_ostr, "1004");
|
|
}
|
|
|
|
void WmfTest::testTdf88163NonPlaceableWmf()
|
|
{
|
|
OUString fileName(u"tdf88163-non-placeable.wmf"_ustr);
|
|
SvFileStream aFileStream(getFullUrl(fileName), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// These values come from the fix for tdf#88163
|
|
|
|
// Fails without the fix
|
|
// With fix: 3272, without fix: ~ 8000
|
|
auto x = getXPath(pDoc, "/metafile/push[2]/font[1]"_ostr, "height"_ostr);
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(3272), x.toInt32());
|
|
|
|
// Fails without the fix: Expected: 7359, Actual: 7336
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[1]"_ostr, "x"_ostr, "7359");
|
|
// Fails without the fix: Expected: 4118, Actual: 4104
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[1]"_ostr, "y"_ostr, "4118");
|
|
|
|
// Fails without the fix: Expected: 5989, Actual: 5971
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "x"_ostr, "5989");
|
|
// Fails without the fix: Expected: 16264, Actual: 16208
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "y"_ostr, "16264");
|
|
|
|
// Fails without the fix: Expected: 20769, Actual: 20705
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "x"_ostr, "20769");
|
|
// Fails without the fix: Expected: 4077, Actual: 4062
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "y"_ostr, "4077");
|
|
}
|
|
|
|
void WmfTest::testTdf88163PlaceableWmf()
|
|
{
|
|
OUString fileName(u"tdf88163-wrong-font-size.wmf"_ustr);
|
|
SvFileStream aFileStream(getFullUrl(fileName), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// These values come from the fix for tdf#88163
|
|
|
|
// The fix does not affect the font size
|
|
auto x = getXPath(pDoc, "/metafile/push[2]/font[1]"_ostr, "height"_ostr);
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(313), x.toInt32());
|
|
|
|
// Fails without the fix: Expected: 1900, Actual: 19818
|
|
assertXPath(pDoc, "/metafile"_ostr, "height"_ostr, "1900");
|
|
|
|
// Fails without the fix: Expected: 704, Actual: 7336
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[1]"_ostr, "x"_ostr, "704");
|
|
// Fails without the fix: Expected: 394, Actual: 4110
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[1]"_ostr, "y"_ostr, "394");
|
|
|
|
// Fails without the fix: Expected: 573, Actual: 5971
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "x"_ostr, "573");
|
|
// Fails without the fix: Expected: 1556, Actual: 16230
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "y"_ostr, "1556");
|
|
|
|
// Fails without the fix: Expected: 1987, Actual: 20706
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "x"_ostr, "1987");
|
|
// Fails without the fix: Expected: 390, Actual: 4068
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "y"_ostr, "390");
|
|
}
|
|
|
|
void WmfTest::testSetTextAlignWmf()
|
|
{
|
|
OUString fileName(u"TestSetTextAlign.wmf"_ustr);
|
|
SvFileStream aFileStream(getFullUrl(fileName), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
assertXPath(pDoc, "/metafile"_ostr, "height"_ostr, "20999");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[2]"_ostr, "align"_ostr, "top");
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "x"_ostr, "11642");
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "y"_ostr, "212");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[2]/text"_ostr, "textalignment:default");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[3]"_ostr, "align"_ostr, "top");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "x"_ostr, 12700, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "y"_ostr, "212");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[3]/text"_ostr, "textalignment:0x00");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[4]"_ostr, "align"_ostr, "top");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[4]"_ostr, "x"_ostr, 12026, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[4]"_ostr, "y"_ostr, "423");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[4]/text"_ostr, "textalignment:0x02");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[5]"_ostr, "align"_ostr, "top");
|
|
// Fails without the fix: Expected: 12026, Actual: 12350
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[5]"_ostr, "x"_ostr, 12026, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[5]"_ostr, "y"_ostr, "635");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[5]/text"_ostr, "textalignment:0x04");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[6]"_ostr, "align"_ostr, "top");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[6]"_ostr, "x"_ostr, 12363, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[6]"_ostr, "y"_ostr, "847");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[6]/text"_ostr, "textalignment:0x06");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[7]"_ostr, "align"_ostr, "top");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[7]"_ostr, "x"_ostr, 12700, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[7]"_ostr, "y"_ostr, "1058");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[7]/text"_ostr, "textalignment:0x08");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[8]"_ostr, "align"_ostr, "top");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[8]"_ostr, "x"_ostr, 12026, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[8]"_ostr, "y"_ostr, "1270");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[8]/text"_ostr, "textalignment:0x0A");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[9]"_ostr, "align"_ostr, "bottom");
|
|
// Fails without the fix: Expected: 12026, Actual: 12350
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[9]"_ostr, "x"_ostr, 12026, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[9]"_ostr, "y"_ostr, "1482");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[9]/text"_ostr, "textalignment:0x0C");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[10]"_ostr, "align"_ostr, "bottom");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[10]"_ostr, "x"_ostr, 12363, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[10]"_ostr, "y"_ostr, "1693");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[10]/text"_ostr, "textalignment:0x0E");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[11]"_ostr, "align"_ostr, "bottom");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[11]"_ostr, "x"_ostr, 12700, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[11]"_ostr, "y"_ostr, "1905");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[11]/text"_ostr, "textalignment:0x10");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[12]"_ostr, "align"_ostr, "bottom");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[12]"_ostr, "x"_ostr, 12026, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[12]"_ostr, "y"_ostr, "2117");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[12]/text"_ostr, "textalignment:0x12");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[13]"_ostr, "align"_ostr, "bottom");
|
|
// Fails without the fix: Expected: 12026, Actual: 12350
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[13]"_ostr, "x"_ostr, 12026, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[13]"_ostr, "y"_ostr, "2328");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[13]/text"_ostr, "textalignment:0x14");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[14]"_ostr, "align"_ostr, "bottom");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[14]"_ostr, "x"_ostr, 12363, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[14]"_ostr, "y"_ostr, "2540");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[14]/text"_ostr, "textalignment:0x16");
|
|
|
|
assertXPath(pDoc, "/metafile/push[2]/textalign[15]"_ostr, "align"_ostr, "bottom");
|
|
assertXPathDoubleValue(pDoc, "/metafile/push[2]/textarray[15]"_ostr, "x"_ostr, 12700, 30);
|
|
assertXPath(pDoc, "/metafile/push[2]/textarray[15]"_ostr, "y"_ostr, "2752");
|
|
assertXPathContent(pDoc, "/metafile/push[2]/textarray[15]/text"_ostr, "textalignment:0x18");
|
|
}
|
|
|
|
void WmfTest::testSine()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"sine_wave.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
dumper.filterAllActionTypes();
|
|
dumper.filterActionType(MetaActionType::ISECTRECTCLIPREGION, false);
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
assertXPath(pDoc, "/metafile/sectrectclipregion"_ostr, 0);
|
|
}
|
|
|
|
void WmfTest::testEmfProblem()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"computer_mail.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
dumper.filterAllActionTypes();
|
|
dumper.filterActionType(MetaActionType::ISECTRECTCLIPREGION, false);
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
assertXPath(pDoc, "/metafile/sectrectclipregion"_ostr, 2);
|
|
assertXPath(pDoc, "/metafile/sectrectclipregion[1]"_ostr, "top"_ostr, "2125");
|
|
assertXPath(pDoc, "/metafile/sectrectclipregion[1]"_ostr, "left"_ostr, "1084");
|
|
assertXPath(pDoc, "/metafile/sectrectclipregion[1]"_ostr, "bottom"_ostr, "2927");
|
|
assertXPath(pDoc, "/metafile/sectrectclipregion[1]"_ostr, "right"_ostr, "2376");
|
|
}
|
|
|
|
void WmfTest::testEmfLineStyles()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"line_styles.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
dumper.filterAllActionTypes();
|
|
dumper.filterActionType(MetaActionType::LINE, false);
|
|
dumper.filterActionType(MetaActionType::LINECOLOR, false);
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
assertXPath(pDoc, "/metafile/line"_ostr, 4);
|
|
assertXPath(pDoc, "/metafile/linecolor"_ostr, 5);
|
|
|
|
assertXPath(pDoc, "/metafile/linecolor[1]"_ostr, "color"_ostr, "#ffffff");
|
|
assertXPath(pDoc, "/metafile/linecolor[2]"_ostr, "color"_ostr, "#00ff00");
|
|
assertXPath(pDoc, "/metafile/linecolor[3]"_ostr, "color"_ostr, "#408080");
|
|
assertXPath(pDoc, "/metafile/linecolor[4]"_ostr, "color"_ostr, "#ff0000");
|
|
assertXPath(pDoc, "/metafile/linecolor[5]"_ostr, "color"_ostr, "#0000ff");
|
|
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "style"_ostr, "dash");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "dashlen"_ostr, "528");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "dashcount"_ostr, "1");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "dotlen"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "dotcount"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "distance"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "join"_ostr, "miter");
|
|
assertXPath(pDoc, "/metafile/line[1]"_ostr, "cap"_ostr, "butt");
|
|
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "style"_ostr, "dash");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "dashlen"_ostr, "528");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "dashcount"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "dotlen"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "dotcount"_ostr, "1");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "distance"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "join"_ostr, "miter");
|
|
assertXPath(pDoc, "/metafile/line[2]"_ostr, "cap"_ostr, "butt");
|
|
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "style"_ostr, "dash");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "dashlen"_ostr, "528");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "dashcount"_ostr, "1");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "dotlen"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "dotcount"_ostr, "1");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "distance"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "join"_ostr, "miter");
|
|
assertXPath(pDoc, "/metafile/line[3]"_ostr, "cap"_ostr, "butt");
|
|
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "style"_ostr, "dash");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "dashlen"_ostr, "528");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "dashcount"_ostr, "1");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "dotlen"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "dotcount"_ostr, "2");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "distance"_ostr, "176");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "join"_ostr, "miter");
|
|
assertXPath(pDoc, "/metafile/line[4]"_ostr, "cap"_ostr, "butt");
|
|
};
|
|
|
|
void WmfTest::testWorldTransformFontSize()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"image1.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
dumper.filterAllActionTypes();
|
|
dumper.filterActionType(MetaActionType::FONT, false);
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
assertXPath(pDoc, "/metafile/font"_ostr, 9);
|
|
|
|
assertXPath(pDoc, "/metafile/font[1]"_ostr, "color"_ostr, "#595959");
|
|
assertXPath(pDoc, "/metafile/font[1]"_ostr, "width"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/font[1]"_ostr, "height"_ostr, "389");
|
|
assertXPath(pDoc, "/metafile/font[1]"_ostr, "orientation"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/font[1]"_ostr, "weight"_ostr, "bold");
|
|
|
|
assertXPath(pDoc, "/metafile/font[3]"_ostr, "color"_ostr, "#000000");
|
|
assertXPath(pDoc, "/metafile/font[3]"_ostr, "width"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/font[3]"_ostr, "height"_ostr, "389");
|
|
assertXPath(pDoc, "/metafile/font[3]"_ostr, "orientation"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/font[3]"_ostr, "weight"_ostr, "bold");
|
|
|
|
// World transform should not affect font size. Rotating text for 90 degrees
|
|
// should not exchange font width and height.
|
|
assertXPath(pDoc, "/metafile/font[4]"_ostr, "color"_ostr, "#000000");
|
|
assertXPath(pDoc, "/metafile/font[4]"_ostr, "width"_ostr, "0");
|
|
assertXPath(pDoc, "/metafile/font[4]"_ostr, "height"_ostr, "530");
|
|
assertXPath(pDoc, "/metafile/font[4]"_ostr, "orientation"_ostr, "900");
|
|
assertXPath(pDoc, "/metafile/font[4]"_ostr, "weight"_ostr, "normal");
|
|
}
|
|
|
|
void WmfTest::testBigPPI()
|
|
{
|
|
// Test that PPI is reduced from 2540 to 96 (width from META_SETWINDOWEXT) to make the graphic
|
|
// bigger
|
|
SvFileStream aFileStream(getFullUrl(u"TestBigPPI.wmf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
dumper.filterAllActionTypes();
|
|
dumper.filterActionType(MetaActionType::FONT, false);
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// If the PPI was not reduced the width and height would be <100 which is too small
|
|
// Related: tdf#150888
|
|
assertXPath(pDoc, "/metafile"_ostr, "width"_ostr, "2540");
|
|
assertXPath(pDoc, "/metafile"_ostr, "height"_ostr, "2143");
|
|
}
|
|
|
|
void WmfTest::testTdf93750()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"tdf93750.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
assertXPath(pDoc, "/metafile/push[1]/comment[2]"_ostr, "datasize"_ostr, "28");
|
|
assertXPath(pDoc, "/metafile/push[1]/comment[3]"_ostr, "datasize"_ostr, "72");
|
|
}
|
|
|
|
void WmfTest::testTdf99402()
|
|
{
|
|
// Symbol font should arrive with RTL_TEXTENCODING_SYMBOL encoding,
|
|
// even if charset is OEM_CHARSET/DEFAULT_CHARSET in WMF
|
|
emfio::LOGFONTW logfontw;
|
|
logfontw.lfHeight = 0;
|
|
logfontw.lfWidth = 0;
|
|
logfontw.lfEscapement = 0;
|
|
logfontw.lfWeight = 0;
|
|
logfontw.lfItalic = 0;
|
|
logfontw.lfUnderline = 0;
|
|
logfontw.lfStrikeOut = 0;
|
|
logfontw.lfCharSet = emfio::CharacterSet::OEM_CHARSET;
|
|
logfontw.lfPitchAndFamily = emfio::FamilyFont::FF_ROMAN << 4 | emfio::PitchFont::DEFAULT_PITCH;
|
|
logfontw.alfFaceName = "Symbol";
|
|
|
|
emfio::WinMtfFontStyle fontStyle(logfontw);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(RTL_TEXTENCODING_SYMBOL, fontStyle.aFont.GetCharSet());
|
|
}
|
|
|
|
void WmfTest::testTdf39894Wmf()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"tdf39894.wmf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// The x position of the second text must take into account
|
|
// the previous text's last Dx (previously was ~300)
|
|
auto x = getXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "x"_ostr);
|
|
CPPUNIT_ASSERT_GREATER(sal_Int32(2700), x.toInt32());
|
|
}
|
|
|
|
void WmfTest::testTdf39894Emf()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"tdf39894.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// The x position of the second text must take into account
|
|
// the previous text's last Dx (previously was ~300)
|
|
auto x = getXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "x"_ostr);
|
|
CPPUNIT_ASSERT_GREATER(sal_Int32(2700), x.toInt32());
|
|
}
|
|
|
|
void WmfTest::testETO_PDYWmf()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"ETO_PDY.wmf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// The y position of following text
|
|
// must be smaller than that of previous
|
|
auto y1 = getXPath(pDoc, "/metafile/push[2]/textarray[1]"_ostr, "y"_ostr);
|
|
auto y2 = getXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "y"_ostr);
|
|
auto y3 = getXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "y"_ostr);
|
|
CPPUNIT_ASSERT(y2.toInt32() < y1.toInt32());
|
|
CPPUNIT_ASSERT(y3.toInt32() < y2.toInt32());
|
|
}
|
|
|
|
void WmfTest::testETO_PDYEmf()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"ETO_PDY.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// The y position of following text
|
|
// must be smaller than that of previous
|
|
auto y1 = getXPath(pDoc, "/metafile/push[2]/textarray[1]"_ostr, "y"_ostr);
|
|
auto y2 = getXPath(pDoc, "/metafile/push[2]/textarray[2]"_ostr, "y"_ostr);
|
|
auto y3 = getXPath(pDoc, "/metafile/push[2]/textarray[3]"_ostr, "y"_ostr);
|
|
CPPUNIT_ASSERT(y2.toInt32() < y1.toInt32());
|
|
CPPUNIT_ASSERT(y3.toInt32() < y2.toInt32());
|
|
}
|
|
|
|
void WmfTest::testStockObject()
|
|
{
|
|
SvFileStream aFileStream(getFullUrl(u"stockobject.emf"), StreamMode::READ);
|
|
GDIMetaFile aGDIMetaFile;
|
|
ReadWindowMetafile(aFileStream, aGDIMetaFile);
|
|
|
|
MetafileXmlDump dumper;
|
|
xmlDocUniquePtr pDoc = dumpAndParse(dumper, aGDIMetaFile);
|
|
|
|
CPPUNIT_ASSERT(pDoc);
|
|
|
|
// Without the fix in place, this test would have failed with
|
|
// - Expected: 1
|
|
// - Actual : 0
|
|
// - In <>, XPath '/metafile/push[2]/fillcolor[2]' number of nodes is incorrect
|
|
assertXPath(pDoc, "/metafile/push[2]/fillcolor[2]"_ostr, "color"_ostr, "#000000");
|
|
}
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(WmfTest);
|
|
|
|
CPPUNIT_PLUGIN_IMPLEMENT();
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|