fix: eliminate diagonal dither pattern from display driver
Root cause: Panel_ED2208's epd_quality mode applies _dither_row_rgb_pair (diagonal bias pattern with dither=140) during _exec_transfer(). Since our ImagePipeline already does proper Floyd-Steinberg dithering, the driver's additional dithering was creating visible diagonal artifacts. Fix: setEpdMode(epd_fastest) selects _dither_row_none (clean nearest-color lookup, no spatial bias). On Panel_ED2208 this only affects the dither function — NOT refresh quality or waveform. Also: default dither_noise setting to OFF since error scatter was targeting the wrong layer (it made gradient areas fuzzier without fixing the real problem in the display driver). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
23
data/app.js
23
data/app.js
@@ -87,7 +87,8 @@ async function renderAlbums(el) {
|
||||
async function renderSlideshow(el) {
|
||||
const settings = await api('/api/settings');
|
||||
const intervals = [1, 5, 15, 30, 60];
|
||||
const modes = ['Random', 'Chronological', 'Reverse Chrono', 'Favorites Weighted'];
|
||||
const modes = ['Random', 'Chronological', 'Reverse Chrono', 'Favorites Weighted',
|
||||
'Weighted Recent', 'Weighted Oldest'];
|
||||
el.innerHTML = `
|
||||
<div class="card">
|
||||
<h2>Interval</h2>
|
||||
@@ -131,6 +132,16 @@ async function renderDisplay(el) {
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h2>Image Processing</h2>
|
||||
<div class="field">
|
||||
<select id="pipelineMode">
|
||||
<option value="0" ${settings.pipeline_mode===0?'selected':''}>Dynamic (vivid colors)</option>
|
||||
<option value="1" ${settings.pipeline_mode===1?'selected':''}>Balanced (preserve tones)</option>
|
||||
<option value="2" ${settings.pipeline_mode===2?'selected':''}>None (no processing)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h2>Metadata Overlay</h2>
|
||||
<ul class="checkbox-list">
|
||||
@@ -163,16 +174,24 @@ async function renderDisplay(el) {
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h2>Battery Indicator</h2>
|
||||
<ul class="checkbox-list">
|
||||
<li><input type="checkbox" id="showBattery" ${settings.show_battery?'checked':''}><span>Show battery level on display</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn-group"><button class="btn btn-primary" id="saveDisplay">Save</button></div>`;
|
||||
document.getElementById('saveDisplay').onclick = async () => {
|
||||
let flags = 0;
|
||||
el.querySelectorAll('[data-flag]').forEach(cb => { if (cb.checked) flags |= parseInt(cb.dataset.flag); });
|
||||
await api('/api/settings', { method: 'POST', body: JSON.stringify({
|
||||
img_quality: parseInt(document.getElementById('imgQuality').value),
|
||||
pipeline_mode: parseInt(document.getElementById('pipelineMode').value),
|
||||
meta_flags: flags,
|
||||
meta_pos: parseInt(document.getElementById('metaPos').value),
|
||||
date_fmt: document.getElementById('dateFmt').value,
|
||||
time_fmt: document.getElementById('timeFmt').value
|
||||
time_fmt: document.getElementById('timeFmt').value,
|
||||
show_battery: document.getElementById('showBattery').checked ? 1 : 0
|
||||
})});
|
||||
toast('Display settings saved');
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user