[Pkg-javascript-commits] [pdf.js] 88/157: Refactor annotation color handling and add unit tests
David Prévot
taffit at moszumanska.debian.org
Tue Aug 11 06:46:41 UTC 2015
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository pdf.js.
commit a2e9845093118e25a93c1836a97df38adb6ac208
Author: Tim van der Meij <timvandermeij at gmail.com>
Date: Wed Jul 15 16:59:25 2015 +0200
Refactor annotation color handling and add unit tests
---
src/core/annotation.js | 68 +++++++++++++++++++++++++-------------
src/display/annotation_helper.js | 22 ++++++------
test/unit/annotation_layer_spec.js | 58 +++++++++++++++++++++++++++++++-
3 files changed, 112 insertions(+), 36 deletions(-)
diff --git a/src/core/annotation.js b/src/core/annotation.js
index 82b4e2a..22ee0bf 100644
--- a/src/core/annotation.js
+++ b/src/core/annotation.js
@@ -17,7 +17,7 @@
/* globals PDFJS, Util, isDict, isName, stringToPDFString, warn, Dict, Stream,
stringToBytes, Promise, isArray, ObjectLoader, OperatorList,
isValidUrl, OPS, createPromiseCapability, AnnotationType,
- stringToUTF8String, AnnotationBorderStyleType */
+ stringToUTF8String, AnnotationBorderStyleType, ColorSpace */
'use strict';
@@ -79,28 +79,8 @@ var Annotation = (function AnnotationClosure() {
data.rect = Util.normalizeRect(rect);
data.annotationFlags = dict.get('F');
- var color = dict.get('C');
- if (!color) {
- // The PDF spec does not mention how a missing color array is interpreted.
- // Adobe Reader seems to default to black in this case.
- data.color = [0, 0, 0];
- } else if (isArray(color)) {
- switch (color.length) {
- case 0:
- // Empty array denotes transparent border.
- data.color = null;
- break;
- case 1:
- // TODO: implement DeviceGray
- break;
- case 3:
- data.color = color;
- break;
- case 4:
- // TODO: implement DeviceCMYK
- break;
- }
- }
+ this.setColor(dict.get('C'));
+ data.color = this.color;
this.borderStyle = data.borderStyle = new AnnotationBorderStyle();
this.setBorderStyle(dict);
@@ -112,6 +92,48 @@ var Annotation = (function AnnotationClosure() {
Annotation.prototype = {
/**
+ * Set the color and take care of color space conversion.
+ *
+ * @public
+ * @memberof Annotation
+ * @param {Array} color - The color array containing either 0
+ * (transparent), 1 (grayscale), 3 (RGB) or
+ * 4 (CMYK) elements
+ */
+ setColor: function Annotation_setColor(color) {
+ var rgbColor = new Uint8Array(3); // Black in RGB color space (default)
+ if (!isArray(color)) {
+ this.color = rgbColor;
+ return;
+ }
+
+ switch (color.length) {
+ case 0: // Transparent, which we indicate with a null value
+ this.color = null;
+ break;
+
+ case 1: // Convert grayscale to RGB
+ ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);
+ this.color = rgbColor;
+ break;
+
+ case 3: // Convert RGB percentages to RGB
+ ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);
+ this.color = rgbColor;
+ break;
+
+ case 4: // Convert CMYK to RGB
+ ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);
+ this.color = rgbColor;
+ break;
+
+ default:
+ this.color = rgbColor;
+ break;
+ }
+ },
+
+ /**
* Set the border style (as AnnotationBorderStyle object).
*
* @public
diff --git a/src/display/annotation_helper.js b/src/display/annotation_helper.js
index 215c7c2..af30c28 100644
--- a/src/display/annotation_helper.js
+++ b/src/display/annotation_helper.js
@@ -100,12 +100,12 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
// Border color
if (item.color) {
container.style.borderColor =
- Util.makeCssRgb(Math.round(item.color[0] * 255),
- Math.round(item.color[1] * 255),
- Math.round(item.color[2] * 255));
+ Util.makeCssRgb(item.color[0] | 0,
+ item.color[1] | 0,
+ item.color[2] | 0);
} else {
- // Default color is black, but that's not obvious from the spec.
- container.style.borderColor = 'rgb(0,0,0)';
+ // Transparent (invisible) border, so do not draw it at all.
+ container.style.borderWidth = 0;
}
}
@@ -172,17 +172,15 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
content.setAttribute('hidden', true);
var i, ii;
- if (item.hasBgColor) {
+ if (item.hasBgColor && item.color) {
var color = item.color;
// Enlighten the color (70%)
var BACKGROUND_ENLIGHT = 0.7;
- var r = BACKGROUND_ENLIGHT * (1.0 - color[0]) + color[0];
- var g = BACKGROUND_ENLIGHT * (1.0 - color[1]) + color[1];
- var b = BACKGROUND_ENLIGHT * (1.0 - color[2]) + color[2];
- content.style.backgroundColor = Util.makeCssRgb((r * 255) | 0,
- (g * 255) | 0,
- (b * 255) | 0);
+ var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];
+ var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];
+ var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];
+ content.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0);
}
var title = document.createElement('h1');
diff --git a/test/unit/annotation_layer_spec.js b/test/unit/annotation_layer_spec.js
index 728c59e..889004f 100644
--- a/test/unit/annotation_layer_spec.js
+++ b/test/unit/annotation_layer_spec.js
@@ -1,11 +1,67 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* globals expect, it, describe, Dict, AnnotationBorderStyle,
+/* globals expect, it, describe, Dict, Annotation, AnnotationBorderStyle,
AnnotationBorderStyleType */
'use strict';
describe('Annotation layer', function() {
+ describe('Annotation', function() {
+ it('should reject a color if it is not an array', function() {
+ var dict = new Dict();
+ dict.set('Subtype', '');
+ var annotation = new Annotation({ dict: dict, ref: 0 });
+ annotation.setColor('red');
+
+ expect(annotation.color).toEqual([0, 0, 0]);
+ });
+
+ it('should set and get a transparent color', function() {
+ var dict = new Dict();
+ dict.set('Subtype', '');
+ var annotation = new Annotation({ dict: dict, ref: 0 });
+ annotation.setColor([]);
+
+ expect(annotation.color).toEqual(null);
+ });
+
+ it('should set and get a grayscale color', function() {
+ var dict = new Dict();
+ dict.set('Subtype', '');
+ var annotation = new Annotation({ dict: dict, ref: 0 });
+ annotation.setColor([0.4]);
+
+ expect(annotation.color).toEqual([102, 102, 102]);
+ });
+
+ it('should set and get an RGB color', function() {
+ var dict = new Dict();
+ dict.set('Subtype', '');
+ var annotation = new Annotation({ dict: dict, ref: 0 });
+ annotation.setColor([0, 0, 1]);
+
+ expect(annotation.color).toEqual([0, 0, 255]);
+ });
+
+ it('should set and get a CMYK color', function() {
+ var dict = new Dict();
+ dict.set('Subtype', '');
+ var annotation = new Annotation({ dict: dict, ref: 0 });
+ annotation.setColor([0.1, 0.92, 0.84, 0.02]);
+
+ expect(annotation.color).toEqual([233, 59, 47]);
+ });
+
+ it('should not set and get an invalid color', function() {
+ var dict = new Dict();
+ dict.set('Subtype', '');
+ var annotation = new Annotation({ dict: dict, ref: 0 });
+ annotation.setColor([0.4, 0.6]);
+
+ expect(annotation.color).toEqual([0, 0, 0]);
+ });
+ });
+
describe('AnnotationBorderStyle', function() {
it('should set and get a valid width', function() {
var borderStyle = new AnnotationBorderStyle();
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git
More information about the Pkg-javascript-commits
mailing list