[core] Update shaders.
Implements 'icon-pitch-alignment' (issue #9345) Fixes issue #9456 (map-aligned point label regression)
This commit is contained in:
@@ -160,6 +160,32 @@ public final class Property {
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ICON_TEXT_FIT {}
|
||||
|
||||
// ICON_PITCH_ALIGNMENT: Orientation of icon when map is pitched.
|
||||
|
||||
/**
|
||||
* The icon is aligned to the plane of the map.
|
||||
*/
|
||||
public static final String ICON_PITCH_ALIGNMENT_MAP = "map";
|
||||
/**
|
||||
* The icon is aligned to the plane of the viewport.
|
||||
*/
|
||||
public static final String ICON_PITCH_ALIGNMENT_VIEWPORT = "viewport";
|
||||
/**
|
||||
* Automatically matches the value of {@link ICON_ROTATION_ALIGNMENT}.
|
||||
*/
|
||||
public static final String ICON_PITCH_ALIGNMENT_AUTO = "auto";
|
||||
|
||||
/**
|
||||
* Orientation of icon when map is pitched.
|
||||
*/
|
||||
@StringDef({
|
||||
ICON_PITCH_ALIGNMENT_MAP,
|
||||
ICON_PITCH_ALIGNMENT_VIEWPORT,
|
||||
ICON_PITCH_ALIGNMENT_AUTO,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ICON_PITCH_ALIGNMENT {}
|
||||
|
||||
// TEXT_PITCH_ALIGNMENT: Orientation of text when map is pitched.
|
||||
|
||||
/**
|
||||
|
||||
@@ -1881,6 +1881,29 @@ public class PropertyFactory {
|
||||
return new LayoutPropertyValue<>("icon-offset", function);
|
||||
}
|
||||
|
||||
/**
|
||||
* Orientation of icon when map is pitched.
|
||||
*
|
||||
* @param value a String value
|
||||
* @return property wrapper around String
|
||||
*/
|
||||
public static PropertyValue<String> iconPitchAlignment(@Property.ICON_PITCH_ALIGNMENT String value) {
|
||||
return new LayoutPropertyValue<>("icon-pitch-alignment", value);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Orientation of icon when map is pitched.
|
||||
*
|
||||
* @param <Z> the zoom parameter type
|
||||
* @param function a wrapper {@link CameraFunction} for String
|
||||
* @return property wrapper around a String function
|
||||
*/
|
||||
public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> iconPitchAlignment(CameraFunction<Z, String> function) {
|
||||
return new LayoutPropertyValue<>("icon-pitch-alignment", function);
|
||||
}
|
||||
|
||||
/**
|
||||
* Orientation of text when map is pitched.
|
||||
*
|
||||
|
||||
@@ -251,6 +251,16 @@ public class SymbolLayer extends Layer {
|
||||
return (PropertyValue<Float[]>) new PropertyValue("icon-offset", nativeGetIconOffset());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the IconPitchAlignment property
|
||||
*
|
||||
* @return property wrapper value around String
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public PropertyValue<String> getIconPitchAlignment() {
|
||||
return (PropertyValue<String>) new PropertyValue("icon-pitch-alignment", nativeGetIconPitchAlignment());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the TextPitchAlignment property
|
||||
*
|
||||
@@ -891,6 +901,8 @@ public class SymbolLayer extends Layer {
|
||||
|
||||
private native Object nativeGetIconOffset();
|
||||
|
||||
private native Object nativeGetIconPitchAlignment();
|
||||
|
||||
private native Object nativeGetTextPitchAlignment();
|
||||
|
||||
private native Object nativeGetTextRotationAlignment();
|
||||
|
||||
@@ -43,8 +43,7 @@ public class Light {
|
||||
*
|
||||
* @return anchor as String
|
||||
*/
|
||||
@Property.ANCHOR
|
||||
public String getAnchor() {
|
||||
@Property.ANCHOR public String getAnchor() {
|
||||
return nativeGetAnchor();
|
||||
}
|
||||
|
||||
@@ -107,7 +106,7 @@ public class Light {
|
||||
*
|
||||
* @return color as String
|
||||
*/
|
||||
public String getColor() {
|
||||
public String getColor() {
|
||||
return nativeGetColor();
|
||||
}
|
||||
|
||||
@@ -143,7 +142,7 @@ public class Light {
|
||||
*
|
||||
* @return intensity as Float
|
||||
*/
|
||||
public float getIntensity() {
|
||||
public float getIntensity() {
|
||||
return nativeGetIntensity();
|
||||
}
|
||||
|
||||
@@ -166,30 +165,17 @@ public class Light {
|
||||
}
|
||||
|
||||
private native void nativeSetAnchor(String anchor);
|
||||
|
||||
private native String nativeGetAnchor();
|
||||
|
||||
private native void nativeSetPosition(Position position);
|
||||
|
||||
private native Position nativeGetPosition();
|
||||
|
||||
private native TransitionOptions nativeGetPositionTransition();
|
||||
|
||||
private native void nativeSetPositionTransition(long duration, long delay);
|
||||
|
||||
private native void nativeSetColor(String color);
|
||||
|
||||
private native String nativeGetColor();
|
||||
|
||||
private native TransitionOptions nativeGetColorTransition();
|
||||
|
||||
private native void nativeSetColorTransition(long duration, long delay);
|
||||
|
||||
private native void nativeSetIntensity(float intensity);
|
||||
|
||||
private native float nativeGetIntensity();
|
||||
|
||||
private native TransitionOptions nativeGetIntensityTransition();
|
||||
|
||||
private native void nativeSetIntensityTransition(long duration, long delay);
|
||||
}
|
||||
@@ -1052,11 +1052,16 @@ public class CircleLayerTest extends BaseActivityTest {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("circle-pitch-alignment");
|
||||
assertNotNull(layer);
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set and Get
|
||||
layer.setProperties(circlePitchAlignment(CIRCLE_PITCH_ALIGNMENT_MAP));
|
||||
assertEquals((String) layer.getCirclePitchAlignment().getValue(), (String) CIRCLE_PITCH_ALIGNMENT_MAP);
|
||||
// Set and Get
|
||||
layer.setProperties(circlePitchAlignment(CIRCLE_PITCH_ALIGNMENT_MAP));
|
||||
assertEquals((String) layer.getCirclePitchAlignment().getValue(), (String) CIRCLE_PITCH_ALIGNMENT_MAP);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1064,25 +1069,30 @@ public class CircleLayerTest extends BaseActivityTest {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("circle-pitch-alignment");
|
||||
assertNotNull(layer);
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set
|
||||
layer.setProperties(
|
||||
circlePitchAlignment(
|
||||
zoom(
|
||||
interval(
|
||||
stop(2, circlePitchAlignment(CIRCLE_PITCH_ALIGNMENT_MAP))
|
||||
// Set
|
||||
layer.setProperties(
|
||||
circlePitchAlignment(
|
||||
zoom(
|
||||
interval(
|
||||
stop(2, circlePitchAlignment(CIRCLE_PITCH_ALIGNMENT_MAP))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
);
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getCirclePitchAlignment());
|
||||
assertNotNull(layer.getCirclePitchAlignment().getFunction());
|
||||
assertEquals(CameraFunction.class, layer.getCirclePitchAlignment().getFunction().getClass());
|
||||
assertEquals(IntervalStops.class, layer.getCirclePitchAlignment().getFunction().getStops().getClass());
|
||||
assertEquals(1, ((IntervalStops) layer.getCirclePitchAlignment().getFunction().getStops()).size());
|
||||
// Verify
|
||||
assertNotNull(layer.getCirclePitchAlignment());
|
||||
assertNotNull(layer.getCirclePitchAlignment().getFunction());
|
||||
assertEquals(CameraFunction.class, layer.getCirclePitchAlignment().getFunction().getClass());
|
||||
assertEquals(IntervalStops.class, layer.getCirclePitchAlignment().getFunction().getStops().getClass());
|
||||
assertEquals(1, ((IntervalStops) layer.getCirclePitchAlignment().getFunction().getStops()).size());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -865,19 +865,24 @@ public class LineLayerTest extends BaseActivityTest {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("line-width");
|
||||
assertNotNull(layer);
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(property("FeaturePropertyA", Stops.<Float>identity()))
|
||||
);
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(property("FeaturePropertyA", Stops.<Float>identity()))
|
||||
);
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(SourceFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((SourceFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(IdentityStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(SourceFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((SourceFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(IdentityStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -885,26 +890,31 @@ public class LineLayerTest extends BaseActivityTest {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("line-width");
|
||||
assertNotNull(layer);
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(
|
||||
property(
|
||||
"FeaturePropertyA",
|
||||
exponential(
|
||||
stop(0.3f, lineWidth(0.3f))
|
||||
).withBase(0.5f)
|
||||
)
|
||||
)
|
||||
);
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(
|
||||
property(
|
||||
"FeaturePropertyA",
|
||||
exponential(
|
||||
stop(0.3f, lineWidth(0.3f))
|
||||
).withBase(0.5f)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(SourceFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((SourceFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(ExponentialStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(SourceFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((SourceFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(ExponentialStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -912,29 +922,35 @@ public class LineLayerTest extends BaseActivityTest {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("line-width");
|
||||
assertNotNull(layer);
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(
|
||||
property(
|
||||
"FeaturePropertyA",
|
||||
categorical(
|
||||
stop(1.0f, lineWidth(0.3f))
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(
|
||||
property(
|
||||
"FeaturePropertyA",
|
||||
categorical(
|
||||
stop(1.0f, lineWidth(0.3f))
|
||||
)
|
||||
).withDefaultValue(lineWidth(0.3f))
|
||||
)
|
||||
).withDefaultValue(lineWidth(0.3f))
|
||||
)
|
||||
);
|
||||
);
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(SourceFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((SourceFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(CategoricalStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
assertNotNull(((SourceFunction) layer.getLineWidth().getFunction()).getDefaultValue());
|
||||
assertNotNull(((SourceFunction) layer.getLineWidth().getFunction()).getDefaultValue().getValue());
|
||||
assertEquals(0.3f, ((SourceFunction) layer.getLineWidth().getFunction()).getDefaultValue().getValue());
|
||||
}
|
||||
});
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(SourceFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((SourceFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(CategoricalStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
assertNotNull(((SourceFunction) layer.getLineWidth().getFunction()).getDefaultValue());
|
||||
assertNotNull(((SourceFunction) layer.getLineWidth().getFunction()).getDefaultValue().getValue());
|
||||
assertEquals(0.3f, ((SourceFunction) layer.getLineWidth().getFunction()).getDefaultValue().getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -942,34 +958,39 @@ public class LineLayerTest extends BaseActivityTest {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("line-width");
|
||||
assertNotNull(layer);
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(
|
||||
composite(
|
||||
"FeaturePropertyA",
|
||||
exponential(
|
||||
stop(0, 0.3f, lineWidth(0.9f))
|
||||
).withBase(0.5f)
|
||||
).withDefaultValue(lineWidth(0.3f))
|
||||
)
|
||||
);
|
||||
// Set
|
||||
layer.setProperties(
|
||||
lineWidth(
|
||||
composite(
|
||||
"FeaturePropertyA",
|
||||
exponential(
|
||||
stop(0, 0.3f, lineWidth(0.9f))
|
||||
).withBase(0.5f)
|
||||
).withDefaultValue(lineWidth(0.3f))
|
||||
)
|
||||
);
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(CompositeFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((CompositeFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(ExponentialStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
assertEquals(1, ((ExponentialStops) layer.getLineWidth().getFunction().getStops()).size());
|
||||
// Verify
|
||||
assertNotNull(layer.getLineWidth());
|
||||
assertNotNull(layer.getLineWidth().getFunction());
|
||||
assertEquals(CompositeFunction.class, layer.getLineWidth().getFunction().getClass());
|
||||
assertEquals("FeaturePropertyA", ((CompositeFunction) layer.getLineWidth().getFunction()).getProperty());
|
||||
assertEquals(ExponentialStops.class, layer.getLineWidth().getFunction().getStops().getClass());
|
||||
assertEquals(1, ((ExponentialStops) layer.getLineWidth().getFunction().getStops()).size());
|
||||
|
||||
ExponentialStops<Stop.CompositeValue<Float, Float>, Float> stops =
|
||||
(ExponentialStops<Stop.CompositeValue<Float, Float>, Float>) layer.getLineWidth().getFunction().getStops();
|
||||
Stop<Stop.CompositeValue<Float, Float>, Float> stop = stops.iterator().next();
|
||||
assertEquals(0f, stop.in.zoom, 0.001);
|
||||
assertEquals(0.3f, stop.in.value, 0.001f);
|
||||
assertEquals(0.9f, stop.out, 0.001f);
|
||||
ExponentialStops<Stop.CompositeValue<Float, Float>, Float> stops =
|
||||
(ExponentialStops<Stop.CompositeValue<Float, Float>, Float>) layer.getLineWidth().getFunction().getStops();
|
||||
Stop<Stop.CompositeValue<Float, Float>, Float> stop = stops.iterator().next();
|
||||
assertEquals(0f, stop.in.zoom, 0.001);
|
||||
assertEquals(0.3f, stop.in.value, 0.001f);
|
||||
assertEquals(0.9f, stop.out, 0.001f);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -1213,6 +1213,54 @@ public class SymbolLayerTest extends BaseActivityTest {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIconPitchAlignmentAsConstant() {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("icon-pitch-alignment");
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set and Get
|
||||
layer.setProperties(iconPitchAlignment(ICON_PITCH_ALIGNMENT_MAP));
|
||||
assertEquals((String) layer.getIconPitchAlignment().getValue(), (String) ICON_PITCH_ALIGNMENT_MAP);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIconPitchAlignmentAsCameraFunction() {
|
||||
validateTestSetup();
|
||||
setupLayer();
|
||||
Timber.i("icon-pitch-alignment");
|
||||
invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() {
|
||||
@Override
|
||||
public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) {
|
||||
assertNotNull(layer);
|
||||
|
||||
// Set
|
||||
layer.setProperties(
|
||||
iconPitchAlignment(
|
||||
zoom(
|
||||
interval(
|
||||
stop(2, iconPitchAlignment(ICON_PITCH_ALIGNMENT_MAP))
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
// Verify
|
||||
assertNotNull(layer.getIconPitchAlignment());
|
||||
assertNotNull(layer.getIconPitchAlignment().getFunction());
|
||||
assertEquals(CameraFunction.class, layer.getIconPitchAlignment().getFunction().getClass());
|
||||
assertEquals(IntervalStops.class, layer.getIconPitchAlignment().getFunction().getStops().getClass());
|
||||
assertEquals(1, ((IntervalStops) layer.getIconPitchAlignment().getFunction().getStops()).size());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTextPitchAlignmentAsConstant() {
|
||||
validateTestSetup();
|
||||
|
||||
@@ -125,6 +125,12 @@ namespace android {
|
||||
return jni::Object<jni::ObjectTag>(*converted);
|
||||
}
|
||||
|
||||
jni::Object<jni::ObjectTag> SymbolLayer::getIconPitchAlignment(jni::JNIEnv& env) {
|
||||
using namespace mbgl::android::conversion;
|
||||
Result<jni::jobject*> converted = convert<jni::jobject*>(env, layer.as<mbgl::style::SymbolLayer>()->SymbolLayer::getIconPitchAlignment());
|
||||
return jni::Object<jni::ObjectTag>(*converted);
|
||||
}
|
||||
|
||||
jni::Object<jni::ObjectTag> SymbolLayer::getTextPitchAlignment(jni::JNIEnv& env) {
|
||||
using namespace mbgl::android::conversion;
|
||||
Result<jni::jobject*> converted = convert<jni::jobject*>(env, layer.as<mbgl::style::SymbolLayer>()->SymbolLayer::getTextPitchAlignment());
|
||||
@@ -514,6 +520,7 @@ namespace android {
|
||||
METHOD(&SymbolLayer::getIconPadding, "nativeGetIconPadding"),
|
||||
METHOD(&SymbolLayer::getIconKeepUpright, "nativeGetIconKeepUpright"),
|
||||
METHOD(&SymbolLayer::getIconOffset, "nativeGetIconOffset"),
|
||||
METHOD(&SymbolLayer::getIconPitchAlignment, "nativeGetIconPitchAlignment"),
|
||||
METHOD(&SymbolLayer::getTextPitchAlignment, "nativeGetTextPitchAlignment"),
|
||||
METHOD(&SymbolLayer::getTextRotationAlignment, "nativeGetTextRotationAlignment"),
|
||||
METHOD(&SymbolLayer::getTextField, "nativeGetTextField"),
|
||||
|
||||
@@ -59,6 +59,8 @@ public:
|
||||
|
||||
jni::Object<jni::ObjectTag> getIconOffset(jni::JNIEnv&);
|
||||
|
||||
jni::Object<jni::ObjectTag> getIconPitchAlignment(jni::JNIEnv&);
|
||||
|
||||
jni::Object<jni::ObjectTag> getTextPitchAlignment(jni::JNIEnv&);
|
||||
|
||||
jni::Object<jni::ObjectTag> getTextRotationAlignment(jni::JNIEnv&);
|
||||
|
||||
Reference in New Issue
Block a user