fork from https://github.com/mozilla/pdf.js.git
This commit is contained in:
903
test/unit/colorspace_spec.js
Normal file
903
test/unit/colorspace_spec.js
Normal file
@@ -0,0 +1,903 @@
|
||||
/* Copyright 2017 Mozilla Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { Dict, Name, Ref } from "../../src/core/primitives.js";
|
||||
import { FunctionType, PDFFunctionFactory } from "../../src/core/function.js";
|
||||
import {
|
||||
GlobalColorSpaceCache,
|
||||
LocalColorSpaceCache,
|
||||
} from "../../src/core/image_utils.js";
|
||||
import { Stream, StringStream } from "../../src/core/stream.js";
|
||||
import { ColorSpace } from "../../src/core/colorspace.js";
|
||||
import { ColorSpaceUtils } from "../../src/core/colorspace_utils.js";
|
||||
import { XRefMock } from "./test_utils.js";
|
||||
|
||||
describe("colorspace", function () {
|
||||
describe("ColorSpace.isDefaultDecode", function () {
|
||||
it("should be true if decode is not an array", function () {
|
||||
expect(ColorSpace.isDefaultDecode("string", 0)).toBeTruthy();
|
||||
});
|
||||
|
||||
it("should be true if length of decode array is not correct", function () {
|
||||
expect(ColorSpace.isDefaultDecode([0], 1)).toBeTruthy();
|
||||
expect(ColorSpace.isDefaultDecode([0, 1, 0], 1)).toBeTruthy();
|
||||
});
|
||||
|
||||
it("should be true if decode map matches the default decode map", function () {
|
||||
expect(ColorSpace.isDefaultDecode([], 0)).toBeTruthy();
|
||||
|
||||
expect(ColorSpace.isDefaultDecode([0, 0], 1)).toBeFalsy();
|
||||
expect(ColorSpace.isDefaultDecode([0, 1], 1)).toBeTruthy();
|
||||
|
||||
expect(ColorSpace.isDefaultDecode([0, 1, 0, 1, 0, 1], 3)).toBeTruthy();
|
||||
expect(ColorSpace.isDefaultDecode([0, 1, 0, 1, 1, 1], 3)).toBeFalsy();
|
||||
|
||||
expect(
|
||||
ColorSpace.isDefaultDecode([0, 1, 0, 1, 0, 1, 0, 1], 4)
|
||||
).toBeTruthy();
|
||||
expect(
|
||||
ColorSpace.isDefaultDecode([1, 0, 0, 1, 0, 1, 0, 1], 4)
|
||||
).toBeFalsy();
|
||||
});
|
||||
});
|
||||
|
||||
describe("ColorSpace caching", function () {
|
||||
let globalColorSpaceCache, localColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
localColorSpaceCache = new LocalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
localColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("caching by Name", function () {
|
||||
const xref = new XRefMock();
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
|
||||
const colorSpace1 = ColorSpaceUtils.parse({
|
||||
cs: Name.get("Pattern"),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache,
|
||||
});
|
||||
expect(colorSpace1.name).toEqual("Pattern");
|
||||
|
||||
const colorSpace2 = ColorSpaceUtils.parse({
|
||||
cs: Name.get("Pattern"),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache,
|
||||
});
|
||||
expect(colorSpace2.name).toEqual("Pattern");
|
||||
|
||||
const colorSpaceNonCached = ColorSpaceUtils.parse({
|
||||
cs: Name.get("Pattern"),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache: new GlobalColorSpaceCache(),
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
expect(colorSpaceNonCached.name).toEqual("Pattern");
|
||||
|
||||
const colorSpaceOther = ColorSpaceUtils.parse({
|
||||
cs: Name.get("RGB"),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache,
|
||||
});
|
||||
expect(colorSpaceOther.name).toEqual("DeviceRGB");
|
||||
|
||||
// These two must be *identical* if caching worked as intended.
|
||||
expect(colorSpace1).toBe(colorSpace2);
|
||||
|
||||
expect(colorSpace1).not.toBe(colorSpaceNonCached);
|
||||
expect(colorSpace1).not.toBe(colorSpaceOther);
|
||||
});
|
||||
|
||||
it("caching by Ref", function () {
|
||||
const paramsCalGray = new Dict();
|
||||
paramsCalGray.set("WhitePoint", [1, 1, 1]);
|
||||
paramsCalGray.set("BlackPoint", [0, 0, 0]);
|
||||
paramsCalGray.set("Gamma", 2.0);
|
||||
|
||||
const paramsCalRGB = new Dict();
|
||||
paramsCalRGB.set("WhitePoint", [1, 1, 1]);
|
||||
paramsCalRGB.set("BlackPoint", [0, 0, 0]);
|
||||
paramsCalRGB.set("Gamma", [1, 1, 1]);
|
||||
paramsCalRGB.set("Matrix", [1, 0, 0, 0, 1, 0, 0, 0, 1]);
|
||||
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(50, 0),
|
||||
data: [Name.get("CalGray"), paramsCalGray],
|
||||
},
|
||||
{
|
||||
ref: Ref.get(100, 0),
|
||||
data: [Name.get("CalRGB"), paramsCalRGB],
|
||||
},
|
||||
]);
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
|
||||
const colorSpace1 = ColorSpaceUtils.parse({
|
||||
cs: Ref.get(50, 0),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache,
|
||||
});
|
||||
expect(colorSpace1.name).toEqual("CalGray");
|
||||
|
||||
const colorSpace2 = ColorSpaceUtils.parse({
|
||||
cs: Ref.get(50, 0),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache,
|
||||
});
|
||||
expect(colorSpace2.name).toEqual("CalGray");
|
||||
|
||||
const colorSpaceNonCached = ColorSpaceUtils.parse({
|
||||
cs: Ref.get(50, 0),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache: new GlobalColorSpaceCache(),
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
expect(colorSpaceNonCached.name).toEqual("CalGray");
|
||||
|
||||
const colorSpaceOther = ColorSpaceUtils.parse({
|
||||
cs: Ref.get(100, 0),
|
||||
xref,
|
||||
resources: null,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache,
|
||||
});
|
||||
expect(colorSpaceOther.name).toEqual("CalRGB");
|
||||
|
||||
// These two must be *identical* if caching worked as intended.
|
||||
expect(colorSpace1).toBe(colorSpace2);
|
||||
|
||||
expect(colorSpace1).not.toBe(colorSpaceNonCached);
|
||||
expect(colorSpace1).not.toBe(colorSpaceOther);
|
||||
});
|
||||
});
|
||||
|
||||
describe("DeviceGrayCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is a Name object", function () {
|
||||
const cs = Name.get("DeviceGray");
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
const testSrc = new Uint8Array([27, 125, 250, 131]);
|
||||
const testDest = new Uint8ClampedArray(4 * 4 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
27, 27, 27,
|
||||
27, 27, 27,
|
||||
125, 125, 125,
|
||||
125, 125, 125,
|
||||
27, 27, 27,
|
||||
27, 27, 27,
|
||||
125, 125, 125,
|
||||
125, 125, 125,
|
||||
250, 250, 250,
|
||||
250, 250, 250,
|
||||
131, 131, 131,
|
||||
131, 131, 131,
|
||||
250, 250, 250,
|
||||
250, 250, 250,
|
||||
131, 131, 131,
|
||||
131, 131, 131
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 4, 4, 4, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb(new Float32Array([0.1]), 0)).toEqual(
|
||||
new Uint8ClampedArray([26, 26, 26])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(2, 0)).toEqual(6);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
it("should handle the case when cs is an indirect object", function () {
|
||||
const cs = Ref.get(10, 0);
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: cs,
|
||||
data: Name.get("DeviceGray"),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
const testSrc = new Uint8Array([27, 125, 250, 131]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
27, 27, 27,
|
||||
27, 27, 27,
|
||||
125, 125, 125,
|
||||
27, 27, 27,
|
||||
27, 27, 27,
|
||||
125, 125, 125,
|
||||
250, 250, 250,
|
||||
250, 250, 250,
|
||||
131, 131, 131
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb(new Float32Array([0.2]), 0)).toEqual(
|
||||
new Uint8ClampedArray([51, 51, 51])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(3, 1)).toEqual(12);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("DeviceRgbCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is a Name object", function () {
|
||||
const cs = Name.get("DeviceRGB");
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
// prettier-ignore
|
||||
const testSrc = new Uint8Array([
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
111, 25, 198,
|
||||
21, 147, 255
|
||||
]);
|
||||
const testDest = new Uint8ClampedArray(4 * 4 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
27, 125, 250,
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
131, 139, 140,
|
||||
27, 125, 250,
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
131, 139, 140,
|
||||
111, 25, 198,
|
||||
111, 25, 198,
|
||||
21, 147, 255,
|
||||
21, 147, 255,
|
||||
111, 25, 198,
|
||||
111, 25, 198,
|
||||
21, 147, 255,
|
||||
21, 147, 255
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 4, 4, 4, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb(new Float32Array([0.1, 0.2, 0.3]), 0)).toEqual(
|
||||
new Uint8ClampedArray([26, 51, 77])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(4, 0)).toEqual(4);
|
||||
expect(colorSpace.isPassthrough(8)).toBeTruthy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
it("should handle the case when cs is an indirect object", function () {
|
||||
const cs = Ref.get(10, 0);
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: cs,
|
||||
data: Name.get("DeviceRGB"),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
// prettier-ignore
|
||||
const testSrc = new Uint8Array([
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
111, 25, 198,
|
||||
21, 147, 255
|
||||
]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
27, 125, 250,
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
27, 125, 250,
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
111, 25, 198,
|
||||
111, 25, 198,
|
||||
21, 147, 255
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb(new Float32Array([0.1, 0.2, 0.3]), 0)).toEqual(
|
||||
new Uint8ClampedArray([26, 51, 77])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(4, 1)).toEqual(5);
|
||||
expect(colorSpace.isPassthrough(8)).toBeTruthy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("DeviceCmykCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is a Name object", function () {
|
||||
const cs = Name.get("DeviceCMYK");
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
// prettier-ignore
|
||||
const testSrc = new Uint8Array([
|
||||
27, 125, 250, 128,
|
||||
131, 139, 140, 45,
|
||||
111, 25, 198, 78,
|
||||
21, 147, 255, 69
|
||||
]);
|
||||
const testDest = new Uint8ClampedArray(4 * 4 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
135, 81, 18,
|
||||
135, 81, 18,
|
||||
114, 102, 97,
|
||||
114, 102, 97,
|
||||
135, 81, 18,
|
||||
135, 81, 18,
|
||||
114, 102, 97,
|
||||
114, 102, 97,
|
||||
112, 144, 75,
|
||||
112, 144, 75,
|
||||
188, 98, 27,
|
||||
188, 98, 27,
|
||||
112, 144, 75,
|
||||
112, 144, 75,
|
||||
188, 98, 27,
|
||||
188, 98, 27
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 4, 4, 4, 8, testSrc, 0);
|
||||
|
||||
expect(
|
||||
colorSpace.getRgb(new Float32Array([0.1, 0.2, 0.3, 1]), 0)
|
||||
).toEqual(new Uint8ClampedArray([32, 28, 21]));
|
||||
expect(colorSpace.getOutputLength(4, 0)).toEqual(3);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
it("should handle the case when cs is an indirect object", function () {
|
||||
const cs = Ref.get(10, 0);
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: cs,
|
||||
data: Name.get("DeviceCMYK"),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
// prettier-ignore
|
||||
const testSrc = new Uint8Array([
|
||||
27, 125, 250, 128,
|
||||
131, 139, 140, 45,
|
||||
111, 25, 198, 78,
|
||||
21, 147, 255, 69
|
||||
]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
135, 81, 18,
|
||||
135, 81, 18,
|
||||
114, 102, 97,
|
||||
135, 81, 18,
|
||||
135, 81, 18,
|
||||
114, 102, 97,
|
||||
112, 144, 75,
|
||||
112, 144, 75,
|
||||
188, 98, 27
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(
|
||||
colorSpace.getRgb(new Float32Array([0.1, 0.2, 0.3, 1]), 0)
|
||||
).toEqual(new Uint8ClampedArray([32, 28, 21]));
|
||||
expect(colorSpace.getOutputLength(4, 1)).toEqual(4);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("CalGrayCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is an array", function () {
|
||||
const params = new Dict();
|
||||
params.set("WhitePoint", [1, 1, 1]);
|
||||
params.set("BlackPoint", [0, 0, 0]);
|
||||
params.set("Gamma", 2.0);
|
||||
|
||||
const cs = [Name.get("CalGray"), params];
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
const testSrc = new Uint8Array([27, 125, 250, 131]);
|
||||
const testDest = new Uint8ClampedArray(4 * 4 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
25, 25, 25,
|
||||
25, 25, 25,
|
||||
143, 143, 143,
|
||||
143, 143, 143,
|
||||
25, 25, 25,
|
||||
25, 25, 25,
|
||||
143, 143, 143,
|
||||
143, 143, 143,
|
||||
251, 251, 251,
|
||||
251, 251, 251,
|
||||
149, 149, 149,
|
||||
149, 149, 149,
|
||||
251, 251, 251,
|
||||
251, 251, 251,
|
||||
149, 149, 149,
|
||||
149, 149, 149
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 4, 4, 4, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb(new Float32Array([1.0]), 0)).toEqual(
|
||||
new Uint8ClampedArray([255, 255, 255])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(4, 0)).toEqual(12);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("CalRGBCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is an array", function () {
|
||||
const params = new Dict();
|
||||
params.set("WhitePoint", [1, 1, 1]);
|
||||
params.set("BlackPoint", [0, 0, 0]);
|
||||
params.set("Gamma", [1, 1, 1]);
|
||||
params.set("Matrix", [1, 0, 0, 0, 1, 0, 0, 0, 1]);
|
||||
|
||||
const cs = [Name.get("CalRGB"), params];
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
// prettier-ignore
|
||||
const testSrc = new Uint8Array([
|
||||
27, 125, 250,
|
||||
131, 139, 140,
|
||||
111, 25, 198,
|
||||
21, 147, 255
|
||||
]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
0, 238, 255,
|
||||
0, 238, 255,
|
||||
185, 196, 195,
|
||||
0, 238, 255,
|
||||
0, 238, 255,
|
||||
185, 196, 195,
|
||||
235, 0, 243,
|
||||
235, 0, 243,
|
||||
0, 255, 255
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb(new Float32Array([0.1, 0.2, 0.3]), 0)).toEqual(
|
||||
new Uint8ClampedArray([0, 147, 151])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(4, 0)).toEqual(4);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("LabCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is an array", function () {
|
||||
const params = new Dict();
|
||||
params.set("WhitePoint", [1, 1, 1]);
|
||||
params.set("BlackPoint", [0, 0, 0]);
|
||||
params.set("Range", [-100, 100, -100, 100]);
|
||||
|
||||
const cs = [Name.get("Lab"), params];
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
// prettier-ignore
|
||||
const testSrc = new Uint8Array([
|
||||
27, 25, 50,
|
||||
31, 19, 40,
|
||||
11, 25, 98,
|
||||
21, 47, 55
|
||||
]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
0, 49, 101,
|
||||
0, 49, 101,
|
||||
0, 53, 117,
|
||||
0, 49, 101,
|
||||
0, 49, 101,
|
||||
0, 53, 117,
|
||||
0, 41, 40,
|
||||
0, 41, 40,
|
||||
0, 43, 90
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb([55, 25, 35], 0)).toEqual(
|
||||
new Uint8ClampedArray([188, 100, 61])
|
||||
);
|
||||
expect(colorSpace.getOutputLength(4, 0)).toEqual(4);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(colorSpace.isDefaultDecode([0, 1])).toBeTruthy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("IndexedCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is an array", function () {
|
||||
// prettier-ignore
|
||||
const lookup = new Stream(
|
||||
new Uint8Array([
|
||||
23, 155, 35,
|
||||
147, 69, 93,
|
||||
255, 109, 70
|
||||
])
|
||||
);
|
||||
const cs = [Name.get("Indexed"), Name.get("DeviceRGB"), 2, lookup];
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: Ref.get(10, 0),
|
||||
data: new Dict(),
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
const testSrc = new Uint8Array([2, 2, 0, 1]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
255, 109, 70,
|
||||
255, 109, 70,
|
||||
255, 109, 70,
|
||||
255, 109, 70,
|
||||
255, 109, 70,
|
||||
255, 109, 70,
|
||||
23, 155, 35,
|
||||
23, 155, 35,
|
||||
147, 69, 93,
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb([2], 0)).toEqual(
|
||||
new Uint8ClampedArray([255, 109, 70])
|
||||
);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(colorSpace.isDefaultDecode([0, 1], 1)).toBeTruthy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
|
||||
describe("AlternateCS", function () {
|
||||
let globalColorSpaceCache;
|
||||
|
||||
beforeAll(function () {
|
||||
globalColorSpaceCache = new GlobalColorSpaceCache();
|
||||
});
|
||||
|
||||
afterAll(function () {
|
||||
globalColorSpaceCache = null;
|
||||
});
|
||||
|
||||
it("should handle the case when cs is an array", function () {
|
||||
const fnDict = new Dict();
|
||||
fnDict.set("FunctionType", FunctionType.POSTSCRIPT_CALCULATOR);
|
||||
fnDict.set("Domain", [0.0, 1.0]);
|
||||
fnDict.set("Range", [0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0]);
|
||||
fnDict.set("Length", 58);
|
||||
|
||||
const fn = new StringStream(
|
||||
"{ dup 0.84 mul " +
|
||||
"exch 0.00 exch " +
|
||||
"dup 0.44 mul " +
|
||||
"exch 0.21 mul }",
|
||||
fnDict
|
||||
);
|
||||
const fnRef = Ref.get(10, 0);
|
||||
|
||||
const cs = [
|
||||
Name.get("Separation"),
|
||||
Name.get("LogoGreen"),
|
||||
Name.get("DeviceCMYK"),
|
||||
fnRef,
|
||||
];
|
||||
const xref = new XRefMock([
|
||||
{
|
||||
ref: fnRef,
|
||||
data: fn,
|
||||
},
|
||||
]);
|
||||
const resources = new Dict();
|
||||
|
||||
const pdfFunctionFactory = new PDFFunctionFactory({
|
||||
xref,
|
||||
});
|
||||
const colorSpace = ColorSpaceUtils.parse({
|
||||
cs,
|
||||
xref,
|
||||
resources,
|
||||
pdfFunctionFactory,
|
||||
globalColorSpaceCache,
|
||||
localColorSpaceCache: new LocalColorSpaceCache(),
|
||||
});
|
||||
|
||||
const testSrc = new Uint8Array([27, 25, 50, 31]);
|
||||
const testDest = new Uint8ClampedArray(3 * 3 * 3);
|
||||
// prettier-ignore
|
||||
const expectedDest = new Uint8ClampedArray([
|
||||
226, 242, 241,
|
||||
226, 242, 241,
|
||||
229, 244, 242,
|
||||
226, 242, 241,
|
||||
226, 242, 241,
|
||||
229, 244, 242,
|
||||
203, 232, 229,
|
||||
203, 232, 229,
|
||||
222, 241, 238
|
||||
]);
|
||||
colorSpace.fillRgb(testDest, 2, 2, 3, 3, 3, 8, testSrc, 0);
|
||||
|
||||
expect(colorSpace.getRgb([0.1], 0)).toEqual(
|
||||
new Uint8ClampedArray([228, 243, 242])
|
||||
);
|
||||
expect(colorSpace.isPassthrough(8)).toBeFalsy();
|
||||
expect(colorSpace.isDefaultDecode([0, 1])).toBeTruthy();
|
||||
expect(testDest).toEqual(expectedDest);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user