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