From 2c4ab75d55fa7ea827fef21ff0de2d11c60bc294 Mon Sep 17 00:00:00 2001 From: tobrun Date: Mon, 25 Jun 2018 13:36:57 +0200 Subject: [android] - range alpha between 0 and 1 with android color conversion --- platform/android/MapboxGLAndroidSDK/build.gradle | 1 + .../mapboxsdk/style/expressions/Expression.java | 2 +- .../mapboxsdk/style/layers/PropertyFactory.java | 16 +++++++++---- .../style/layers/property_factory.java.ejs | 16 +++++++++---- .../style/expressions/ExpressionTest.java | 28 ++++++++++++++++++---- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/build.gradle b/platform/android/MapboxGLAndroidSDK/build.gradle index 64f2e5f73d..35b4de003b 100644 --- a/platform/android/MapboxGLAndroidSDK/build.gradle +++ b/platform/android/MapboxGLAndroidSDK/build.gradle @@ -124,6 +124,7 @@ android { testOptions { unitTests { returnDefaultValues true + includeAndroidResources = true } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java index 72e8187b96..1aa0ce9093 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java @@ -213,7 +213,7 @@ public class Expression { * @return the color expression */ public static Expression color(@ColorInt int color) { - int[] rgba = PropertyFactory.colorToRgbaArray(color); + float[] rgba = PropertyFactory.colorToRgbaArray(color); return rgba(rgba[0], rgba[1], rgba[2], rgba[3]); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java index 5338fb84f6..a7b42cedf5 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java @@ -2397,22 +2397,28 @@ public class PropertyFactory { /** * Converts Android color int to "rbga(r, g, b, a)" String equivalent. + *

+ * Alpha value will be converted from 0-255 range to 0-1. + *

* * @param color Android color int * @return String rgba color */ public static String colorToRgbaString(@ColorInt int color) { - return String.format(Locale.US, "rgba(%d, %d, %d, %d)", - (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, (color >> 24) & 0xFF); + return String.format(Locale.US, "rgba(%d, %d, %d, %.001f)", + (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, ((color >> 24) & 0xFF) / 255.0f); } /** - * Converts Android color int to rgba int array. + * Converts Android color int to rgba float array. + *

+ * Alpha value will be converted from 0-255 range to 0-1. + *

* * @param color Android color int * @return int rgba array */ - public static int[] colorToRgbaArray(@ColorInt int color) { - return new int[] {(color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, (color >> 24) & 0xFF}; + public static float[] colorToRgbaArray(@ColorInt int color) { + return new float[] {(color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, ((color >> 24) & 0xFF) / 255.0f}; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs index ce0489409c..439ae2f13e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs @@ -87,22 +87,28 @@ public class PropertyFactory { <% } -%> /** * Converts Android color int to "rbga(r, g, b, a)" String equivalent. + *

+ * Alpha value will be converted from 0-255 range to 0-1. + *

* * @param color Android color int * @return String rgba color */ public static String colorToRgbaString(@ColorInt int color) { - return String.format(Locale.US, "rgba(%d, %d, %d, %d)", - (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, (color >> 24) & 0xFF); + return String.format(Locale.US, "rgba(%d, %d, %d, %.001f)", + (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, ((color >> 24) & 0xFF) / 255.0f); } /** - * Converts Android color int to rgba int array. + * Converts Android color int to rgba float array. + *

+ * Alpha value will be converted from 0-255 range to 0-1. + *

* * @param color Android color int * @return int rgba array */ - public static int[] colorToRgbaArray(@ColorInt int color) { - return new int[] {(color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, (color >> 24) & 0xFF}; + public static float[] colorToRgbaArray(@ColorInt int color) { + return new float[] {(color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, ((color >> 24) & 0xFF) / 255.0f}; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/style/expressions/ExpressionTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/style/expressions/ExpressionTest.java index 1070a25f55..1654c69a42 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/style/expressions/ExpressionTest.java +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/style/expressions/ExpressionTest.java @@ -3,6 +3,8 @@ package com.mapbox.mapboxsdk.style.expressions; import android.graphics.Color; import com.mapbox.mapboxsdk.style.layers.PropertyFactory; import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; import java.util.Arrays; @@ -85,6 +87,7 @@ import static org.junit.Assert.assertEquals; /** * Expression unit tests that validate the expression output with the expected Object[]array representation. */ +@RunWith(RobolectricTestRunner.class) public class ExpressionTest { @Test @@ -117,7 +120,7 @@ public class ExpressionTest { @Test public void testToRgba() throws Exception { - Object[] expected = new Object[] {"to-rgba", new Object[] {"to-color", "rgba(255, 0, 0, 255)"}}; + Object[] expected = new Object[] {"to-rgba", new Object[] {"to-color", "rgba(255, 0, 0, 1.0)"}}; Object[] actual = toRgba(toColor(literal(PropertyFactory.colorToRgbaString(Color.RED)))).toArray(); assertTrue("expression should match", Arrays.deepEquals(expected, actual)); } @@ -138,7 +141,7 @@ public class ExpressionTest { @Test public void testEqExpression() throws Exception { - Object[] expected = new Object[] {"==",new Object[]{"get", "hello"}, 1f}; + Object[] expected = new Object[] {"==", new Object[] {"get", "hello"}, 1f}; Object[] actual = eq(get("hello"), 1).toArray(); assertTrue("expression should match", Arrays.deepEquals(expected, actual)); } @@ -159,7 +162,7 @@ public class ExpressionTest { @Test public void testNeqExpression() throws Exception { - Object[] expected = new Object[] {"!=",new Object[]{"get", "hello"}, 1f}; + Object[] expected = new Object[] {"!=", new Object[] {"get", "hello"}, 1f}; Object[] actual = neq(get("hello"), 1).toArray(); assertTrue("expression should match", Arrays.deepEquals(expected, actual)); } @@ -1140,7 +1143,7 @@ public class ExpressionTest { @Test public void testColorConversion() { Expression greenColor = color(0xFF00FF00); - Object[] expected = new Object[] {"rgba", 0f, 255f, 0f, 255f}; + Object[] expected = new Object[] {"rgba", 0f, 255f, 0f, 1f}; assertTrue("expression should match", Arrays.deepEquals(expected, greenColor.toArray())); } @@ -1250,7 +1253,7 @@ public class ExpressionTest { public void testRawRgbaColor() { Expression expected = interpolate( exponential(2f), zoom(), - literal(5f), literal("rgba(0, 0, 0, 255)"), + literal(5f), literal("rgba(0, 0, 0, 1)"), literal(10.5f), literal("rgb(255, 0, 0)"), literal(15), color(Color.GREEN), literal(20), literal(PropertyFactory.colorToRgbaString(Color.BLUE))); @@ -1272,4 +1275,19 @@ public class ExpressionTest { stop("layer2", 2.7)); assertEquals("expressions should match", expected, raw(expected.toString())); } + + @Test + public void testAlphaValueInColorConversion() { + // regression test for #12198 + Expression colorExpression = color(Color.parseColor("#40FF0000")); // 25% alpha red + Object[] result = colorExpression.toArray(); + assertEquals("alpha value should match", 0.25, (Float) result[4], 0.01f); + } + + @Test + public void testAlphaValueInStringConversion() { + String color = PropertyFactory.colorToRgbaString(Color.parseColor("#80FF0000")); // 50% alpha red + String alpha = color.split(" ")[3].substring(0, 3); + assertEquals("alpha value should match", 0.5f, Float.valueOf(alpha), 0.001f); + } } \ No newline at end of file -- cgit v1.2.1