Skip to content

Commit 3db2bb3

Browse files
committed
Reduce panic branches in vp_create_node
1 parent d80380d commit 3db2bb3

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

benches/bench.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ fn remap_ord(b: &mut Bencher) {
2323
let mut liq = Attributes::new();
2424
liq.set_speed(10).unwrap();
2525
let mut img = liq.new_image(img.buffer, img.width, img.height, 0.).unwrap();
26+
liq.set_max_colors(256).unwrap();
2627
let mut res = liq.quantize(&mut img).unwrap();
2728
res.set_dithering_level(0.).unwrap();
2829
b.iter(move || {

src/nearest.rs

+18-10
Original file line numberDiff line numberDiff line change
@@ -109,22 +109,27 @@ fn vp_create_node(indexes: &mut [MapIndex], items: &PalF) -> Node {
109109
debug_assert!(!indexes.is_empty());
110110
let palette = items.as_slice();
111111

112-
if indexes.len() == 1 {
112+
if indexes.len() <= 1 {
113+
let idx = indexes.first().map(|i| i.idx).unwrap_or_default();
113114
return Node {
114-
vantage_point: palette[usize::from(indexes[0].idx)],
115-
idx: indexes[0].idx,
115+
vantage_point: palette.get(usize::from(idx)).copied().unwrap_or_default(),
116+
idx,
116117
inner: NodeInner::Leaf { len: 0, idxs: [0; LEAF_MAX_SIZE], colors: Box::new([f_pixel::default(); LEAF_MAX_SIZE]) },
117118
};
118119
}
119120

120121
let most_popular_item = indexes.iter().enumerate().max_by_key(move |(_, idx)| {
121-
OrdFloat::new(items.pop_as_slice()[usize::from(idx.idx)].popularity())
122+
OrdFloat::new(items.pop_as_slice().get(usize::from(idx.idx))
123+
.map(|p| p.popularity()).unwrap_or_default())
122124
}).map(|(n, _)| n).unwrap_or_default();
123125
indexes.swap(most_popular_item, 0);
124126
let (ref_, indexes) = indexes.split_first_mut().unwrap();
125127

126-
let vantage_point = palette[usize::from(ref_.idx)];
127-
indexes.sort_by_cached_key(move |i| OrdFloat::new(vantage_point.diff(&palette[usize::from(i.idx)])));
128+
let vantage_point = palette.get(usize::from(ref_.idx)).copied().unwrap_or_default();
129+
indexes.sort_by_cached_key(move |i| {
130+
OrdFloat::new(palette.get(usize::from(i.idx))
131+
.map(|px| vantage_point.diff(px)).unwrap_or_default())
132+
});
128133

129134
let num_indexes = indexes.len();
130135

@@ -133,8 +138,10 @@ fn vp_create_node(indexes: &mut [MapIndex], items: &PalF) -> Node {
133138
let mut idxs = [Default::default(); LEAF_MAX_SIZE];
134139

135140
indexes.iter().zip(colors.iter_mut().zip(idxs.iter_mut())).for_each(|(i, (color, idx))| {
136-
*idx = i.idx;
137-
*color = palette[usize::from(i.idx)];
141+
if let Some(c) = palette.get(usize::from(i.idx)) {
142+
*idx = i.idx;
143+
*color = *c;
144+
}
138145
});
139146
NodeInner::Leaf {
140147
len: num_indexes as _,
@@ -146,7 +153,8 @@ fn vp_create_node(indexes: &mut [MapIndex], items: &PalF) -> Node {
146153
let (near, far) = indexes.split_at_mut(half_index);
147154
debug_assert!(!near.is_empty());
148155
debug_assert!(!far.is_empty());
149-
let radius_squared = vantage_point.diff(&palette[usize::from(far[0].idx)]);
156+
let radius_squared = palette.get(usize::from(far[0].idx))
157+
.map(|px| vantage_point.diff(px)).unwrap_or_default();
150158
let radius = radius_squared.sqrt();
151159
NodeInner::Nodes {
152160
radius, radius_squared,
@@ -157,7 +165,7 @@ fn vp_create_node(indexes: &mut [MapIndex], items: &PalF) -> Node {
157165

158166
Node {
159167
inner,
160-
vantage_point: palette[usize::from(ref_.idx)],
168+
vantage_point,
161169
idx: ref_.idx,
162170
}
163171
}

0 commit comments

Comments
 (0)