121 lines
4.9 KiB
JavaScript
121 lines
4.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
/*! wmf.js (C) 2020-present SheetJS LLC -- https://sheetjs.com */
|
|
var util_1 = require("./util");
|
|
var wmf_1 = require("./wmf");
|
|
exports.css_color = function (clr) { return "#" + (clr & 0xFF).toString(16).padStart(2, "0") + ((clr >> 8) & 0xFF).toString(16).padStart(2, "0") + ((clr >> 16) & 0xFF).toString(16).padStart(2, "0"); };
|
|
exports.set_ctx_state = function (ctx, state) {
|
|
if (!state)
|
|
return;
|
|
var font = "";
|
|
if (state.Font) {
|
|
if (state.Font.Italic)
|
|
font += " italic";
|
|
if (state.Font.Weight)
|
|
font += " " + (state.Font.Weight == 700 ? "bold" : state.Font.Weight == 400 ? "" : state.Font.Weight);
|
|
if (state.Font.Height < 0)
|
|
font += " " + -state.Font.Height + "px";
|
|
else if (state.Font.Height > 0)
|
|
font += " " + state.Font.Height + "px";
|
|
var name_1 = state.Font.Name || "";
|
|
if (name_1 == "System")
|
|
name_1 = "Calibri"; // TODO: default sys font is Segoe UI
|
|
if (name_1)
|
|
font += " '" + name_1 + "', sans-serif";
|
|
ctx.font = font.trim();
|
|
}
|
|
};
|
|
// TODO: DIB BIT ORDER?
|
|
exports.render_actions_to_context = function (out, ctx) {
|
|
out.forEach(function (act) {
|
|
ctx.save();
|
|
exports.set_ctx_state(ctx, act.s);
|
|
switch (act.t) {
|
|
case "poly":
|
|
ctx.beginPath();
|
|
if (act.s.Pen.Color != null)
|
|
ctx.strokeStyle = exports.css_color(act.s.Pen.Color);
|
|
if (act.s.Pen.Width > 0)
|
|
ctx.lineWidth = act.s.Pen.Width;
|
|
if (act.s.Brush.Color != null)
|
|
ctx.fillStyle = exports.css_color(act.s.Brush.Color);
|
|
ctx.moveTo(act.p[0][0], act.p[0][1]);
|
|
act.p.slice(1).forEach(function (_a) {
|
|
var x = _a[0], y = _a[1];
|
|
ctx.lineTo(x, y);
|
|
});
|
|
if (act.g)
|
|
ctx.closePath();
|
|
if (act.s.Pen.Style != 5)
|
|
ctx.stroke();
|
|
if (act.s.Brush.Style != 1)
|
|
ctx.fill();
|
|
break;
|
|
case "text":
|
|
if (act.s && act.s.TextColor)
|
|
ctx.fillStyle = exports.css_color(act.s.TextColor);
|
|
if (act.s.Font.Angle != 0) {
|
|
ctx.translate(act.p[0], act.p[1]);
|
|
ctx.rotate(-act.s.Font.Angle * Math.PI / 180);
|
|
ctx.fillText(act.v, 0, 0);
|
|
ctx.translate(-act.p[0], -act.p[1]);
|
|
}
|
|
else
|
|
ctx.fillText(act.v, act.p[0], act.p[1]);
|
|
break;
|
|
case "cpy":
|
|
{
|
|
// TODO: base on ROP
|
|
var idata = ctx.getImageData(act.src[0][0], act.src[1][0], act.src[0][1], act.src[1][1]);
|
|
ctx.putImageData(idata, act.dst[0], act.dst[1]);
|
|
}
|
|
break;
|
|
case "str": {
|
|
if (act.data && act.data.BitCount == 24 && act.data.ImageData) {
|
|
var _o = new Uint8ClampedArray(act.data.Width * act.data.Height * 4);
|
|
for (var i = 0; i < act.data.Width * act.data.Height; ++i) {
|
|
var j = (i % act.data.Width) + act.data.Width * (act.data.Height - 1 - Math.floor(i / act.data.Width));
|
|
_o[4 * i] = act.data.ImageData[3 * j + 2];
|
|
_o[4 * i + 1] = act.data.ImageData[3 * j + 1];
|
|
_o[4 * i + 2] = act.data.ImageData[3 * j];
|
|
_o[4 * i + 3] = 255;
|
|
}
|
|
var idata = new ImageData(_o, act.data.Width, act.data.Height);
|
|
ctx.putImageData(idata, act.dst[0][0], act.dst[1][0]);
|
|
}
|
|
// TODO: ROP et al
|
|
}
|
|
}
|
|
ctx.restore();
|
|
});
|
|
};
|
|
exports.render_canvas = function (out, image) {
|
|
var ctx;
|
|
/* find first action with window info */
|
|
out.forEach(function (act) {
|
|
if (ctx)
|
|
return;
|
|
if (!act.s)
|
|
return;
|
|
if (!act.s.Extent || !act.s.Origin)
|
|
return;
|
|
image.width = act.s.Extent[0] - act.s.Origin[0];
|
|
image.height = act.s.Extent[1] - act.s.Origin[1];
|
|
ctx = image.getContext('2d');
|
|
ctx.save();
|
|
ctx.fillStyle = 'rgb(255,255,255)';
|
|
ctx.fillRect(0, 0, act.s.Extent[0] - act.s.Origin[0], act.s.Extent[1] - act.s.Origin[1]);
|
|
ctx.restore();
|
|
});
|
|
if (!ctx)
|
|
ctx = image.getContext('2d');
|
|
exports.render_actions_to_context(out, ctx);
|
|
};
|
|
exports.draw_canvas = function (data, image) {
|
|
if (data instanceof ArrayBuffer)
|
|
return exports.draw_canvas(new Uint8Array(data), image);
|
|
util_1.prep_blob(data, 0);
|
|
var out = wmf_1.get_actions_prepped_bytes(data);
|
|
return exports.render_canvas(out, image);
|
|
};
|
|
//# sourceMappingURL=canvas.js.map
|