/*
PbiImageStream.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.pebble.util;
/**
* Pebble 用 pbi 画像のファイルイメージ作成.
*
* @author NTT DOCOMO, INC.
* @see ~/pebble-dev/PebbleSDK-2.3/Pebble/tools/bitmapgen.py を参照のこと
*/
public class PbiImageStream {
/** Pebble の int のビット数. */
private static final int CONTAIN_BITS = 32;
/** Pebble の int の byte 数. */
private static final int WORD_BY_BYTE = 4;
/** pbi ファイルイメージ. */
private byte[] mDataWithHeader;
/** pbi 総byte 数. */
private int mDataImageDataSize;
/** pbi ヘッダ長. */
private static final int HEADER_LENGTH = 12;
// 以下の 6つ のshortデータは、pbi ヘッダを表している
/** 横ラインのバイト数. */
private int mRowSizeByte;
/** pbi ファイルのバージョン. */
private static final short PBI_FIEL_VERSION = (1 << 12);
/** 開始位置 x. */
private short mX = 0;
/** 開始位置 y. */
private short mY = 0;
/** 横幅 bit 数. */
private short mWidth = 0;
/** 高さ bit 数. */
private short mHeight = 0;
/**
* Pbi ファイルイメージの作成.
*
* @param w 横幅.
* @param h 高さ.
*/
PbiImageStream(final int w, final int h) {
mWidth = (short) w;
mHeight = (short) h;
mRowSizeByte = ((mWidth + CONTAIN_BITS - 1) / CONTAIN_BITS) * WORD_BY_BYTE;
mDataImageDataSize = mRowSizeByte * mHeight;
mDataWithHeader = new byte[mDataImageDataSize + HEADER_LENGTH];
// ヘッダー作成
BinaryTools.setInt32ToByte2(mDataWithHeader, mRowSizeByte, 0);
BinaryTools.setInt32ToByte2(mDataWithHeader, PBI_FIEL_VERSION, 2);
BinaryTools.setInt32ToByte2(mDataWithHeader, mX, 4);
BinaryTools.setInt32ToByte2(mDataWithHeader, mY, 6);
BinaryTools.setInt32ToByte2(mDataWithHeader, mWidth, 8);
BinaryTools.setInt32ToByte2(mDataWithHeader, mHeight, 10);
// データ部分を初期化
for (int i = HEADER_LENGTH; i < mDataWithHeader.length; i++) {
mDataWithHeader[i] = 0;
}
}
/**
* ピクセルを描画.
*
* @param x 位置 x.
* @param y 位置 y.
* @param color 色
*/
public void setPixel(final int x, final int y, final int color) {
if (x < 0 || x >= mWidth) {
return;
}
if (y < 0 || y >= mHeight) {
return;
}
int wordPosX = x / Byte.SIZE;
int index = (mRowSizeByte * y) + wordPosX;
int bitPosX = x % Byte.SIZE;
if (color != 0) {
mDataWithHeader[index + HEADER_LENGTH] |= (1 << bitPosX);
} else {
mDataWithHeader[index + HEADER_LENGTH] &= (~(1 << bitPosX));
}
}
/**
* pbi ファイルの byte配列を得る.
*
* @return byte配列
*/
public byte[] getStream() {
return mDataWithHeader;
}
}