DrawHighQualityUnicodeTextDemo
日本語(ユニコード、2バイト文字)を呈示するデモです。
(日本語の呈示についてもご覧ください)
このデモはどんな環境でも動作するようにするために、やや複雑なコードになっていますが、特定の環境でのみ動作すればよいのであればもっと簡単に書くことができます。
以下ではデモプログラムの内容を簡単に説明します。
Screen('Preference', 'TextRenderer', 1);
Screen('Preference', 'TextAntiAliasing', 1);
Screen('Preference', 'TextAlphaBlending', 0);
この3行はコメントにも書いてあるように必ずしも必要ありません。
Screen('Preference', 'DefaultTextYPositionIsBaseline', 1);
これをしていないデフォルトの状態では、Screen('DrawText')もしくはDrawFormattedTextで指定するY座標が、文字の「上部」になります。この1行により、文字の「下部」に変更になります。
Screen('TextFont',w, 'Courier New');
Screen('TextSize',w, 48);
Screen('TextStyle', w, 0);
フォントの種類、サイズ、スタイル(太字など)を指定します。
Screen('DrawText', w, double('Hello'), 300, 100, [255, 0, 255]);
(x, y) = (300, 100)の座標に"Hello"という文字列を描画します。
Xの座標は、文字列の左端になります。
Yの座標は、DefaultTextYPositionIsBaseline を1にしているので、文字列の下部になります。(デフォルトのままであれば文字列の上部です)
[255, 0, 255]はRGB値で、文字の色です。
Screen('DrawText', w, double('World!'));
文字列を描画する座標が指定されていませんが、この場合は、前回書き終えた文字列(このデモでは"Hello")の直後になります。
japanesetext = [26085, 26412, 35486, 12391, 12354, 12426, 12364, 12392, 12358, 12372, 12374, 12356, 12414, 12375, 12383, 12290, 13, 10];
これだけ見るとなんのことだか意味が分かりませんが、これは「日本語でありがとうございました。」という文字列を表すユニコードの行ベクトルになっています。
例えば一番最初の数字「26085」が日本語の「日」に対応しています。
どうしてこんなまどろっこしい書き方になっているかと言いますと、どのような環境でもデモプログラムが正しく動作するためです。
実はほとんどの環境で、
japanesetext = double('日本語でありがとうございました。');
で問題なく動作します。(doubleは不要な場合もあります)
ちなみに
char([26085, 26412, 35486])
で、「日本語」という文字列が返ってきます。
逆に「日本語」のユニコード(double型の数字、倍精度値)を知りたい場合は
double('日本語')
とします。
if 0
fid = fopen([PsychtoolboxRoot 'PsychDemos/japanese_shiftJIS.txt'], 'r', 'n','Shift_JIS');
japanesetext = native2unicode(fread(fid),'Shift_JIS'); %#ok<N2UNI>
fclose(fid);
disp(japanesetext);
japanesetext = double(transpose(japanesetext));
end
この部分は実際には実行されていません(if 0 であるため)。呈示したい文字列をテキストファイルに保存しておいて、それを読み込み、画面に呈示させることもできますよ、という案内です。
if IsOSX
allFonts = FontInfo('Fonts');
foundfont = 0;
for idx = 1:length(allFonts)
if strcmpi(allFonts(idx).name, 'Hiragino Mincho Pro W3')
foundfont = 1;
break;
end
end
if ~foundfont
error('Could not find wanted japanese font on OS/X !');
end
Screen('TextFont', w, allFonts(idx).number);
end
ここはMacで日本語を呈示するときに、日本語フォント(ヒラギノ明朝)を設定する方法です。
FontInfo関数ですべてのフォント情報を取得して、その中からヒラギノ明朝を探しています。もちろん、インストール済みのフォントであればヒラギノ明朝以外も利用可能です。
余談ですが、上記を踏まえて、中国語を呈示する方法を説明します。
中国語のように、Matlabのコードのなかに記入することが難しい言語を呈示したいときには、あらかじめその言語で書かれたテキストファイルを文字コード utf-8 を使用して保存しておきます。
ここではファイル名をchinese.txtとしています。
(注意:以下のコードはMac専用です)
strFileName = 'chinese.txt'; % テキストファイル名
strFid = fopen([strFileName], 'r', 'n','utf-8'); % ファイルを開く
mytext = native2unicode(fread(strFid),'utf-8'); % ファイルを読み込む
fclose(strFid); % ファイルを閉じる
mytext2 = double(transpose(mytext)); % 文字列の行列を入れ替える
% 中国語のフォント設定
allFonts = FontInfo('Fonts');
for idx = 1:length(allFonts)
if strcmpi(allFonts(idx).name, 'Simhei') % 中国語のフォントとして、Simhei を使用
chineseIndex = idx;
foundfont = 1;
break;
end
end
Screen('TextFont', windowPtr, allFonts(chineseIndex).number);
DrawFormattedText(windowPtr, mytext2, 'center', 'center'); % 中国語の描画
デモの解説に戻ります。
if IsLinux
if 1
Screen('TextFont', w, '-:lang=ja');
else
Screen('TextFont', w, '-:lang=he');
japanesetext = 1488:1514;
end
end
Linuxでのフォントの設定方法です。Linuxではフォント名を指定することができないのかもしれません(未確認)ヘブライ語なども設定できると書いてあります。
y = 200;
y座標はあとからも使うために、ここで設定しています。
Screen('DrawText', w, japanesetext, 20, y, 0);
ノーマルに日本語を呈示しています。(x, y) = (20, 200)です。0は黒色を意味しています。
Screen('DrawLine', w, [0 255 0], 100, y - 48, 1400, y - 48);
Screen('DrawLine', w, [0 255 0], 100, y, 1400, y);
この2行は日本語の呈示とは直接の関係はありません。
DrawTextコマンドが、テキストの高さをどれくらい正しく描画できているかを確認するために、緑の線を文字列の上下に水平に描画しています。(テキストのサイズを48ポイントに設定していることに留意してください)
DrawFormattedText(w, japanesetext, 'center', 'center');
DrawTextよりも高機能なDrawFormattedTextコマンドの描画をテストしています。画面の中央に文字列が描画されるはずです。
以降の説明は、日本語の呈示には直接の関係はありません。
Screen('TextFont',w, 'Times');
Screen('TextSize',w, 86);
Screen('DrawText', w, 'Hit any key to continue.', 100, 600, [255, 0, 0]);
教示(Hit any key to continue.)を描画するため、フォントをTimesにサイズを86に変更しています。TimesフォントはどのOSでも使用できるのだと思います。
[normRect realRect] = Screen('TextBounds', w, 'Hit any key to exit.', 100, count);
文字列(Hit any key to exit.)を(x, y) = (100, count) に描画するときの、文字列を囲む長方形の座標を取得します。ここでは座標を取得するだけで、実際に描画はされません。
normRectは、文字列の左上の座標を(0, 0)としたときの長方形の座標です。
realRectは、画面の左上を(0, 0)としたときの長方形の座標です。
Screen('DrawText', w, 'Hit any key to exit.', 100, count, [255, 0, 0, 255]);
ここで実際に、文字列(Hit any key to exit.)を描画しています。
Screen('FrameRect', w, [255 0 255], realRect);
確認のために、realRectの長方形の枠を描画しています。