From e34bc19f7126b80764a4c8747a7a2a1636289396 Mon Sep 17 00:00:00 2001
From: jvoisin <julien.voisin@dustri.org>
Date: Mon, 16 Apr 2018 22:27:29 +0200
Subject: [PATCH] Add support for BMP
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

To be completely honest, BMP have no metadata,
but we still add it, just in caseâ„¢
---
 src/images.py         |  14 ++++++++++++++
 tests/data/dirty.bmp  | Bin 0 -> 5746 bytes
 tests/test_libmat2.py |  15 +++++++++++++++
 3 files changed, 29 insertions(+)
 create mode 100644 tests/data/dirty.bmp

diff --git a/src/images.py b/src/images.py
index 06f3e22..707207b 100644
--- a/src/images.py
+++ b/src/images.py
@@ -75,3 +75,17 @@ class TiffParser(GdkPixbufAbstractParser):
             'FileTypeExtension', 'ImageHeight', 'ImageSize', 'ImageWidth',
             'MIMEType', 'Megapixels', 'SourceFile'}
 
+
+class BMPParser(GdkPixbufAbstractParser):
+    mimetypes = {'image/bmp', 'image/x-ms-bmp'}
+    meta_whitelist = {'SourceFile', 'ExifToolVersion', 'FileName', 'Directory',
+            'FileSize', 'FileModifyDate', 'FileAccessDate',
+            'FileInodeChangeDate', 'FilePermissions', 'FileType',
+            'FileTypeExtension', 'MIMEType', 'BMPVersion', 'ImageWidth',
+            'ImageHeight', 'Planes', 'BitDepth', 'Compression', 'ImageLength',
+            'PixelsPerMeterX', 'PixelsPerMeterY', 'NumColors',
+            'NumImportantColors', 'RedMask', 'GreenMask', 'BlueMask',
+            'AlphaMask', 'ColorSpace', 'RedEndpoint', 'GreenEndpoint',
+            'BlueEndpoint', 'GammaRed', 'GammaGreen', 'GammaBlue', 'ImageSize',
+            'Megapixels'}
+
diff --git a/tests/data/dirty.bmp b/tests/data/dirty.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..be9094d1f8e9f9e9ae0584863c2aa6cb48b7f05d
GIT binary patch
literal 5746
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

literal 0
HcmV?d00001

diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py
index 34f7301..ae04dc2 100644
--- a/tests/test_libmat2.py
+++ b/tests/test_libmat2.py
@@ -307,3 +307,18 @@ class TestCleaning(unittest.TestCase):
         self.assertEqual(p.get_meta(), {})
 
         os.remove('./tests/data/clean.tiff')
+
+    def test_bmp(self):
+        shutil.copy('./tests/data/dirty.bmp', './tests/data/clean.bmp')
+        p = images.BMPParser('./tests/data/clean.bmp')
+
+        meta = p.get_meta()
+        self.assertEqual(meta, {})  # bmp has no meta :)
+
+        ret = p.remove_all()
+        self.assertTrue(ret)
+
+        p = images.BMPParser('./tests/data/clean.bmp.cleaned')
+        self.assertEqual(p.get_meta(), {})
+
+        os.remove('./tests/data/clean.bmp')
-- 
GitLab