Additional Manuals

Acer XZ271U
Acer KG251Q (240 Hz)
Dell S2419HGF/S2719DGF
Samsung C*JG5*
Samsung C*HG70
ViewSonic XG240R
master
Glenwing 5 years ago
parent b0521b94b5
commit 721c8fc329

@ -1,7 +1,9 @@
function SI(value, unit, options_input) {
DEBUG('Input:', value, unit, options_input);
if (isNaN(parseInt(value))) { return value; }
if (typeof(options_input) === 'number' || typeof(options_input) === 'string') { options_input = {p: options_input.toString()}; }
if (typeof(options_input) === 'number' || typeof(options_input) === 'string') {
options_input = {p: options_input.toString()};
}
Default_Options = [
['mode', 'f'],
['p', '2'],
@ -20,6 +22,9 @@ function SI(value, unit, options_input) {
['big_kilo', false],
['no_mu', false],
]
if (typeof(options_input) === 'undefined') {
options_input = Default_Options;
}
for (var i = 0; i < Default_Options.length; i++) {
if (!(Default_Options[i][0] in options_input)) {
//DEBUG('SI option "' + Default_Options[i][0] + '" defaulted to:', Default_Options[i][1])
@ -246,14 +251,14 @@ function SI(value, unit, options_input) {
}
}
if (SI_options['output'] == 'single') {
var final_output = (out_value + '&nbsp;' + out_prefix + unit);
var final_output = (out_value + options_input['separator'] + out_prefix + unit);
DEBUG('Single Output');
return final_output
}
else if (SI_options['output'] == 'split') {
var final_output = {
'full': out_value + '&nbsp;' + out_prefix + unit,
'f': out_value + '&nbsp;' + out_prefix + unit,
'full': out_value + options_input['separator'] + out_prefix + unit,
'f': out_value + options_input['separator'] + out_prefix + unit,
'value': out_value,
'val': out_value,
'v': out_value,

@ -29,24 +29,24 @@ DMT_List = {};
// The intepreted current state of all input fields is stored here
Global_InputVars = {
'HRES': '', // Int
'VRES': '', // Int
'FREQ': '', // Float
'COLOR_DEPTH': '',
'PIXEL_FORMAT': '',
'COMP': '',
'SCAN': '',
'MARGINS': '',
'TIMING_STD': '',
'V_FP': '',
'V_BP': '',
'V_SW': '',
'H_FP': '',
'H_BP': '',
'H_SW': '',
'V_FP_INT': '',
'V_BP_INT': '',
'V_SW_INT': '',
'HRES': '', // int
'VRES': '', // int
'FREQ': '', // float
'COLOR_DEPTH': '', // int, in bits per pixel
'PIXEL_FORMAT': '', // float: 1.0 for RGB/YCbCr 4:4;4, 1.5 for YCbCr 4:2:2, 2.0 for YCbCr 2.0
'COMP': '', // float (compression ratio)
'SCAN': '', // int; 1 for progressive, 2 for interlaced
'MARGINS': '', // float; margin %
'TIMING_STD': '', // string
'V_FP': '', // int
'V_BP': '', // int
'V_SW': '', // int
'H_FP': '', // int
'H_BP': '', // int
'H_SW': '', // int
'V_FP_INT': '', // int
'V_BP_INT': '', // int
'V_SW_INT': '', // int
}
Detailed_Results = {
@ -715,7 +715,10 @@ function calcMain() {
}
//DEBUG('Results:', SI(results['bits_per_sec_eff'], 'bit/s', 2), results);
generateLaTeX();
updateDisplay();
return;
}
@ -823,7 +826,7 @@ function getTiming(timing_standard) {
else if (timing_standard == 'CTA-861') {
Timing = CTA();
if (!Timing) {
DEBUG ('Not a CTA Format. CTA Function returned false.');
DEBUG ('Not a CTA Format. CTA Function returned false. Vars:', Global_InputVars);
$('#TIMING_FORMAT_NAME').html('Not a CTA format');
clearTiming();
return false; }
@ -942,8 +945,8 @@ function CVT_R(R) { // Variable R is an integer representing the reduced blankin
var H_SW; // Horizontal sync width
var H_BP; // Horizontal back porch
var V_BLANK; // Total vertical blanking (V_FP + V_SW + V_BP)
var H_BLANK; // Total horizontal blanking (H_FP + H_SW + H_BP)
var V_BLANK; // Total vertical blanking inteval size, in pixels (V_FP + V_SW + V_BP)
var H_BLANK; // Total horizontal blanking interval size, in pixels (H_FP + H_SW + H_BP)
var V_EFF; // V + V_Blank + V_Margins
var H_EFF; // H + H_Blank + H_Margins
@ -951,7 +954,7 @@ function CVT_R(R) { // Variable R is an integer representing the reduced blankin
var F_HOR; // Horizontal refresh frequency
// Common constants
var V_PER_MIN = 0.00046; /* Minimum vertical blanking period for reduced blank timing (in seconds), defined by VESA CVT 1.2 standard */
var V_PER_MIN = 0.00046; // Minimum vertical blanking period for reduced blank timing (in seconds), defined by VESA CVT 1.2 standard
var V_LINES = Math.floor(V / S) // If progressive scan, S = 1 and V_LINES = V. If interlaced, V_LINES = floor(V / 2).
if (R == 1) {
@ -963,7 +966,7 @@ function CVT_R(R) { // Variable R is an integer representing the reduced blankin
V_FP = 3;
var V_BP_MIN = 6;
// All H timings are defined, as well as V_FP. Only V_SW and V_BP remain (and V_BLANK, the sum of all 3 V parameters)
// All H timings are pre-defined by the standard, as well as V_FP. Only V_SW and V_BP remain (and V_BLANK, the sum of all 3 V parameters)
// Determine vertical sync width (V_SW) from table of magic numbers defined in VESA CVT standard
var V_SYNC_TABLE = [
@ -992,7 +995,7 @@ function CVT_R(R) { // Variable R is an integer representing the reduced blankin
var V_MARGIN = Math.floor(M / 100) * V_LINES; // If margins percent (M) is 0, this result is 0
var H_MARGIN = Math.floor(H_RND * M / 100 / G) * G; // If margins percent (M) is 0, this result is 0
var H_PER_EST = ((1 / F) - V_PER_MIN) / (V_LINES + (2 * V_MARGIN)); // Horizontal blanking period estimate
var H_PER_EST = ((1 / F) - V_PER_MIN) / (V_LINES + (2 * V_MARGIN)); // Horizontal refresh period estimate
V_BLANK = Math.floor((V_PER_MIN / H_PER_EST) + 1);
var V_BLANK_MIN = V_FP + V_SW + V_BP_MIN;
@ -1217,11 +1220,21 @@ function CTA() {
DEBUG('Input:', H, V, F, S);
if (( H == 720 && V == 480 && F <= 60 && S == 'i')
|| (H == 720 && V == 576 && F <= 50 && S == 'i')
|| (H == 720 && (V == 240 || V == 288) && F <= 60)
) {
Global_InputVars['HRES'] = 2 * H;
H = 2 * H;
DEBUG('Horizontal width H changed to', H);
}
var CTA_H;
var CTA_V;
var CTA_F;
var CTA_S;
for (var i = 0; i < CTA861.length; i++) {
CTA_H = parseFloat(CTA861[i]['H']);
CTA_V = parseFloat(CTA861[i]['V']);
@ -1231,7 +1244,7 @@ function CTA() {
DEBUG('Parsing: VIC', CTA861[i]['VIC'], '|', CTA_H, (H == CTA_H), '|', CTA_V, (V == CTA_V), '|' , (CTA_F).toFixed(3), (Math.abs(F - CTA_F) < 0.01), '|', CTA_S, (S == CTA_S));
//DEBUG( (V == CTA_V), (Math.abs(F - CTA_F) < 0.01), (S == CTA_S))
if ((H == CTA_H) && (V == CTA_V) && (Math.abs(F - CTA_F) < 0.01) && (S == CTA_S)) {
if ((H == CTA_H) && (V == CTA_V) && (Math.abs(F - CTA_F) < (0.001 * F)) && (S == CTA_S)) {
DEBUG('Match Found');
// Special modifications to values based on whether interlacing is selected or not
@ -1265,6 +1278,8 @@ function CTA() {
}
// Not found in CTA list
return false;
}
@ -1651,11 +1666,65 @@ function LoadDMT(){
}
//Small functions
// LaTeX
function MathCommas(num) {
var parts = num.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, "\\:");
return parts.join(".");
}
function generateLaTeX() {
DEBUG('Generating LaTeX...');
var result;
var H = Global_InputVars['HRES'];
var H_FP = Global_InputVars['H_FP'];
var H_SW = Global_InputVars['H_SW'];
var H_BP = Global_InputVars['H_BP'];
var V = Global_InputVars['VRES'];
var V_FP = Global_InputVars['V_FP'];
var V_SW = Global_InputVars['V_SW'];
var V_BP = Global_InputVars['V_BP'];
var F = Global_InputVars['FREQ'];
var F_ACTUAL = Global_InputVars['F_ACTUAL'];
var CD = Global_InputVars['COLOR DEPTH'];
// Total Pixels
result = SI(H * V, 'px', {'output': 'split'});
DEBUG('Total pixels SI result:', result);
$('#Math_TotalPixels').html(
'$$' + MathCommas(H) + '\\times' + MathCommas(V) + '= \\boxed{\\vphantom{^0_0}\\,' + MathCommas(H * V) + '~\\mathrm{px}\\ (' + result['v'] + '~\\mathrm{' + result['u'] + '}' + ')\\,}' + '$$'
);
// Total Pixels with Blanking
result = SI((H + H_FP + H_SW + H_BP) * (V + V_FP + V_SW + V_BP), 'px', {'output':'split'});
DEBUG('Pixels with blanking SI result:', result);
$('#Math_EffectiveTotalPixels').html(
'$$' + 'H_{\\rm blank} = H_{\\rm front~porch} + H_{\\rm sync~width} + H_{\\rm back~porch} = {\\rm' +
MathCommas(H_FP) + '~px +' + MathCommas(H_SW) + '~px +' + MathCommas(H_BP) + '~px} = \\box{\\rm' + MathCommas(H_FP + H_SW + H_BP) + '~px } \\\\' +
'V_{\\rm blank} = V_{\\rm front~porch} + V_{\\rm sync~width} + V_{\\rm back~porch} = {\\rm' +
MathCommas(V_FP) + '~px +' + MathCommas(V_SW) + '~px +' + MathCommas(V_BP) + '~px} = \\box{\\rm' + MathCommas(V_FP + V_SW + V_BP) + '~px } \\\\' + '$$'
+ '$$' + '(H + H_{\\rm blank}) \\times (V + V_{\\rm blank}) = \\rm (' + MathCommas(H) + '+' + MathCommas(H_FP + H_SW + H_BP) + ') \\times (' + MathCommas(V) + '+' + MathCommas(V_FP + V_SW + V_BP) + ')' +
'= \\boxed{\\vphantom{^0_0}\\,' + MathCommas(result['o']) + '~\\mathrm{' + result['b'] + '}\\ (' + result['v'] + '~\\mathrm{' + result['u'] + '}) \\,}' + '$$'
);
MathJax.Hub.Typeset();
}
// Small functions
{
function Commas(num) {
function Commas(num, commaChar) {
if (commaChar === undefined) {
commaChar = ',';
}
var parts = num.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, commaChar);
return parts.join(".");
}
@ -1904,13 +1973,13 @@ function parseNum(val) {
function parseNum(val) {
// This function is designed to interpret strings with formatted numbers (which may contain currencies, digit grouping commas, units, etc.)
// This function is designed to interpret strings with formatted numbers (which may contain currency symbols, digit grouping commas, units of measurement, etc.)
// It will return NaN if it cannot be interpreted as a valid number (i.e. no numeric characters, multiple periods or minus signs, etc.)
if (typeof(val) === 'number') {
// If the input argument is already a number, then nothing needs to be done, simply return the input value
if (Number.isNaN(val) == true) {
// However, we do need to check that it isn't NaN, because that is identified as a number.
// However, we do need to check that it isn't NaN, because NaN is identified as a 'number' type.
return NaN;
}
else {
@ -1919,10 +1988,12 @@ function parseNum(val) {
}
else if (typeof val === 'string') {
// If the input argument is a string, then the parsing process begins
// Empty string is interpreted as 0
if (val == '') { return 0; }
// First, remove all non-numeric characters on the outsides of the string
// First, remove all non-numeric characters on the outsides of the string (with exceptions for minus signs or other numerically-meaningful characters)
for (var i = 0; i < val.length; i++) {
// Loop through each character starting from the front
if (!(i < val.length)) { break; }
@ -1935,7 +2006,7 @@ function parseNum(val) {
continue;
}
else if ((/[-]/g).test(val[i]) == true) {
// If character is a negative sign, continue searching without deleting it. This is because there may still be non-number characters between the negative sign and the first digit, such as "-$1.00". The negative sign should stay but the dollar needs to be removed.
// If character is a minus sign, continue searching without deleting it. The search continues because there may still be non-number characters between the negative sign and the first digit, such as "-$1.00". The negative sign should stay but the dollar needs to be removed.
continue;
}
else if ((/[.]/g).test(val[i]) == true) {

@ -9,7 +9,12 @@
<script>
MathJax.Hub.Config({
jax: ["input/TeX", "output/HTML-CSS"],
displayAlign: "left"
displayAlign: "left",
TeX: {
Macros: {
box: ['\\boxed{\\vphantom{^0_0}\\hphantom{\\,} #1 \\hphantom{\\,}}', 1],
},
},
});
WebFont.load({
google: { families: ['Inconsolata'] }
@ -416,22 +421,32 @@
<tr id="calculations_body" style="display:table-row;">
<td colspan="3" class="body" style="vertical-align:top;">
<div style="overflow-x:auto; white-space:nowrap;">
$$\texttt{Pixels per frame:}$$
<div style="padding-left:20px;">$$\texttt{4,096} \times \texttt{2,560 lines} = \texttt{10,485,760 px (10.5 Mpx)}$$</div>
$$\texttt{Pixels per second:}$$
<div style="padding-left:20px;">$$10\,485\,760\;\mathtt{px/frame} \times 120\;\mathtt{frame/s} = 1\,258\,291\,200\;\mathtt{px/s}\;(1.26\;\mathtt{Gpx/s})$$</div>
$$\texttt{Bits per second:}$$
<div style="padding-left:20px;">$$1\,258\,291\,200\;\mathtt{px/s} \times 30\;\mathtt{bit/px} = 37\,748\,736\,000\;\mathtt{bit/s}\;(37.7\;\mathtt{Gbit/s})$$</div>
$$\textrm{Active pixels per frame:}$$
<div class='equation' id='Math_TotalPixels'>
$$\mathtt{4\:096 \times 2\:560~pixels = 10\:485\:760~px \ (10.5~Mpx)}$$
</div>
$$\textrm{Effective pixels per frame:}$$
<div class='equation' id='Math_EffectiveTotalPixels'>
$$\mathtt{4\:096 \times 2\:560~pixels = 10\:485\:760~px \ (10.5~Mpx)}$$
</div>
$$\textrm{Pixels per second:}$$
<div class='equation' id='Math_PixelRate'>
$$10\,485\,760\;\mathtt{px/frame} \times 120\;\mathtt{frame/s} = 1\,258\,291\,200\;\mathtt{px/s}\;(1.26\;\mathtt{Gpx/s})$$
</div>
$$\textrm{Bits per second:}$$
<div class='equation' id='Math_BitRate'>
$$1\,258\,291\,200\;\mathtt{px/s} \times 30\;\mathtt{bit/px} = 37\,748\,736\,000\;\mathtt{bit/s}\;(37.7\;\mathtt{Gbit/s})$$
</div>
<br /><hr /><br />
$$\texttt{Timing Formula:}$$
<div style="padding-left:20px;">
$$\textrm{Timing Formula:}$$
<div class='equation'>
$$\texttt{Constants:}$$
$$\texttt{H = 4,096 px}$$
$$\texttt{V = 2,560 px}$$
$$\texttt{F = 120 Hz}$$
</div>
$$\texttt{Formula:}$$
<div style="padding-left:20px;">$$\texttt{V}_{\texttt{blank}} \texttt{ = } {{\texttt{V × V}_{\texttt{min}}} \over {{\texttt{1} \over \texttt{F}} - \texttt{V}_{\texttt{min}}}}$$</div>
<div class='equation'>$$\texttt{V}_{\texttt{blank}} \texttt{ = } {{\texttt{V × V}_{\texttt{min}}} \over {{\texttt{1} \over \texttt{F}} - \texttt{V}_{\texttt{min}}}}$$</div>
</div>
<div style="padding-left:20px; max-width:100%;">The timing parameters used for these calculations are defined by the <a>CTA-861</a> standard. The definitions for this format are listed under Video Identification Code (VIC) #98, first defined in <a style="white-space:nowrap;">CTA-861-F</a> (formerly CEA-861-F).</div>
</td>

@ -461,4 +461,10 @@ div.trow {
div.tcell {
display:table-cell;
}
/* LaTeX */
div.equation {
padding-left: 32px;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save