mirror of
https://github.com/Smaug123/KaTeX
synced 2025-10-05 03:08:40 +00:00
Turn var into const or let
This commit is contained in:
committed by
Kevin Barabash
parent
9b565a6375
commit
bd9db332d2
@@ -1,27 +1,27 @@
|
||||
/* eslint no-console:0, prefer-spread:0 */
|
||||
"use strict";
|
||||
|
||||
var childProcess = require("child_process");
|
||||
var fs = require("fs");
|
||||
var http = require("http");
|
||||
var jspngopt = require("jspngopt");
|
||||
var net = require("net");
|
||||
var os = require("os");
|
||||
var pako = require("pako");
|
||||
var path = require("path");
|
||||
var selenium = require("selenium-webdriver");
|
||||
var firefox = require("selenium-webdriver/firefox");
|
||||
const childProcess = require("child_process");
|
||||
const fs = require("fs");
|
||||
const http = require("http");
|
||||
const jspngopt = require("jspngopt");
|
||||
const net = require("net");
|
||||
const os = require("os");
|
||||
const pako = require("pako");
|
||||
const path = require("path");
|
||||
const selenium = require("selenium-webdriver");
|
||||
const firefox = require("selenium-webdriver/firefox");
|
||||
|
||||
var app = require("../../server");
|
||||
var data = require("../../test/screenshotter/ss_data");
|
||||
const app = require("../../server");
|
||||
const data = require("../../test/screenshotter/ss_data");
|
||||
|
||||
var dstDir = path.normalize(
|
||||
const dstDir = path.normalize(
|
||||
path.join(__dirname, "..", "..", "test", "screenshotter", "images"));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Process command line arguments
|
||||
|
||||
var opts = require("nomnom")
|
||||
const opts = require("nomnom")
|
||||
.option("browser", {
|
||||
abbr: "b",
|
||||
"default": "firefox",
|
||||
@@ -74,25 +74,25 @@ var opts = require("nomnom")
|
||||
})
|
||||
.parse();
|
||||
|
||||
var listOfCases;
|
||||
let listOfCases;
|
||||
if (opts.include) {
|
||||
listOfCases = opts.include.split(",");
|
||||
} else {
|
||||
listOfCases = Object.keys(data);
|
||||
}
|
||||
if (opts.exclude) {
|
||||
var exclude = opts.exclude.split(",");
|
||||
const exclude = opts.exclude.split(",");
|
||||
listOfCases = listOfCases.filter(function(key) {
|
||||
return exclude.indexOf(key) === -1;
|
||||
});
|
||||
}
|
||||
|
||||
var seleniumURL = opts.seleniumURL;
|
||||
var seleniumIP = opts.seleniumIP;
|
||||
var seleniumPort = opts.seleniumPort;
|
||||
var katexURL = opts.katexURL;
|
||||
var katexIP = opts.katexIP;
|
||||
var katexPort = opts.katexPort;
|
||||
let seleniumURL = opts.seleniumURL;
|
||||
let seleniumIP = opts.seleniumIP;
|
||||
let seleniumPort = opts.seleniumPort;
|
||||
let katexURL = opts.katexURL;
|
||||
let katexIP = opts.katexIP;
|
||||
let katexPort = opts.katexPort;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Work out connection to selenium docker container
|
||||
@@ -107,15 +107,15 @@ function check(err) {
|
||||
}
|
||||
|
||||
function cmd() {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
var cmd = args.shift();
|
||||
const args = Array.prototype.slice.call(arguments);
|
||||
const cmd = args.shift();
|
||||
return childProcess.execFileSync(
|
||||
cmd, args, { encoding: "utf-8" }).replace(/\n$/, "");
|
||||
}
|
||||
|
||||
function guessDockerIPs() {
|
||||
if (process.env.DOCKER_MACHINE_NAME) {
|
||||
var machine = process.env.DOCKER_MACHINE_NAME;
|
||||
const machine = process.env.DOCKER_MACHINE_NAME;
|
||||
seleniumIP = seleniumIP || cmd("docker-machine", "ip", machine);
|
||||
katexIP = katexIP || cmd("docker-machine", "ssh", machine,
|
||||
"echo ${SSH_CONNECTION%% *}");
|
||||
@@ -124,7 +124,7 @@ function guessDockerIPs() {
|
||||
try {
|
||||
// When using boot2docker, seleniumIP and katexIP are distinct.
|
||||
seleniumIP = seleniumIP || cmd("boot2docker", "ip");
|
||||
var config = cmd("boot2docker", "config");
|
||||
let config = cmd("boot2docker", "config");
|
||||
config = (/^HostIP = "(.*)"$/m).exec(config);
|
||||
if (!config) {
|
||||
console.error("Failed to find HostIP");
|
||||
@@ -142,7 +142,7 @@ function guessDockerIPs() {
|
||||
return;
|
||||
}
|
||||
// Native Docker on Linux or remote Docker daemon or similar
|
||||
var gatewayIP = cmd("docker", "inspect",
|
||||
const gatewayIP = cmd("docker", "inspect",
|
||||
"-f", "{{.NetworkSettings.Gateway}}", opts.container);
|
||||
seleniumIP = seleniumIP || gatewayIP;
|
||||
katexIP = katexIP || gatewayIP;
|
||||
@@ -165,22 +165,22 @@ if (seleniumURL) {
|
||||
}
|
||||
|
||||
process.nextTick(startServer);
|
||||
var attempts = 0;
|
||||
let attempts = 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Start up development server
|
||||
|
||||
var devServer = null;
|
||||
var minPort = 32768;
|
||||
var maxPort = 61000;
|
||||
let devServer = null;
|
||||
const minPort = 32768;
|
||||
const maxPort = 61000;
|
||||
|
||||
function startServer() {
|
||||
if (katexURL || katexPort) {
|
||||
process.nextTick(tryConnect);
|
||||
return;
|
||||
}
|
||||
var port = Math.floor(Math.random() * (maxPort - minPort)) + minPort;
|
||||
var server = http.createServer(app).listen(port);
|
||||
const port = Math.floor(Math.random() * (maxPort - minPort)) + minPort;
|
||||
const server = http.createServer(app).listen(port);
|
||||
server.once("listening", function() {
|
||||
devServer = server;
|
||||
katexPort = port;
|
||||
@@ -206,7 +206,7 @@ function tryConnect() {
|
||||
process.nextTick(buildDriver);
|
||||
return;
|
||||
}
|
||||
var sock = net.connect({
|
||||
const sock = net.connect({
|
||||
host: seleniumIP,
|
||||
port: +seleniumPort,
|
||||
});
|
||||
@@ -225,21 +225,21 @@ function tryConnect() {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Build the web driver
|
||||
|
||||
var driver;
|
||||
let driver;
|
||||
function buildDriver() {
|
||||
var builder = new selenium.Builder().forBrowser(opts.browser);
|
||||
var ffProfile = new firefox.Profile();
|
||||
const builder = new selenium.Builder().forBrowser(opts.browser);
|
||||
const ffProfile = new firefox.Profile();
|
||||
ffProfile.setPreference(
|
||||
"browser.startup.homepage_override.mstone", "ignore");
|
||||
ffProfile.setPreference("browser.startup.page", 0);
|
||||
var ffOptions = new firefox.Options().setProfile(ffProfile);
|
||||
const ffOptions = new firefox.Options().setProfile(ffProfile);
|
||||
builder.setFirefoxOptions(ffOptions);
|
||||
if (seleniumURL) {
|
||||
builder.usingServer(seleniumURL);
|
||||
}
|
||||
driver = builder.build();
|
||||
driver.manage().timeouts().setScriptTimeout(3000).then(function() {
|
||||
var html = '<!DOCTYPE html>' +
|
||||
let html = '<!DOCTYPE html>' +
|
||||
'<html><head><style type="text/css">html,body{' +
|
||||
'width:100%;height:100%;margin:0;padding:0;overflow:hidden;' +
|
||||
'}</style></head><body><p>Test</p></body></html>';
|
||||
@@ -253,15 +253,15 @@ function buildDriver() {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Set the screen size
|
||||
|
||||
var targetW = 1024;
|
||||
var targetH = 768;
|
||||
const targetW = 1024;
|
||||
const targetH = 768;
|
||||
function setSize(reqW, reqH) {
|
||||
return driver.manage().window().setSize(reqW, reqH).then(function() {
|
||||
return driver.takeScreenshot();
|
||||
}).then(function(img) {
|
||||
img = imageDimensions(img);
|
||||
var actualW = img.width;
|
||||
var actualH = img.height;
|
||||
const actualW = img.width;
|
||||
const actualH = img.height;
|
||||
if (actualW === targetW && actualH === targetH) {
|
||||
findHostIP();
|
||||
return;
|
||||
@@ -274,7 +274,7 @@ function setSize(reqW, reqH) {
|
||||
}
|
||||
|
||||
function imageDimensions(img) {
|
||||
var buf = new Buffer(img, "base64");
|
||||
const buf = new Buffer(img, "base64");
|
||||
return {
|
||||
buf: buf,
|
||||
width: buf.readUInt32BE(16),
|
||||
@@ -312,13 +312,13 @@ function findHostIP() {
|
||||
});
|
||||
|
||||
// Next, enumerate all network addresses
|
||||
var ips = [];
|
||||
var devs = os.networkInterfaces();
|
||||
for (var dev in devs) {
|
||||
const ips = [];
|
||||
const devs = os.networkInterfaces();
|
||||
for (const dev in devs) {
|
||||
if (devs.hasOwnProperty(dev)) {
|
||||
var addrs = devs[dev];
|
||||
for (var i = 0; i < addrs.length; ++i) {
|
||||
var addr = addrs[i].address;
|
||||
const addrs = devs[dev];
|
||||
for (let i = 0; i < addrs.length; ++i) {
|
||||
let addr = addrs[i].address;
|
||||
if (/:/.test(addr)) {
|
||||
addr = "[" + addr + "]";
|
||||
}
|
||||
@@ -329,7 +329,7 @@ function findHostIP() {
|
||||
console.log("Looking for host IP among " + ips.join(", "));
|
||||
|
||||
// Load a data: URI document which attempts to contact each of these IPs
|
||||
var html = "<!doctype html>\n<html><body>\n";
|
||||
let html = "<!doctype html>\n<html><body>\n";
|
||||
html += ips.map(function(ip) {
|
||||
return '<script src="http://' + ip + ':' + katexPort +
|
||||
'/ss-connect.js?ip=' + encodeURIComponent(ip) +
|
||||
@@ -343,17 +343,17 @@ function findHostIP() {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Take the screenshots
|
||||
|
||||
var countdown = listOfCases.length;
|
||||
let countdown = listOfCases.length;
|
||||
|
||||
var exitStatus = 0;
|
||||
var listOfFailed = [];
|
||||
let exitStatus = 0;
|
||||
const listOfFailed = [];
|
||||
|
||||
function takeScreenshots() {
|
||||
listOfCases.forEach(takeScreenshot);
|
||||
}
|
||||
|
||||
function takeScreenshot(key) {
|
||||
var itm = data[key];
|
||||
const itm = data[key];
|
||||
if (!itm) {
|
||||
console.error("Test case " + key + " not known!");
|
||||
listOfFailed.push(key);
|
||||
@@ -364,14 +364,14 @@ function takeScreenshot(key) {
|
||||
return;
|
||||
}
|
||||
|
||||
var file = path.join(dstDir, key + "-" + opts.browser + ".png");
|
||||
var retry = 0;
|
||||
var loadExpected = null;
|
||||
let file = path.join(dstDir, key + "-" + opts.browser + ".png");
|
||||
let retry = 0;
|
||||
let loadExpected = null;
|
||||
if (opts.verify) {
|
||||
loadExpected = promisify(fs.readFile, file);
|
||||
}
|
||||
|
||||
var url = katexURL + "test/screenshotter/test.html?" + itm.query;
|
||||
const url = katexURL + "test/screenshotter/test.html?" + itm.query;
|
||||
driver.get(url);
|
||||
if (opts.wait) {
|
||||
browserSideWait(1000 * opts.wait);
|
||||
@@ -398,10 +398,10 @@ function takeScreenshot(key) {
|
||||
loadExpected = promisify(fs.readFile, file);
|
||||
}
|
||||
}
|
||||
var opt = new jspngopt.Optimizer({
|
||||
const opt = new jspngopt.Optimizer({
|
||||
pako: pako,
|
||||
});
|
||||
var buf = opt.bufferSync(img.buf);
|
||||
const buf = opt.bufferSync(img.buf);
|
||||
if (loadExpected) {
|
||||
return loadExpected.then(function(expected) {
|
||||
if (!buf.equals(expected)) {
|
||||
@@ -451,8 +451,8 @@ function browserSideWait(milliseconds) {
|
||||
// Second and later arguments are passed to the function named in the
|
||||
// first argument, and a callback is added as last argument.
|
||||
function promisify(f) {
|
||||
var args = Array.prototype.slice.call(arguments, 1);
|
||||
var deferred = new selenium.promise.Deferred();
|
||||
const args = Array.prototype.slice.call(arguments, 1);
|
||||
const deferred = new selenium.promise.Deferred();
|
||||
args.push(function(err, val) {
|
||||
if (err) {
|
||||
deferred.reject(err);
|
||||
|
@@ -2,22 +2,22 @@
|
||||
/* eslint-disable no-console */
|
||||
"use strict";
|
||||
|
||||
var childProcess = require("child_process");
|
||||
var fs = require("fs");
|
||||
var path = require("path");
|
||||
var Q = require("q"); // To debug, pass Q_DEBUG=1 in the environment
|
||||
var pngparse = require("pngparse");
|
||||
var fft = require("ndarray-fft");
|
||||
var ndarray = require("ndarray-fft/node_modules/ndarray");
|
||||
const childProcess = require("child_process");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const Q = require("q"); // To debug, pass Q_DEBUG=1 in the environment
|
||||
const pngparse = require("pngparse");
|
||||
const fft = require("ndarray-fft");
|
||||
const ndarray = require("ndarray-fft/node_modules/ndarray");
|
||||
|
||||
var data = require("../../test/screenshotter/ss_data");
|
||||
const data = require("../../test/screenshotter/ss_data");
|
||||
|
||||
// Adapt node functions to Q promises
|
||||
var readFile = Q.denodeify(fs.readFile);
|
||||
var writeFile = Q.denodeify(fs.writeFile);
|
||||
var mkdir = Q.denodeify(fs.mkdir);
|
||||
const readFile = Q.denodeify(fs.readFile);
|
||||
const writeFile = Q.denodeify(fs.writeFile);
|
||||
const mkdir = Q.denodeify(fs.mkdir);
|
||||
|
||||
var todo;
|
||||
let todo;
|
||||
if (process.argv.length > 2) {
|
||||
todo = process.argv.slice(2);
|
||||
} else {
|
||||
@@ -27,23 +27,23 @@ if (process.argv.length > 2) {
|
||||
}
|
||||
|
||||
// Dimensions used when we do the FFT-based alignment computation
|
||||
var alignWidth = 2048; // should be at least twice the width resp. height
|
||||
var alignHeight = 2048; // of the screenshots, and a power of two.
|
||||
const alignWidth = 2048; // should be at least twice the width resp. height
|
||||
const alignHeight = 2048; // of the screenshots, and a power of two.
|
||||
|
||||
// Compute required resolution to match test.html. 16px default font,
|
||||
// scaled to 4em in test.html, and to 1.21em in katex.css. Corresponding
|
||||
// LaTeX font size is 10pt. There are 72.27pt per inch.
|
||||
var pxPerEm = 16 * 4 * 1.21;
|
||||
var pxPerPt = pxPerEm / 10;
|
||||
var dpi = pxPerPt * 72.27;
|
||||
const pxPerEm = 16 * 4 * 1.21;
|
||||
const pxPerPt = pxPerEm / 10;
|
||||
const dpi = pxPerPt * 72.27;
|
||||
|
||||
var tmpDir = "/tmp/texcmp";
|
||||
var ssDir = path.normalize(
|
||||
const tmpDir = "/tmp/texcmp";
|
||||
const ssDir = path.normalize(
|
||||
path.join(__dirname, "..", "..", "test", "screenshotter"));
|
||||
var imagesDir = path.join(ssDir, "images");
|
||||
var teximgDir = path.join(ssDir, "tex");
|
||||
var diffDir = path.join(ssDir, "diff");
|
||||
var template;
|
||||
const imagesDir = path.join(ssDir, "images");
|
||||
const teximgDir = path.join(ssDir, "tex");
|
||||
const diffDir = path.join(ssDir, "diff");
|
||||
let template;
|
||||
|
||||
Q.all([
|
||||
readFile(path.join(ssDir, "test.tex"), "utf-8"),
|
||||
@@ -58,8 +58,8 @@ Q.all([
|
||||
|
||||
// Process a single test case: rasterize, then create diff
|
||||
function processTestCase(key) {
|
||||
var itm = data[key];
|
||||
var tex = "$" + itm.tex + "$";
|
||||
const itm = data[key];
|
||||
let tex = "$" + itm.tex + "$";
|
||||
if (itm.display) {
|
||||
tex = "\\[" + itm.tex + "\\]";
|
||||
}
|
||||
@@ -70,14 +70,14 @@ function processTestCase(key) {
|
||||
tex = tex + itm.post.replace("<br>", "\\\\");
|
||||
}
|
||||
tex = template.replace(/\$.*\$/, tex.replace(/\$/g, "$$$$"));
|
||||
var texFile = path.join(tmpDir, key + ".tex");
|
||||
var pdfFile = path.join(tmpDir, key + ".pdf");
|
||||
var pngFile = path.join(teximgDir, key + "-pdflatex.png");
|
||||
var browserFile = path.join(imagesDir, key + "-firefox.png");
|
||||
var diffFile = path.join(diffDir, key + ".png");
|
||||
const texFile = path.join(tmpDir, key + ".tex");
|
||||
const pdfFile = path.join(tmpDir, key + ".pdf");
|
||||
const pngFile = path.join(teximgDir, key + "-pdflatex.png");
|
||||
const browserFile = path.join(imagesDir, key + "-firefox.png");
|
||||
const diffFile = path.join(diffDir, key + ".png");
|
||||
|
||||
// Step 1: write key.tex file
|
||||
var fftLatex = writeFile(texFile, tex).then(function() {
|
||||
const fftLatex = writeFile(texFile, tex).then(function() {
|
||||
// Step 2: call "pdflatex key" to create key.pdf
|
||||
return execFile("pdflatex", [
|
||||
"-interaction", "nonstopmode", key,
|
||||
@@ -95,24 +95,24 @@ function processTestCase(key) {
|
||||
return readPNG(pngFile).then(fftImage);
|
||||
});
|
||||
// Step 5: apply FFT to reference image as well
|
||||
var fftBrowser = readPNG(browserFile).then(fftImage);
|
||||
const fftBrowser = readPNG(browserFile).then(fftImage);
|
||||
|
||||
return Q.all([fftBrowser, fftLatex]).spread(function(browser, latex) {
|
||||
// Now we have the FFT result from both
|
||||
// Step 6: find alignment which maximizes overlap.
|
||||
// This uses a FFT-based correlation computation.
|
||||
var x;
|
||||
var y;
|
||||
var real = createMatrix();
|
||||
var imag = createMatrix();
|
||||
let x;
|
||||
let y;
|
||||
const real = createMatrix();
|
||||
const imag = createMatrix();
|
||||
|
||||
// Step 6a: (real + i*imag) = latex * conjugate(browser)
|
||||
for (y = 0; y < alignHeight; ++y) {
|
||||
for (x = 0; x < alignWidth; ++x) {
|
||||
var br = browser.real.get(y, x);
|
||||
var bi = browser.imag.get(y, x);
|
||||
var lr = latex.real.get(y, x);
|
||||
var li = latex.imag.get(y, x);
|
||||
const br = browser.real.get(y, x);
|
||||
const bi = browser.imag.get(y, x);
|
||||
const lr = latex.real.get(y, x);
|
||||
const li = latex.imag.get(y, x);
|
||||
real.set(y, x, br * lr + bi * li);
|
||||
imag.set(y, x, br * li - bi * lr);
|
||||
}
|
||||
@@ -122,14 +122,14 @@ function processTestCase(key) {
|
||||
fft(-1, real, imag);
|
||||
|
||||
// Step 6c: find position where the (squared) absolute value is maximal
|
||||
var offsetX = 0;
|
||||
var offsetY = 0;
|
||||
var maxSquaredNorm = -1; // any result is greater than initial value
|
||||
let offsetX = 0;
|
||||
let offsetY = 0;
|
||||
let maxSquaredNorm = -1; // any result is greater than initial value
|
||||
for (y = 0; y < alignHeight; ++y) {
|
||||
for (x = 0; x < alignWidth; ++x) {
|
||||
var or = real.get(y, x);
|
||||
var oi = imag.get(y, x);
|
||||
var squaredNorm = or * or + oi * oi;
|
||||
const or = real.get(y, x);
|
||||
const oi = imag.get(y, x);
|
||||
const squaredNorm = or * or + oi * oi;
|
||||
if (maxSquaredNorm < squaredNorm) {
|
||||
maxSquaredNorm = squaredNorm;
|
||||
offsetX = x;
|
||||
@@ -148,12 +148,12 @@ function processTestCase(key) {
|
||||
console.log("Positioned " + key + ": " + offsetX + ", " + offsetY);
|
||||
|
||||
// Step 7: use these offsets to compute difference illustration
|
||||
var bx = Math.max(offsetX, 0); // browser left padding
|
||||
var by = Math.max(offsetY, 0); // browser top padding
|
||||
var lx = Math.max(-offsetX, 0); // latex left padding
|
||||
var ly = Math.max(-offsetY, 0); // latex top padding
|
||||
var uw = Math.max(browser.width + bx, latex.width + lx); // union width
|
||||
var uh = Math.max(browser.height + by, latex.height + ly); // u. height
|
||||
const bx = Math.max(offsetX, 0); // browser left padding
|
||||
const by = Math.max(offsetY, 0); // browser top padding
|
||||
const lx = Math.max(-offsetX, 0); // latex left padding
|
||||
const ly = Math.max(-offsetY, 0); // latex top padding
|
||||
const uw = Math.max(browser.width + bx, latex.width + lx); // union w.
|
||||
const uh = Math.max(browser.height + by, latex.height + ly); // u. h.
|
||||
return execFile("convert", [
|
||||
// First image: latex rendering, converted to grayscale and padded
|
||||
"(", pngFile, "-grayscale", "Rec709Luminance",
|
||||
@@ -187,7 +187,7 @@ function ensureDir(dir) {
|
||||
// Execute a given command, and return a promise to its output.
|
||||
// Don't denodeify here, since fail branch needs access to stderr.
|
||||
function execFile(cmd, args, opts) {
|
||||
var deferred = Q.defer();
|
||||
const deferred = Q.defer();
|
||||
childProcess.execFile(cmd, args, opts, function(err, stdout, stderr) {
|
||||
if (err) {
|
||||
console.error("Error executing " + cmd + " " + args.join(" "));
|
||||
@@ -204,9 +204,9 @@ function execFile(cmd, args, opts) {
|
||||
|
||||
// Read given file and parse it as a PNG file.
|
||||
function readPNG(file) {
|
||||
var deferred = Q.defer();
|
||||
var onerror = deferred.reject.bind(deferred);
|
||||
var stream = fs.createReadStream(file);
|
||||
const deferred = Q.defer();
|
||||
const onerror = deferred.reject.bind(deferred);
|
||||
const stream = fs.createReadStream(file);
|
||||
stream.on("error", onerror);
|
||||
pngparse.parseStream(stream, function(err, image) {
|
||||
if (err) {
|
||||
@@ -221,20 +221,19 @@ function readPNG(file) {
|
||||
|
||||
// Take a parsed image data structure and apply FFT transformation to it
|
||||
function fftImage(image) {
|
||||
var real = createMatrix();
|
||||
var imag = createMatrix();
|
||||
var idx = 0;
|
||||
var nchan = image.channels;
|
||||
var alphachan = 1 - (nchan % 2);
|
||||
var colorchan = nchan - alphachan;
|
||||
for (var y = 0; y < image.height; ++y) {
|
||||
for (var x = 0; x < image.width; ++x) {
|
||||
var c;
|
||||
var v = 0;
|
||||
for (c = 0; c < colorchan; ++c) {
|
||||
const real = createMatrix();
|
||||
const imag = createMatrix();
|
||||
let idx = 0;
|
||||
const nchan = image.channels;
|
||||
const alphachan = 1 - (nchan % 2);
|
||||
const colorchan = nchan - alphachan;
|
||||
for (let y = 0; y < image.height; ++y) {
|
||||
for (let x = 0; x < image.width; ++x) {
|
||||
let v = 0;
|
||||
for (let c = 0; c < colorchan; ++c) {
|
||||
v += 255 - image.data[idx++];
|
||||
}
|
||||
for (c = 0; c < alphachan; ++c) {
|
||||
for (let c = 0; c < alphachan; ++c) {
|
||||
v += image.data[idx++];
|
||||
}
|
||||
real.set(y, x, v);
|
||||
@@ -251,6 +250,6 @@ function fftImage(image) {
|
||||
|
||||
// Create a new matrix of preconfigured dimensions, initialized to zero
|
||||
function createMatrix() {
|
||||
var array = new Float64Array(alignWidth * alignHeight);
|
||||
const array = new Float64Array(alignWidth * alignHeight);
|
||||
return new ndarray(array, [alignWidth, alignHeight]);
|
||||
}
|
||||
|
Reference in New Issue
Block a user