4

C または C++ で、カラー パレットの RGB 値を直接読み取る方法はありますか? 特に興味深いのは、最大 256 のターミナル カラーを定義するために xterm (およびその他) で使用される拡張カラー スペースです。

ポテト

適切なケースは、(ANSI エスケープ シーケンスを使用して、または c で直接) 独自の色を定義したいが、\e]4;3;rgb:cc/78/33\e\\再定義する前にユーザーの色を保存する必要があることです (まれに、ユーザーが既に色を再定義している場合)。 ) プログラムが終了したときにそれらを復元できるようにします。ユーザー設定を壊すのは良くありません。

現在、ANSI エスケープ シーケンスを使用してクライアントの方法でこれを行うことを目指しています。しかし、色を出す方法が見つからないので、代わりに c または c++ でこれを行うことを検討し始めています。

ソリューションは、ネイティブ拡張機能 (基本的には c または c++ コードが埋め込まれたもの) を備えた ruby​​ gem として作成されます。主なターゲットは OS X であり、次に Linux 環境であっても、クロスプラットフォーム ソリューションを取得することを目指します...

ソース

最初の実験から、カラー パレットのコード ポイントに必要な色を定義できるようになりました。デフォルトのシステム カラーを簡単に復元することもできます (ANSI 標準であるため)。私は ANSI エスケープ コードでこれを行う方法をよく調べましたが、何も見つかりませんでした。これはどこかにメモリに保存されていると思います。どこにあるかを見つける方法があれば、色を読むのは簡単なはずです...

デザート

これまでのコメントの情報を要約するには:

これを一貫して行う唯一の方法は、█文字の画面を異なる色で印刷し、そこから色を取得することです。このプロジェクトは 3 つの主要な OS にまたがるクロス プラットフォームであると想定されており、Linux では現在 3 つのディスプレイ マネージャーが使用されており、Windows には 2 つ (7 と 8) があるため、何時間も楽しめることしか想像できません。だろう :)

したがって、私の「解決策」™ は、ユーザーの色を上書きすることです (システムのデフォルト以外の色があった場合、これはかなり珍しいことです)。システムのデフォルトに満足できない場合に、どの色を復元する必要があるかをユーザーがプラグインに伝えることができる設定ファイルを提供します。実用的で退屈ですが、これでまたやり直せます :)

4

1 に答える 1

1

[編集1]申し訳ありませんが、これは解決につながりませんが、他の人のためにDACパレットIOアクセスを追加しました

古いレガシー EGA/VGA リファレンスを見てください ...

  • I/O経由でパレットにアクセスできます
  • ポート0x03C8、0x03C9 hexだったと思います。
  • もちろん、最新のOSではアクセスできません
  • DOS-BOXなどで試してみて、元のパレット値を保存してください。それらは同じはずです。

直接アクセスするには、これを試してください:

BYTE r,g,b,c=5; // R,G,B values are 6 bit only !!!
out 0x3C8,c;    // set color index to work with <0,255>
in  r,0x3C9;    // read color pallete for color c
in  g,0x3C9;    // not sure if it should be r,g,b 
in  b,0x3C9;    // or b,g,r ... i did not use it for too many years
out 0x3C8,c;    // set color index to work with <0,255>
out 0x3C9,r;    // write color pallete for color c
out 0x3C9,g;
out 0x3C9,b;

C/C++ には in,out 操作がないため、次を使用します。

BYTE i,o;       // this must be local !!!
WORD port;      // this must be local !!!
asm {
    mov dx,port // in i,port
    in al,dx
    mov o,al

    mov dx,port // out port,o
    mov al,o
    out dx,al
    }
于 2013-10-28T18:48:22.670 に答える