1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10 #include <unotest/bootstrapfixturebase.hxx>
11
12 #include <cppunit/TestAssert.h>
13 #include <cppunit/TestFixture.h>
14 #include <cppunit/extensions/HelperMacros.h>
15
16 #include <com/sun/star/uno/Sequence.hxx>
17 #include <com/sun/star/beans/PropertyValue.hpp>
18
19 #include <vcl/graphicfilter.hxx>
20 #include <tools/stream.hxx>
21
22 using namespace css;
23
24 namespace
25 {
26 class GraphicDescriptorTest : public test::BootstrapFixtureBase
27 {
getFullUrl(std::u16string_view sFileName)28 OUString getFullUrl(std::u16string_view sFileName)
29 {
30 return m_directories.getURLFromSrc(u"/vcl/qa/cppunit/data/") + sFileName;
31 }
32 void testDetectPNG();
33 void testDetectJPG();
34 void testDetectGIF();
35 void testDetectTIF();
36 void testDetectBMP();
37
38 CPPUNIT_TEST_SUITE(GraphicDescriptorTest);
39 CPPUNIT_TEST(testDetectPNG);
40 CPPUNIT_TEST(testDetectJPG);
41 CPPUNIT_TEST(testDetectGIF);
42 CPPUNIT_TEST(testDetectTIF);
43 CPPUNIT_TEST(testDetectBMP);
44 CPPUNIT_TEST_SUITE_END();
45 };
46
createBitmap()47 BitmapEx createBitmap()
48 {
49 Bitmap aBitmap(Size(100, 100), vcl::PixelFormat::N24_BPP);
50 aBitmap.Erase(COL_LIGHTRED);
51
52 return BitmapEx(aBitmap);
53 }
54
createBitmapAndExportForType(SvStream & rStream,std::u16string_view sType)55 void createBitmapAndExportForType(SvStream& rStream, std::u16string_view sType)
56 {
57 BitmapEx aBitmapEx = createBitmap();
58
59 uno::Sequence<beans::PropertyValue> aFilterData;
60 GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
61 sal_uInt16 nFilterFormat = rGraphicFilter.GetExportFormatNumberForShortName(sType);
62 rGraphicFilter.ExportGraphic(aBitmapEx, "none", rStream, nFilterFormat, &aFilterData);
63
64 rStream.Seek(STREAM_SEEK_TO_BEGIN);
65 }
66
testDetectPNG()67 void GraphicDescriptorTest::testDetectPNG()
68 {
69 SvMemoryStream aStream;
70 createBitmapAndExportForType(aStream, u"png");
71
72 GraphicDescriptor aDescriptor(aStream, nullptr);
73 aDescriptor.Detect(true);
74
75 CPPUNIT_ASSERT_EQUAL(GraphicFileFormat::PNG, aDescriptor.GetFileFormat());
76
77 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Width());
78 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Height());
79 }
80
testDetectJPG()81 void GraphicDescriptorTest::testDetectJPG()
82 {
83 SvMemoryStream aStream;
84 createBitmapAndExportForType(aStream, u"jpg");
85
86 GraphicDescriptor aDescriptor(aStream, nullptr);
87 aDescriptor.Detect(true);
88
89 CPPUNIT_ASSERT_EQUAL(GraphicFileFormat::JPG, aDescriptor.GetFileFormat());
90
91 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Width());
92 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Height());
93 }
94
testDetectGIF()95 void GraphicDescriptorTest::testDetectGIF()
96 {
97 SvMemoryStream aStream;
98 createBitmapAndExportForType(aStream, u"gif");
99
100 GraphicDescriptor aDescriptor(aStream, nullptr);
101 aDescriptor.Detect(true);
102
103 CPPUNIT_ASSERT_EQUAL(GraphicFileFormat::GIF, aDescriptor.GetFileFormat());
104
105 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Width());
106 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Height());
107 }
108
testDetectTIF()109 void GraphicDescriptorTest::testDetectTIF()
110 {
111 SvMemoryStream aStream;
112 createBitmapAndExportForType(aStream, u"tif");
113
114 GraphicDescriptor aDescriptor(aStream, nullptr);
115 aDescriptor.Detect(true);
116
117 CPPUNIT_ASSERT_EQUAL(GraphicFileFormat::TIF, aDescriptor.GetFileFormat());
118
119 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Width());
120 CPPUNIT_ASSERT_EQUAL(tools::Long(100), aDescriptor.GetSizePixel().Height());
121 }
122
testDetectBMP()123 void GraphicDescriptorTest::testDetectBMP()
124 {
125 GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
126 SvFileStream aFileStream(getFullUrl(u"graphic-descriptor-mapmode.bmp"), StreamMode::READ);
127
128 Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aFileStream);
129
130 CPPUNIT_ASSERT(!aGraphic.isAvailable());
131 // Without the accompanying fix in place, this test would have failed with:
132 // - Expected: 2 (MapUnit::MapMM)
133 // - Actual : 0 (MapUnit::Map100thMM)
134 // i.e. lazy load and load created different map modes, breaking the contour polygon code in
135 // Writer.
136 CPPUNIT_ASSERT_EQUAL(MapUnit::MapMM, aGraphic.GetPrefMapMode().GetMapUnit());
137 aGraphic.makeAvailable();
138 CPPUNIT_ASSERT_EQUAL(MapUnit::MapMM, aGraphic.GetPrefMapMode().GetMapUnit());
139 }
140
141 } // namespace
142
143 CPPUNIT_TEST_SUITE_REGISTRATION(GraphicDescriptorTest);
144
145 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
146