Skip to main content

map2fig/plot/
hammer.rs

1use super::mollweide::{
2    _plot_mollweide_pdf_impl, _plot_mollweide_png_impl_projected, ProjectionType,
3};
4use crate::params::HammerParams;
5use crate::params::MollweideParams;
6use std::path::Path;
7
8fn render_hammer_pixels(
9    params: crate::params::RenderMollweideParams,
10    layout: crate::layout::MollweideLayout,
11    sink: &mut dyn crate::PixelSink,
12    debug_overlay: Option<super::DebugOverlay>,
13) {
14    use crate::hammer::HammerProjection;
15    use crate::render::raster::RasterGrid;
16    let proj = HammerProjection::new();
17
18    let mut grid = RasterGrid::new(layout.map_w as u32, layout.map_h as u32);
19
20    if let Some(overlay) = debug_overlay
21        && overlay.show_background
22    {
23        super::fill_grid_background(&mut grid);
24    }
25
26    super::render_projection_to_grid(
27        crate::params::RenderGridParams {
28            map: params.map,
29            proj: &proj,
30            scale: params.scale,
31            cmap: params.cmap,
32            scale_type: params.scale_type,
33            neg_mode: params.neg_mode,
34            gamma: params.gamma,
35            bad_color: params.bad_color,
36            meta: params.meta,
37            hist_scale: params.hist_scale,
38            view: params.view,
39            mask: params.mask,
40            scale_cache: params.scale_cache,
41        },
42        &mut grid,
43    );
44
45    // Draw debug overlay only if provided
46    if let Some(overlay) = debug_overlay {
47        super::draw_debug_overlay_raster(&mut grid, overlay);
48    }
49
50    super::blit_grid_to_sink(&grid, sink, 0, 0);
51}
52
53/// Plot a Hammer projection map as PNG.
54pub fn plot_hammer_png(params: HammerParams) {
55    let mollweide_params = MollweideParams {
56        plot: params.plot,
57        scale: params.scale,
58        color: params.color,
59        display: params.display,
60        graticule: params.graticule,
61        meta: params.meta,
62        view: params.view,
63    };
64    _plot_mollweide_png_impl_projected(
65        mollweide_params,
66        render_hammer_pixels,
67        ProjectionType::Hammer,
68    );
69}
70
71/// Plot a Hammer projection map as PDF.
72pub fn plot_hammer_pdf(params: HammerParams) {
73    let mollweide_params = MollweideParams {
74        plot: params.plot,
75        scale: params.scale,
76        color: params.color,
77        display: params.display,
78        graticule: params.graticule,
79        meta: params.meta,
80        view: params.view,
81    };
82    _plot_mollweide_pdf_impl(mollweide_params, render_hammer_pixels);
83}
84
85/// Automatically choose PNG or PDF based on file extension for Hammer projection.
86pub fn plot_hammer_auto(params: HammerParams) {
87    let ext = Path::new(params.plot.filename.as_str())
88        .extension()
89        .and_then(|s| s.to_str())
90        .map(|s| s.to_lowercase())
91        .unwrap_or_default();
92
93    match ext.as_str() {
94        "png" => plot_hammer_png(params),
95        "pdf" => plot_hammer_pdf(params),
96        _ => {
97            panic!(
98                "Unsupported output format: .{} (expected .png or .pdf)",
99                ext
100            );
101        }
102    }
103}