mirror of
https://github.com/CKegel/Web-SSTV.git
synced 2025-06-06 11:35:47 +00:00
Rename vertResolution
to pixelsPerLine
.
previously the number of pixels encoded in each scan line was represented as the `vertResolution`. This is a typo, and is better referred to as `pixelsPerLine`.
This commit is contained in:
parent
627e3301dc
commit
38a673b30a
82
encode.js
82
encode.js
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2024 Christian Kegel
|
Copyright (c) 2025 Christian Kegel
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -30,16 +30,16 @@ const VIS_BIT_FREQ = {
|
|||||||
class Format {
|
class Format {
|
||||||
|
|
||||||
#numScanLines;
|
#numScanLines;
|
||||||
#vertResolution;
|
#pixelsPerLine;
|
||||||
#blankingInterval;
|
#blankingInterval;
|
||||||
#scanLineLength;
|
#scanLineLength;
|
||||||
#syncPulseLength;
|
#syncPulseLength;
|
||||||
#VISCode;
|
#VISCode;
|
||||||
#preparedImage = [];
|
#preparedImage = [];
|
||||||
|
|
||||||
constructor(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode) {
|
constructor(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode) {
|
||||||
this.#numScanLines = numScanLines;
|
this.#numScanLines = numScanLines;
|
||||||
this.#vertResolution = vertResolution;
|
this.#pixelsPerLine = pixelsPerLine;
|
||||||
this.#blankingInterval = blankingInterval;
|
this.#blankingInterval = blankingInterval;
|
||||||
this.#scanLineLength = scanLineLength;
|
this.#scanLineLength = scanLineLength;
|
||||||
this.#syncPulseLength = syncPulseLength;
|
this.#syncPulseLength = syncPulseLength;
|
||||||
@ -47,13 +47,13 @@ class Format {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getGreyscaleFreq(data, scanLine, vertPos) {
|
getGreyscaleFreq(data, scanLine, vertPos) {
|
||||||
const index = scanLine * (this.#vertResolution * 4) + vertPos * 4;
|
const index = scanLine * (this.#pixelsPerLine * 4) + vertPos * 4;
|
||||||
let grey = data[index] * 0.299 + 0.587 * data[index + 1] + 0.114 * data[index + 2]
|
let grey = data[index] * 0.299 + 0.587 * data[index + 1] + 0.114 * data[index + 2]
|
||||||
return grey * COLOR_FREQ_MULT + 1500
|
return grey * COLOR_FREQ_MULT + 1500
|
||||||
}
|
}
|
||||||
|
|
||||||
getRGBValueAsFreq(data, scanLine, vertPos) {
|
getRGBValueAsFreq(data, scanLine, vertPos) {
|
||||||
const index = scanLine * (this.#vertResolution * 4) + vertPos * 4;
|
const index = scanLine * (this.#pixelsPerLine * 4) + vertPos * 4;
|
||||||
let red = data[index] * COLOR_FREQ_MULT + 1500;
|
let red = data[index] * COLOR_FREQ_MULT + 1500;
|
||||||
let green = data[index + 1] * COLOR_FREQ_MULT + 1500;
|
let green = data[index + 1] * COLOR_FREQ_MULT + 1500;
|
||||||
let blue = data[index + 2] * COLOR_FREQ_MULT + 1500;
|
let blue = data[index + 2] * COLOR_FREQ_MULT + 1500;
|
||||||
@ -61,7 +61,7 @@ class Format {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getYRYBYValueAsFreq(data, scanLine, vertPos) {
|
getYRYBYValueAsFreq(data, scanLine, vertPos) {
|
||||||
const index = scanLine * (this.#vertResolution * 4) + vertPos * 4;
|
const index = scanLine * (this.#pixelsPerLine * 4) + vertPos * 4;
|
||||||
let red = data[index];
|
let red = data[index];
|
||||||
let green = data[index + 1];
|
let green = data[index + 1];
|
||||||
let blue = data[index + 2];
|
let blue = data[index + 2];
|
||||||
@ -149,8 +149,8 @@ class Format {
|
|||||||
get numScanLines() {
|
get numScanLines() {
|
||||||
return this.#numScanLines;
|
return this.#numScanLines;
|
||||||
}
|
}
|
||||||
get vertResolution() {
|
get pixelsPerLine() {
|
||||||
return this.#vertResolution;
|
return this.#pixelsPerLine;
|
||||||
}
|
}
|
||||||
get blankingInterval() {
|
get blankingInterval() {
|
||||||
return this.#blankingInterval;
|
return this.#blankingInterval;
|
||||||
@ -177,7 +177,7 @@ class MartinBase extends Format {
|
|||||||
let red = [];
|
let red = [];
|
||||||
let green = [];
|
let green = [];
|
||||||
let blue = [];
|
let blue = [];
|
||||||
for(let vertPos = 0; vertPos < this.vertResolution; ++vertPos){
|
for(let vertPos = 0; vertPos < this.pixelsPerLine; ++vertPos){
|
||||||
let freqs = this.getRGBValueAsFreq(data, scanLine, vertPos);
|
let freqs = this.getRGBValueAsFreq(data, scanLine, vertPos);
|
||||||
red.push(freqs[0]);
|
red.push(freqs[0]);
|
||||||
green.push(freqs[1]);
|
green.push(freqs[1]);
|
||||||
@ -217,25 +217,25 @@ class MartinBase extends Format {
|
|||||||
class MartinMOne extends MartinBase {
|
class MartinMOne extends MartinBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.000572;
|
let blankingInterval = 0.000572;
|
||||||
let scanLineLength = 0.146432;
|
let scanLineLength = 0.146432;
|
||||||
let syncPulseLength = 0.004862;
|
let syncPulseLength = 0.004862;
|
||||||
let VISCode = [false, true, false, true, true, false, false];
|
let VISCode = [false, true, false, true, true, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class MartinMTwo extends MartinBase {
|
class MartinMTwo extends MartinBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.000572;
|
let blankingInterval = 0.000572;
|
||||||
let scanLineLength = 0.073216;
|
let scanLineLength = 0.073216;
|
||||||
let syncPulseLength = 0.004862;
|
let syncPulseLength = 0.004862;
|
||||||
let VISCode = [false, true, false, true, false, false, false];
|
let VISCode = [false, true, false, true, false, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ class ScottieBase extends Format {
|
|||||||
let red = [];
|
let red = [];
|
||||||
let green = [];
|
let green = [];
|
||||||
let blue = [];
|
let blue = [];
|
||||||
for(let vertPos = 0; vertPos < this.vertResolution; ++vertPos){
|
for(let vertPos = 0; vertPos < this.pixelsPerLine; ++vertPos){
|
||||||
let freqs = this.getRGBValueAsFreq(data, scanLine, vertPos);
|
let freqs = this.getRGBValueAsFreq(data, scanLine, vertPos);
|
||||||
red.push(freqs[0]);
|
red.push(freqs[0]);
|
||||||
green.push(freqs[1]);
|
green.push(freqs[1]);
|
||||||
@ -290,37 +290,37 @@ class ScottieBase extends Format {
|
|||||||
class ScottieOne extends ScottieBase {
|
class ScottieOne extends ScottieBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.0015;
|
let blankingInterval = 0.0015;
|
||||||
let scanLineLength = 0.138240;
|
let scanLineLength = 0.138240;
|
||||||
let syncPulseLength = 0.009;
|
let syncPulseLength = 0.009;
|
||||||
let VISCode = [false, true, true, true, true, false, false];
|
let VISCode = [false, true, true, true, true, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class ScottieTwo extends ScottieBase {
|
class ScottieTwo extends ScottieBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.0015;
|
let blankingInterval = 0.0015;
|
||||||
let scanLineLength = 0.088064;
|
let scanLineLength = 0.088064;
|
||||||
let syncPulseLength = 0.009;
|
let syncPulseLength = 0.009;
|
||||||
let VISCode = [false, true, true, true, false, false, false];
|
let VISCode = [false, true, true, true, false, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class ScottieDX extends ScottieBase {
|
class ScottieDX extends ScottieBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.0015;
|
let blankingInterval = 0.0015;
|
||||||
let scanLineLength = 0.3456;
|
let scanLineLength = 0.3456;
|
||||||
let syncPulseLength = 0.009;
|
let syncPulseLength = 0.009;
|
||||||
let VISCode = [true, false, false, true, true, false, false];
|
let VISCode = [true, false, false, true, true, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ class PDBase extends Format {
|
|||||||
let Y = [];
|
let Y = [];
|
||||||
let RY = [];
|
let RY = [];
|
||||||
let BY = [];
|
let BY = [];
|
||||||
for(let vertPos = 0; vertPos < this.vertResolution; ++vertPos){
|
for(let vertPos = 0; vertPos < this.pixelsPerLine; ++vertPos){
|
||||||
let freqs = this.getYRYBYValueAsFreq(data, scanLine, vertPos);
|
let freqs = this.getYRYBYValueAsFreq(data, scanLine, vertPos);
|
||||||
Y.push(freqs[0]);
|
Y.push(freqs[0]);
|
||||||
RY.push(freqs[1]);
|
RY.push(freqs[1]);
|
||||||
@ -340,7 +340,7 @@ class PDBase extends Format {
|
|||||||
preparedImage.push([Y, RY, BY]);
|
preparedImage.push([Y, RY, BY]);
|
||||||
}
|
}
|
||||||
for(let scanLine = 0; scanLine < this.numScanLines; scanLine += 2){
|
for(let scanLine = 0; scanLine < this.numScanLines; scanLine += 2){
|
||||||
for(let vertPos = 0; vertPos < this.vertResolution; ++vertPos){
|
for(let vertPos = 0; vertPos < this.pixelsPerLine; ++vertPos){
|
||||||
let RY = preparedImage[scanLine][1][vertPos] + preparedImage[scanLine + 1][1][vertPos]
|
let RY = preparedImage[scanLine][1][vertPos] + preparedImage[scanLine + 1][1][vertPos]
|
||||||
preparedImage[scanLine][1][vertPos] = RY / 2;
|
preparedImage[scanLine][1][vertPos] = RY / 2;
|
||||||
let BY = preparedImage[scanLine][2][vertPos] + preparedImage[scanLine + 1][2][vertPos]
|
let BY = preparedImage[scanLine][2][vertPos] + preparedImage[scanLine + 1][2][vertPos]
|
||||||
@ -382,85 +382,85 @@ class PDBase extends Format {
|
|||||||
class PD50 extends PDBase {
|
class PD50 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.091520;
|
let scanLineLength = 0.091520;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, false, true, true, true, false, true];
|
let VISCode = [true, false, true, true, true, false, true];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class PD90 extends PDBase {
|
class PD90 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.170240;
|
let scanLineLength = 0.170240;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, true, false, false, false, true, true];
|
let VISCode = [true, true, false, false, false, true, true];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class PD120 extends PDBase {
|
class PD120 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 496;
|
let numScanLines = 496;
|
||||||
let vertResolution = 640;
|
let pixelsPerLine = 640;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.121600;
|
let scanLineLength = 0.121600;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, false, true, true, true, true, true];
|
let VISCode = [true, false, true, true, true, true, true];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class PD160 extends PDBase {
|
class PD160 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 400;
|
let numScanLines = 400;
|
||||||
let vertResolution = 512;
|
let pixelsPerLine = 512;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.195584;
|
let scanLineLength = 0.195584;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, true, false, false, true, false, false];
|
let VISCode = [true, true, false, false, true, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class PD180 extends PDBase {
|
class PD180 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 496;
|
let numScanLines = 496;
|
||||||
let vertResolution = 640;
|
let pixelsPerLine = 640;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.18304;
|
let scanLineLength = 0.18304;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, true, false, false, false, false, false];
|
let VISCode = [true, true, false, false, false, false, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class PD240 extends PDBase {
|
class PD240 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 496;
|
let numScanLines = 496;
|
||||||
let vertResolution = 640;
|
let pixelsPerLine = 640;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.24448;
|
let scanLineLength = 0.24448;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, true, false, false, false, false, true];
|
let VISCode = [true, true, false, false, false, false, true];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class PD290 extends PDBase {
|
class PD290 extends PDBase {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 616;
|
let numScanLines = 616;
|
||||||
let vertResolution = 800;
|
let pixelsPerLine = 800;
|
||||||
let blankingInterval = 0.00208;
|
let blankingInterval = 0.00208;
|
||||||
let scanLineLength = 0.2288;
|
let scanLineLength = 0.2288;
|
||||||
let syncPulseLength = 0.02;
|
let syncPulseLength = 0.02;
|
||||||
let VISCode = [true, false, true, true, true, true, false];
|
let VISCode = [true, false, true, true, true, true, false];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,7 +471,7 @@ class WrasseSC2 extends Format {
|
|||||||
let red = [];
|
let red = [];
|
||||||
let green = [];
|
let green = [];
|
||||||
let blue = [];
|
let blue = [];
|
||||||
for(let vertPos = 0; vertPos < this.vertResolution; ++vertPos){
|
for(let vertPos = 0; vertPos < this.pixelsPerLine; ++vertPos){
|
||||||
let freqs = this.getRGBValueAsFreq(data, scanLine, vertPos);
|
let freqs = this.getRGBValueAsFreq(data, scanLine, vertPos);
|
||||||
red.push(freqs[0]);
|
red.push(freqs[0]);
|
||||||
green.push(freqs[1]);
|
green.push(freqs[1]);
|
||||||
@ -510,13 +510,13 @@ class WrasseSC2 extends Format {
|
|||||||
class WrasseSC2180 extends WrasseSC2 {
|
class WrasseSC2180 extends WrasseSC2 {
|
||||||
constructor() {
|
constructor() {
|
||||||
let numScanLines = 256;
|
let numScanLines = 256;
|
||||||
let vertResolution = 320;
|
let pixelsPerLine = 320;
|
||||||
let blankingInterval = 0.0005;
|
let blankingInterval = 0.0005;
|
||||||
let scanLineLength = 0.235;
|
let scanLineLength = 0.235;
|
||||||
let syncPulseLength = 0.0055225;
|
let syncPulseLength = 0.0055225;
|
||||||
let VISCode = [false, true, true, false, true, true, true];
|
let VISCode = [false, true, true, false, true, true, true];
|
||||||
|
|
||||||
super(numScanLines, vertResolution, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
super(numScanLines, pixelsPerLine, blankingInterval, scanLineLength, syncPulseLength, VISCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,7 +539,7 @@ let rawImage = new Image();
|
|||||||
let sstvFormat = new Format();
|
let sstvFormat = new Format();
|
||||||
|
|
||||||
function drawPreview() {
|
function drawPreview() {
|
||||||
canvas.width = sstvFormat.vertResolution;
|
canvas.width = sstvFormat.pixelsPerLine;
|
||||||
canvas.height = sstvFormat.numScanLines;
|
canvas.height = sstvFormat.numScanLines;
|
||||||
canvasCtx.drawImage(rawImage,0,0, canvas.width, canvas.height);
|
canvasCtx.drawImage(rawImage,0,0, canvas.width, canvas.height);
|
||||||
canvasCtx.font = "bold 24pt sans-serif";
|
canvasCtx.font = "bold 24pt sans-serif";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user