summaryrefslogtreecommitdiff
path: root/src/cairo-tag-attributes.c
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2017-10-22 08:07:49 +1030
committerAdrian Johnson <ajohnson@redneon.com>2017-10-22 08:42:36 +1030
commite1a02b180d804887980c111c1f9780bed44b96a6 (patch)
treecca69a484e92389b20ef60f31fb697e61b7ce774 /src/cairo-tag-attributes.c
parent4ae7f411c865a25b577faea58e5fda6f4e9e1172 (diff)
downloadcairo-e1a02b180d804887980c111c1f9780bed44b96a6.tar.gz
Add CCITT_FAX mime type for PDF and PS surfaces
This completes the full set of PDF/PS image filters allowing image data to be passed though without decompressing then recompresssing in a less efficient format. The difficulty with CCITT_FAX is it needs some decoding parameters that are not stored inside the image data. This is achieved by using an additional mime type CCITT_FAX_PARAMS that contains the params in key=value format.
Diffstat (limited to 'src/cairo-tag-attributes.c')
-rw-r--r--src/cairo-tag-attributes.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/cairo-tag-attributes.c b/src/cairo-tag-attributes.c
index b3d08f6f7..64173402d 100644
--- a/src/cairo-tag-attributes.c
+++ b/src/cairo-tag-attributes.c
@@ -113,6 +113,36 @@ static attribute_spec_t _link_attrib_spec[] =
{ NULL }
};
+/*
+ * Required:
+ * Columns - width of the image in pixels.
+ * Rows - height of the image in scan lines.
+ *
+ * Optional:
+ * K - An integer identifying the encoding scheme used. < 0 is 2 dimensional
+ * Group 4, = 0 is Group3 1 dimensional, > 0 is mixed 1 and 2 dimensional
+ * encoding. Default: 0.
+ * EndOfLine - If true end-of-line bit patterns are present. Default: false.
+ * EncodedByteAlign - If true the end of line is padded with 0 bits so the next
+ * line begins on a byte boundary. Default: false.
+ * EndOfBlock - If true the data contains an end-of-block pattern. Default: true.
+ * BlackIs1 - If true 1 bits are black pixels. Default: false.
+ * DamagedRowsBeforeError - Number of damages rows tolerated before an error
+ * occurs. Default: 0.
+ */
+static attribute_spec_t _ccitt_params_spec[] =
+{
+ { "Columns", ATTRIBUTE_INT },
+ { "Rows", ATTRIBUTE_INT },
+ { "K", ATTRIBUTE_INT },
+ { "EndOfLine", ATTRIBUTE_BOOL },
+ { "EncodedByteAlign", ATTRIBUTE_BOOL },
+ { "EndOfBlock", ATTRIBUTE_BOOL },
+ { "BlackIs1", ATTRIBUTE_BOOL },
+ { "DamagedRowsBeforeError", ATTRIBUTE_INT },
+ { NULL }
+};
+
typedef union {
cairo_bool_t b;
int i;
@@ -569,3 +599,53 @@ _cairo_tag_parse_dest_attributes (const char *attributes, cairo_dest_attrs_t *de
return status;
}
+
+cairo_int_status_t
+_cairo_tag_parse_ccitt_params (const char *attributes, cairo_ccitt_params_t *ccitt_params)
+{
+ cairo_list_t list;
+ cairo_int_status_t status;
+ attribute_t *attr;
+
+ ccitt_params->columns = -1;
+ ccitt_params->rows = -1;
+
+ /* set defaults */
+ ccitt_params->k = 0;
+ ccitt_params->end_of_line = FALSE;
+ ccitt_params->encoded_byte_align = FALSE;
+ ccitt_params->end_of_block = TRUE;
+ ccitt_params->black_is_1 = FALSE;
+ ccitt_params->damaged_rows_before_error = 0;
+
+ cairo_list_init (&list);
+ status = parse_attributes (attributes, _ccitt_params_spec, &list);
+ if (unlikely (status))
+ goto cleanup;
+
+ cairo_list_foreach_entry (attr, attribute_t, &list, link)
+ {
+ if (strcmp (attr->name, "Columns") == 0) {
+ ccitt_params->columns = attr->scalar.i;
+ } else if (strcmp (attr->name, "Rows") == 0) {
+ ccitt_params->rows = attr->scalar.i;
+ } else if (strcmp (attr->name, "K") == 0) {
+ ccitt_params->k = attr->scalar.i;
+ } else if (strcmp (attr->name, "EndOfLine") == 0) {
+ ccitt_params->end_of_line = attr->scalar.b;
+ } else if (strcmp (attr->name, "EncodedByteAlign") == 0) {
+ ccitt_params->encoded_byte_align = attr->scalar.b;
+ } else if (strcmp (attr->name, "EndOfBlock") == 0) {
+ ccitt_params->end_of_block = attr->scalar.b;
+ } else if (strcmp (attr->name, "BlackIs1") == 0) {
+ ccitt_params->black_is_1 = attr->scalar.b;
+ } else if (strcmp (attr->name, "DamagedRowsBeforeError") == 0) {
+ ccitt_params->damaged_rows_before_error = attr->scalar.b;
+ }
+ }
+
+ cleanup:
+ free_attributes_list (&list);
+
+ return status;
+}