diff options
Diffstat (limited to 'Build/source/texk/dvipdfm-x/pdfdoc.c')
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfdoc.c | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.c b/Build/source/texk/dvipdfm-x/pdfdoc.c index 0921924d0bf..cc5e3800499 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.c +++ b/Build/source/texk/dvipdfm-x/pdfdoc.c @@ -979,7 +979,8 @@ pdf_doc_get_page_count (pdf_file *pf) pdf_obj * pdf_doc_get_page (pdf_file *pf, int page_no, int options, /* load options */ - pdf_rect *bbox, pdf_obj **resources_p /* returned values */ + pdf_rect *bbox, pdf_tmatrix *matrix, /* returned value */ + pdf_obj **resources_p /* returned values */ ) { pdf_obj *page_tree = NULL; pdf_obj *resources = NULL, *box = NULL, *rotate = NULL, *medbox = NULL; @@ -1167,15 +1168,6 @@ pdf_doc_get_page (pdf_file *pf, !PDF_OBJ_DICTTYPE(resources)) goto error; - if (PDF_OBJ_NUMBERTYPE(rotate)) { - if (pdf_number_value(rotate)) - WARN("<< /Rotate %d >> found. (Not supported yet)", - (int) pdf_number_value(rotate)); - pdf_release_obj(rotate); - rotate = NULL; - } else if (rotate) - goto error; - { int i; @@ -1216,9 +1208,51 @@ pdf_doc_get_page (pdf_file *pf, } } } - pdf_release_obj(box); + matrix->a = matrix->d = 1.0; + matrix->b = matrix->c = 0.0; + matrix->e = matrix->f = 0.0; + if (PDF_OBJ_NUMBERTYPE(rotate)) { + double deg = pdf_number_value(rotate); + if (deg - (int)deg != 0.0) + WARN("Invalid value specified for /Rotate: %f", deg); + else if (deg != 0.0) { + int rot = (int) deg; + if (rot % 90 != 0.0) { + WARN("Invalid value specified for /Rotate: %f", deg); + } else { + rot = rot % 360; + if (rot < 0) rot += 360; + switch (rot) { + case 90: + matrix->a = matrix->d = 0; + matrix->b = -1; + matrix->c = 1; + matrix->e = bbox->llx - bbox->lly; + matrix->f = bbox->lly + bbox->urx; + break; + case 180: + matrix->a = matrix->d = -1; + matrix->b = matrix->c = 0; + matrix->e = bbox->llx + bbox->urx; + matrix->f = bbox->lly + bbox->ury; + break; + case 270: + matrix->a = matrix->d = 0; + matrix->b = 1; + matrix->c = -1; + matrix->e = bbox->llx + bbox->ury; + matrix->f = bbox->lly - bbox->llx; + break; + } + } + } + pdf_release_obj(rotate); + rotate = NULL; + } else if (rotate) + goto error; + if (resources_p) *resources_p = resources; else if (resources) |