Skip to content

Commit 3d9151d

Browse files
committed
Support further pdf versions.
1 parent 0ec8841 commit 3d9151d

File tree

3 files changed

+55
-36
lines changed

3 files changed

+55
-36
lines changed

CHANGELOG.rst

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
next
2+
====
3+
4+
- Support pdf MaxVersion up to 1.7 (if the underlying cairo supports it).
5+
16
v0.5 (2022-08-18)
27
=================
38

src/_mplcairo.cpp

+38-21
Original file line numberDiff line numberDiff line change
@@ -480,15 +480,22 @@ void GraphicsContextRenderer::_set_metadata(std::optional<py::dict> metadata)
480480
if (auto maxver =
481481
metadata->attr("pop")("MaxVersion", py::none())
482482
.cast<std::optional<std::string>>()) {
483-
if (*maxver == "1.4") {
484-
detail::cairo_pdf_surface_restrict_to_version(
485-
surface, detail::CAIRO_PDF_VERSION_1_4);
486-
} else if (*maxver == "1.5") {
487-
detail::cairo_pdf_surface_restrict_to_version(
488-
surface, detail::CAIRO_PDF_VERSION_1_5);
489-
} else {
483+
auto intver =
484+
*maxver == "1.4" ? 0 :
485+
*maxver == "1.5" ? 1 :
486+
*maxver == "1.6" ? 2 :
487+
*maxver == "1.7" ? 3 :
488+
-1;
489+
if (intver == -1) {
490490
throw std::invalid_argument("Invalid MaxVersion: " + *maxver);
491491
}
492+
int n_supported_vers;
493+
detail::cairo_pdf_get_versions(nullptr, &n_supported_vers);
494+
if (intver >= n_supported_vers) {
495+
throw std::invalid_argument("Unsupported MaxVersion: " + *maxver);
496+
}
497+
detail::cairo_pdf_surface_restrict_to_version(
498+
surface, detail::cairo_pdf_version_t(intver));
492499
}
493500
for (auto const& it: *metadata) {
494501
if (it.second.is_none()) {
@@ -538,15 +545,20 @@ void GraphicsContextRenderer::_set_metadata(std::optional<py::dict> metadata)
538545
if (auto maxver =
539546
metadata->attr("pop")("MaxVersion", py::none())
540547
.cast<std::optional<std::string>>()) {
541-
if (*maxver == "2") {
542-
detail::cairo_ps_surface_restrict_to_level(
543-
surface, detail::CAIRO_PS_LEVEL_2);
544-
} else if (*maxver == "3") {
545-
detail::cairo_ps_surface_restrict_to_level(
546-
surface, detail::CAIRO_PS_LEVEL_3);
547-
} else {
548+
auto intver =
549+
*maxver == "2" ? 0 :
550+
*maxver == "3" ? 1 :
551+
-1;
552+
if (intver == -1) {
548553
throw std::invalid_argument("Invalid MaxVersion: " + *maxver);
549554
}
555+
int n_supported_vers;
556+
detail::cairo_ps_get_levels(nullptr, &n_supported_vers);
557+
if (intver >= n_supported_vers) {
558+
throw std::invalid_argument("Unsupported MaxVersion: " + *maxver);
559+
}
560+
detail::cairo_svg_surface_restrict_to_version(
561+
surface, detail::cairo_svg_version_t(intver));
550562
}
551563
for (auto const& it: *metadata) {
552564
auto const& key = it.first.cast<std::string>();
@@ -565,15 +577,20 @@ void GraphicsContextRenderer::_set_metadata(std::optional<py::dict> metadata)
565577
if (auto maxver =
566578
metadata->attr("pop")("MaxVersion", py::none())
567579
.cast<std::optional<std::string>>()) {
568-
if (*maxver == "1.1") {
569-
detail::cairo_svg_surface_restrict_to_version(
570-
surface, detail::CAIRO_SVG_VERSION_1_1);
571-
} else if (*maxver == "1.2") {
572-
detail::cairo_svg_surface_restrict_to_version(
573-
surface, detail::CAIRO_SVG_VERSION_1_2);
574-
} else {
580+
auto intver =
581+
*maxver == "1.1" ? 0 :
582+
*maxver == "1.2" ? 1 :
583+
-1;
584+
if (intver == -1) {
575585
throw std::invalid_argument("Invalid MaxVersion: " + *maxver);
576586
}
587+
int n_supported_vers;
588+
detail::cairo_svg_get_versions(nullptr, &n_supported_vers);
589+
if (intver >= n_supported_vers) {
590+
throw std::invalid_argument("Unsupported MaxVersion: " + *maxver);
591+
}
592+
detail::cairo_svg_surface_restrict_to_version(
593+
surface, detail::cairo_svg_version_t(intver));
577594
}
578595
break;
579596
default:

src/_util.h

+12-15
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,8 @@ extern std::array<uint8_t, 0x10000> unpremultiplication_table;
3131
extern void (*cairo_tag_begin)(cairo_t*, char const*, char const*);
3232
extern void (*cairo_tag_end)(cairo_t*, char const*);
3333

34-
// Copy-pasted from cairo-pdf.h.
35-
typedef enum _cairo_pdf_version {
36-
CAIRO_PDF_VERSION_1_4,
37-
CAIRO_PDF_VERSION_1_5
38-
} cairo_pdf_version_t;
34+
// Modified from cairo-pdf.h.
35+
enum cairo_pdf_version_t {};
3936
typedef enum _cairo_pdf_metadata {
4037
CAIRO_PDF_METADATA_TITLE,
4138
CAIRO_PDF_METADATA_AUTHOR,
@@ -46,6 +43,7 @@ typedef enum _cairo_pdf_metadata {
4643
CAIRO_PDF_METADATA_MOD_DATE,
4744
} cairo_pdf_metadata_t;
4845

46+
extern void (*cairo_pdf_get_versions)(cairo_pdf_version_t const**, int*);
4947
extern cairo_surface_t* (*cairo_pdf_surface_create_for_stream)(
5048
cairo_write_func_t, void*, double, double);
5149
extern void (*cairo_pdf_surface_restrict_to_version)(
@@ -54,11 +52,9 @@ extern void (*cairo_pdf_surface_set_metadata)(
5452
cairo_surface_t*, cairo_pdf_metadata_t, char const*);
5553
extern void (*cairo_pdf_surface_set_size)(cairo_surface_t*, double, double);
5654

57-
// Copy-pasted from cairo-ps.h.
58-
typedef enum _cairo_ps_level {
59-
CAIRO_PS_LEVEL_2,
60-
CAIRO_PS_LEVEL_3
61-
} cairo_ps_level_t;
55+
// Modified from cairo-ps.h.
56+
enum cairo_ps_level_t {};
57+
extern void (*cairo_ps_get_levels)(cairo_ps_level_t const**, int*);
6258
extern cairo_surface_t* (*cairo_ps_surface_create_for_stream)(
6359
cairo_write_func_t, void*, double, double);
6460
extern void (*cairo_ps_surface_dsc_comment)(cairo_surface_t*, char const*);
@@ -67,11 +63,9 @@ extern void (*cairo_ps_surface_restrict_to_level)(
6763
extern void (*cairo_ps_surface_set_eps)(cairo_surface_t*, cairo_bool_t);
6864
extern void (*cairo_ps_surface_set_size)(cairo_surface_t*, double, double);
6965

70-
// Copy-pasted from cairo-svg.h.
71-
typedef enum _cairo_svg_version {
72-
CAIRO_SVG_VERSION_1_1,
73-
CAIRO_SVG_VERSION_1_2
74-
} cairo_svg_version_t;
66+
// Modified from cairo-svg.h.
67+
enum cairo_svg_version_t {};
68+
extern void (*cairo_svg_get_versions)(cairo_svg_version_t const**, int*);
7569
extern cairo_surface_t* (*cairo_svg_surface_create_for_stream)(
7670
cairo_write_func_t, void*, double, double);
7771
extern void (*cairo_svg_surface_restrict_to_version)(
@@ -80,15 +74,18 @@ extern void (*cairo_svg_surface_restrict_to_version)(
8074
#define ITER_CAIRO_OPTIONAL_API(_) \
8175
_(cairo_tag_begin) \
8276
_(cairo_tag_end) \
77+
_(cairo_pdf_get_versions) \
8378
_(cairo_pdf_surface_create_for_stream) \
8479
_(cairo_pdf_surface_restrict_to_version) \
8580
_(cairo_pdf_surface_set_metadata) \
8681
_(cairo_pdf_surface_set_size) \
82+
_(cairo_ps_get_levels) \
8783
_(cairo_ps_surface_create_for_stream) \
8884
_(cairo_ps_surface_dsc_comment) \
8985
_(cairo_ps_surface_restrict_to_level) \
9086
_(cairo_ps_surface_set_eps) \
9187
_(cairo_ps_surface_set_size) \
88+
_(cairo_svg_get_versions) \
9289
_(cairo_svg_surface_create_for_stream) \
9390
_(cairo_svg_surface_restrict_to_version)
9491

0 commit comments

Comments
 (0)