19 extract_all_colors(
const Image& image)
21 auto ret = std::vector<Rgbi>{};
24 for(
int y=0;
y<image.height;
y+=1)
26 for(
int x=0;
x<image.width;
x+=1)
29 ret.emplace_back(color);
44 get_value(SortRange range,
const Rgbi& c)
48 case SortRange::r:
return to_rgb(c).
r;
49 case SortRange::g:
return to_rgb(c).
g;
50 case SortRange::b:
return to_rgb(c).
b;
56 std::tuple<SortRange, Range<float>>
59 using Tu = std::tuple<SortRange, Range<float>>;
61 const auto [min_values, max_values] = find_min_max_ranges<3, float>
64 [](
const Rgbi& c) -> std::array<float, 3>
68 get_value(SortRange::r, c),
69 get_value(SortRange::g, c),
70 get_value(SortRange::b, c)
76 auto make = [&, miv = std::move(min_values), mav = std::move(max_values)] (SortRange
r,
size_t i) -> Tu
78 return std::make_tuple(r,
Range{miv[
i], mav[
i]});
80 auto ranges = std::vector<Tu>
82 make(SortRange::r, 0),
83 make(SortRange::g, 1),
88 ranges.begin(), ranges.end(), [](
const Tu& lhs,
const Tu& rhs)
90 return std::get<1>(lhs).get_distance() > std::get<1>(rhs).get_distance();
100 auto sort = [&](std::function<float (
const Rgbi& c)> conv)
102 std::sort(colors.
begin(), colors.
end(), [&]
106 return conv(lhs) < conv(rhs);
113 case SortRange::r: sort([](
const Rgbi& c) ->
float {
return c.r; });
break;
114 case SortRange::g: sort([](
const Rgbi& c) ->
float {
return c.g; });
break;
115 case SortRange::b: sort([](
const Rgbi& c) ->
float {
return c.b; });
break;
126 for(
size_t index = 0; index<colors.
size()-1; index+=1)
133 DIE(
"shouldn't happen...");
148 if(depth <= 0 || src.
size() < 2)
150 auto sum =
Rgb{0,0,0};
152 for(
const auto& c: src)
158 const auto r =
to_rgbi(sum / total);
163 const auto [range, rrange] = find_greatest_sort_range(src);
167 const auto median = split_middle
169 : find_median_index(range, src, rrange)
171 const auto left = src.
sub(0, median);
176 ret.insert(ret.end(), rhs.begin(), rhs.end());
187 auto all_colors = extract_all_colors(image);
std::vector< Rgbi > extract_palette_median_cut(const Image &image, int depth, bool middle_split)
constexpr ShaderAttribute color
int c_sizet_to_int(size_t t)
Rgbi to_rgbi(const Rgb &c)
size_t c_int_to_sizet(int i)
Rgb to_rgb(const Rgbi &c)
SubVec< T > sub(std::size_t start, std::size_t end)