diff --git a/DEVLOG.md b/DEVLOG.md index cb82288..8155087 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,6 +2,42 @@ --- +## 2026-10-22(MOSS-Image タブ: 吹き出しなしの単独テキストの取込、panelラベルの使い分け、空の文字枠の送信除外、未リリース) + +**1. 吹き出しなしの単独テキストの取り込み(新機能)** +- 「フキダシ・セリフを取り込む」に、チェックボックス「吹き出しなしの文字も取り込む」(既定オン)を追加。テキストツールで置いた `` を文字枠として取り込む。フキダシ内のテキスト(`g.balloon-shape` の子)と `defs` / `clipPath` / `mask` / `pattern` 内のテキストは対象外。 +- 回転・拡縮・せん断・縦書きを含む実際の見た目の範囲が要るため、文字だけの新しいSVGを画面外(`position:fixed; left:-100000px`)へ描画し、`getBoundingClientRect()` で実測する(`extractFreeTexts`)。`document.fonts.ready` を待ってから測る。枠は実測範囲+フォントサイズの0.15倍の余白で、`fitBox=false`(文字を編集しても枠が縮まない)。フォントサイズは `font-size` × `data-scale-x/y` の幾何平均 × キャンバス倍率。縦書きは `style` の `writing-mode`。 +- caption は文字数による簡易な推定(6文字以下=`Sound effect.`、それ以外=`Narration text.`)。回転した文字は外接矩形になる(MOSS-Imageの枠は回転を表せない)。 +- 再取込は、取り込み済みの枠(`src: 'balloon'` / `'text'`)だけを入れ替える。チェックを外して取り込むと、前回の単独テキストの枠は残る。 + +**2. セキュリティ修正(取込の途中で発見・修正)** +- 初版は保存済みページのSVG文字列を `innerHTML` で画面外のDOMへ入れていたため、保存済みSVGに紛れた `onload` / `onerror` 等が実行されうる(旧方式では実際に実行されることを確認)。まず `DOMParser` + `sanitizeSvgTree()` に変えたが、禁止リスト方式では名前空間付きの要素(``)、`` / ``、`style` 内の `url()` 等の抜け道を塞ぎきれない。 +- 最終形は許可リスト方式: 保存済みSVGは描画せず(パースしただけのDOMは何も実行しない)、`` / `` と許可リストの属性(`x y dx dy font-* letter-spacing text-anchor transform data-scale-*`)・許可プロパティだけの `style`・祖先 `` の `transform`(`matrix/translate/scale/rotate/skew` の形式のみ)を、新しく作ったSVGへ写して測る。値は括弧・`;`・`:`・`/` を通さない。攻撃用SVG(名前空間付き `script`、XHTMLの `iframe srcdoc`、`set` / `animate`、`javascript:` のリンク、`style` 内の `url()`)で、スクリプトの実行0件・外部通信0件を確認した。 + +**3. 枠固定の文字の表示** +- 取り込んだフキダシ・単独テキスト(`fitBox=false`)の表示を、枠の幅で折り返す(`white-space: pre-wrap`)。実ページの思考フキダシの長い英文が、枠の外へ1行ではみ出して見えていたため。MOSS-Image も枠の中で折り返す。単独テキストは左上(縦書きは右上)から置く。 + +**4. panel ラベルの使い分けと、空の文字枠の送信除外** +- 描画種別・種別セレクトに「コマ」(`panel` ラベル)を追加(黄色)。コマ取込の `panel` ラベル化はチェックボックス(既定は `object`)。`panel` は学習時にあるラベルだが、公開仕様は `object / character / text` のみ。32枚(8シード×4通り)の測定で、`object` との差は誤差の範囲内(枠線・ガターの再現度)、`summary.canvas: "multi_panel"` も同様だった。ユーザーが使い分けられるように選べる形にした。 +- 文字が空(空白のみ)の `text` item は、`_moss_layout_prompt` で除外する。送ると、モデルがその領域を「文字を書く領域」と解釈して、罫線入りの紙のようなものを描いてしまう(8シード中8)。公式コンパイラも空の `text` を拒否する。UIでは破線で薄く表示する(入力のたびに切り替わる)。 + +**5. 調査(実装なし)** +- MOSS-Image の bbox: 公式仕様では、`items` のキーは `label / caption / bbox / text / tags / palette` のみ、bbox は軸並行の長方形(4つの数値)。回転角・形状(多角形)の項目はない(公式コンパイラは未知のフィールドを拒否)。非公式の `rotation` 項目は無視される。caption の英文での回転指示は、回転後の外接矩形と併用すると傾くが、文字が崩れやすい。形状は caption の英文で表現する。 +- 参照画像ノード `ThetaCursed/ComfyUI-MOSSImageTextEncoder`(Qwen3.5の視覚タワー経由の参照画像条件づけ)を実機で検証(導入はコミット `289170a` 固定。CC本体は未使用): エラーなく動き、参照なしは標準と画素同一、時間・VRAM問題なし。レイアウトなしでは参照が構図を乗っ取る(シート全体を渡すとシートそのものが出る)。レイアウトJSON併用なら構図は保たれるが、全身の参照は近景のコマに白背景が漏れる。単純なデザインでは文章の外見説明で参照と同等に揃う。このため「キャラ設定(文章)の登録・自動挿入」を先に検討したが、今回は見送り(スクリプトタブの要素・Autoタブの脚本との関係を整理してから再検討)。 + +**6. 検証** +- 実ページ(ユーザーの保存済み45ページ)で、フキダシ168件・単独テキスト8件を、エラー・異常値なしで抽出できた。実ページ「これはTEST_p1_1791201461030」の取込結果(位置・大きさ・フォントサイズ)を元データと突き合わせて一致を確認し、取り込んだレイアウトで生成して、縦長の吹き出し・思考フキダシ(英文)・擬音「あ」が指定の位置に描かれた。 +- 未確認: 英語・中国語UIの表示、擬音かナレーションかの推定の精度、回転した単独テキストの実ページでの見た目。 +- `py/ccc.py` を変更したため、反映にはComfyUIの再起動が必要(再起動後に、`panel` ラベルの通過と空の文字枠の除外をAPIで確認済み)。 + +**How to apply** +- ページのSVG文字列を、保存済みでも外部由来でも、`innerHTML` でDOMへ入れない。DOMへ描画する必要があるなら、許可リスト方式で必要な要素・属性だけを新しいDOMへ写す。禁止リスト方式(`sanitizeSvgTree`)は、名前空間付きの要素やアニメーション要素を塞ぎきれない。 +- 外部モデルの仕様外の入力(空の `text` など)は、「無視されるだけ」と仮定せず、同じシードで有無を比べて確かめる。 +- 回転・拡縮を含む `` の範囲は、数式ではなく、画面外に描画して `getBoundingClientRect()` で測るのが確実(`document.fonts.ready` を待つ)。 +- 再取込できる要素には `src` のような印を付け、再取込では印の付いたものだけを入れ替える。 + +--- + ## 2026-10-22(MOSS-Image タブ: シードの動作モード、フキダシ・セリフの自動取込、シード欄のレイアウト変更、v1.58.1) **1. シードの動作モード(修正・改善)**