/*
* $Id$
* This file is a part of the Arakhne Foundation Classes, http://www.arakhne.org/afc
*
* Copyright (c) 2000-2012 Stephane GALLAND.
* Copyright (c) 2005-10, Multiagent Team, Laboratoire Systemes et Transports,
* Universite de Technologie de Belfort-Montbeliard.
* Copyright (c) 2013-2016 The original authors, and other authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.arakhne.afc.ui.vector.android;
import java.io.IOError;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import org.arakhne.afc.math.continous.object2d.Shape2f;
import org.arakhne.afc.math.matrix.Transform2D;
import org.arakhne.afc.ui.vector.Color;
import org.arakhne.afc.ui.vector.Composite;
import org.arakhne.afc.ui.vector.Dimension;
import org.arakhne.afc.ui.vector.Font;
import org.arakhne.afc.ui.vector.FontMetrics;
import org.arakhne.afc.ui.vector.FontStyle;
import org.arakhne.afc.ui.vector.Image;
import org.arakhne.afc.ui.vector.Margins;
import org.arakhne.afc.ui.vector.Stroke;
import org.arakhne.afc.ui.vector.Stroke.EndCap;
import org.arakhne.afc.ui.vector.Stroke.LineJoin;
import org.arakhne.afc.ui.vector.VectorGraphics2D;
import org.arakhne.afc.ui.vector.VectorToolkit;
import org.arakhne.afc.vmutil.OperatingSystem;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
/** Android implementation of the generic Window toolkit.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
* @deprecated see JavaFX API
*/
@Deprecated
public class AndroidVectorToolkit extends VectorToolkit {
/**
*/
public AndroidVectorToolkit() {
//
}
@Override
protected boolean isSupported() {
return OperatingSystem.ANDROID.isCurrentOS();
}
@Override
protected void postDrawing(VectorGraphics2D context) {
// do not call super function to avoid to reset the current context.
}
@Override
protected <T> T toNativeUIObject(Class<T> type, Object o) {
if (o instanceof NativeWrapper) {
return ((NativeWrapper)o).getNativeObject(type);
}
return type.cast(o);
}
@Override
protected Shape2f createShape(Object nativeObject) {
throw new UnsupportedOperationException();
}
@Override
protected Transform2D createTransform(Object affineTransform) {
if (affineTransform==null) return null;
Matrix matrix = (Matrix)affineTransform;
float[] values = new float[9];
matrix.getValues(values);
return new Transform2D(
values[0], values[1], values[2],
values[3], values[4], values[5]);
}
@Override
protected Dimension createDimension(float width, float height) {
return new AndroidDimension(width, height);
}
@Override
protected Margins createMargins(float top, float left, float right,
float bottom) {
return new AndroidMargins(top, left, right, bottom);
}
@Override
protected Composite createComposite(Object compositeObject) {
if (compositeObject==null) return null;
return new AndroidComposite((Paint)compositeObject);
}
@Override
protected Composite createComposite(float alpha) {
return new AndroidComposite(alpha);
}
@Override
protected org.arakhne.afc.ui.vector.Paint createPaint(Object paintObject) {
return new AndroidPaint((Paint)paintObject);
}
@Override
protected Font createFont(String name, FontStyle style, float size) {
return AndroidPaint.getFont(name, style, size, getCurrentDrawingContext());
}
@Override
protected Font createFont(Object fontObject) {
if (fontObject==null) return null;
return new AndroidPaint((android.graphics.Paint)fontObject);
}
@Override
protected Font getDefaultFont() {
return AndroidPaint.getDefaultFont();
}
@Override
protected FontMetrics createFontMetrics(Object metricsObject) {
if (metricsObject==null) return null;
return new AndroidPaint((android.graphics.Paint)metricsObject);
}
@Override
protected FontMetrics createFontMetrics(Font font) {
if (font instanceof FontMetrics)
return (FontMetrics)font;
return new AndroidPaint(toNativeUIObject(Paint.class, font));
}
@Override
protected Image createImage(URL url) {
if (url==null) return null;
try {
return createImage(url.openStream());
}
catch (IOException e) {
throw new IOError(e);
}
}
@Override
protected Image createImage(InputStream stream) {
if (stream==null) return null;
AndroidImage img = new AndroidImage(stream);
if (img.getBitmap()==null) return null;
return img;
}
@Override
protected Image createImage(int width, int height, boolean isAlpha) {
AndroidImage img = new AndroidImage(width, height, isAlpha);
if (img.getBitmap()==null) return null;
return img;
}
@Override
protected Image createImage(Object imageObject) {
if (imageObject==null) return null;
AndroidImage img = new AndroidImage((Bitmap)imageObject);
if (img.getBitmap()==null) return null;
return img;
}
@Override
protected Image createTransparentImage(Image imageObject, float transparency) {
if (imageObject==null) return null;
Bitmap aImg = toNativeUIObject(Bitmap.class, imageObject);
Bitmap mutableBitmap = aImg.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
float t = 255f*(transparency+1f)/2f;
int colour = ((int)t & 0xFF) << 24;
canvas.drawColor(colour, PorterDuff.Mode.DST_OUT);
return new AndroidImage(mutableBitmap);
}
@Override
protected Image makeTransparentImage(Image imageObject, float transparency) {
if (imageObject==null) return null;
Bitmap aImg = toNativeUIObject(Bitmap.class, imageObject);
Bitmap mutableBitmap = aImg.isMutable() ?
aImg : aImg.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
float t = 255f*(transparency+1f)/2f;
int colour = ((int)t & 0xFF) << 24;
canvas.drawColor(colour, PorterDuff.Mode.DST_OUT);
return new AndroidImage(mutableBitmap);
}
@Override
protected void write(Image image, String type, OutputStream stream)
throws IOException {
String lt = type.toLowerCase();
Bitmap aImg = toNativeUIObject(Bitmap.class, image);
CompressFormat format;
if (lt.equals("png")) {
format = CompressFormat.PNG;
}
else if (lt.equals("jpeg") || lt.equals("jpg")) {
format = CompressFormat.JPEG;
}
else if (lt.equals("webp")) {
format = CompressFormat.WEBP;
}
else {
throw new IOException("Unsupported image type: "+type);
}
if (!aImg.compress(format, 100, stream)) {
throw new IOException("Unable to write the Android image for type: "+type);
}
}
@Override
protected Stroke createStroke(float width, LineJoin join, EndCap endCap,
float mitterLimit, float[] dashes, float dashPhase) {
return new AndroidPaint(width, join, endCap, mitterLimit, dashes, dashPhase);
}
@Override
protected Stroke createStroke(Object strokeObject) {
if (strokeObject==null) return null;
return new AndroidPaint((Paint)strokeObject);
}
@Override
protected Color createColor(int red, int green, int blue, int alpha) {
return new AndroidColor(red, green, blue, alpha);
}
@Override
protected Color createColor(Object rawColorObject) {
if (rawColorObject==null) return null;
if (rawColorObject instanceof Drawable) {
return new AndroidColor((Drawable)rawColorObject);
}
return new AndroidColor(((Number)rawColorObject).intValue());
}
@Override
protected <T> T findObjectWithId(int id, Class<T> type) {
Object o = null;
if (id==0) {
o = AndroidPaint.getDefaultFont();
}
if (o!=null && type.isInstance(o)) return type.cast(o);
return null;
}
@Override
protected int HSBtoRGB(float hue, float saturation, float brightness) {
float[] t = new float[] {hue, saturation, brightness};
return android.graphics.Color.HSVToColor(t);
}
@Override
protected Image createColorizedImage(Image imageObject,
Color filtering_color, float alpha) {
if (filtering_color==null || imageObject==null) return imageObject;
Bitmap img = toNativeUIObject(Bitmap.class, imageObject);
Bitmap mutableBitmap = img.copy(Bitmap.Config.ARGB_8888, true);
int[] pixels = new int[mutableBitmap.getHeight()*mutableBitmap.getWidth()];
mutableBitmap.getPixels(pixels, 0, mutableBitmap.getWidth(), 0, 0, mutableBitmap.getWidth(), mutableBitmap.getHeight());
int color_r, color_g, color_b;
for(int i=0; i<pixels.length; ++i) {
color_r = ((pixels[i] >> 16) & 0xff);
color_g = ((pixels[i] >> 8) & 0xff);
color_b = (pixels[i] & 0xff);
color_r = (int)((filtering_color.getRed() + color_r) * alpha);
if (color_r<0) color_r = 0;
if (color_r>255) color_r = 0;
color_g = (int)((filtering_color.getGreen() + color_g) * alpha);
if (color_g<0) color_g = 0;
if (color_g>255) color_g = 0;
color_b = (int)((filtering_color.getBlue() + color_b) * alpha);
if (color_b<0) color_b = 0;
if (color_b>255) color_b = 0;
pixels[i] = (pixels[i] & 0xff000000) | (color_r << 16) | (color_g << 8) | color_b;
}
mutableBitmap.setPixels(pixels, 0, mutableBitmap.getWidth(), 0, 0, mutableBitmap.getWidth(), mutableBitmap.getHeight());
return new AndroidImage(mutableBitmap);
}
@Override
protected Color createSelectionBackground() {
return color(0xFF9ccf00);
}
@Override
protected Color createSelectionForeground() {
return color(0xFF000000);
}
}