// Generated by CoffeeScript 1.12.5 (function() { var PDFGradient, PDFLinearGradient, PDFRadialGradient, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; PDFGradient = (function() { function PDFGradient(doc) { this.doc = doc; this.stops = []; this.embedded = false; this.transform = [1, 0, 0, 1, 0, 0]; this._colorSpace = 'DeviceRGB'; } PDFGradient.prototype.stop = function(pos, color, opacity) { if (opacity == null) { opacity = 1; } opacity = Math.max(0, Math.min(1, opacity)); this.stops.push([pos, this.doc._normalizeColor(color), opacity]); return this; }; PDFGradient.prototype.setTransform = function(m11, m12, m21, m22, dx, dy) { this.transform = [m11, m12, m21, m22, dx, dy]; return this; }; PDFGradient.prototype.embed = function(m) { var bounds, encode, fn, form, grad, gstate, i, j, k, last, len, opacityPattern, pageBBox, pattern, ref, ref1, shader, stop, stops, v; if (this.stops.length === 0) { return; } this.embedded = true; this.matrix = m; last = this.stops[this.stops.length - 1]; if (last[0] < 1) { this.stops.push([1, last[1], last[2]]); } bounds = []; encode = []; stops = []; for (i = j = 0, ref = this.stops.length - 1; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { encode.push(0, 1); if (i + 2 !== this.stops.length) { bounds.push(this.stops[i + 1][0]); } fn = this.doc.ref({ FunctionType: 2, Domain: [0, 1], C0: this.stops[i + 0][1], C1: this.stops[i + 1][1], N: 1 }); stops.push(fn); fn.end(); } if (stops.length === 1) { fn = stops[0]; } else { fn = this.doc.ref({ FunctionType: 3, Domain: [0, 1], Functions: stops, Bounds: bounds, Encode: encode }); fn.end(); } this.id = 'Sh' + (++this.doc._gradCount); shader = this.shader(fn); shader.end(); pattern = this.doc.ref({ Type: 'Pattern', PatternType: 2, Shading: shader, Matrix: (function() { var k, len, ref1, results; ref1 = this.matrix; results = []; for (k = 0, len = ref1.length; k < len; k++) { v = ref1[k]; results.push(+v.toFixed(5)); } return results; }).call(this) }); pattern.end(); if (this.stops.some(function(stop) { return stop[2] < 1; })) { grad = this.opacityGradient(); grad._colorSpace = 'DeviceGray'; ref1 = this.stops; for (k = 0, len = ref1.length; k < len; k++) { stop = ref1[k]; grad.stop(stop[0], [stop[2]]); } grad = grad.embed(this.matrix); pageBBox = [0, 0, this.doc.page.width, this.doc.page.height]; form = this.doc.ref({ Type: 'XObject', Subtype: 'Form', FormType: 1, BBox: pageBBox, Group: { Type: 'Group', S: 'Transparency', CS: 'DeviceGray' }, Resources: { ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'], Pattern: { Sh1: grad } } }); form.write("/Pattern cs /Sh1 scn"); form.end((pageBBox.join(" ")) + " re f"); gstate = this.doc.ref({ Type: 'ExtGState', SMask: { Type: 'Mask', S: 'Luminosity', G: form } }); gstate.end(); opacityPattern = this.doc.ref({ Type: 'Pattern', PatternType: 1, PaintType: 1, TilingType: 2, BBox: pageBBox, XStep: pageBBox[2], YStep: pageBBox[3], Resources: { ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'], Pattern: { Sh1: pattern }, ExtGState: { Gs1: gstate } } }); opacityPattern.write("/Gs1 gs /Pattern cs /Sh1 scn"); opacityPattern.end((pageBBox.join(" ")) + " re f"); this.doc.page.patterns[this.id] = opacityPattern; } else { this.doc.page.patterns[this.id] = pattern; } return pattern; }; PDFGradient.prototype.apply = function(op) { var dx, dy, m, m0, m1, m11, m12, m2, m21, m22, m3, m4, m5, ref, ref1; ref = this.doc._ctm.slice(), m0 = ref[0], m1 = ref[1], m2 = ref[2], m3 = ref[3], m4 = ref[4], m5 = ref[5]; ref1 = this.transform, m11 = ref1[0], m12 = ref1[1], m21 = ref1[2], m22 = ref1[3], dx = ref1[4], dy = ref1[5]; m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5]; if (!(this.embedded && m.join(" ") === this.matrix.join(" "))) { this.embed(m); } return this.doc.addContent("/" + this.id + " " + op); }; return PDFGradient; })(); PDFLinearGradient = (function(superClass) { extend(PDFLinearGradient, superClass); function PDFLinearGradient(doc, x1, y1, x2, y2) { this.doc = doc; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; PDFLinearGradient.__super__.constructor.apply(this, arguments); } PDFLinearGradient.prototype.shader = function(fn) { return this.doc.ref({ ShadingType: 2, ColorSpace: this._colorSpace, Coords: [this.x1, this.y1, this.x2, this.y2], Function: fn, Extend: [true, true] }); }; PDFLinearGradient.prototype.opacityGradient = function() { return new PDFLinearGradient(this.doc, this.x1, this.y1, this.x2, this.y2); }; return PDFLinearGradient; })(PDFGradient); PDFRadialGradient = (function(superClass) { extend(PDFRadialGradient, superClass); function PDFRadialGradient(doc, x1, y1, r1, x2, y2, r2) { this.doc = doc; this.x1 = x1; this.y1 = y1; this.r1 = r1; this.x2 = x2; this.y2 = y2; this.r2 = r2; PDFRadialGradient.__super__.constructor.apply(this, arguments); } PDFRadialGradient.prototype.shader = function(fn) { return this.doc.ref({ ShadingType: 3, ColorSpace: this._colorSpace, Coords: [this.x1, this.y1, this.r1, this.x2, this.y2, this.r2], Function: fn, Extend: [true, true] }); }; PDFRadialGradient.prototype.opacityGradient = function() { return new PDFRadialGradient(this.doc, this.x1, this.y1, this.r1, this.x2, this.y2, this.r2); }; return PDFRadialGradient; })(PDFGradient); module.exports = { PDFGradient: PDFGradient, PDFLinearGradient: PDFLinearGradient, PDFRadialGradient: PDFRadialGradient }; }).call(this);