Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1439c86f authored by Aurélien Pomini's avatar Aurélien Pomini
Browse files

Use less clusters for color extraction for small bitmaps

The color extraction in WallpaperColors uses a K-Mean algorithm.
Currently, it uses 128 clusters, so it generates 128 colors, and then select the most important ones.

But for most widgets this method is called with highly downscaled bitmaps (as small as 20x20 px), so we're trying to k-mean 128 clusters with only a couple hundreds of datapoints, which is most likely instable.

This CL changes the number of cluster to be max(5, min(nPixels / 16, 128)). Thus, image with less than 2048 px (about 45x45) will use less than 128 clusters, but always at least 5 clusters.

Bug: 273505854
Bug: 268180548
Test: perfetto trace
Test: manual: observe the result on widget colors
Change-Id: I34c13cfca392bb64bae4e7bf0adc1933c0eeb67c
parent fbba5e15
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -213,9 +213,17 @@ public final class WallpaperColors implements Parcelable {
                    .resizeBitmapArea(MAX_WALLPAPER_EXTRACTION_AREA)
                    .generate();
        } else {
            // in any case, always use between 5 and 128 clusters
            int minClusters = 5;
            int maxClusters = 128;

            // if the bitmap is very small, use bitmapArea/16 clusters instead of 128
            int minPixelsPerCluster = 16;
            int numberOfColors = Math.max(minClusters,
                    Math.min(maxClusters, bitmapArea / minPixelsPerCluster));
            palette = Palette
                    .from(bitmap, new CelebiQuantizer())
                    .maximumColorCount(128)
                    .maximumColorCount(numberOfColors)
                    .resizeBitmapArea(MAX_WALLPAPER_EXTRACTION_AREA)
                    .generate();
        }