萌えハッカーニュースリーダー

2025/09/05 00:54 Forking Chrome to Run in the Terminal (2023)

出典: https://fathy.fr/carbonyl
hakase
博士

ロボ子、今日のニュースはCarbonylじゃ。Chromeをフォークしてターミナルでレンダリングするブラウザを作るなんて、クレイジーじゃな!

roboko
ロボ子

博士、ターミナルでChromeですか?一体どういうことでしょう?

hakase
博士

ターミナルは固定グリッドで文字を描画するから、エスケープシーケンスを使ってカーソルを動かしたり、色を変えたりするんじゃ。UnicodeのU+2584(▄)を使って、正方形ピクセルを表現するらしいぞ。

roboko
ロボ子

なるほど、文字で頑張って描画するんですね。テキストのレンダリングも工夫が必要そうですね。

hakase
博士

そうなんじゃ。Skiaデバイスを使ってテキストを描画する時に、`drawRect`と`drawRRect`メソッドを修正して、テキストの背景をちゃんとクリアするようにしたらしいぞ。Chromiumのコードも修正して、テキスト要素の背後の灰色の背景を削除したみたいじゃ。

roboko
ロボ子

細かい調整が必要なんですね。入力はどうなっているんですか?

hakase
博士

ターミナルエミュレータにマウストラッキングを指示するシーケンスを使うんじゃ。`TaskRunner`クラスを通して、メインスレッドからブラウザメソッドを呼ぶみたいじゃな。

roboko
ロボ子

なるほど。でも、それだと処理が重くなりそうですね。

hakase
博士

初期段階ではCPU使用率が高かったみたいじゃ。マルチプロセスアーキテクチャのChromeで、IPC呼び出しによるオーバーヘッドが発生するからのう。共有メモリ領域を使って効率的なレンダリングを目指しているみたいじゃ。

roboko
ロボ子

共有メモリですか。それは良いアイデアですね。

hakase
博士

`HostDisplayClient`と`SoftwareOutputDevice`を実装して、共有メモリを管理するんじゃ。`VizProcessTransportFactory::OnEstablishedGpuChannel()`も修正して、カスタム表示クライアントを使うようにしたみたいじゃな。

roboko
ロボ子

Mojoも使っているんですね。

hakase
博士

そうじゃ。プロセス間通信ライブラリMojoを使って、レンダラープロセスとブラウザプロセス間の通信を実現するんじゃ。`CarbonylRenderService`インターフェースを作って、`DrawText`メソッドを定義したみたいじゃな。

roboko
ロボ子

`BrowserInterfaceBroker`を介して実装を登録して、`GetPaintRecord()`メソッドでテキストデータを取得するんですね。

hakase
博士

CPU使用率を下げるために、`--disable-threaded-scrolling`と`--disable-threaded-animation`をコマンドライン引数に追加したみたいじゃ。

roboko
ロボ子

Blinkがフォントサイズを認識しない問題もあったんですね。

hakase
博士

`StyleResolver::ResolveStyle`にコードを追加して解決したみたいじゃ。すべての要素に等幅フォントを強制的に適用したみたいじゃな。

roboko
ロボ子

LoDPIにも対応しているんですね。

hakase
博士

HiDPIの逆で、仮想空間から物理空間へのフレームバッファのリサイズ(ダウン スケーリング)を行うんじゃ。`Display`クラスでスケーリングを強制したみたいじゃな。

roboko
ロボ子

色はどうやって表現しているんですか?

hakase
博士

RGBからxterm-256色への高速な変換式を実装したみたいじゃ。6つのカラーレベルが線形でない点も考慮しているみたいじゃな。`COLORTERM`環境変数の代わりに、DCS(Device Control Sequence)を使ってtrue-colorサポートを検出するんじゃ。

roboko
ロボ子

ターミナルのタイトルも設定できるんですね。

hakase
博士

xtermシーケンスを使ってターミナルウィンドウのタイトルを設定するんじゃ。`WebContentsObserver::TitleWasSet()`を実装して、タイトル変更時に通知を受け取るみたいじゃな。

roboko
ロボ子

今後の予定は?

hakase
博士

来月はフーリエ解析の紹介記事を公開予定で、その後、Rustでの投機的JS VMについて調査するみたいじゃ。

roboko
ロボ子

すごいですね!ターミナルでChromeが見れるなんて、夢にも思いませんでした。

hakase
博士

じゃろ?まさに技術の無駄遣い…いや、最先端じゃ!ところでロボ子、ターミナルで動くブラウザで何が見たい?

roboko
ロボ子

そうですね… やっぱり、アスキーアートでしょうか?

hakase
博士

アスキーアートか… それはCarbonylの作者も予想外じゃったかもしれんのう。もしかしたら、作者はロボ子のために作ったのかも… なんちゃって!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search