CLIP STUDIO PAINT の clip ファイルを扱うツールです。
現状 SQLite3 データベースを出力するくらいにしか役に立ちません。
ブロックデータの圧縮方法がよくわからないのでこれ以上は期待しないでください。zlib じゃないっぽい。
# ヘッダ、外部データ、SQLite3データに分割し、test ディレクトリを作成して出力する。
python cliputils.py -v -s -c test.clip
# 外部データのブロックデータを分割して出力
python cliputils.py -v -s --blockdata -c test.clip
CSFCHUNK、CHNK???? は識別用の文字列で8バイト。
識別文字列に続く数値はビッグエンディアン符号なし64-bit整数。
CHNKExta の外部データやそれに含まれるチャンクとその内部のブロックデータは繰り返し構造になっている。
バイト数
内容
説明
8
"CSFCHUNK"
ファイル情報チャンク識別文字列
8
整数
ファイルサイズ
8
整数?
CHNKHead の開始オフセットで24固定?
8
"CHNKHead"
ヘッダチャンク識別文字列
8
整数
CHNKHead ヘッダ情報サイズ 40固定?
40?
ヘッダ情報
内容は知らない
8
"CHNKExta"
外部(external)データチャンク識別文字列
8
整数
外部データサイズ
8
整数
extrnlid + id文字列の長さで 40固定?
40
文字列
外部データ id 文字列 (extrnlid...)
-
データ
ブロックデータ
...
...
CHNKExta チャンクの繰り返し
8
"CHNKSQLi"
SQLiteチャンク識別文字列
8
整数
SQLite3 データベースサイズ
-
SQLite3 データ
8
"CHNKFoot"
フッタチャンク識別文字列
8
整数
フッタサイズ フッタの内容は空で0固定?
sqlite の Offsets にも BlockData 位置が記録される
BlockDataBeginChunkのみサイズを表わす4-byte uintが先頭にある。
整数はビッグエンディアン32-bit符号なし整数
BlockDataBeginChunk、データ、BlockDataEndChunkの繰り返しで、次にBlockStatus、最後にBlockCheckSumで終わる。
バイト数
内容
説明
4
整数
BlockDataBeginChunk のサイズ(自身を含む)。
4
整数
文字列長(19)
-
可変長2-byte文字列
'BlockDataBeginChunk'
4
整数
ブロックデータインデックス
12
?
?
4
整数
データがある場合は 1、空の場合は 0。
-
ブロックデータ
バイト数
内容
説明
4
整数
文字列長(17)
-
可変長2-byte文字列
'BlockDataEndChunk'
BlockStatus BlockCheckSum
バイト数
内容
説明
4
整数
文字列長
-
可変長2-byte文字列
'BlockStatus' 'BlockCheckSum'
28
?
?
SQLiteデータベースのみ改変する場合は CSFCHUNK のファイルサイズと CHNKSQLi のデータベースサイズを修正する。
SQLiteデータベース内にも外部データのオフセット情報が記録されているので、外部データの長さに変更がある場合はSQLiteデータベースの Offsets も修正する。
レイヤーのサムネイル画像は外部データではなく SQLiteデータベース内にpngファイルとして入っている。
まだしっかり検証していない。 ハッキリしない部分には ? をつけた。