1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
[]
= "ggsql"
= true
= true
= true
= true
= true
= true
= true
= true
[]
= "ggsql"
= "lib.rs"
[]
# Parsing
= true
= { = true }
= true
# Color interpolation
= true
# Arrow (core data container)
= { = true }
# Readers
= { = true, = true }
= { = true, = true }
= { = true, = true }
= { = true, = true }
= { = true, = true }
= { = true }
# ADBC reader
= { = "0.23", = true }
# Spatial
= { = true, = true, = ["with-wkb", "with-wkt", "with-geojson"] }
# Backend for the renderer-backed writers (non-default; gated, excluded from the
# MSRV 1.86 build). The GPU rasteriser is *not* requested here: it arrives with
# the `raster` feature, so a build wanting only vector output pulls no wgpu.
= { = "0.4.1", = true, = false, = ["geom-wkb", "geom-wkt"] }
# WOFF / WOFF2 decoding for `fonts::register_font`, behind `webfonts`. Pure
# Rust and no build script; `brotli` here is `brotli-decompressor`, the
# decode-only half, so the gate costs a decompressor and nothing else.
= { = "0.2", = true, = false, = ["brotli", "z"] }
# Serialization
= true
= true
# Error handling
= true
# Utilities
= true
= true
= true
= "0.4"
= true
= true
# Named only to reach one feature parley does not re-export. `fontconfig-dlopen`
# makes fontique load `libfontconfig.so.1` at runtime instead of asking
# pkg-config for it at build time, so building any renderer-backed writer needs
# only the runtime library and not the `-dev` package — which is what keeps
# `cargo install ggsql-cli` working on a bare box now that `svg`, `pdf` and
# `hep` are default. Cargo unions features, so this applies to the `fontique`
# parley resolves; Linux-only because that is the only target with fontconfig.
[]
= { = "0.9", = true, = false, = ["fontconfig-dlopen"] }
[]
= { = "0.44", = false, = ["resolve-file"] }
= "3.8"
= "3"
= "0.23"
= "0.23"
[]
= ["adbc", "duckdb", "sqlite", "vegalite", "parquet", "builtin-data", "odbc", "spatial", "svg", "pdf", "hep"]
= ["dep:duckdb"]
= ["dep:parquet"]
= ["dep:rusqlite"]
= ["dep:adbc_core"]
= ["dep:toml_edit", "dep:libloading"]
= ["dep:geozero", "rusqlite?/load_extension"]
= []
# Internal, enabled by the writer features below rather than named directly.
# `graphics` is the shared plot-composition layer; `raster` adds the GPU
# rasteriser on top of it. Splitting them is what lets a vector-only build skip
# wgpu, vello_hybrid and pollster entirely — hephaestus gates only its GPU
# backends behind that feature, not the plot layer.
= ["dep:hephaestus", "dep:fontique"]
# The GPU rasteriser. `vello-hybrid` rather than vello classic: it computes
# coverage on the CPU and hands the GPU a plain render pipeline. Its GPU buffers
# are sized to the scene's actual content rather than to fixed caps, so there is
# no draw-count ceiling to budget against on a dense plot.
#
# It transitively enables `hephaestus/png`, so a build wanting only, say, webp
# still compiles the PNG codec. A few kB, and not worth working around.
= ["graphics", "hephaestus/vello-hybrid"]
# On when at least one writer reads pixels back. Distinct from `raster`, which
# only says the GPU rasteriser is available — the plot viewer needs that and
# presents its frames straight to a window, never through a buffer.
= ["raster"]
# One feature per output format, each pulling in exactly one codec. The knob
# each writer exposes is the axis its format actually has — png trades encode
# time for size, jpeg trades quality for size, tiff picks a compressor, and
# webp is lossless with no rate control at all — so they share no setting they
# would each have to reinterpret.
= ["raster-writer", "hephaestus/png"]
= ["raster-writer", "hephaestus/jpeg"]
= ["raster-writer", "hephaestus/tiff"]
= ["raster-writer", "hephaestus/webp"]
# The vector writers need only `graphics`: they record the composition's own
# drawing commands rather than rasterising them, so they pull in no wgpu, need
# no GPU adapter at render time, and compile on the MSRV toolchain.
= ["graphics", "hephaestus/svg"]
= ["graphics", "hephaestus/pdf"]
# The plot-document writer. Named after the format, which ggsql does not own —
# see `src/writer/hephaestus/CLAUDE.md` on why that is accurate rather than a
# leak. `hep-read` is test-only: it is what lets the round trip be asserted.
= ["graphics", "hephaestus/document-write"]
= ["hep", "hephaestus/document-read"]
# The plot viewer, which is not a writer: it shows a window and returns nothing.
# Needs `raster` because a window is presented by the GPU rasteriser.
= ["raster", "hephaestus/window"]
# Accept the font containers a CDN serves a browser — WOFF and WOFF2 — in
# `fonts::register_font`, unwrapping them to the sfnt inside before the shaper
# sees it. Off by default: a host reading fonts off a filesystem has sfnt
# already, and this is the one place the decompressor is worth its bytes.
= ["graphics", "dep:wuff"]
= []
= ["duckdb", "sqlite", "odbc"]
= ["vegalite", "png", "jpeg", "tiff", "webp", "svg", "pdf", "hep"]