package com.brightgenerous.zxing.deleg.android;
import java.io.IOException;
import java.io.OutputStream;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.Color;
import com.brightgenerous.zxing.EncodeArguments;
import com.brightgenerous.zxing.android.BitmapEncodeArguments;
import com.google.zxing.common.BitMatrix;
class ImageCreaterImpl<T> implements ImageCreater<T> {
{
check();
}
private static void check() {
try {
Class.forName(Bitmap.class.getName());
Class.forName(CompressFormat.class.getName());
Class.forName(Config.class.getName());
Class.forName(Color.class.getName());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean useful(EncodeArguments args) {
if (args == null) {
return true;
}
if (args instanceof BitmapEncodeArguments) {
return true;
}
return false;
}
@Override
public T toImage(BitMatrix bitMatrix, EncodeArguments args) {
return (T) createBitmap(bitMatrix, args);
}
@Override
public void writeToStream(BitMatrix bitMatrix, String format, int quality,
OutputStream outputStream, EncodeArguments args) throws IOException {
Bitmap bmp = createBitmap(bitMatrix, args);
CompressFormat cf = null;
if (format != null) {
for (CompressFormat e : CompressFormat.values()) {
if (e.toString().equals(format)) {
cf = e;
break;
}
}
if (cf == null) {
if (format.toLowerCase().startsWith("jpeg")) {
cf = CompressFormat.JPEG;
} else if (format.toLowerCase().startsWith("png")) {
cf = CompressFormat.PNG;
} else if (format.toLowerCase().startsWith("webp")) {
cf = CompressFormat.WEBP;
}
}
if (cf == null) {
throw new IllegalArgumentException(String.format("not found format by name %s",
format));
}
} else {
cf = CompressFormat.PNG;
}
bmp.compress(cf, quality, outputStream);
}
protected Bitmap createBitmap(BitMatrix bitMatrix, EncodeArguments args) {
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
int[] pixels = new int[width * height];
Config config = null;
int frontColor;
int backColor;
{
Integer fc = null;
Integer bc = null;
if ((args != null) && (args instanceof BitmapEncodeArguments)) {
BitmapEncodeArguments ba = (BitmapEncodeArguments) args;
config = ba.getConfig();
fc = ba.getFrontColor();
bc = ba.getBackColor();
}
if (config == null) {
config = Config.ARGB_8888;
}
if (fc == null) {
frontColor = Color.BLACK;
} else {
frontColor = fc.intValue();
}
if (bc == null) {
backColor = Color.WHITE;
} else {
backColor = bc.intValue();
}
}
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = bitMatrix.get(x, y) ? frontColor : backColor;
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
}