diff --git a/jni/gl/utils.c b/jni/gl/utils.c index 9786365c..09d8fb9c 100644 --- a/jni/gl/utils.c +++ b/jni/gl/utils.c @@ -7,20 +7,53 @@ #define JNI(X) JNIEXPORT Java_org_oscim_utils_GlUtils_##X -static const char TAG[] = "org.oscim.utils.GLUtils"; +#define COLOR_R(C) (((C >> 16) & 0xff) / 255.0f) +#define COLOR_G(C) (((C >> 8) & 0xff) / 255.0f) +#define COLOR_B(C) (((C >> 0) & 0xff) / 255.0f) +#define COLOR_A(C) (((C >> 24) & 0xff) / 255.0f) -static void -nativeClassInit(JNIEnv *_env) +void JNI(setColor)(JNIEnv *env, jclass* clazz, jint location, jint c, jfloat alpha) { + if (alpha >= 1) + alpha = COLOR_A(c); + else if (alpha < 0) + alpha = 0; + else + alpha *= COLOR_A(c); + + if (alpha == 1) + { + glUniform4f((GLint) location, + (GLfloat) COLOR_R(c), + (GLfloat) COLOR_G(c), + (GLfloat) COLOR_B(c), + (GLfloat) alpha); + } + else + { + glUniform4f((GLint) location, + (GLfloat) (COLOR_R(c) * alpha), + (GLfloat) (COLOR_G(c) * alpha), + (GLfloat) (COLOR_B(c) * alpha), + (GLfloat) alpha); + } } -void JNI(init)(JNIEnv *env, jclass* clazz) +void JNI(setColorBlend)(JNIEnv *env, jclass* clazz, jint location, jint c1, jint c2, jfloat mix) { - nativeClassInit(env); - __android_log_print(ANDROID_LOG_INFO, TAG, "all initialized"); + float a1 = COLOR_A(c1) * (1 - mix); + float a2 = COLOR_A(c2) * mix; + + glUniform4f((GLint) location, + (GLfloat) (COLOR_R(c1) * a1 + COLOR_R(c2) * a2), + (GLfloat) (COLOR_G(c1) * a1 + COLOR_G(c2) * a2), + (GLfloat) (COLOR_B(c1) * a1 + COLOR_B(c2) * a2), + (GLfloat) (a1 + a2)); } + + #undef JNI #define JNI(X) JNIEXPORT Java_org_oscim_utils_Matrix4_##X @@ -42,7 +75,6 @@ transposeM(float* mTrans, int mTransOffset, float* m, int mOffset); static inline void matrix4_proj(float* mat, float* vec); - jlong JNI(alloc)(JNIEnv *env, jclass* clazz) { return (long) calloc(16, sizeof(float)); diff --git a/src/org/oscim/renderer/LineTexRenderer.java b/src/org/oscim/renderer/LineTexRenderer.java index 6d3be5ae..bd3beb7c 100644 --- a/src/org/oscim/renderer/LineTexRenderer.java +++ b/src/org/oscim/renderer/LineTexRenderer.java @@ -167,12 +167,8 @@ public class LineTexRenderer { LineTexLayer ll = (LineTexLayer) l; Line line = ll.line; - if (line.stippleColor == null) - GLES20.glUniform4f(hTexColor, 1.0f, 1.0f, 1.0f, 1.0f); - else - GLES20.glUniform4fv(hTexColor, 1, line.stippleColor, 0); - - GLES20.glUniform4fv(hBgColor, 1, line.color, 0); + GlUtils.setColor(hTexColor, line.stippleColor, 1); + GlUtils.setColor(hBgColor, line.color, 1); float ps = FastMath.clamp((int) (s+0.5f), 1, 3); GLES20.glUniform1f(hPatternScale, (GLRenderer.COORD_SCALE * line.stipple) / ps); diff --git a/src/org/oscim/renderer/PolygonRenderer.java b/src/org/oscim/renderer/PolygonRenderer.java index ef5b1f34..c2f82a60 100644 --- a/src/org/oscim/renderer/PolygonRenderer.java +++ b/src/org/oscim/renderer/PolygonRenderer.java @@ -113,13 +113,13 @@ public final class PolygonRenderer { GLState.blend(false); if (a.blend == zoom) - GlUtils.setBlendColors(hPolygonColor, + GlUtils.setColorBlend(hPolygonColor, a.color, a.blendColor, scale - 1.0f); else GlUtils.setColor(hPolygonColor, a.blendColor, 1); } else { - if (a.color[3] != 1) + if (a.color < 0xff000000) GLState.blend(true); else GLState.blend(false); diff --git a/src/org/oscim/theme/renderinstruction/Area.java b/src/org/oscim/theme/renderinstruction/Area.java index d4fae587..9c9f2609 100644 --- a/src/org/oscim/theme/renderinstruction/Area.java +++ b/src/org/oscim/theme/renderinstruction/Area.java @@ -17,7 +17,6 @@ package org.oscim.theme.renderinstruction; import org.oscim.core.Tag; import org.oscim.theme.IRenderCallback; import org.oscim.theme.RenderThemeHandler; -import org.oscim.utils.GlUtils; import org.xml.sax.Attributes; import android.graphics.Color; @@ -85,11 +84,11 @@ public final class Area extends RenderInstruction { this.level = 0; this.style = ""; this.fade = -1; - blendColor = null; + blendColor = 0; blend = -1; strokeWidth = 0; - color = GlUtils.colorToFloatP(fill); + color = fill; } /** @@ -126,12 +125,8 @@ public final class Area extends RenderInstruction { // paintFill.setShader(shader); // } - color = GlUtils.colorToFloatP(fill); - - if (blend > 0) - blendColor = GlUtils.colorToFloatP(blendFill); - else - blendColor = null; + color = fill; //GlUtils.colorToFloatP(fill); + blendColor = blendFill; //GlUtils.colorToFloatP(blendFill); this.blend = blend; this.strokeWidth = strokeWidth; @@ -144,18 +139,11 @@ public final class Area extends RenderInstruction { renderCallback.renderArea(this, this.level); } - // @Override - // public void scaleStrokeWidth(float scaleFactor) { - // // if (paintOutline != null) { - // // paintOutline.setStrokeWidth(strokeWidth * scaleFactor); - // // } - // } - public String style; private final int level; public final float strokeWidth; - public final float color[]; + public final int color; public final int fade; - public final float blendColor[]; + public final int blendColor; public final int blend; } diff --git a/src/org/oscim/theme/renderinstruction/Line.java b/src/org/oscim/theme/renderinstruction/Line.java index abdd566c..6165aff9 100644 --- a/src/org/oscim/theme/renderinstruction/Line.java +++ b/src/org/oscim/theme/renderinstruction/Line.java @@ -20,7 +20,6 @@ import java.util.regex.Pattern; import org.oscim.core.Tag; import org.oscim.theme.IRenderCallback; import org.oscim.theme.RenderThemeHandler; -import org.oscim.utils.GlUtils; import org.xml.sax.Attributes; import android.graphics.Color; @@ -66,8 +65,9 @@ public final class Line extends RenderInstruction { int stipple = 0; float stippleWidth = 0; - float[] color = null; - float[] stippleColor = null; + int color = Color.RED; + + int stippleColor = Color.BLACK; if (line != null) { color = line.color; @@ -90,8 +90,7 @@ public final class Line extends RenderInstruction { else if ("src".equals(name)) { //src = value; } else if ("stroke".equals(name)) { - int stroke = Color.parseColor(value); - color = GlUtils.colorToFloatP(stroke); + color = Color.parseColor(value); } else if ("width".equals(name)) { width = Float.parseFloat(value); } else if ("cap".equals(name)) { @@ -101,8 +100,7 @@ public final class Line extends RenderInstruction { } else if ("stipple".equals(name)) { stipple = Integer.parseInt(value); } else if ("stipple-stroke".equals(name)) { - int stroke = Color.parseColor(value); - stippleColor = GlUtils.colorToFloatP(stroke); + stippleColor = Color.parseColor(value); } else if ("stipple-width".equals(name)) { stippleWidth = Float.parseFloat(value); } else if ("fade".equals(name)) { @@ -117,13 +115,6 @@ public final class Line extends RenderInstruction { } } - // hint that sth is missing - if (color == null) - color = GlUtils.colorToFloatP(Color.RED); - - if (stipple != 0 && stippleColor == null) - stippleColor = GlUtils.colorToFloatP(Color.GREEN); - // inherit properties from 'line' if (line != null) { // use stroke width relative to 'line' @@ -160,7 +151,7 @@ public final class Line extends RenderInstruction { public final String style; public final float width; - public final float[] color; + public final int color; public final Cap cap; public final boolean outline; public final boolean fixed; @@ -169,14 +160,14 @@ public final class Line extends RenderInstruction { public final float min; public final int stipple; - public final float[] stippleColor; + public final int stippleColor; public final float stippleWidth; - private Line(int level, String style, float[] color, float width, + private Line(int level, String style, int color, float width, Cap cap, boolean fixed, - int stipple, float[] stippleColor, float stippleWidth, + int stipple, int stippleColor, float stippleWidth, int fade, float blur, boolean isOutline, float min) { this.level = level; @@ -222,10 +213,10 @@ public final class Line extends RenderInstruction { this.fixed = true; this.fade = -1; this.stipple = 0; - this.stippleColor = null; + this.stippleColor = Color.BLACK; this.stippleWidth = 0; this.min = 0; - this.color = GlUtils.colorToFloatP(stroke); + this.color = stroke; //GlUtils.colorToFloatP(stroke); } public Line(int stroke, float width, int stipple) { @@ -238,10 +229,10 @@ public final class Line extends RenderInstruction { this.fixed = true; this.fade = -1; this.stipple = stipple; - this.stippleColor = null; + this.stippleColor = Color.BLACK; this.stippleWidth = 0.6f; this.min = 0; - color = GlUtils.colorToFloatP(stroke); + color = stroke; //GlUtils.colorToFloatP(stroke); } @Override diff --git a/src/org/oscim/utils/GlUtils.java b/src/org/oscim/utils/GlUtils.java index 3953c8bb..0b57ba64 100644 --- a/src/org/oscim/utils/GlUtils.java +++ b/src/org/oscim/utils/GlUtils.java @@ -26,6 +26,10 @@ import android.util.Log; * Utility functions */ public class GlUtils { + + public static native void setColor(int location, int color, float alpha); + public static native void setColorBlend(int location, int color1, int color2, float mix); + private static String TAG = "GlUtils"; public static void setTextureParameter(int min_filter, int mag_filter, int wrap_s, int wrap_t) { @@ -202,6 +206,7 @@ public class GlUtils { return oom; } + public static void setBlendColors(int handle, float[] c1, float[] c2, float mix) { if (mix <= 0f) GLES20.glUniform4fv(handle, 1, c1, 0);