From 55d6ede1da3591fed719f49bb21c0de8c7c56939 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 30 Jul 2013 15:35:35 -0700 Subject: [PATCH] Create only one instance of each device colorspace. --- src/canvas.js | 22 ++++++++-------------- src/colorspace.js | 20 ++++++++++++++++---- src/pattern.js | 2 +- src/util.js | 10 +++------- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 0b1bed490..8db9fa939 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -358,9 +358,9 @@ var CanvasExtraState = (function CanvasExtraStateClosure() { this.textRenderingMode = TextRenderingMode.FILL; this.textRise = 0; // Color spaces - this.fillColorSpace = new DeviceGrayCS(); + this.fillColorSpace = ColorSpace.singletons.gray; this.fillColorSpaceObj = null; - this.strokeColorSpace = new DeviceGrayCS(); + this.strokeColorSpace = ColorSpace.singletons.gray; this.strokeColorSpaceObj = null; this.fillColorObj = null; this.strokeColorObj = null; @@ -1357,8 +1357,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } }, setStrokeGray: function CanvasGraphics_setStrokeGray(gray) { - if (!(this.current.strokeColorSpace instanceof DeviceGrayCS)) - this.current.strokeColorSpace = new DeviceGrayCS(); + this.current.strokeColorSpace = ColorSpace.singletons.gray; var rgbColor = this.current.strokeColorSpace.getRgb(arguments, 0); var color = Util.makeCssRgb(rgbColor); @@ -1366,8 +1365,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.current.strokeColor = color; }, setFillGray: function CanvasGraphics_setFillGray(gray) { - if (!(this.current.fillColorSpace instanceof DeviceGrayCS)) - this.current.fillColorSpace = new DeviceGrayCS(); + this.current.fillColorSpace = ColorSpace.singletons.gray; var rgbColor = this.current.fillColorSpace.getRgb(arguments, 0); var color = Util.makeCssRgb(rgbColor); @@ -1375,8 +1373,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.current.fillColor = color; }, setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - if (!(this.current.strokeColorSpace instanceof DeviceRgbCS)) - this.current.strokeColorSpace = new DeviceRgbCS(); + this.current.strokeColorSpace = ColorSpace.singletons.rgb; var rgbColor = this.current.strokeColorSpace.getRgb(arguments, 0); var color = Util.makeCssRgb(rgbColor); @@ -1384,8 +1381,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.current.strokeColor = color; }, setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - if (!(this.current.fillColorSpace instanceof DeviceRgbCS)) - this.current.fillColorSpace = new DeviceRgbCS(); + this.current.fillColorSpace = ColorSpace.singletons.rgb; var rgbColor = this.current.fillColorSpace.getRgb(arguments, 0); var color = Util.makeCssRgb(rgbColor); @@ -1393,16 +1389,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.current.fillColor = color; }, setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) { - if (!(this.current.strokeColorSpace instanceof DeviceCmykCS)) - this.current.strokeColorSpace = new DeviceCmykCS(); + this.current.strokeColorSpace = ColorSpace.singletons.cmyk; var color = Util.makeCssCmyk(arguments); this.ctx.strokeStyle = color; this.current.strokeColor = color; }, setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) { - if (!(this.current.fillColorSpace instanceof DeviceCmykCS)) - this.current.fillColorSpace = new DeviceCmykCS(); + this.current.fillColorSpace = ColorSpace.singletons.cmyk; var color = Util.makeCssCmyk(arguments); this.ctx.fillStyle = color; diff --git a/src/colorspace.js b/src/colorspace.js index e6e81fdd8..76b495d2d 100644 --- a/src/colorspace.js +++ b/src/colorspace.js @@ -15,7 +15,7 @@ * limitations under the License. */ /* globals error, info, input, isArray, isDict, isName, isStream, isString, - PDFFunction, warn */ + PDFFunction, warn, shadow */ 'use strict'; @@ -127,11 +127,11 @@ var ColorSpace = (function ColorSpaceClosure() { switch (name) { case 'DeviceGrayCS': - return new DeviceGrayCS(); + return this.singletons.gray; case 'DeviceRgbCS': - return new DeviceRgbCS(); + return this.singletons.rgb; case 'DeviceCmykCS': - return new DeviceCmykCS(); + return this.singletons.cmyk; case 'PatternCS': var basePatternCS = IR[1]; if (basePatternCS) @@ -281,6 +281,18 @@ var ColorSpace = (function ColorSpaceClosure() { return true; }; + ColorSpace.singletons = { + get gray() { + return shadow(this, 'gray', new DeviceGrayCS()); + }, + get rgb() { + return shadow(this, 'rgb', new DeviceRgbCS()); + }, + get cmyk() { + return shadow(this, 'cmyk', new DeviceCmykCS()); + } + }; + return ColorSpace; })(); diff --git a/src/pattern.js b/src/pattern.js index 6f7db2722..94870f288 100644 --- a/src/pattern.js +++ b/src/pattern.js @@ -398,7 +398,7 @@ var TilingPattern = (function TilingPatternClosure() { context.strokeStyle = ctx.strokeStyle; break; case PaintType.UNCOLORED: - var rgbColor = new DeviceRgbCS().getRgb(color, 0); + var rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); var cssColor = Util.makeCssRgb(rgbColor); context.fillStyle = cssColor; context.strokeStyle = cssColor; diff --git a/src/util.js b/src/util.js index 8cee4a1eb..0ed1192c5 100644 --- a/src/util.js +++ b/src/util.js @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals Cmd, DeviceCmykCS, Dict, globalScope, INFOS, MozBlobBuilder, Name, +/* globals Cmd, ColorSpace, Dict, globalScope, INFOS, MozBlobBuilder, Name, PDFJS, Ref, WARNINGS, verbosity */ 'use strict'; @@ -281,12 +281,8 @@ var Util = PDFJS.Util = (function UtilClosure() { }; Util.makeCssCmyk = function Util_makeCssCmyk(cmyk) { - var cs = new DeviceCmykCS(); - Util.makeCssCmyk = function makeCssCmyk(cmyk) { - var rgb = cs.getRgb(cmyk, 0); - return Util.makeCssRgb(rgb); - }; - return Util.makeCssCmyk(cmyk); + var rgb = ColorSpace.singletons.cmyk.getRgb(cmyk, 0); + return Util.makeCssRgb(rgb); }; // Concatenates two transformation matrices together and returns the result.