From 0116c9240efd6e6ba12f357b81a8c5290d64474c Mon Sep 17 00:00:00 2001 From: glexey Date: Sun, 27 Nov 2016 08:03:51 -0800 Subject: [PATCH] EMF: support negative bounding box coordinates (#2249) * EMF: support negative bounding box coordinates Similar to placeable WMF, bounding box coordinates should be interpreted as signed integer, otherwise opening EMF file with negative (x0,y0) fails. * Basic load tests for WMF and EMF formats * WMF/WMF tests: just test open(), not load() Not sure why load() fails on Debian build. Well, at least we can test open(). * WMF/EMF: Unpack signed integers using unpack() * WMF/EMF: Compare to reference PNG rendering * EMF/WMF comparison: use assert_image_similar() * Use similarity epsilon 0.5 for WMF, as vector rendering looks different across Windows platforms * Trigger rebuild --- PIL/WmfImagePlugin.py | 25 +++++++++++-------------- PIL/_binary.py | 22 ++++++++++++++++++++-- Tests/images/drawing.emf | Bin 0 -> 876 bytes Tests/images/drawing.wmf | Bin 0 -> 610 bytes Tests/images/drawing_emf_ref.png | Bin 0 -> 20304 bytes Tests/images/drawing_wmf_ref.png | Bin 0 -> 531 bytes Tests/test_file_wmf.py | 31 +++++++++++++++++++++++++++++++ 7 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 Tests/images/drawing.emf create mode 100644 Tests/images/drawing.wmf create mode 100644 Tests/images/drawing_emf_ref.png create mode 100644 Tests/images/drawing_wmf_ref.png create mode 100644 Tests/test_file_wmf.py diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 9416035c0..1dbd9f964 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -14,6 +14,10 @@ # # See the README file for information on usage and redistribution. # +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html from PIL import Image, ImageFile, _binary @@ -56,16 +60,9 @@ if hasattr(Image.core, "drawwmf"): # -------------------------------------------------------------------- word = _binary.i16le - - -def short(c, o=0): - v = word(c, o) - if v >= 32768: - v -= 65536 - return v - +short = _binary.si16le dword = _binary.i32le - +_long = _binary.si32le # # -------------------------------------------------------------------- @@ -121,13 +118,13 @@ class WmfStubImageFile(ImageFile.StubImageFile): # enhanced metafile # get bounding box - x0 = dword(s, 8) - y0 = dword(s, 12) - x1 = dword(s, 16) - y1 = dword(s, 20) + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) # get frame (in 0.01 millimeter units) - frame = dword(s, 24), dword(s, 28), dword(s, 32), dword(s, 36) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) # normalize size to 72 dots per inch size = x1 - x0, y1 - y0 diff --git a/PIL/_binary.py b/PIL/_binary.py index 1cbe59dea..9760b86cd 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -31,23 +31,41 @@ else: # TODO: replace with more readable struct.unpack equivalent def i16le(c, o=0): """ - Converts a 2-bytes (16 bits) string to an integer. + Converts a 2-bytes (16 bits) string to an unsigned integer. c: string containing bytes to convert o: offset of bytes to convert in string """ return unpack("H", c[o:o+2])[0] diff --git a/Tests/images/drawing.emf b/Tests/images/drawing.emf new file mode 100644 index 0000000000000000000000000000000000000000..ef751cd51a4d542c949802f6ca0d6824cf0ba8bb GIT binary patch literal 876 zcmaiz-AV#c6ouEM{g4&?Q9%$xB^8LxPo`E9K?N0EdDT^jnMf*P7tT%Ki}Wr%LYLn3 zEVkBgjzNKK_|D$5&)WN(nRCVg@JTQn4#mSHAgq;BfN-zwuK@?m1hBLxb~m*4NO&^Ju{(Msvg=y9S_t&d}ITJi!cK3K`;(aM?t>WYQlbri{ddB7qUSVaG)H^)Y-kPm{@DBnRtU< zNF!S%isuPGXFR9(kPXQcNt53_rFkR;qW*tu+lhPHy!u$P{Zw~C)H_K|$qd;fizMWo zc&A8L5tA rUx_*8&y3ea(V1AY@0Vsm--hM=eG{|I=sehCl-IXhAUaQL`ft7g7R6_K literal 0 HcmV?d00001 diff --git a/Tests/images/drawing.wmf b/Tests/images/drawing.wmf new file mode 100644 index 0000000000000000000000000000000000000000..d9cfda453d9fcb68f45c5b7aa775599a859c374f GIT binary patch literal 610 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 Dw?19& literal 0 HcmV?d00001 diff --git a/Tests/images/drawing_wmf_ref.png b/Tests/images/drawing_wmf_ref.png new file mode 100644 index 0000000000000000000000000000000000000000..207160de0d33ec60eb038a5bc7988c6bc28ddc70 GIT binary patch literal 531 zcmV+u0_^>XP)Y0005nNklTSrsyoowwgOkt~`U?tyz;LPi1#*)}+gm*e1-HMENz_ zkXe%=zhIj)YcAz6wo$VtE&Kgpt#LL}oXr$xGo_<{ z&_5OdrVv8mgAkTOI^@n~inE#GY^Kn$1qdNb00{3`=-SqBvq|P$zRx0ax6PIxd-yq* z#nblmZDZ)dW&OhnZyUg%h0E?YG~V_%gB8B78fR?}BR@35hkTm>3O}nF@wQFNBW7F< zxlwuCjFiu|Ir*g-iC<}kqE$F`@^_PCWhXf6IWu!Gj|8vX5;_7BUZ V=6D`xo3j7_002ovPDHLkV1n2=1BU