From 3ef8053d0d0021cac3030deb005f01fe4ee1068c Mon Sep 17 00:00:00 2001 From: picomeg <megordon5@gmail.com> Date: Mon, 25 Apr 2022 17:06:19 +0100 Subject: [PATCH] Parses and processes values for MediaBox which are integer or decimal --- pdf.c | 55 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/pdf.c b/pdf.c index c7d9957..f3fdb24 100644 --- a/pdf.c +++ b/pdf.c @@ -13,6 +13,7 @@ #include <hammer/hammer.h> #include <hammer/glue.h> #include <errno.h> +#include <math.h> /* convenience macros */ #define SEQ(...) h_sequence(__VA_ARGS__, NULL) @@ -375,8 +376,8 @@ typedef struct PtNode_S { TextState_T ts; // text state associated with this node size_t offset; // This may not be useful -- often within encoded streams struct { - unsigned int width; // page width described by MediaBox - unsigned int height; // page height described by MediaBox + double width; // page width described by MediaBox + double height; // page height described by MediaBox } pagesz; union { struct { @@ -5022,13 +5023,22 @@ void parse_pagenode ( if (item) { item = resolve(aux, item); if (item->token_type == TT_SEQUENCE) { - int llx, lly, urx, ury; // typical but can be any diagonal - llx = H_INDEX_SINT(item, 0); - lly = H_INDEX_SINT(item, 1); - urx = H_INDEX_SINT(item, 2); - ury = H_INDEX_SINT(item, 3); - myNode->mediaBox.tx = abs(llx - urx); - myNode->mediaBox.ty = abs(lly - ury);; + double llx, lly, urx, ury; // typical but can be any diagonal + HParsedToken * token; + token = H_INDEX_TOKEN(item, 0); + if (token->token_type == TT_SINT) llx = (double)token->sint; + else llx = token->dbl; + token = H_INDEX_TOKEN(item, 1); + if (token->token_type == TT_SINT) lly = (double)token->sint; + else lly = token->dbl; + token = H_INDEX_TOKEN(item, 2); + if (token->token_type == TT_SINT) urx = (double)token->sint; + else urx = token->dbl; + token = H_INDEX_TOKEN(item, 3); + if (token->token_type == TT_SINT) ury = (double)token->sint; + else ury = token->dbl; + myNode->mediaBox.tx = fabs(llx - urx); + myNode->mediaBox.ty = fabs(lly - ury);; } } @@ -5192,8 +5202,8 @@ parse_pagetree( } else { myNode->pgRsrc = NULL; - myNode->mediaBox.tx = 0; - myNode->mediaBox.ty = 0; + myNode->mediaBox.tx = 0.0; + myNode->mediaBox.ty = 0.0; } myNode->offset = 0; @@ -5252,13 +5262,22 @@ parse_pagetree( if (item) { item = resolve(aux, item); if (item->token_type == TT_SEQUENCE) { - int llx, lly, urx, ury; // typical but can be any diagonal - llx = H_INDEX_SINT(item, 0); - lly = H_INDEX_SINT(item, 1); - urx = H_INDEX_SINT(item, 2); - ury = H_INDEX_SINT(item, 3); - myNode->mediaBox.tx = abs(llx - urx); - myNode->mediaBox.ty = abs(lly - ury);; + double llx, lly, urx, ury; // typical but can be any diagonal + HParsedToken * token; + token = H_INDEX_TOKEN(item, 0); + if (token->token_type == TT_SINT) llx = (double)token->sint; + else llx = token->dbl; + token = H_INDEX_TOKEN(item, 1); + if (token->token_type == TT_SINT) lly = (double)token->sint; + else lly = token->dbl; + token = H_INDEX_TOKEN(item, 2); + if (token->token_type == TT_SINT) urx = (double)token->sint; + else urx = token->dbl; + token = H_INDEX_TOKEN(item, 3); + if (token->token_type == TT_SINT) ury = (double)token->sint; + else ury = token->dbl; + myNode->mediaBox.tx = fabs(llx - urx); + myNode->mediaBox.ty = fabs(lly - ury);; } } -- GitLab