R8.1: document content keeps the file's colours in a dark app
Pages, cells, slides and PDF pages paint as the file says in any appearance; only the chrome around them follows dark mode. The kernel keeps Ely's one light scheme, sent once a view, and MuPDF no longer inverts. Reviews now run gpt-6.1-sol at xhigh. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
42 files changed
+204
-209
No files matched your search
@@ -257,7 +257,7 @@ fn long_clashing_field_names_still_get_a_number() {
|
||||
|
||||
/// Red pixels of a page at one pixel a point.
|
||||
fn red(worker: &mut Worker, doc: Doc, page: usize) -> usize {
|
||||
let pixels = worker.render(doc, page, (1.0, 0), [0, 0, 612, 792], false).expect("renders").bgra;
|
||||
let pixels = worker.render(doc, page, (1.0, 0), [0, 0, 612, 792]).expect("renders").bgra;
|
||||
pixels.chunks_exact(4).filter(|p| p[2] > 180 && p[1] < 80 && p[0] < 80).count()
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ fn note(page: usize, shape: Shape) -> NewAnnot {
|
||||
|
||||
/// Whether page one's pixels `at` hold colour `bgra`.
|
||||
fn has_color(worker: &mut Worker, doc: Doc, at: [i32; 4], bgra: [u8; 3]) -> bool {
|
||||
let pixels = worker.render(doc, 0, (1.0, 0), at, false).expect("draws").bgra;
|
||||
let pixels = worker.render(doc, 0, (1.0, 0), at).expect("draws").bgra;
|
||||
pixels.chunks_exact(4).any(|p| p[..3].iter().zip(bgra).all(|(a, b)| a.abs_diff(b) < 40))
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ const SCALE: f32 = 200.0 / 72.0;
|
||||
/// Page one of `doc`, saved as a gray scan.
|
||||
fn scan_of(worker: &mut Worker, doc: Doc, out: PathBuf) -> PathBuf {
|
||||
let (w, h) = ((612.0 * SCALE).ceil() as i32, (792.0 * SCALE).ceil() as i32);
|
||||
let bgra = worker.render(doc, 0, (SCALE, 0), [0, 0, w, h], false).expect("draws").bgra;
|
||||
let bgra = worker.render(doc, 0, (SCALE, 0), [0, 0, w, h]).expect("draws").bgra;
|
||||
let gray: Vec<u8> = bgra.chunks_exact(4).map(|p| ((u16::from(p[0]) + u16::from(p[1]) + u16::from(p[2])) / 3) as u8).collect();
|
||||
std::fs::write(&out, scan((612.0, 792.0), (w as u32, h as u32), &gray)).expect("writes");
|
||||
out
|
||||
@@ -49,12 +49,12 @@ fn a_scan_reads_and_its_text_layer_finds_without_drawing() {
|
||||
assert!(read.iter().any(|l| l.contains("Hello world")) && read.iter().any(|l| l.contains("Second line")), "{read:?}");
|
||||
let hello = lines.iter().find(|l| l.text.contains("Hello")).expect("hello");
|
||||
assert!((hello.rect[0] - 72.0).abs() < 6.0 && (hello.rect[3] - 76.0).abs() < 8.0, "in page points: {:?}", hello.rect);
|
||||
let before = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws").bgra;
|
||||
let before = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws").bgra;
|
||||
let mark = worker.text_layer(doc, &[(0, lines)], false).expect("lays");
|
||||
doc = worker.now(doc).expect("the state");
|
||||
assert!(words(&mut worker, doc).contains("Hello world"), "searchable now");
|
||||
assert_eq!(worker.search(doc, 0, "second line").expect("finds").len(), 1);
|
||||
assert!(worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws").bgra == before, "nothing drawn");
|
||||
assert!(worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws").bgra == before, "nothing drawn");
|
||||
worker.undo(doc, false).expect("undoes");
|
||||
doc = worker.now(doc).expect("the state");
|
||||
assert_eq!(words(&mut worker, doc), "", "one step");
|
||||
@@ -144,9 +144,9 @@ fn text_added_after_a_layer_still_shows() {
|
||||
let line = OcrLine { rect: [72.0, 60.0, 200.0, 78.0], text: "Hello world".into() };
|
||||
worker.text_layer(doc, &[(0, vec![line])], false).expect("lays");
|
||||
doc = worker.now(doc).expect("the state");
|
||||
let before = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws").bgra;
|
||||
let before = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws").bgra;
|
||||
let writing = Writing { block: None, expected: String::new(), text: "VISIBLE".into(), font: "helvetica".into(), size: 24.0, rgb: 0, bx: [72.0, 600.0, 300.0] };
|
||||
assert!(matches!(worker.put_text(doc, 0, &writing, 0.0).expect("writes"), Wrote::Done(_)));
|
||||
doc = worker.now(doc).expect("the state");
|
||||
assert!(worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws").bgra != before, "the new text is drawn");
|
||||
assert!(worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws").bgra != before, "the new text is drawn");
|
||||
}
|
||||
@@ -199,7 +199,7 @@ fn a_print_copy_shows_what_prints_to_any_screen_renderer() {
|
||||
// MuPDF draws by screen rules, as Windows' renderer does.
|
||||
let mut third = self::worker();
|
||||
let printed = third.open(&print).expect("opens").doc;
|
||||
let bgra = third.render(printed, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws").bgra;
|
||||
let bgra = third.render(printed, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws").bgra;
|
||||
let at = |x: usize, y: usize| -> [u8; 3] {
|
||||
let p = &bgra[((792 - y) * 612 + x) * 4..][..3];
|
||||
[p[2], p[1], p[0]]
|
||||
@@ -219,7 +219,7 @@ fn a_broken_picture_shows_when_drawn_or_checked() {
|
||||
std::fs::write(&path, &bytes).expect("writes");
|
||||
let (mut worker, doc) = opened(&path);
|
||||
assert_eq!(worker.repair_report(doc).expect("asks"), None, "pictures wait to be drawn");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws");
|
||||
assert!(tile.damaged, "drawing finds it");
|
||||
assert!(worker.repair_report(doc).expect("asks").is_some());
|
||||
let (mut other, again) = opened(&path);
|
||||
@@ -249,7 +249,7 @@ fn an_unembedded_font_is_no_damage() {
|
||||
let (mut worker, doc) = opened(&path);
|
||||
// Read unwatched first: its repeat is pending.
|
||||
worker.text(doc, 0).expect("reads");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws");
|
||||
assert!(!tile.damaged, "a substituted font draws whole");
|
||||
assert_eq!(worker.repair_report(doc).expect("asks"), None);
|
||||
}
|
||||
@@ -262,7 +262,7 @@ fn unreadable_content_still_draws_as_damage() {
|
||||
let path = dir.path().join("doc.pdf");
|
||||
std::fs::write(&path, one_page("", "", content, &[])).expect("writes");
|
||||
let (mut worker, doc) = opened(&path);
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws");
|
||||
assert!(tile.damaged, "{content} draws as damage");
|
||||
}
|
||||
}
|
||||
@@ -327,7 +327,7 @@ fn a_broken_picture_under_two_filters_fails_exports() {
|
||||
let (mut worker, doc) = opened(&path);
|
||||
assert!(worker.export_image(doc, 0, 72.0, &dir.path().join("page.png")).is_err(), "its page read whole");
|
||||
let (mut worker, doc) = opened(&path);
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws");
|
||||
assert!(tile.damaged, "the picture draws as damage");
|
||||
}
|
||||
|
||||
@@ -340,7 +340,7 @@ fn a_broken_picture_read_before_is_still_damage() {
|
||||
for (path, first) in files.iter().flat_map(|p| read.map(|r| (p, r))) {
|
||||
let (mut worker, doc) = opened(path);
|
||||
first(&mut worker, doc);
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792], false).expect("draws");
|
||||
let tile = worker.render(doc, 0, (1.0, 0), [0, 0, 612, 792]).expect("draws");
|
||||
assert!(tile.damaged, "the picture draws as damage");
|
||||
assert!(worker.repair_report(doc).expect("asks").is_some());
|
||||
let (mut worker, doc) = opened(path);
|
||||
|
||||
@@ -67,9 +67,9 @@ fn a_picture_under_a_region_loses_those_pixels() {
|
||||
let out = dir.path().join("out.pdf");
|
||||
worker.redact(doc, &[Region { page: 0, rect: [72.0, 242.0, 122.0, 292.0] }], &out).expect("removes");
|
||||
let (mut other, written) = reopen(&out);
|
||||
let left = other.render(written, 0, (1.0, 0), [124, 244, 46, 46], false).expect("draws").bgra;
|
||||
let left = other.render(written, 0, (1.0, 0), [124, 244, 46, 46]).expect("draws").bgra;
|
||||
assert!(left.chunks_exact(4).any(|p| p[0] > 100 || p[1] > 100 || p[2] > 100), "the right half keeps its colour");
|
||||
let gone = other.render(written, 0, (1.0, 0), [74, 244, 46, 46], false).expect("draws").bgra;
|
||||
let gone = other.render(written, 0, (1.0, 0), [74, 244, 46, 46]).expect("draws").bgra;
|
||||
assert!(gone.chunks_exact(4).all(|p| p[0] < 40 && p[1] < 40 && p[2] < 40), "the left half is black");
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ fn a_shape_touching_a_region_goes_whole() {
|
||||
let report = worker.redact(doc, &[Region { page: 0, rect: [90.0, 45.0, 180.0, 100.0] }], &out).expect("removes");
|
||||
assert_eq!(report.objects, 0);
|
||||
let (mut other, read) = reopen(&out);
|
||||
let right = other.render(read, 0, (1.0, 0), [200, 55, 90, 30], false).expect("draws").bgra;
|
||||
let right = other.render(read, 0, (1.0, 0), [200, 55, 90, 30]).expect("draws").bgra;
|
||||
assert!(right.chunks_exact(4).all(|p| p[2] < 200 || p[1] > 200), "no red left past the box");
|
||||
}
|
||||
|
||||
|
||||
@@ -36,23 +36,15 @@ fn pages_measure_render_and_read_their_text() {
|
||||
);
|
||||
// Page one's top left, twice its size: text is dark.
|
||||
let tile = worker
|
||||
.render(doc, 0, (2.0, 0), [0, 0, 600, 300], false)
|
||||
.render(doc, 0, (2.0, 0), [0, 0, 600, 300])
|
||||
.expect("renders").bgra;
|
||||
assert_eq!(tile.len(), 600 * 300 * 4);
|
||||
let dark = tile.chunks_exact(4).filter(|p| p[0] < 128).count();
|
||||
assert!(dark > 100, "text shows: {dark}");
|
||||
let night = worker
|
||||
.render(doc, 0, (2.0, 0), [0, 0, 600, 300], true)
|
||||
.expect("renders dark").bgra;
|
||||
let light = night.chunks_exact(4).filter(|p| p[0] > 128).count();
|
||||
assert!(
|
||||
light > 100 && night[0] < 64,
|
||||
"dark mode turns paper dark and text light"
|
||||
);
|
||||
// A quarter turn makes the page tall side wide.
|
||||
assert!(
|
||||
worker
|
||||
.render(doc, 1, (1.0, 90), [0, 0, 595, 842], false)
|
||||
.render(doc, 1, (1.0, 90), [0, 0, 595, 842])
|
||||
.is_ok()
|
||||
);
|
||||
let text: String = worker
|
||||
@@ -135,7 +127,7 @@ fn a_thousand_pages_show_the_first_in_time() {
|
||||
assert_eq!(worker.pages(doc).expect("counts"), 1000);
|
||||
// What the viewer asks before its first frame.
|
||||
worker.bounds(doc, 0, 100).expect("the first sizes");
|
||||
worker.render(doc, 0, (2.0, 0), [0, 0, 512, 512], false).expect("the first tile");
|
||||
worker.render(doc, 0, (2.0, 0), [0, 0, 512, 512]).expect("the first tile");
|
||||
let took = started.elapsed();
|
||||
assert!(took < std::time::Duration::from_secs(3), "PERF-05: {took:?}");
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user