Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion include/hpdf_error.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ extern "C" {
#define HPDF_NAME_CANNOT_GET_NAMES 0x1084
#define HPDF_INVALID_ICC_COMPONENT_NUM 0x1085
#define HPDF_PAGE_INVALID_OPERATOR_STACK 0x1086
#define HPDF_STRUCTURE_ELEMENT_CANNOT_SET_PARENT 0x1087

/*---------------------------------------------------------------------------*/

Expand Down
5 changes: 5 additions & 0 deletions include/hpdf_objects.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,11 @@ HPDF_Array_Add (HPDF_Array array,
void *obj);


HPDF_STATUS
HPDF_Array_Remove (HPDF_Array array,
void *obj);


HPDF_STATUS
HPDF_Array_Insert (HPDF_Array array,
void *target,
Expand Down
4 changes: 4 additions & 0 deletions include/hpdf_structure_element.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ HPDF_STATUS
HPDF_StructureElement_AddChild (HPDF_StructureElement parent,
HPDF_StructureElement child);

HPDF_STATUS
HPDF_StructureElement_RemoveChild (HPDF_StructureElement parent,
HPDF_StructureElement child);

HPDF_STATUS
HPDF_StructureElement_AddMarkedContentSequence (HPDF_StructureElement structure_element,
HPDF_UINT mcid,
Expand Down
28 changes: 28 additions & 0 deletions src/hpdf_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,34 @@ HPDF_Array_Add (HPDF_Array array,
return ret;
}

HPDF_STATUS
HPDF_Array_Remove (HPDF_Array array,
void *target)
{
HPDF_UINT i;

for (i = 0; i < array->list->count; i++) {
void *ptr = HPDF_List_ItemAt (array->list, i);
void *obj_ptr;

HPDF_Obj_Header *header = (HPDF_Obj_Header *)ptr;
if (header->obj_class == HPDF_OCLASS_PROXY)
obj_ptr = ((HPDF_Proxy)ptr)->obj;
else
obj_ptr = ptr;

if (obj_ptr == target) {
HPDF_List_RemoveByIndex (array->list, i);

if (header->obj_class == HPDF_OCLASS_PROXY)
HPDF_Obj_Free (array->mmgr, ptr);

return HPDF_OK;
}
}

return HPDF_ITEM_NOT_FOUND;
}

HPDF_UINT
HPDF_Array_Items (HPDF_Array array)
Expand Down
25 changes: 21 additions & 4 deletions src/hpdf_structure_element.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,8 +264,11 @@ HPDF_StructureElement_AddChild (HPDF_StructureElement parent,

HPDF_PTRACE((" HPDF_StructureElement_AddChild\n"));

if (HPDF_Dict_GetItem (child, "P", HPDF_OCLASS_DICT))
return HPDF_SetError (parent->error, HPDF_STRUCTURE_ELEMENT_CANNOT_SET_PARENT, 0);
if (HPDF_Dict_GetItem (child, "P", HPDF_OCLASS_DICT)) {
HPDF_StructureElement old_parent = (HPDF_StructureElement)HPDF_Dict_GetItem (child, "P", HPDF_OCLASS_DICT);
if ((ret = HPDF_StructureElement_RemoveChild (old_parent, child)) != HPDF_OK)
return ret;
}

if ((ret = HPDF_Dict_Add (child, "P", parent)) != HPDF_OK)
return ret;
Expand All @@ -283,6 +286,20 @@ HPDF_StructureElement_AddChild (HPDF_StructureElement parent,
return HPDF_Array_Add (children, child);
}

HPDF_STATUS
HPDF_StructureElement_RemoveChild (HPDF_StructureElement parent,
HPDF_StructureElement child)
{
HPDF_PTRACE((" HPDF_StructureElement_RemoveChild\n"));

HPDF_Array children = (HPDF_Array)HPDF_Dict_GetItem (parent, "K", HPDF_OCLASS_ARRAY);
if (!children) {
return HPDF_OK;
}

return HPDF_Array_Remove (children, child);
}

HPDF_STATUS
HPDF_StructureElement_AddMarkedContentSequence (HPDF_StructureElement structure_element,
HPDF_UINT mcid,
Expand All @@ -292,7 +309,7 @@ HPDF_StructureElement_AddMarkedContentSequence (HPDF_StructureElement structure
HPDF_Dict pg;
HPDF_STATUS ret;

HPDF_PTRACE((" HPDF_StructureElement_AddChild\n"));
HPDF_PTRACE((" HPDF_StructureElement_AddMarkedContentSequence\n"));

pg = (HPDF_Dict)HPDF_Dict_GetItem (structure_element, "Pg", HPDF_OCLASS_DICT);
if (!pg) {
Expand Down Expand Up @@ -343,7 +360,7 @@ HPDF_StructureElement_AddObjectReference (HPDF_StructureElement structure_elemen
HPDF_Array children;
HPDF_STATUS ret;

HPDF_PTRACE((" HPDF_StructureElement_SetObjectReference\n"));
HPDF_PTRACE((" HPDF_StructureElement_AddObjectReference\n"));

HPDF_Dict objr = HPDF_Dict_New (structure_element->mmgr);
if (!objr)
Expand Down