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:
2026-08-03 19:52:22 -04:00
parent fd7643db6a
commit 065d80ca89
20 changed files with 1100 additions and 138 deletions

View File

@@ -138,6 +138,51 @@ std::vector<String> ImmichClient::fetchRandomAssetIds(int count) {
return ids;
}
std::vector<RandomAsset> ImmichClient::fetchRandomAssets(int count) {
std::vector<RandomAsset> assets;
String url = buildUrl("/api/search/random");
JsonDocument reqDoc;
reqDoc["size"] = count;
reqDoc["type"] = "IMAGE";
String body;
serializeJson(reqDoc, body);
String response = httpPost(url, body);
if (response.isEmpty()) return assets;
JsonDocument doc;
DeserializationError err = deserializeJson(doc, response);
if (err) return assets;
JsonArray arr = doc.as<JsonArray>();
int skippedRaw = 0;
for (JsonObject asset : arr) {
String id = asset["id"].as<String>();
if (id.length() == 0) continue;
String filename = asset["originalFileName"] | "";
filename.toLowerCase();
if (filename.endsWith(".dng") || filename.endsWith(".raw") ||
filename.endsWith(".cr2") || filename.endsWith(".cr3") ||
filename.endsWith(".nef") || filename.endsWith(".arw") ||
filename.endsWith(".orf") || filename.endsWith(".rw2") ||
filename.endsWith(".raf") || filename.endsWith(".srw")) {
skippedRaw++;
continue;
}
RandomAsset ra;
ra.id = id;
ra.dateTime = asset["localDateTime"] | "";
assets.push_back(ra);
}
Serial.printf("[immich] Fetched %d random assets with dates (skipped %d RAW)\n",
assets.size(), skippedRaw);
return assets;
}
std::vector<String> ImmichClient::fetchFavoriteAssetIds() {
std::vector<String> ids;
String url = buildUrl("/api/assets?isFavorite=true");