HPDF_STATUS HPDF_NameTree_Add (HPDF_NameTree tree, HPDF_String name, void *obj) { HPDF_Array items; HPDF_INT32 i, icount; if (!tree || !name) return HPDF_INVALID_PARAMETER; items = HPDF_Dict_GetItem (tree, "Names", HPDF_OCLASS_ARRAY); if (!items) return HPDF_INVALID_OBJECT; /* "The keys shall be sorted in lexical order" -- 7.9.6, Name Trees. * Since we store keys sorted, it's best to do a linear insertion sort * Find the first element larger than 'key', and insert 'key' and then * 'obj' into the items. */ icount = HPDF_Array_Items(items); /* If we're larger than the last element, append */ if (icount) { HPDF_String last = HPDF_Array_GetItem(items, icount - 2, HPDF_OCLASS_STRING); if (HPDF_String_Cmp(name, last) > 0) { HPDF_Array_Add(items, name); HPDF_Array_Add(items, obj); return HPDF_OK; } } /* Walk backwards through the list until we're smaller than an element= * That's the element to insert in front of. */ for (i = icount - 4; i >= 0; i -= 2) { HPDF_String elem = HPDF_Array_GetItem(items, i, HPDF_OCLASS_STRING); if (i == 0 || HPDF_String_Cmp(name, elem) < 0) { HPDF_Array_Insert(items, elem, name); HPDF_Array_Insert(items, elem, obj); return HPDF_OK; } } /* Items list is empty */ HPDF_Array_Add(items, name); HPDF_Array_Add(items, obj); return HPDF_OK; }
/* bbox is filled with xMin, xMax, yMin, yMax */ static HPDF_BOOL _GetDecodeArrayVertexValues(HPDF_Shading shading, HPDF_REAL *bbox) { HPDF_Array decodeArray; HPDF_Real r; int i; if (!shading) { return HPDF_FALSE; } decodeArray = (HPDF_Array)(HPDF_Dict_GetItem(shading, "Decode", HPDF_OCLASS_ARRAY)); if (!decodeArray) { return HPDF_FALSE; } for (i = 0; i < 4; ++i) { r = HPDF_Array_GetItem(decodeArray, i, HPDF_OCLASS_REAL); if (!r) { return HPDF_FALSE; } bbox[i] = r->value; } return HPDF_TRUE; }
static HPDF_UINT GetPageCount (HPDF_Dict pages) { HPDF_UINT i; HPDF_UINT count = 0; HPDF_Array kids = (HPDF_Array)HPDF_Dict_GetItem (pages, "Kids", HPDF_OCLASS_ARRAY); HPDF_PTRACE((" GetPageCount\n")); if (!kids) return 0; for (i = 0; i < kids->list->count; i++) { void *obj = HPDF_Array_GetItem (kids, i, HPDF_OCLASS_DICT); HPDF_Obj_Header *header = (HPDF_Obj_Header *)obj; if (header->obj_class == (HPDF_OCLASS_DICT | HPDF_OSUBCLASS_PAGES)) count += GetPageCount ((HPDF_Dict)obj); else if (header->obj_class == (HPDF_OCLASS_DICT | HPDF_OSUBCLASS_PAGE)) count += 1; } return count; }
HPDF_STATUS HPDF_Page_SetBoxValue (HPDF_Page page, const char *name, HPDF_UINT index, HPDF_REAL value) { HPDF_Real r; HPDF_Array array; HPDF_PTRACE((" HPDF_Page_SetBoxValue\n")); if (!HPDF_Page_Validate (page)) return HPDF_INVALID_PAGE; array = HPDF_Page_GetInheritableItem (page, name, HPDF_OCLASS_ARRAY); if (!array) return HPDF_SetError (page->error, HPDF_PAGE_CANNOT_FIND_OBJECT, 0); r = HPDF_Array_GetItem (array, index, HPDF_OCLASS_REAL); if (!r) return HPDF_SetError (page->error, HPDF_PAGE_INVALID_INDEX, 0); r->value = value; return HPDF_OK; }
HPDF_Image_GetColorSpace (HPDF_Image image) { HPDF_Name n; HPDF_PTRACE ((" HPDF_Image_GetColorSpace\n")); n = HPDF_Dict_GetItem (image, "ColorSpace", HPDF_OCLASS_NAME); if (!n) { HPDF_Array a; HPDF_Error_Reset(image->error); a = HPDF_Dict_GetItem (image, "ColorSpace", HPDF_OCLASS_ARRAY); if (a) { n = HPDF_Array_GetItem (a, 0, HPDF_OCLASS_NAME); } } if (!n) { HPDF_CheckError (image->error); return NULL; } return n->value; }
HPDF_Destination_SetXYZ (HPDF_Destination dst, HPDF_REAL left, HPDF_REAL top, HPDF_REAL zoom) { HPDF_STATUS ret = HPDF_OK; HPDF_Page target; HPDF_PTRACE((" HPDF_Destination_SetXYZ\n")); if (!HPDF_Destination_Validate (dst)) return HPDF_INVALID_DESTINATION; if (left < 0 || top < 0 || zoom < 0.08 || zoom > 32) return HPDF_RaiseError (dst->error, HPDF_INVALID_PARAMETER, 0); target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); if (dst->list->count > 1) { HPDF_Array_Clear (dst); ret += HPDF_Array_Add (dst, target); } ret += HPDF_Array_AddName (dst, HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_XYZ]); ret += HPDF_Array_AddReal (dst, left); ret += HPDF_Array_AddReal (dst, top); ret += HPDF_Array_AddReal (dst, zoom); if (ret != HPDF_OK) return HPDF_CheckError (dst->error); return HPDF_OK; }
HPDF_Destination_SetFitBV (HPDF_Destination dst, HPDF_REAL left) { HPDF_STATUS ret = HPDF_OK; HPDF_Page target; HPDF_PTRACE((" HPDF_Destination_SetFitBV\n")); if (!HPDF_Destination_Validate (dst)) return HPDF_INVALID_DESTINATION; target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); if (dst->list->count > 1) { HPDF_Array_Clear (dst); ret += HPDF_Array_Add (dst, target); } ret += HPDF_Array_AddName (dst, HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_BV]); ret += HPDF_Array_AddReal (dst, left); if (ret != HPDF_OK) return HPDF_CheckError (dst->error); return HPDF_OK; }
HPDF_Box HPDF_Page_GetMediaBox (HPDF_Page page) { HPDF_Box media_box = {0, 0, 0, 0}; HPDF_PTRACE((" HPDF_Page_GetMediaBox\n")); if (HPDF_Page_Validate (page)) { HPDF_Array array = HPDF_Page_GetInheritableItem (page, "MediaBox", HPDF_OCLASS_ARRAY); if (array) { HPDF_Real r; r = HPDF_Array_GetItem (array, 0, HPDF_OCLASS_REAL); if (r) media_box.left = r->value; r = HPDF_Array_GetItem (array, 1, HPDF_OCLASS_REAL); if (r) media_box.bottom = r->value; r = HPDF_Array_GetItem (array, 2, HPDF_OCLASS_REAL); if (r) media_box.right = r->value; r = HPDF_Array_GetItem (array, 3, HPDF_OCLASS_REAL); if (r) media_box.top = r->value; HPDF_CheckError (page->error); } else HPDF_RaiseError (page->error, HPDF_PAGE_CANNOT_FIND_OBJECT, 0); } return media_box; }
HPDF_BOOL HPDF_Destination_Validate (HPDF_Destination dst) { HPDF_Obj_Header *header = (HPDF_Obj_Header *)dst; HPDF_Page target; if (!dst || header->obj_class != (HPDF_OCLASS_ARRAY | HPDF_OSUBCLASS_DESTINATION)) return HPDF_FALSE; /* destination-types not defined. */ if (dst->list->count < 2) return HPDF_FALSE; target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); if (!HPDF_Page_Validate (target)) return HPDF_SetError (dst->error, HPDF_INVALID_PAGE, 0); return HPDF_TRUE; }