Skip to content

Commit

Permalink
Merge pull request #12101 from Snuffleupagus/Dict-size-getRawValues
Browse files Browse the repository at this point in the history
Add a new `size` getter and `getRawValues` method, to `Dict` instances, to simplify some code
  • Loading branch information
timvandermeij authored Jul 17, 2020
2 parents e63d1eb + 684a7b8 commit 90689cf
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 23 deletions.
2 changes: 1 addition & 1 deletion src/core/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ class PDFDocument {
// Check if a Collection dictionary is present in the document.
try {
const collection = this.catalog.catDict.get("Collection");
if (isDict(collection) && collection.getKeys().length > 0) {
if (isDict(collection) && collection.size > 0) {
this.collection = collection;
}
} catch (ex) {
Expand Down
10 changes: 3 additions & 7 deletions src/core/evaluator.js
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,7 @@ class PartialEvaluator {
// First check the current resources for blend modes.
var graphicStates = node.get("ExtGState");
if (graphicStates instanceof Dict) {
for (const key of graphicStates.getKeys()) {
let graphicState = graphicStates.getRaw(key);
for (let graphicState of graphicStates.getRawValues()) {
if (graphicState instanceof Ref) {
if (processed.has(graphicState)) {
continue; // The ExtGState has already been processed.
Expand Down Expand Up @@ -301,8 +300,7 @@ class PartialEvaluator {
if (!(xObjects instanceof Dict)) {
continue;
}
for (const key of xObjects.getKeys()) {
var xObject = xObjects.getRaw(key);
for (let xObject of xObjects.getRawValues()) {
if (xObject instanceof Ref) {
if (processed.has(xObject)) {
// The XObject has already been processed, and by avoiding a
Expand Down Expand Up @@ -3078,9 +3076,7 @@ class PartialEvaluator {
} else if (isRef(encoding)) {
hash.update(encoding.toString());
} else if (isDict(encoding)) {
var keys = encoding.getKeys();
for (var i = 0, ii = keys.length; i < ii; i++) {
var entry = encoding.getRaw(keys[i]);
for (const entry of encoding.getRawValues()) {
if (isName(entry)) {
hash.update(entry.name);
} else if (isRef(entry)) {
Expand Down
25 changes: 10 additions & 15 deletions src/core/obj.js
Original file line number Diff line number Diff line change
Expand Up @@ -2205,21 +2205,16 @@ const ObjectLoader = (function () {
}

function addChildren(node, nodesToVisit) {
if (node instanceof Dict || isStream(node)) {
const dict = node instanceof Dict ? node : node.dict;
const dictKeys = dict.getKeys();
for (let i = 0, ii = dictKeys.length; i < ii; i++) {
const rawValue = dict.getRaw(dictKeys[i]);
if (mayHaveChildren(rawValue)) {
nodesToVisit.push(rawValue);
}
}
} else if (Array.isArray(node)) {
for (let i = 0, ii = node.length; i < ii; i++) {
const value = node[i];
if (mayHaveChildren(value)) {
nodesToVisit.push(value);
}
if (node instanceof Dict) {
node = node.getRawValues();
} else if (isStream(node)) {
node = node.dict.getRawValues();
} else if (!Array.isArray(node)) {
return;
}
for (const rawValue of node) {
if (mayHaveChildren(rawValue)) {
nodesToVisit.push(rawValue);
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions src/core/primitives.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ var Dict = (function DictClosure() {
this.xref = newXref;
},

get size() {
return Object.keys(this._map).length;
},

// automatically dereferences Ref objects
get(key1, key2, key3) {
let value = this._map[key1];
Expand Down Expand Up @@ -140,6 +144,11 @@ var Dict = (function DictClosure() {
return Object.keys(this._map);
},

// no dereferencing
getRawValues: function Dict_getRawValues() {
return Object.values(this._map);
},

set: function Dict_set(key, value) {
if (
(typeof PDFJSDev === "undefined" ||
Expand Down
40 changes: 40 additions & 0 deletions test/unit/primitives_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,17 @@ describe("primitives", function () {
expect(dict.xref).toEqual(xref);
});

it("should return correct size", function () {
const dict = new Dict(null);
expect(dict.size).toEqual(0);

dict.set("Type", Name.get("Page"));
expect(dict.size).toEqual(1);

dict.set("Contents", Ref.get(10, 0));
expect(dict.size).toEqual(2);
});

it("should return invalid values for unknown keys", function () {
checkInvalidHasValues(emptyDict);
checkInvalidKeyValues(emptyDict);
Expand Down Expand Up @@ -264,6 +275,35 @@ describe("primitives", function () {
expect(keys.sort()).toEqual(expectedKeys);
});

it("should get all raw values", function () {
// Test direct objects:
const expectedRawValues1 = [testFontFile, testFontFile2, testFontFile3];
const rawValues1 = dictWithManyKeys.getRawValues();

expect(rawValues1.sort()).toEqual(expectedRawValues1);

// Test indirect objects:
const typeName = Name.get("Page");
const resources = new Dict(null),
resourcesRef = Ref.get(5, 0);
const contents = new StringStream("data"),
contentsRef = Ref.get(10, 0);
const xref = new XRefMock([
{ ref: resourcesRef, data: resources },
{ ref: contentsRef, data: contents },
]);

const dict = new Dict(xref);
dict.set("Type", typeName);
dict.set("Resources", resourcesRef);
dict.set("Contents", contentsRef);

const expectedRawValues2 = [contentsRef, resourcesRef, typeName];
const rawValues2 = dict.getRawValues();

expect(rawValues2.sort()).toEqual(expectedRawValues2);
});

it("should create only one object for Dict.empty", function () {
const firstDictEmpty = Dict.empty;
const secondDictEmpty = Dict.empty;
Expand Down

0 comments on commit 90689cf

Please sign in to comment.