bitmap フォントについて
まず、前提条件として中の人は画像処理系をあまり理解していません
かなり適当な事を書いていますのでご容赦ください。
bitmap フォントには、画像データ,グリフの座標情報の2点が必要です。
まず、画像データから
tex → png 変換
Unity の画像は Texture2D で UnityEx では28で拡張子が tex のものになります。まず抽出します。
Tex ヘッダ
struct Tex {
img_width: u32,
img_height: u32,
img_size: u32,
tex_type: u32,
mipmaps: u32,
num0: u32,
num1: u32,
num2: u32,
num3: u32,
num4: u32,
num5: u32,
num6: u32,
num7: u32,
mipmap_flag: u32,
img_size2: u32,
}
num0~num7と不明な部分が多いです
---------------------------------------------------------------
追記: 判明したので修正
struct Tex {
img_width: u32,
img_height: u32,
complete_image_size: u32,
texture_format: u32,
mip_count: u32,
is_readable: u8,
read_allowed: u8,
padding: u16,
image_count: u32,
texture_dimension: u32,
filter_mode: u32,
aniso: u32,
mip_bias: f32,
wrap_mode: u32,
lightmap_format: u32,
color_space: u32,
img_size: u32,
}
---------------------------------------------------------------
まず、tex_type を見ます。
enum TexType {
Alpha8, // 0x1
RGBA32, // 0x4
ARGB32, // 0x5
RGB565, // 0x7
DXT1, // 0xA
DXT5, // 0xC
}
この部分は Unity TextureFormat の数ありますので、上記に無いフォーマットのデータ形式もあります。
今回の LIB では上記のフォーマットのみなので上記の enum になっています。
各自の実装に依ると思いますが、自分の使用しているライブラリでは pixel はグレイスケール・フルカラーの2点のみで上記の Alpha8 とかのフォーマットはそのままでは使えません。なので自前で読み込みます。
Alpha8:
これは alpha が1バイトで連続して格納されているので読み込んで alpha, glay(0固定) で pixel 設定して png で save すると png ファイルが生成されます。ただこのままだと上下左右反転した画像になっているので出力する前に180度回転・左右反転を行ったあとに png 出力します。
フォント画像は、この alpha8 です。
RGBA32, ARGB32:
RGBA32 と ARGB32 は格納されている順番が違うだけなので、4バイト読み込み順番を揃えてフルカラー pixel に設定して png 出力
反転してますので180度回転・左右反転を行う
RGB565:
LIBではブランクデータのみなので実装せず。
DXT1,DXT5:(DDS)
DDSなのでこれは png ではなくそのまま出力します。DDSヘッダーが無いので付加します。
struct DDSHeader {
magic: u32, // 0x20534444("DDS ")
header_size: u32, // 0x7C
flag: u32, // 0xA1007
img_height: u32,
img_width: u32,
pitch: u32, // img_width * img_height
depth: u32, // 0
mipmap_count: u32,
reserve1: [u8; 44], // 0 fill
pixel: Pixel,
caps1: u32, // 0x401008
caps2: u32, // 0
caps3: u32, // 0
caps4: u32, // 0
reserve2: u32, // 0
}
struct Pixel {
size: u32, // 32
flag: u32, // 4
four_cc: u32,
rgb_bit_count: u32, // 0
r_mask: u32, // 0
g_mask: u32, // 0
b_mask: u32, // 0
a_mask: u32, // 0
}
Pixel の four_cc は DXT1 なら 0x31545844("DXT1") DXT5 なら 0x35545844("DXT5")
mipmap_count は tex の mipmap_flag が 1 なら mipmap mode で img_height と img_width を比較して大きい方の値を元に算出する。
img_width が 2048 の場合
2048 = 2^11
11-1=10
よって mipmap_count = 0xA(10) となる。
このヘッダーを付加して DDS ファイルを出力すると良い。
この画像も上下左右反転していますが、画像編集ソフトで反転してから画像編集すると良いでしょう。
戻すときも画像反転を忘れないように。
png → tex 変換
上記の反対をするだけなんですが、問題は tex ヘッダーの部分です。不明な部分があるのでヘッダーは元のヘッダーを使用すると良いでしょう。
画像反転を忘れないように。
以上で画像データの取り出し・格納が出来るようになります。
座標情報は次回
ARIAL SDF Atlas.tex
sharedassets0_00001.-1
まず、前提条件として中の人は画像処理系をあまり理解していません
かなり適当な事を書いていますのでご容赦ください。
bitmap フォントには、画像データ,グリフの座標情報の2点が必要です。
まず、画像データから
tex → png 変換
Unity の画像は Texture2D で UnityEx では28で拡張子が tex のものになります。まず抽出します。
Tex ヘッダ
struct Tex {
img_width: u32,
img_height: u32,
img_size: u32,
tex_type: u32,
mipmaps: u32,
num0: u32,
num1: u32,
num2: u32,
num3: u32,
num4: u32,
num5: u32,
num6: u32,
num7: u32,
mipmap_flag: u32,
img_size2: u32,
}
num0~num7と不明な部分が多いです
---------------------------------------------------------------
追記: 判明したので修正
struct Tex {
img_width: u32,
img_height: u32,
complete_image_size: u32,
texture_format: u32,
mip_count: u32,
is_readable: u8,
read_allowed: u8,
padding: u16,
image_count: u32,
texture_dimension: u32,
filter_mode: u32,
aniso: u32,
mip_bias: f32,
wrap_mode: u32,
lightmap_format: u32,
color_space: u32,
img_size: u32,
}
---------------------------------------------------------------
まず、tex_type を見ます。
enum TexType {
Alpha8, // 0x1
RGBA32, // 0x4
ARGB32, // 0x5
RGB565, // 0x7
DXT1, // 0xA
DXT5, // 0xC
}
この部分は Unity TextureFormat の数ありますので、上記に無いフォーマットのデータ形式もあります。
今回の LIB では上記のフォーマットのみなので上記の enum になっています。
各自の実装に依ると思いますが、自分の使用しているライブラリでは pixel はグレイスケール・フルカラーの2点のみで上記の Alpha8 とかのフォーマットはそのままでは使えません。なので自前で読み込みます。
Alpha8:
これは alpha が1バイトで連続して格納されているので読み込んで alpha, glay(0固定) で pixel 設定して png で save すると png ファイルが生成されます。ただこのままだと上下左右反転した画像になっているので出力する前に180度回転・左右反転を行ったあとに png 出力します。
フォント画像は、この alpha8 です。
RGBA32, ARGB32:
RGBA32 と ARGB32 は格納されている順番が違うだけなので、4バイト読み込み順番を揃えてフルカラー pixel に設定して png 出力
反転してますので180度回転・左右反転を行う
RGB565:
LIBではブランクデータのみなので実装せず。
DXT1,DXT5:(DDS)
DDSなのでこれは png ではなくそのまま出力します。DDSヘッダーが無いので付加します。
struct DDSHeader {
magic: u32, // 0x20534444("DDS ")
header_size: u32, // 0x7C
flag: u32, // 0xA1007
img_height: u32,
img_width: u32,
pitch: u32, // img_width * img_height
depth: u32, // 0
mipmap_count: u32,
reserve1: [u8; 44], // 0 fill
pixel: Pixel,
caps1: u32, // 0x401008
caps2: u32, // 0
caps3: u32, // 0
caps4: u32, // 0
reserve2: u32, // 0
}
struct Pixel {
size: u32, // 32
flag: u32, // 4
four_cc: u32,
rgb_bit_count: u32, // 0
r_mask: u32, // 0
g_mask: u32, // 0
b_mask: u32, // 0
a_mask: u32, // 0
}
Pixel の four_cc は DXT1 なら 0x31545844("DXT1") DXT5 なら 0x35545844("DXT5")
mipmap_count は tex の mipmap_flag が 1 なら mipmap mode で img_height と img_width を比較して大きい方の値を元に算出する。
img_width が 2048 の場合
2048 = 2^11
11-1=10
よって mipmap_count = 0xA(10) となる。
このヘッダーを付加して DDS ファイルを出力すると良い。
この画像も上下左右反転していますが、画像編集ソフトで反転してから画像編集すると良いでしょう。
戻すときも画像反転を忘れないように。
png → tex 変換
上記の反対をするだけなんですが、問題は tex ヘッダーの部分です。不明な部分があるのでヘッダーは元のヘッダーを使用すると良いでしょう。
画像反転を忘れないように。
以上で画像データの取り出し・格納が出来るようになります。
座標情報は次回
ARIAL SDF Atlas.tex
sharedassets0_00001.-1
コメント