/usr/share/psychtoolbox-3/PsychDocumentation/DrawTextEncodingLocaleSettings.m is in psychtoolbox-3-common 3.0.9+svn2579.dfsg1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | % DrawTextEncodingLocaleSettings
%
% If you are just concerned with drawing "standard" ASCII text with the
% Screen('DrawText', window, text); command, i.e. text that only contains
% "standard" latin characters, e.g., abcdef....ABCDEF.... and numbers
% 01234567890 and a few punctuation marks and symbols like .,!?#@$%& etc.
% then there's nothing you'd need to do. Screen('DrawText') and
% DrawFormattedText() will process these just fine.
%
% If you want to draw "native" unicode text strings conforming to
% UTF-16 encoding with characters or code points in the BMP (Basic
% multilingual plane), you can simply convert your string of unicode code
% points into a vector of doubles, ie., pass it as a vector of numbers of
% class double(), e.g., text = [1424, 1425, 1426] for the first three
% characters of the hebrew alphabet.
%
% Direct drawing of unicode text characters outside the BMP is possible in the
% same way on GNU/Linux with its default textrenderer, and on OS/X with
% Screen('Preference','TextRenderer', 2); set, if you've installed the
% neccessary software as described in "help DrawTextPlugin". In that case,
% the unicode code points may have values greater than 65535, ie., they are
% processed internally as UTF-32 / UCS-4 characters - Each single number
% represents exactly one character and the numbers can be codepoints from
% any Unicode plane.
%
% The standard OS/X text renderer and MS-Windows text renderer only support
% UTF-16 / UCS-2 encoding. Therefore, characters outside of the BMP must be
% represented by pairs of codepoints, each with a value between 0 and 65535
% - Two consecutive values in your double vector will represent one
% character from outside the BMP.
%
% You can also draw non-ASCII character strings encoded into some single-byte
% encoding scheme, multibyte encoding scheme or unicode characters that are
% not encoded as doubles but as a sequence of UTF-8 encoded bytes. To do
% so, first you have to tell Screen() the encoding scheme of the character
% string by a call to Screen('Preference','TextEncodingLoale', newloc);
% newloc is the name of the text encoding scheme to use. Example names for
% valid locales could be 'en_US.ISO8859-1' for single-byte ISO8859-1
% "Latin-1" encoding, or 'UTF-8' for UTF-8 encoded unicode text, or 'C' for
% default C language character encoding. Passing an empty string '' will
% reset the setting to the system default of your operating system. The
% function returns the previous setting. On OS/X and Linux you can type
% "locale -a" in a terminal window to list all supported settings. For
% MS-Windows you can find supported codepages under this URL:
% http://msdn.microsoft.com/en-us/library/dd317756%28VS.85%29.aspx
% e.g., setting a locale of '.1252' would select MS-Windows codepage 1252,
% aka 'windows-1252'.
% A setting of 'UTF-8' for UTF-8 encoded unicode should always work. The
% set of other supported encodings is highly operating system dependent.
%
% After you've told Screen the encoding to use, you can pass strings to
% Screen('DrawText'). If you want to make sure that Matlab or Octave don't
% tamper in unexpected or uncontrollable ways with your string, you can
% pass the string as a uint8 vector. Passing the string as uint8 vector is
% recommended in most cases. Different versions of Matlab and Octave store
% and process regular char() character strings in different ways on
% different operating systems which can often lead to unexpected results.
% On some setups you will be able to directly pass regular text strings,
% but this is not guaranteed to be portable across different computer
% systems, Matlab or Octave versions.
%
% If you get unexpected results for given text strings you can call
% Screen('Preference','Verbosity', 10); before a drawtext operation. The
% function will then print the passed string as a sequence of numbers after
% conversion into unicode format. This allows to check what kind of unicode
% characters were generated.
%
%
% Assuming Screen('DrawText') managed to receive your final (unicode) text
% string correctly, you'll also have to make sure that a font is selected
% that supports the characters in your string. E.g., not all fonts support
% hebrew characters. Use Screen('TextFont', window, fontName); to select a
% proper font fontName. How to find such a font is operating system
% specific. On Linux, the text renderer allows to select fonts by
% properties instead of names as well, e.g., it allows to select a font
% that supports a requested language:
% Screen('Textfont', window, '-:lang=he'); would select a font that
% supports hebrew. Screen('Textfont', window, '-:lang=ja'); would select a
% font that supports japanese script. See some more examples in the code of
% DrawHighQualityUnicodeTextDemo.m. The same works on OS/X with text
% renderer type 2.
%
% If you type DrawTextEncodingLocaleSettings to run this script, you may
% see some hebrew characters rendered if your systems fonts and text
% renderers do support this. This code also acts as a sample on how to pass
% UTF-8 unicode strings to 'DrawText'.
%
AssertOpenGL;
try
screenid = max(Screen('Screens'));
w = Screen('Openwindow', screenid, 255);
Screen('TextSize', w, 48);
if ~IsWin
Screen('Preference', 'TextRenderer', 2);
Screen('TextFont', w, '-:lang=he');
end
% Some uint8 vector with UTF-8 encoded hebrew characters:
y = uint8([215 148 215 169 215 160 215 153 215 157 44 32 215 149 215 160 215 162 215 169 215 148]);
if ~IsLinux
oldone = Screen('Preference', 'TextEncodingLocale', 'UTF-8');
else
oldone = Screen('Preference', 'TextEncodingLocale', 'en_US.UTF-8');
end
Screen('DrawText', w, y, 10, 100);
Screen('Flip', w);
KbStrokeWait;
Screen('CloseAll');
Screen('Preference', 'TextEncodingLocale', oldone);
catch
sca;
if exist('oldone','var')
Screen('Preference', 'TextEncodingLocale', oldone);
end
psychrethrow(psychlasterror);
end
|