summaryrefslogtreecommitdiff
path: root/jbig2dec/jbig2_segment.c
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2018-05-27 00:33:45 +0800
committerSebastian Rasmussen <sebras@gmail.com>2018-07-13 16:54:31 +0800
commit5c8a10f2e936b990fa3340650849186e92f1ecfd (patch)
tree10a401242022dbbc6d245bef688cf395a7319a96 /jbig2dec/jbig2_segment.c
parent46f4acd48c81fa0db76f26c40b2e76c0fe7d7842 (diff)
downloadghostpdl-5c8a10f2e936b990fa3340650849186e92f1ecfd.tar.gz
jbig2dec: Implement support for profile segment.
The information in the profile segment is simply printed as informational messages via jbig2_error().
Diffstat (limited to 'jbig2dec/jbig2_segment.c')
-rw-r--r--jbig2dec/jbig2_segment.c87
1 files changed, 86 insertions, 1 deletions
diff --git a/jbig2dec/jbig2_segment.c b/jbig2dec/jbig2_segment.c
index 405f16682..23949f565 100644
--- a/jbig2dec/jbig2_segment.c
+++ b/jbig2dec/jbig2_segment.c
@@ -241,6 +241,90 @@ jbig2_parse_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_
}
}
+/* dispatch code for profile segment parsing */
+static int
+jbig2_parse_profile_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)
+{
+ uint32_t profiles;
+ uint32_t i;
+ uint32_t profile;
+ int index;
+ const char *requirements;
+ const char *generic_region;
+ const char *refinement_region;
+ const char *halftone_region;
+ const char *numerical_data;
+
+ if (segment->data_length < 4)
+ return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "Segment too short");
+ index = 0;
+
+ profiles = jbig2_get_uint32(&segment_data[index]);
+ index += 4;
+
+ for (i = 0; i < profiles; i++) {
+ if (segment->data_length - index < 4)
+ return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short to store profile");
+
+ profile = jbig2_get_uint32(&segment_data[index]);
+ index += 4;
+
+ switch (profile) {
+ case 0x00000001:
+ requirements = "All JBIG2 capabilities";
+ generic_region = "No restriction";
+ refinement_region = "No restriction";
+ halftone_region = "No restriction";
+ numerical_data = "No restriction";
+ break;
+ case 0x00000002:
+ requirements = "Maximum compression";
+ generic_region = "Arithmetic only; any template used";
+ refinement_region = "No restriction";
+ halftone_region = "No restriction";
+ numerical_data = "Arithmetic only";
+ break;
+ case 0x00000003:
+ requirements = "Medium complexity and medium compression";
+ generic_region = "Arithmetic only; only 10-pixel and 13-pixel templates";
+ refinement_region = "10-pixel template only";
+ halftone_region = "No skip mask used";
+ numerical_data = "Arithmetic only";
+ break;
+ case 0x00000004:
+ requirements = "Low complexity with progressive lossless capability";
+ generic_region = "MMR only";
+ refinement_region = "10-pixel template only";
+ halftone_region = "No skip mask used";
+ numerical_data = "Huffman only";
+ break;
+ case 0x00000005:
+ requirements = "Low complexity";
+ generic_region = "MMR only";
+ refinement_region = "Not available";
+ halftone_region = "No skip mask used";
+ numerical_data = "Huffman only";
+ break;
+ default:
+ requirements = "Unknown";
+ generic_region = "Unknown";
+ refinement_region = "Unknown";
+ halftone_region = "Unknown";
+ numerical_data = "Unknown";
+ break;
+ }
+
+ jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "Supported profile: 0x%08x", profile);
+ jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, " Requirements: %s", requirements);
+ jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, " Generic region coding: %s", generic_region);
+ jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, " Refinement region coding: %s", refinement_region);
+ jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, " Halftone region coding: %s", halftone_region);
+ jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, " Numerical data: %s", numerical_data);
+ }
+
+ return 0;
+}
+
/* general segment parsing dispatch */
int
jbig2_parse_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)
@@ -278,8 +362,9 @@ jbig2_parse_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment
case 51:
ctx->state = JBIG2_FILE_EOF;
jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "end of file");
+ break;
case 52:
- return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "unhandled segment type 'profile'");
+ return jbig2_parse_profile_segment(ctx, segment, segment_data);
case 53: /* user-supplied huffman table */
return jbig2_table(ctx, segment, segment_data);
case 54: