Windows 10の次期大型アップデートで現在プレビュー版が提供されている19H1（来年4月にリリース予定）では、コンソールが改良された。具体的には、文字色と背景色で「デフォルトカラー」をサポートした。そのほかにカーソルの形状や色の指定などが可能になっている。ここでは、この文字色と背景色について考えてみる。

Windowsコンソールの表示色は

IBM PC当初のハードウェアの制限を受け続けていた

そもそもWindowsのコンソールは、Win32アプリケーション（デスクトップアプリケーション）がコンソールAPIを使って出力などをするように作られたもの。コンソールは、文字や背景の色を16個のカラーコードで指定する。つまり全部で16色しか利用できない。

WindowsアプリケーションはグラフィックスでRGB各8bitのフルカラーを使えるというのに、コンソールの中の文字や背景の色はたった16色しか指定できないのである。

これは、IBM PCに搭載されたCGAなどのテキストモードの仕様を引き継いだからだ。現在のコンソールは、アプリケーションが指定した文字列をWindowsがフォントのビットパターンとして描画している。しかし、IBM PCが発売された当時は、CPUも高速ではなかったため、現在のような「ビットマップディスプレイ」で文字を扱うと描画速度が遅くなってしまう。

そんなIBM PCのディスプレイカード（CGA、MGAと呼ばれるハードウェア）では、文字をハードウェアで表示していた。具体的には、ビデオメモリーに文字コードとアトリビュートを書き込むと、ハードウェアでフォントパターン（当時は、これをキャラクタージェネレーターと呼んでいた）として表示させていた。プログラム側は、8bitの文字コードをビデオメモリに書き込むだけで、文字が表示できた。

このときビデオメモリには、文字コードだけでなく、表示色を指定する「アトリビュート」も同時に書き込んだ。合わせて16bitをメモリに書き込むだけで文字が表示できたわけだ。IBM PCはそのままではいわゆる7bitアスキーコードや互換の1バイト文字コードしか想定しておらず、日本語の表示はできない。

アトリビュートは、表示モード（たとえば白黒モードなどもある）によって違うが、テキストモードでは、上位4bitが背景色、下位4bitが文字色になっていた（正確には、点滅ビットや輝度ビットなどがあるのだが、それについては省略）。それぞれ4bitしかないため、最大16色しか指定できない。

そもそも、CGAは16色表示のCRTディスプレイのためのハードウェアで、最大16色しか表示させることができなかった。16色表示のディスプレイは、Red、Green、BlueのいわゆるRGB各1bitと輝度（Intensety）1bitの4bitでドットを表現する。RGB各1bit値を組みあわせた8色（黒、青、緑、シアン、赤、マゼンタ、ブラウン、明るいグレー）の暗い色と明るい色で合計16色となる（明るいグレーの輝度の高いものが白。黒の輝度の高いものが暗いグレー、ブラウンの輝度の高いものが黄色になることに注意）。

この仕組みはずっと継承されており、後継のEGA、PS/2向けに開発されたVGAでもテキストモードは、この方式のアトリビュートを使っていた。VGAではこの16色に対して、RGB値を自由に割り当てる「カラーパレット」の仕組みも持っていた。カラーパレットを使うことで、同時に表示できる色は16色だが、任意の色を表示させることができた。

Windowsのコンソールは、CGAやVGAのテキストモードを前提に開発されたMS-DOSアプリケーションを移植しやすいように作られた。このため、テキスト表示時のアトリビュートは、CGAから使われている「伝統ある」方式を踏襲している。

また、カラーパレットもコンソールAPIから制御可能だ。さらに、コンソールプロパティのダイアローグボックスにある「画面の色」タブで、ユーザーは手動で16色に対して任意のRGB値を設定することもできる。