private ReturnType CopyPageMarks(PdfDictionary parentTree, PdfNumber arrayNumber, int newArrayNumber) {
PdfArray pages = (PdfArray)GetDirectObject(parentTree.Get(PdfName.NUMS));
if (pages == null) {
PdfArray kids = (PdfArray)GetDirectObject(parentTree.Get(PdfName.KIDS));
if (kids == null)
return ReturnType.NOTFOUND;
int cur = kids.Size/2;
int begin = 0;
while (true) {
PdfDictionary kidTree = (PdfDictionary)GetDirectObject(kids[cur + begin]);
switch (CopyPageMarks(kidTree,arrayNumber,newArrayNumber)) {
case ReturnType.FOUND:
return ReturnType.FOUND;
case ReturnType.ABOVE:
begin += cur;
cur /= 2;
if (cur == 0)
cur = 1;
if (cur + begin == kids.Size)
return ReturnType.ABOVE;
break;
case ReturnType.BELOW:
if (cur + begin == 0)
return ReturnType.BELOW;
if (cur == 0)
return ReturnType.NOTFOUND;
cur /= 2;
break;
default:
return ReturnType.NOTFOUND;
}
}
} else {
if (pages.Size == 0)
return ReturnType.NOTFOUND;
return FindAndCopyMarks(pages, arrayNumber.IntValue, newArrayNumber);
}
}