use super::region::DEFAULT_EDGE_PADDING;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub enum OcgPolicy {
Keep,
#[default]
StripHidden,
Flatten,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub struct RedactionOptions {
pub scrub_metadata: bool,
pub remove_javascript: bool,
pub remove_embedded_files: bool,
pub optional_content: OcgPolicy,
pub edge_padding: f32,
pub default_fill: [f32; 3],
pub draw_overlay_when_no_ic: bool,
pub emit_redaction_artifacts: bool,
}
impl Default for RedactionOptions {
fn default() -> Self {
Self {
scrub_metadata: true,
remove_javascript: true,
remove_embedded_files: true,
optional_content: OcgPolicy::StripHidden,
edge_padding: DEFAULT_EDGE_PADDING,
default_fill: [0.0, 0.0, 0.0],
draw_overlay_when_no_ic: true,
emit_redaction_artifacts: false,
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize)]
#[non_exhaustive]
pub struct RedactionReport {
pub regions: usize,
pub glyphs_removed: usize,
pub images_modified: usize,
pub images_removed: usize,
pub paths_pruned: usize,
pub xobjects_specialized: usize,
pub annotations_removed: usize,
pub fonts_scrubbed: usize,
pub bytes_removed: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_options_are_safe() {
let o = RedactionOptions::default();
assert!(o.scrub_metadata);
assert!(o.remove_javascript);
assert!(o.remove_embedded_files);
assert_eq!(o.optional_content, OcgPolicy::StripHidden);
assert_eq!(o.edge_padding, DEFAULT_EDGE_PADDING);
assert_eq!(o.default_fill, [0.0, 0.0, 0.0]);
assert!(o.draw_overlay_when_no_ic);
assert!(!o.emit_redaction_artifacts);
}
#[test]
fn default_ocg_policy_strips_hidden() {
assert_eq!(OcgPolicy::default(), OcgPolicy::StripHidden);
}
#[test]
fn report_default_is_all_zero() {
let r = RedactionReport::default();
assert_eq!(r, RedactionReport::default());
assert_eq!(r.regions, 0);
assert_eq!(r.glyphs_removed, 0);
assert_eq!(r.images_modified, 0);
assert_eq!(r.images_removed, 0);
assert_eq!(r.paths_pruned, 0);
assert_eq!(r.xobjects_specialized, 0);
assert_eq!(r.annotations_removed, 0);
assert_eq!(r.fonts_scrubbed, 0);
assert_eq!(r.bytes_removed, 0);
}
#[test]
fn options_overridable_field_by_field() {
let o = RedactionOptions {
scrub_metadata: false,
optional_content: OcgPolicy::Keep,
edge_padding: 3.0,
..RedactionOptions::default()
};
assert!(!o.scrub_metadata);
assert_eq!(o.optional_content, OcgPolicy::Keep);
assert_eq!(o.edge_padding, 3.0);
assert!(o.remove_javascript);
assert!(o.draw_overlay_when_no_ic);
}
}