From 74f8af2d42047544d8ad974bb14459f576096a03 Mon Sep 17 00:00:00 2001 From: Tuan Dung Tran Date: Sat, 27 May 2017 22:03:32 +1000 Subject: [PATCH 1/4] fixed pdf backend saving and modified pdf to eps blank/nonblank comparison and unit test case --- lib/matplotlib/backends/backend_pdf.py | 7 +++++++ lib/matplotlib/testing/compare.py | 4 ++-- lib/matplotlib/tests/test_backend_pdf.py | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index e14aadcb48bd..7ae584ac63df 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1626,6 +1626,13 @@ def check_gc(self, gc, fillcolor=None): orig_alphas = getattr(gc, '_effective_alphas', (1.0, 1.0)) + if gc._rgb is None: + if gc.get_linewidth() != 0: + warnings.warn('if rgb is None, ' + + 'linewidth should also be 0') + # doesn't matter what color here + gc._rgb = [1, 0, 0, 1] + if gc._forced_alpha: gc._effective_alphas = (gc._alpha, gc._alpha) elif fillcolor is None or len(fillcolor) < 4: diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index c3d649e38069..b6f508660fc9 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -355,8 +355,8 @@ def crop_to_same(actual_path, actual_image, expected_path, expected_image): # clip the images to the same size -- this is useful only when # comparing eps to pdf if actual_path[-7:-4] == 'eps' and expected_path[-7:-4] == 'pdf': - aw, ah = actual_image.shape - ew, eh = expected_image.shape + aw, ah, ad = actual_image.shape + ew, eh, ed = expected_image.shape actual_image = actual_image[int(aw / 2 - ew / 2):int( aw / 2 + ew / 2), int(ah / 2 - eh / 2):int(ah / 2 + eh / 2)] return actual_image, expected_image diff --git a/lib/matplotlib/tests/test_backend_pdf.py b/lib/matplotlib/tests/test_backend_pdf.py index 3529ea8541db..fac9cd8635fd 100644 --- a/lib/matplotlib/tests/test_backend_pdf.py +++ b/lib/matplotlib/tests/test_backend_pdf.py @@ -19,7 +19,9 @@ _determinism_check) from matplotlib.testing.decorators import image_comparison from matplotlib import dviread +from matplotlib.testing.compare import compare_images +import matplotlib as mpl needs_tex = pytest.mark.xfail( not checkdep_tex(), @@ -191,3 +193,22 @@ def psfont(*args, **kwargs): ax.text(0.5, 0.5, 'hello') with tempfile.TemporaryFile() as tmpfile, pytest.raises(ValueError): fig.savefig(tmpfile, format='pdf') + + +def test_pdf_savefig_when_color_is_none(): + backup_params = mpl.rcParams.copy() + mpl.rcParams.update(mpl.rcParamsDefault) + plt.subplot() + plt.axis('off') + plt.plot(np.sin(np.linspace(-5, 5, 100)), 'v', c='none') + try: + plt.savefig("figure.pdf", format='pdf') + except Exception: + pytest.fail("Failed to save pdf") + plt.savefig("figure.eps", format='eps') + result = compare_images('figure.pdf', 'figure.eps', 0) + assert result is None + from os import remove + remove('figure.eps') + remove('figure.pdf') + mpl.rcParams.update(backup_params) From 13917124501bbd7b33e2b50e1fcca75cae22a536 Mon Sep 17 00:00:00 2001 From: Tuan Date: Sun, 28 May 2017 19:15:09 +1000 Subject: [PATCH 2/4] Update backend_pdf.py to handle case where rgb is None --- lib/matplotlib/backends/backend_pdf.py | 10 +++++----- lib/matplotlib/tests/test_backend_pdf.py | 22 +++++++++------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 7ae584ac63df..bf710705f202 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1627,11 +1627,11 @@ def check_gc(self, gc, fillcolor=None): orig_alphas = getattr(gc, '_effective_alphas', (1.0, 1.0)) if gc._rgb is None: - if gc.get_linewidth() != 0: - warnings.warn('if rgb is None, ' + - 'linewidth should also be 0') - # doesn't matter what color here - gc._rgb = [1, 0, 0, 1] + # it should not matter what color here + # since linewidth should be 0 + # unless affected by global settings in rcParams + # hence setting zero alpha just incase + gc._rgb = [0, 0, 0, 0] if gc._forced_alpha: gc._effective_alphas = (gc._alpha, gc._alpha) diff --git a/lib/matplotlib/tests/test_backend_pdf.py b/lib/matplotlib/tests/test_backend_pdf.py index fac9cd8635fd..275748e2aec2 100644 --- a/lib/matplotlib/tests/test_backend_pdf.py +++ b/lib/matplotlib/tests/test_backend_pdf.py @@ -195,20 +195,16 @@ def psfont(*args, **kwargs): fig.savefig(tmpfile, format='pdf') -def test_pdf_savefig_when_color_is_none(): - backup_params = mpl.rcParams.copy() - mpl.rcParams.update(mpl.rcParamsDefault) +@pytest.fixture(scope='function') +def test_pdf_savefig_when_color_is_none(tempdir_factory): + rcParams['_internal.classic_mode'] = False plt.subplot() plt.axis('off') plt.plot(np.sin(np.linspace(-5, 5, 100)), 'v', c='none') - try: - plt.savefig("figure.pdf", format='pdf') - except Exception: - pytest.fail("Failed to save pdf") - plt.savefig("figure.eps", format='eps') - result = compare_images('figure.pdf', 'figure.eps', 0) + tmpdir_name = str(np.random.randint(100000, 10000000)) + actual_image = tempdir_factory.mktemp(tmpdir_name).join('figure.pdf') + expected_image = tempdir_factory.mktemp(tmpdir_name).join('figure.eps') + plt.savefig(str(actual_image), format='pdf') + plt.savefig(str(expected_image), format='eps') + result = compare_images(str(actual_image), str(expected_image), 0) assert result is None - from os import remove - remove('figure.eps') - remove('figure.pdf') - mpl.rcParams.update(backup_params) From 933c4f78f8df74cebc3ccc51c3fc07af44369975 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 8 Jul 2017 15:56:02 -0400 Subject: [PATCH 3/4] TST: tweak tests so they run --- lib/matplotlib/tests/test_backend_pdf.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/tests/test_backend_pdf.py b/lib/matplotlib/tests/test_backend_pdf.py index 275748e2aec2..7654d8d98b30 100644 --- a/lib/matplotlib/tests/test_backend_pdf.py +++ b/lib/matplotlib/tests/test_backend_pdf.py @@ -195,16 +195,14 @@ def psfont(*args, **kwargs): fig.savefig(tmpfile, format='pdf') -@pytest.fixture(scope='function') -def test_pdf_savefig_when_color_is_none(tempdir_factory): - rcParams['_internal.classic_mode'] = False - plt.subplot() +@pytest.mark.style('default') +def test_pdf_savefig_when_color_is_none(tmpdir): + fig, ax = plt.subplots() plt.axis('off') - plt.plot(np.sin(np.linspace(-5, 5, 100)), 'v', c='none') - tmpdir_name = str(np.random.randint(100000, 10000000)) - actual_image = tempdir_factory.mktemp(tmpdir_name).join('figure.pdf') - expected_image = tempdir_factory.mktemp(tmpdir_name).join('figure.eps') - plt.savefig(str(actual_image), format='pdf') - plt.savefig(str(expected_image), format='eps') + ax.plot(np.sin(np.linspace(-5, 5, 100)), 'v', c='none') + actual_image = tmpdir.join('figure.pdf') + expected_image = tmpdir.join('figure.eps') + fig.savefig(str(actual_image), format='pdf') + fig.savefig(str(expected_image), format='eps') result = compare_images(str(actual_image), str(expected_image), 0) assert result is None From 51f070536cdb8b89552f03091b3068a6fc45e5a0 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 10 Jul 2017 22:45:57 -0500 Subject: [PATCH 4/4] MNT: use public API on gc not private attributes --- lib/matplotlib/backends/backend_pdf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index bf710705f202..e8b143fa7d66 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1626,12 +1626,12 @@ def check_gc(self, gc, fillcolor=None): orig_alphas = getattr(gc, '_effective_alphas', (1.0, 1.0)) - if gc._rgb is None: + if gc.get_rgb() is None: # it should not matter what color here # since linewidth should be 0 # unless affected by global settings in rcParams # hence setting zero alpha just incase - gc._rgb = [0, 0, 0, 0] + gc.set_foreground((0, 0, 0, 0), isRGBA=True) if gc._forced_alpha: gc._effective_alphas = (gc._alpha, gc._alpha)