}
Fonts[name] = {
- data: data,
+ data: file,
properties: properties,
loading: true,
cache: Object.create(null)
var CFF = function(name, file, properties) {
// Get the data block containing glyphs and subrs informations
- var length1 = file.dict.get("Length1");
- var length2 = file.dict.get("Length2");
+ var length1 = file.dict.get("Length1") || 0;
+ var length2 = file.dict.get("Length2") || 0;
file.skip(length1);
var eexecBlock = file.getBytes(length2);
this.setStrokeGray.apply(this, arguments);
} else if (3 === arguments.length) {
this.setStrokeRGBColor.apply(this, arguments);
+ } else if (4 === arguments.length) {
+ this.setStrokeCMYKColor.apply(this, arguments);
}
},
setStrokeColorN: function(/*...*/) {
this.setFillGray.apply(this, arguments);
} else if (3 === arguments.length) {
this.setFillRGBColor.apply(this, arguments);
+ } else if (4 === arguments.length) {
+ this.setFillCMYKColor.apply(this, arguments);
}
},
setFillColorN: function(/*...*/) {
this.ctx.fillStyle = this.makeCssRgb(r, g, b);
},
setStrokeCMYKColor: function(c, m, y, k) {
- TODO("CMYK space");
+ this.ctx.strokeStyle = this.makeCssCmyk(c, m, y, k);
},
setFillCMYKColor: function(c, m, y, k) {
- TODO("CMYK space");
+ this.ctx.fillStyle = this.makeCssCmyk(c, m, y, k);
},
// Shading
var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
return "rgb("+ ri +","+ gi +","+ bi +")";
},
+ makeCssCmyk: function(c, m, y, k) {
+ // while waiting on CSS's cmyk()... http://www.ilkeratalay.com/colorspacesfaq.php#rgb
+ var ri = (255 * (1 - Math.min(1, c * (1 - k) + k))) | 0;
+ var gi = (255 * (1 - Math.min(1, m * (1 - k) + k))) | 0;
+ var bi = (255 * (1 - Math.min(1, y * (1 - k) + k))) | 0;
+ return "rgb("+ ri +","+ gi +","+ bi +")";
+ },
// We generally keep the canvas context set for
// nonzero-winding, and just set evenodd for the operations
// that need them.