зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1324028 - Use edge colour as dominant favicon color if consistent. r=mcomella
If all edges of a favicon are the same colour, we should use that as the background colour too - that way the favicon no longer appears distinct from the background. We still fall back to the dominant colour in most cases, however this improves favicon appearance for some websites. MozReview-Commit-ID: 6xkgXxHHla2 --HG-- extra : rebase_source : c33807fa2b972b5d4d4f44e8e321883b8880f480
This commit is contained in:
Родитель
2ad6c736f1
Коммит
8ac1727d95
|
@ -5,6 +5,8 @@
|
|||
|
||||
package org.mozilla.gecko.icons.processing;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.support.annotation.ColorInt;
|
||||
import android.support.v7.graphics.Palette;
|
||||
import android.util.Log;
|
||||
|
||||
|
@ -27,6 +29,14 @@ public class ColorProcessor implements Processor {
|
|||
return;
|
||||
}
|
||||
|
||||
final Bitmap bitmap = response.getBitmap();
|
||||
|
||||
final @ColorInt Integer edgeColor = getEdgeColor(bitmap);
|
||||
if (edgeColor != null) {
|
||||
response.updateColor(edgeColor);
|
||||
return;
|
||||
}
|
||||
|
||||
if (HardwareUtils.isX86System()) {
|
||||
// (Bug 1318667) We are running into crashes when using the palette library with
|
||||
// specific icons on x86 devices. They take down the whole VM and are not recoverable.
|
||||
|
@ -58,4 +68,66 @@ public class ColorProcessor implements Processor {
|
|||
|
||||
response.updateColor(dominantColor);
|
||||
}
|
||||
|
||||
/**
|
||||
* If a bitmap has a consistent edge colour (i.e. if all the border pixels have the same colour),
|
||||
* return that colour.
|
||||
* @param bitmap
|
||||
* @return The edge colour. null if there is no consistent edge color.
|
||||
*/
|
||||
private @ColorInt Integer getEdgeColor(final Bitmap bitmap) {
|
||||
final int width = bitmap.getWidth();
|
||||
final int height = bitmap.getHeight();
|
||||
|
||||
// Only allocate an array once, with the max width we need once, to minimise the number
|
||||
// of allocations.
|
||||
@ColorInt int[] edge = new int[Math.max(width, height)];
|
||||
|
||||
// Top:
|
||||
bitmap.getPixels(edge, 0, width, 0, 0, width, 1);
|
||||
final @ColorInt Integer edgecolor = getEdgeColorFromSingleDimension(edge, width);
|
||||
if (edgecolor == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Bottom:
|
||||
bitmap.getPixels(edge, 0, width, 0, height - 1, width, 1);
|
||||
if (!edgecolor.equals(getEdgeColorFromSingleDimension(edge, width))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Left:
|
||||
bitmap.getPixels(edge, 0, 1, 0, 0, 1, height);
|
||||
if (!edgecolor.equals(getEdgeColorFromSingleDimension(edge, height))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Right:
|
||||
bitmap.getPixels(edge, 0, 1, width - 1, 0, 1, height);
|
||||
if (!edgecolor.equals(getEdgeColorFromSingleDimension(edge, height))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return edgecolor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain the colour for a given edge if all colors are the same.
|
||||
*
|
||||
* @param edge An array containing the color values of the pixels constituting the edge of a bitmap.
|
||||
* @param length The length of the array to be traversed. Must be smaller than, or equal to
|
||||
* the total length of the array.
|
||||
* @return The colour contained within the array, or null if colours vary.
|
||||
*/
|
||||
private @ColorInt Integer getEdgeColorFromSingleDimension(@ColorInt int[] edge, int length) {
|
||||
@ColorInt int color = edge[0];
|
||||
|
||||
for (int i = 1; i < length; ++i) {
|
||||
if (edge[i] != color) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return color;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче