From b6077c739810dae8265486892e49c8d66cc62c77 Mon Sep 17 00:00:00 2001 From: benbro Date: Sat, 12 May 2012 03:40:40 +0300 Subject: [PATCH 01/18] IE9 breaks when adding to many style elements to the page. --- src/fonts.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/fonts.js b/src/fonts.js index 22037e724..d22a54352 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -20,6 +20,9 @@ var kPDFGlyphSpaceUnits = 1000; // Until hinting is fully supported this constant can be used var kHintingEnabled = false; +// A reference to a reusable style sheet. +var styleSheet; + var FontFlags = { FixedPitch: 1, Serif: 2, @@ -2374,11 +2377,14 @@ var Font = (function FontClosure() { window.btoa(data) + ');'); var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}'; - var styleElement = document.createElement('style'); - document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); - var styleSheet = styleElement.sheet; + if(!styleSheet) { + var styleElement = document.createElement('style'); + document.documentElement.getElementsByTagName('head')[0].appendChild( + styleElement); + + styleSheet = styleElement.sheet; + } styleSheet.insertRule(rule, styleSheet.cssRules.length); if (PDFJS.pdfBug && FontInspector.enabled) From 81681e7914523ec393a947a60415a1779a8110a8 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Sun, 27 May 2012 13:50:46 -0500 Subject: [PATCH 02/18] Pre-scale image in the paintImageMaskXObject --- src/canvas.js | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 9d470fbec..b9d8e9e17 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1094,6 +1094,40 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } } } + function rescaleImage(pixels, widthScale, heightScale) { + var scaledWidth = Math.ceil(width / widthScale); + var scaledHeight = Math.ceil(height / heightScale); + + var itemsSum = new Uint32Array(scaledWidth * scaledHeight * 4); + var itemsCount = new Uint32Array(scaledWidth * scaledHeight); + for (var i = 0, position = 0; i < height; i++) { + var lineOffset = (0 | (i / heightScale)) * scaledWidth; + for (var j = 0; j < width; j++) { + var countOffset = lineOffset + (0 | (j / widthScale)); + var sumOffset = countOffset << 2; + itemsSum[sumOffset] += pixels[position]; + itemsSum[sumOffset + 1] += pixels[position + 1]; + itemsSum[sumOffset + 2] += pixels[position + 2]; + itemsSum[sumOffset + 3] += pixels[position + 3]; + itemsCount[countOffset]++; + position += 4; + } + } + var tmpCanvas = createScratchCanvas(scaledWidth, scaledHeight); + var tmpCtx = tmpCanvas.getContext('2d'); + var imgData = tmpCtx.getImageData(0, 0, scaledWidth, scaledHeight); + pixels = imgData.data; + for (var i = 0, j = 0, ii = scaledWidth * scaledHeight; i < ii; i++) { + var count = itemsCount[i]; + pixels[j] = itemsSum[j] / count; + pixels[j + 1] = itemsSum[j + 1] / count; + pixels[j + 2] = itemsSum[j + 2] / count; + pixels[j + 3] = itemsSum[j + 3] / count; + j += 4; + } + tmpCtx.putImageData(imgData, 0, 0); + return tmpCanvas; + } this.save(); @@ -1117,7 +1151,17 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { applyStencilMask(pixels, inverseDecode); tmpCtx.putImageData(imgData, 0, 0); - ctx.drawImage(tmpCanvas, 0, -h); + var currentTransform = ctx.mozCurrentTransformInverse; + var widthScale = Math.max(Math.abs(currentTransform[0]), 1); + var heightScale = Math.max(Math.abs(currentTransform[3]), 1); + if (widthScale >= 2 || heightScale >= 2) { + // canvas does not resize large images to small -- using simple + // algorithm to perform pre-scaling + tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); + ctx.scale(widthScale, heightScale); + ctx.drawImage(tmpCanvas, 0, -h / heightScale); + } else + ctx.drawImage(tmpCanvas, 0, -h); this.restore(); }, From 50b86ff480ffbad345ca9ca39974143006afc9da Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Mon, 28 May 2012 15:10:44 -0500 Subject: [PATCH 03/18] Move putImageData --- src/canvas.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index b9d8e9e17..0be8cdb59 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1150,17 +1150,17 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { applyStencilMask(pixels, inverseDecode); - tmpCtx.putImageData(imgData, 0, 0); var currentTransform = ctx.mozCurrentTransformInverse; var widthScale = Math.max(Math.abs(currentTransform[0]), 1); var heightScale = Math.max(Math.abs(currentTransform[3]), 1); if (widthScale >= 2 || heightScale >= 2) { - // canvas does not resize large images to small -- using simple + // canvas does not resize well large images to small -- using simple // algorithm to perform pre-scaling tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); ctx.scale(widthScale, heightScale); ctx.drawImage(tmpCanvas, 0, -h / heightScale); } else + tmpCtx.putImageData(imgData, 0, 0); ctx.drawImage(tmpCanvas, 0, -h); this.restore(); }, From 4e39685753b5f70979496b42f45dc69f68c43a2b Mon Sep 17 00:00:00 2001 From: benbro Date: Thu, 31 May 2012 12:01:15 +0300 Subject: [PATCH 04/18] Use a style tag with an ID instead of keeping a reference to it. --- src/fonts.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/fonts.js b/src/fonts.js index d22a54352..e0dfe8b2b 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -20,9 +20,6 @@ var kPDFGlyphSpaceUnits = 1000; // Until hinting is fully supported this constant can be used var kHintingEnabled = false; -// A reference to a reusable style sheet. -var styleSheet; - var FontFlags = { FixedPitch: 1, Serif: 2, @@ -2377,14 +2374,14 @@ var Font = (function FontClosure() { window.btoa(data) + ');'); var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}'; - - if(!styleSheet) { - var styleElement = document.createElement('style'); - document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); - - styleSheet = styleElement.sheet; + var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); + if (!styleElement) { + styleElement = document.createElement('style'); + document.documentElement.getElementsByTagName('head')[0].appendChild( + styleElement); } + + var styleSheet = styleElement.sheet; styleSheet.insertRule(rule, styleSheet.cssRules.length); if (PDFJS.pdfBug && FontInspector.enabled) From 6de284acc9a5fdbb6073eea440a43fcbb4a95d02 Mon Sep 17 00:00:00 2001 From: benbro Date: Thu, 31 May 2012 12:05:06 +0300 Subject: [PATCH 05/18] Set the style element ID. --- src/fonts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fonts.js b/src/fonts.js index e0dfe8b2b..0e505a808 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2377,6 +2377,7 @@ var Font = (function FontClosure() { var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); if (!styleElement) { styleElement = document.createElement('style'); + styleElement.id = 'PDFJS_FONT_STYLE_TAG'; document.documentElement.getElementsByTagName('head')[0].appendChild( styleElement); } From d5da15e0017ae45b944642fd3d3c7185bb2e67c5 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 5 Jun 2012 17:56:18 -0500 Subject: [PATCH 06/18] Fixes brackets --- src/canvas.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 0be8cdb59..06b02c2eb 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1159,9 +1159,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); ctx.scale(widthScale, heightScale); ctx.drawImage(tmpCanvas, 0, -h / heightScale); - } else + } else { tmpCtx.putImageData(imgData, 0, 0); ctx.drawImage(tmpCanvas, 0, -h); + } this.restore(); }, From 2dacbb7a03f591218b0b0fdd83765ebe18405aea Mon Sep 17 00:00:00 2001 From: Saebekassebil Date: Thu, 7 Jun 2012 21:27:26 +0200 Subject: [PATCH 07/18] Dismiss native browser zoom, and use PDF.JS zoom instead --- web/viewer.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/web/viewer.js b/web/viewer.js index 751f2deff..7d07b991e 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1844,6 +1844,18 @@ window.addEventListener('pagechange', function pagechange(evt) { document.getElementById('next').disabled = (page >= PDFView.pages.length); }, true); +// Firefox specific event, so that we can prevent browser from zooming +window.addEventListener('DOMMouseScroll', function(evt) { + if(evt.ctrlKey) { + evt.preventDefault(); + + var ticks = evt.detail; + var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; + for(var i = 0, length = Math.abs(ticks); i < length; i++) + PDFView[direction](); + } +}, false); + window.addEventListener('keydown', function keydown(evt) { var handled = false; var cmd = (evt.ctrlKey ? 1 : 0) | From 67703364fc0c05ed9613dd9bb2d4b7fc650e4a41 Mon Sep 17 00:00:00 2001 From: Saebekassebil Date: Thu, 7 Jun 2012 21:39:18 +0200 Subject: [PATCH 08/18] lint errors --- web/viewer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 7d07b991e..29b57a948 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1846,12 +1846,12 @@ window.addEventListener('pagechange', function pagechange(evt) { // Firefox specific event, so that we can prevent browser from zooming window.addEventListener('DOMMouseScroll', function(evt) { - if(evt.ctrlKey) { + if (evt.ctrlKey) { evt.preventDefault(); var ticks = evt.detail; var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; - for(var i = 0, length = Math.abs(ticks); i < length; i++) + for (var i = 0, length = Math.abs(ticks); i < length; i++) PDFView[direction](); } }, false); From dd14b3051efe843ef757ae1b0ab27a2e22d2f977 Mon Sep 17 00:00:00 2001 From: sbarman Date: Fri, 8 Jun 2012 22:42:56 -0700 Subject: [PATCH 09/18] Fix for issue #1796 --- src/evaluator.js | 6 ++++-- src/image.js | 53 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/evaluator.js b/src/evaluator.js index 8849a994a..059ff113f 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -226,8 +226,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { insertDependency([objId]); args = [objId, w, h]; - var softMask = dict.get('SMask', 'IM') || false; - if (!softMask && image instanceof JpegStream && + var softMask = dict.get('SMask', 'SM') || false; + var mask = dict.get('Mask') || false; + + if (!softMask && !mask && image instanceof JpegStream && image.isNativelySupported(xref, resources)) { // These JPEGs don't need any more processing so we can just send it. fn = 'paintJpegXObject'; diff --git a/src/image.js b/src/image.js index c8c19f9e5..aa241dab9 100644 --- a/src/image.js +++ b/src/image.js @@ -1,4 +1,4 @@ -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 'use strict'; @@ -33,7 +33,7 @@ var PDFImage = (function PDFImageClosure() { // Clamp the value to the range return value < 0 ? 0 : value > max ? max : value; } - function PDFImage(xref, res, image, inline, smask) { + function PDFImage(xref, res, image, inline, smask, mask) { this.image = image; if (image.getParams) { // JPX/JPEG2000 streams directly contain bits per component @@ -94,12 +94,11 @@ var PDFImage = (function PDFImageClosure() { } } - var mask = dict.get('Mask'); - - if (mask) { - TODO('masked images'); - } else if (smask) { + + if (smask) { this.smask = new PDFImage(xref, res, smask, false); + } else if (mask) { + this.mask = new PDFImage(xref, res, mask, false); } } /** @@ -110,21 +109,35 @@ var PDFImage = (function PDFImageClosure() { res, image, inline) { var imageDataPromise = new Promise(); var smaskPromise = new Promise(); + var maskPromise = new Promise(); // The image data and smask data may not be ready yet, wait till both are // resolved. - Promise.all([imageDataPromise, smaskPromise]).then(function(results) { - var imageData = results[0], smaskData = results[1]; - var image = new PDFImage(xref, res, imageData, inline, smaskData); + Promise.all([imageDataPromise, smaskPromise, maskPromise]).then( + function(results) { + var imageData = results[0], smaskData = results[1], maskData = results[2]; + var image = new PDFImage(xref, res, imageData, inline, smaskData, + maskData); callback(image); }); handleImageData(handler, xref, res, image, imageDataPromise); var smask = image.dict.get('SMask'); - if (smask) + var mask = image.dict.get('Mask'); + + if (smask) { handleImageData(handler, xref, res, smask, smaskPromise); - else + } else { smaskPromise.resolve(null); + if (mask && isStream(mask)) { + handleImageData(handler, xref, res, mask, maskPromise); + } else if (mask) { + TODO('handle color key masking') + maskPromise.resolve(null); + } else { + maskPromise.resolve(null); + } + } }; /** @@ -268,6 +281,7 @@ var PDFImage = (function PDFImageClosure() { }, getOpacity: function PDFImage_getOpacity(width, height) { var smask = this.smask; + var mask = this.mask; var originalWidth = this.width; var originalHeight = this.height; var buf; @@ -278,7 +292,20 @@ var PDFImage = (function PDFImageClosure() { buf = new Uint8Array(sw * sh); smask.fillGrayBuffer(buf); if (sw != width || sh != height) - buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height); + buf = PDFImage.resize(buf, smask.bpc, 1, sw, sh, width, height); + } else if (mask) { + var sw = mask.width; + var sh = mask.height; + buf = new Uint8Array(sw * sh); + mask.numComps = 1; + mask.fillGrayBuffer(buf); + + // Need to invert values in buffer + for (var i = 0, ii = sw * sh; i < ii; ++i) + buf[i] = 255 - buf[i] + + if (sw != width || sh != height) + buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height); } else { buf = new Uint8Array(width * height); for (var i = 0, ii = width * height; i < ii; ++i) From 3b14930eec5630892b727acfee6b25eb9beedd63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20M=C3=A4rcker?= Date: Mon, 11 Jun 2012 11:03:15 +0200 Subject: [PATCH 10/18] added missing css vendor prefixes and reordered some properties according to cascade --- web/viewer.css | 186 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 141 insertions(+), 45 deletions(-) diff --git a/web/viewer.css b/web/viewer.css index 329bff2d5..5a8ee2aaf 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -54,19 +54,31 @@ html[dir='rtl'] .innerCenter { bottom: 0; width: 200px; visibility: hidden; - -moz-transition-duration: 200ms; - -moz-transition-timing-function: ease; -webkit-transition-duration: 200ms; -webkit-transition-timing-function: ease; + -moz-transition-duration: 200ms; + -moz-transition-timing-function: ease; + -ms-transition-duration: 200ms; + -ms-transition-timing-function: ease; + -o-transition-duration: 200ms; + -o-transition-timing-function: ease; + transition-duration: 200ms; + transition-timing-function: ease; + } html[dir='ltr'] #sidebarContainer { - -moz-transition-property: left; -webkit-transition-property: left; + -moz-transition-property: left; + -ms-transition-property: left; + -o-transition-property: left; + transition-property: left; left: -200px; } html[dir='rtl'] #sidebarContainer { - -moz-transition-property: right; -webkit-transition-property: right; + -ms-transition-property: right; + -o-transition-property: right; + transition-property: right; right: -200px; } @@ -87,19 +99,31 @@ html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer { right: 0; bottom: 0; left: 0; - -moz-transition-duration: 200ms; - -moz-transition-timing-function: ease; -webkit-transition-duration: 200ms; -webkit-transition-timing-function: ease; + -moz-transition-duration: 200ms; + -moz-transition-timing-function: ease; + -ms-transition-duration: 200ms; + -ms-transition-timing-function: ease; + -o-transition-duration: 200ms; + -o-transition-timing-function: ease; + transition-duration: 200ms; + transition-timing-function: ease; } html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer { - -moz-transition-property: left; -webkit-transition-property: left; + -moz-transition-property: left; + -ms-transition-property: left; + -o-transition-property: left; + transition-property: left; left: 200px; } html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer { - -moz-transition-property: right; -webkit-transition-property: right; + -moz-transition-property: right; + -ms-transition-property: right; + -o-transition-property: right; + transition-property: right; right: 200px; } @@ -147,10 +171,16 @@ html[dir='rtl'] #sidebarContent { #toolbarSidebar { width: 200px; height: 32px; + background-image: url(images/texture.png), + -webkit-linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); background-image: url(images/texture.png), -moz-linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); background-image: url(images/texture.png), - -webkit-linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); + -ms-linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); + background-image: url(images/texture.png), + -o-linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); + background-image: url(images/texture.png), + linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); box-shadow: inset -2px 0 0 hsla(0,0%,100%,.08), inset 0 1px 1px hsla(0,0%,0%,.15), inset 0 -1px 0 hsla(0,0%,100%,.05), @@ -161,10 +191,16 @@ html[dir='rtl'] #sidebarContent { #toolbarViewer { position: relative; height: 32px; + background-image: url(images/texture.png), + -webkit-linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); background-image: url(images/texture.png), -moz-linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); background-image: url(images/texture.png), - -webkit-linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); + -ms-linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); + background-image: url(images/texture.png), + -o-linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); + background-image: url(images/texture.png), + linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); border-left: 1px solid hsla(0,0%,0%,.5); box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08), inset 0 1px 1px hsla(0,0%,0%,.15), @@ -246,20 +282,33 @@ html[dir='rtl'] .splitToolbarButton > .toolbarButton { .splitToolbarButton:focus > .toolbarButton, .splitToolbarButton.toggled > .toolbarButton { background-color: hsla(0,0%,0%,.12); - background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, 0 0 1px hsla(0,0%,100%,.15) inset, 0 1px 0 hsla(0,0%,100%,.05); - -moz-transition-property: background-color, border-color, box-shadow; - -moz-transition-duration: 150ms; - -moz-transition-timing-function: ease; -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 150ms; -webkit-transition-timing-function: ease; + -moz-transition-property: background-color, border-color, box-shadow; + -moz-transition-duration: 150ms; + -moz-transition-timing-function: ease; + -ms-transition-property: background-color, border-color, box-shadow; + -ms-transition-duration: 150ms; + -ms-transition-timing-function: ease; + -o-transition-property: background-color, border-color, box-shadow; + -o-transition-duration: 150ms; + -o-transition-timing-function: ease; + transition-property: background-color, border-color, box-shadow; + transition-duration: 150ms; + transition-timing-function: ease; + } .splitToolbarButton > .toolbarButton:hover, .splitToolbarButton > .toolbarButton:focus, @@ -308,12 +357,21 @@ html[dir='rtl'] .splitToolbarButtonSeparator { padding: 12px 0; margin: 0; box-shadow: 0 0 0 1px hsla(0,0%,100%,.03); - -moz-transition-property: padding; - -moz-transition-duration: 10ms; - -moz-transition-timing-function: ease; -webkit-transition-property: padding; -webkit-transition-duration: 10ms; -webkit-transition-timing-function: ease; + -moz-transition-property: padding; + -moz-transition-duration: 10ms; + -moz-transition-timing-function: ease; + -ms-transition-property: padding; + -ms-transition-duration: 10ms; + -ms-transition-timing-function: ease; + -o-transition-property: padding; + -o-transition-duration: 10ms; + -o-transition-timing-function: ease; + transition-property: padding; + transition-duration: 10ms; + transition-timing-function: ease; } .toolbarButton, @@ -325,15 +383,26 @@ html[dir='rtl'] .splitToolbarButtonSeparator { color: hsl(0,0%,95%); font-size: 12px; line-height: 14px; - -moz-user-select:none; -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + /* Opera does not support user-select, use <... unselectable="on"> instead */ cursor: default; - -moz-transition-property: background-color, border-color, box-shadow; - -moz-transition-duration: 150ms; - -moz-transition-timing-function: ease; -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 150ms; -webkit-transition-timing-function: ease; + -moz-transition-property: background-color, border-color, box-shadow; + -moz-transition-duration: 150ms; + -moz-transition-timing-function: ease; + -ms-transition-property: background-color, border-color, box-shadow; + -ms-transition-duration: 150ms; + -ms-transition-timing-function: ease; + -o-transition-property: background-color, border-color, box-shadow; + -o-transition-duration: 150ms; + -o-transition-timing-function: ease; + transition-property: background-color, border-color, box-shadow; + transition-duration: 150ms; + transition-timing-function: ease; } html[dir='ltr'] .toolbarButton, @@ -349,8 +418,11 @@ html[dir='rtl'] .dropdownToolbarButton { .toolbarButton:focus, .dropdownToolbarButton { background-color: hsla(0,0%,0%,.12); - background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-clip: padding-box; border: 1px solid hsla(0,0%,0%,.35); border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); @@ -362,35 +434,59 @@ html[dir='rtl'] .dropdownToolbarButton { .toolbarButton:hover:active, .dropdownToolbarButton:hover:active { background-color: hsla(0,0%,0%,.2); - background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45); box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, 0 0 1px hsla(0,0%,0%,.2) inset, 0 1px 0 hsla(0,0%,100%,.05); - -moz-transition-property: background-color, border-color, box-shadow; - -moz-transition-duration: 10ms; - -moz-transition-timing-function: linear; -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 10ms; -webkit-transition-timing-function: linear; + -moz-transition-property: background-color, border-color, box-shadow; + -moz-transition-duration: 10ms; + -moz-transition-timing-function: linear; + -ms-transition-property: background-color, border-color, box-shadow; + -ms-transition-duration: 10ms; + -ms-transition-timing-function: linear; + -o-transition-property: background-color, border-color, box-shadow; + -o-transition-duration: 10ms; + -o-transition-timing-function: linear; + transition-property: background-color, border-color, box-shadow; + transition-duration: 10ms; + transition-timing-function: linear; } .toolbarButton.toggled, .splitToolbarButton.toggled > .toolbarButton.toggled { background-color: hsla(0,0%,0%,.3); - background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5); box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, 0 0 1px hsla(0,0%,0%,.2) inset, 0 1px 0 hsla(0,0%,100%,.05); - -moz-transition-property: background-color, border-color, box-shadow; - -moz-transition-duration: 10ms; - -moz-transition-timing-function: linear; -webkit-transition-property: background-color, border-color, box-shadow; -webkit-transition-duration: 10ms; -webkit-transition-timing-function: linear; + -moz-transition-property: background-color, border-color, box-shadow; + -moz-transition-duration: 10ms; + -moz-transition-timing-function: linear; + -ms-transition-property: background-color, border-color, box-shadow; + -ms-transition-duration: 10ms; + -ms-transition-timing-function: linear; + -o-transition-property: background-color, border-color, box-shadow; + -o-transition-duration: 10ms; + -o-transition-timing-function: linear; + transition-property: background-color, border-color, box-shadow; + transition-duration: 10ms; + transition-timing-function: linear; } .toolbarButton.toggled:hover:active, @@ -417,8 +513,8 @@ html[dir='rtl'] .dropdownToolbarButton { } .dropdownToolbarButton > select { - -moz-appearance: none; /* in the future this might matter, see bugzilla bug #649849 */ -webkit-appearance: none; + -moz-appearance: none; /* in the future this might matter, see bugzilla bug #649849 */ min-width: 140px; font-size: 12px; color: hsl(0,0%,95%); @@ -460,8 +556,8 @@ html[dir='rtl'] .toolbarButton:first-child { } .toolbarButtonFlexibleSpacer { - -moz-box-flex: 1; -webkit-box-flex: 1; + -moz-box-flex: 1; min-width: 30px; } @@ -516,8 +612,8 @@ html[dir='rtl'] .toolbarButton.pageDown::before { } .toolbarButton.bookmark { - -moz-box-sizing: border-box; -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; box-sizing: border-box; margin-top: 3px; padding-top: 4px; @@ -597,8 +693,8 @@ html[dir='rtl'] .toolbarButton.pageDown::before { font-size: 12px; line-height: 14px; text-align: left; - -moz-user-select:none; -webkit-user-select:none; + -moz-user-select:none; cursor: default; } @@ -674,8 +770,8 @@ a:focus > .thumbnail > .thumbnailSelectionRing, bottom: 0; padding: 4px 4px 0; overflow: auto; - -moz-user-select:none; -webkit-user-select:none; + -moz-user-select:none; } .outlineItem > .outlineItems { @@ -784,9 +880,9 @@ canvas { margin: 10px auto; position: relative; overflow: hidden; - box-shadow: 0px 4px 10px #000; - -moz-box-shadow: 0px 4px 10px #000; -webkit-box-shadow: 0px 4px 10px #000; + -moz-box-shadow: 0px 4px 10px #000; + box-shadow: 0px 4px 10px #000; background-color: white; } @@ -798,9 +894,9 @@ canvas { .page > a:hover { opacity: 0.2; background: #ff0; - box-shadow: 0px 2px 10px #ff0; - -moz-box-shadow: 0px 2px 10px #ff0; -webkit-box-shadow: 0px 2px 10px #ff0; + -moz-box-shadow: 0px 2px 10px #ff0; + box-shadow: 0px 2px 10px #ff0; } .loadingIcon { @@ -838,11 +934,11 @@ canvas { float: left; background: #666; - background: -moz-linear-gradient(top, #999 0%, #666 50%, #999 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#999), color-stop(50%,#666), color-stop(100%,#999)); background: -webkit-linear-gradient(top, #999 0%,#666 50%,#999 100%); - background: -o-linear-gradient(top, #999 0%,#666 50%,#999 100%); + background: -moz-linear-gradient(top, #999 0%, #666 50%, #999 100%); background: -ms-linear-gradient(top, #999 0%,#666 50%,#999 100%); + background: -o-linear-gradient(top, #999 0%,#666 50%,#999 100%); background: linear-gradient(top, #999 0%,#666 50%,#999 100%); border-top-left-radius: 3px; @@ -896,9 +992,9 @@ canvas { padding: 0.2em; max-width: 20em; background-color: #F1E47B; - box-shadow: 0px 2px 10px #333; - -moz-box-shadow: 0px 2px 10px #333; -webkit-box-shadow: 0px 2px 10px #333; + -moz-box-shadow: 0px 2px 10px #333; + box-shadow: 0px 2px 10px #333; } .annotComment > div > h1 { @@ -1008,9 +1104,9 @@ canvas { .page { float: left; display: none; - box-shadow: none; - -moz-box-shadow: none; -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } .page[data-loaded] { From c900dfeced5f1da4934a9f35b9f6d73e9a5064b4 Mon Sep 17 00:00:00 2001 From: sbarman Date: Mon, 11 Jun 2012 14:57:58 -0700 Subject: [PATCH 11/18] Updated lint errors --- src/image.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/image.js b/src/image.js index aa241dab9..4e403ca12 100644 --- a/src/image.js +++ b/src/image.js @@ -94,7 +94,6 @@ var PDFImage = (function PDFImageClosure() { } } - if (smask) { this.smask = new PDFImage(xref, res, smask, false); } else if (mask) { @@ -115,7 +114,7 @@ var PDFImage = (function PDFImageClosure() { Promise.all([imageDataPromise, smaskPromise, maskPromise]).then( function(results) { var imageData = results[0], smaskData = results[1], maskData = results[2]; - var image = new PDFImage(xref, res, imageData, inline, smaskData, + var image = new PDFImage(xref, res, imageData, inline, smaskData, maskData); callback(image); }); @@ -132,7 +131,7 @@ var PDFImage = (function PDFImageClosure() { if (mask && isStream(mask)) { handleImageData(handler, xref, res, mask, maskPromise); } else if (mask) { - TODO('handle color key masking') + TODO('handle color key masking'); maskPromise.resolve(null); } else { maskPromise.resolve(null); @@ -302,7 +301,7 @@ var PDFImage = (function PDFImageClosure() { // Need to invert values in buffer for (var i = 0, ii = sw * sh; i < ii; ++i) - buf[i] = 255 - buf[i] + buf[i] = 255 - buf[i]; if (sw != width || sh != height) buf = PDFImage.resize(buf, mask.bpc, 1, sw, sh, width, height); From 7c4829779445babd1bd7ccddfbe4070f2acf88d5 Mon Sep 17 00:00:00 2001 From: sbarman Date: Mon, 11 Jun 2012 15:05:06 -0700 Subject: [PATCH 12/18] Adding call to resolve unfulfilled promise --- src/image.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/image.js b/src/image.js index 4e403ca12..5f14868b7 100644 --- a/src/image.js +++ b/src/image.js @@ -126,6 +126,7 @@ var PDFImage = (function PDFImageClosure() { if (smask) { handleImageData(handler, xref, res, smask, smaskPromise); + maskPromise.resolve(null); } else { smaskPromise.resolve(null); if (mask && isStream(mask)) { From ced219c12f4f0276253e3e0fd64bfa6fcde830ce Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Wed, 13 Jun 2012 02:15:31 -0700 Subject: [PATCH 13/18] Switch to using message-box for the body and form elements in the UI of PDF.js. This will use the system's native UI font for each platform as well as fix the current inconsistency between the font of the text label for total page count and the text inside of the input element for current page number. --- web/viewer.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/viewer.css b/web/viewer.css index 329bff2d5..09b5299df 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -11,7 +11,12 @@ body { height: 100%; background-color: #404040; background-image: url(images/texture.png); - font-family: Segoe UI, Verdana, sans-serif; +} + +body, +input, +select { + font-family: message-box; } .hidden { From cba8d992fcecaa290d0e40109f908862b138eb7a Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Wed, 13 Jun 2012 02:27:22 -0700 Subject: [PATCH 14/18] Added |button| to the list of elements that message-box should be applied to. --- web/viewer.css | 1 + 1 file changed, 1 insertion(+) diff --git a/web/viewer.css b/web/viewer.css index 09b5299df..0ad3f4aa0 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -15,6 +15,7 @@ body { body, input, +button, select { font-family: message-box; } From 7ec483a7fa08d38552e8d0931aaaf220e8aad0c4 Mon Sep 17 00:00:00 2001 From: sbarman Date: Wed, 13 Jun 2012 10:29:02 -0700 Subject: [PATCH 15/18] Added new test pdf to manifest --- test/pdfs/issue1796.pdf.link | 1 + test/test_manifest.json | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 test/pdfs/issue1796.pdf.link diff --git a/test/pdfs/issue1796.pdf.link b/test/pdfs/issue1796.pdf.link new file mode 100644 index 000000000..b6470b421 --- /dev/null +++ b/test/pdfs/issue1796.pdf.link @@ -0,0 +1 @@ +http://www.maxims6n.bget.ru/book3/viewer/t4.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 25d2a2080..32bde988e 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -608,5 +608,13 @@ "md5": "cbc1988e4803f647fa83467a85f0e231", "rounds": 1, "type": "eq" + }, + { "id": "issue1796", + "file": "pdfs/issue1796.pdf", + "md5": "9b9b60dc2a4cc3ea05932785d71304fe", + "rounds": 1, + "pageLimit": 2, + "link": true, + "type": "eq" } ] From c3c01d10b325b83689b85b9bf48ef43441ff61dd Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Wed, 13 Jun 2012 10:47:46 -0700 Subject: [PATCH 16/18] message-box needs to use the font property, not the font-family property. --- web/viewer.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/viewer.css b/web/viewer.css index 0ad3f4aa0..ff40cd18f 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -17,7 +17,7 @@ body, input, button, select { - font-family: message-box; + font: message-box; } .hidden { From 5cbe3a517e1dc3e38d1e4a16acff2a6df0480b6e Mon Sep 17 00:00:00 2001 From: sbarman Date: Wed, 13 Jun 2012 16:09:57 -0700 Subject: [PATCH 17/18] Undo removal of Mode line --- src/image.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/image.js b/src/image.js index 5f14868b7..3495483e7 100644 --- a/src/image.js +++ b/src/image.js @@ -1,4 +1,4 @@ - +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 'use strict'; From 76a296cac45b655c0142997da648bc88336fd498 Mon Sep 17 00:00:00 2001 From: benbro Date: Mon, 18 Jun 2012 23:02:23 +0300 Subject: [PATCH 18/18] Remove space at end of line. --- src/fonts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fonts.js b/src/fonts.js index 0e505a808..c8415c911 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2379,7 +2379,7 @@ var Font = (function FontClosure() { styleElement = document.createElement('style'); styleElement.id = 'PDFJS_FONT_STYLE_TAG'; document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); + styleElement); } var styleSheet = styleElement.sheet;