File: DrawFormattedText2Demo.m

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (196 lines) | stat: -rw-r--r-- 9,577 bytes parent folder | download | duplicates (2)
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
% DrawFormattedText2Demo
%
% Draws formatted text, shows how to align and center text vertically
% and/or horizontally, how line-breaks are introduced, how to transform
% text.
%
% Press any key to cycle through different demo displays.
%
% see also: PsychDemos, Screen DrawText?, DrawSomeTextDemo, DrawFormattedText2Demo

% 15-Sep-2016    dcn    Wrote it.
% 07-May-2017    mk     Demo per word bounding boxes.


try
    PsychDefaultSetup(1);   % check PTB is functioning and do default setup
    
    % Choosing the display with the highest display number is
    % a best guess about where you want the stimulus displayed.
    screens=Screen('Screens');
    screenNumber=max(screens);

    % Open window with default settings:
    PsychImaging('PrepareConfiguration');
    % make screen partially transparent so we can debug.
    % PsychDebugWindowConfiguration;
    [w,wrect]=PsychImaging('OpenWindow', screenNumber, 128);
    
    % This preference setting selects the high quality text renderer 
    % each operating system: It is not really needed, as the high quality
    % renderer is the default on all operating systems, so this is more of
    % a "better safe than sorry" setting. DrawFormattedText2 _only_ works
    % with this renderer. So if it fails to load (see the warnings on the
    % command line), the output of this demo will look horrible. See
    % help DrawTextPlugin for more information.
    Screen('Preference', 'TextRenderer', 1);
    Screen('BlendFunction', w, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);   % has no effect on text rendering, used below for semi-transparent bounding boxes
    Screen('Preference', 'TextAntiAliasing', 2);

    
    % aligning of text to a box
    [scrX,scrY] = RectCenter(wrect);
    rect = CenterRectOnPoint([0 0 300 300],scrX,scrY);
    Screen('FrameRect', w, 0, rect);
    DrawFormattedText2('top\ncenter','win',w,'sx','center','sy',scrY-150,'xalign','center','yalign','bottom','xlayout','center');
    DrawFormattedText2('top\nleft<color=ff0000>1','win',w,'sx',scrX-150,'sy',scrY-150,'xalign','right','yalign','bottom','xlayout','right');
    DrawFormattedText2('top\nleft<color=0.,1.,0.>2','win',w,'sx',scrX-150,'sy',scrY-150,'xalign', 'left','yalign','bottom');
    % the below call sets a new basecolor, which is a state that should
    % leak out, setting default color from that call onward
    DrawFormattedText2('center\n<b>inside','win',w,'sx','center','sy','center','xalign','center','yalign','center','xlayout','center','winRect',rect,'baseColor',[0 255 0]);
    DrawFormattedText2('bottom\n<i>left' ,'win',w,'sx',scrX-150,'sy',scrY+150,'xalign','right','yalign','top','xlayout','right');
    % next call resets base color to black
    DrawFormattedText2('bottom\n<u>right','win',w,'sx',scrX+150,'sy',scrY+150,'xalign', 'left','yalign','top','baseColor',0);

    Screen('Flip',w);
    KbStrokeWait;
    
    % unicode text, see DrawHighQualityUnicodeTextDemo for more info about
    % how to draw unicode text
    unicodetext = [26085, 26412, 35486, 60, 99, 111, 108, 111, 114, 62, ...
        12391, 12354, 12426, 12364, 12392, 12358, 12372, 12374, 12356, ...
        12414, 12375, 12383, 12290, 13, 10];
    [~,~,~,~,wbounds] = DrawFormattedText2([double('<size=40><font=-:lang=ja><color=ff0000>') unicodetext],'win',w,'sx','center','sy','center','xalign','center','yalign','center');
    % Screen('FrameRect', w, [255 255 0], wbounds.');
    
    Screen('Flip',w);
    KbStrokeWait;

    % draw few lines of text, with varying formatting, and draw it again
    % from cache with some transformation
    [~,~,bbox,cache,wbounds]=DrawFormattedText2('<font=Courier New><size=27>test\n<font=Times New Roman>scr<font><font>een<font> is\n<b><size=50>UGLY\n<size=12><b><u><i>Isn''t it?','win',w,'sx','center','sy','center','xalign','center','yalign','center');
    Screen('FrameRect', w, [255 0 0 100], bbox);
    % captbbox = bbox;
    Screen('FrameRect', w, [255 255 0], wbounds.');
    % calling with the cache and only sx and/or sy, translated the text by
    % (sx,sy)
    [~,~,bbox,~,wbounds]=DrawFormattedText2(cache,'sx', 300);
    Screen('FrameRect', w, [0 255 0], bbox);
    Screen('FrameRect', w, [255 255 0], wbounds.');
    [~,~,bbox,~,wbounds]=DrawFormattedText2(cache,'sx',-300,'transform',{'flip',1});
    Screen('FrameRect', w, [0 0 255], bbox);
    Screen('FrameRect', w, [255 255 0], wbounds.');
    [~,~,bbox,~,wbounds]=DrawFormattedText2(cache,'sy', 300,'transform',{'rotate',90});
    Screen('FrameRect', w, [0 255 255], bbox);
    Screen('FrameRect', w, [255 255 0], wbounds.');
    [~,~,bbox,~,wbounds]=DrawFormattedText2(cache,'sy',-300,'transform',{'scale',[2 1]});
    Screen('FrameRect', w, [255 0 255], bbox);
    Screen('FrameRect', w, [255 255 0], wbounds.');
    % when called with more alignment inputs, the bounding box of the text
    % is repositioned:
    rect = [100 100 350 250];
    Screen('FrameRect', w, 0, rect);
    % put text in top left of this box
    DrawFormattedText2(cache,'sx',0,'sy',0,'xalign','left','yalign','top','winRect',rect);
    % make another box and put text next to bottom right of this box,
    % vspace differenty
    rect = wrect([3:4 3:4])-[650 350 300 100];
    Screen('FrameRect', w, [255 255 0], rect);
    DrawFormattedText2('simple\ntest\ntext','win',w,'sx','right','sy','bottom','xalign','left','yalign','bottom','winRect',rect,'vSpacing',1.5);
    
    Screen('Flip',w);
    % capt = Screen('GetImage', w, GrowRect(captbbox,20,20));
    KbStrokeWait;
    
    % same as previous, but now with a transformation already applied to
    % the cached texture
    [~,~,bbox,cache,wbounds]=DrawFormattedText2('<font=Courier New><size=27><b>test\n<font=Times New Roman>scr<font><font>een<font> is\n<b><size=50>UGLY\n<size=12><b><u><i>Isn''t it?','win',w,'sx','center','sy','center','xalign','center','yalign','center','transform',{'rotate',-90});
    Screen('FrameRect', w, [255 0 0 100], bbox);
    % captbbox = bbox;
    Screen('FrameRect', w, [255 255 0], wbounds.');
    % calling with the cache and only sx and/or sy, translated the text by
    % (sx,sy)
    [~,~,bbox,~,wbounds]=DrawFormattedText2(cache,'sx', 300);
    Screen('FrameRect', w, [0 255 0], bbox);
    Screen('FrameRect', w, [255 255 0], wbounds.');
    [~,~,bbox,~,wbounds]=DrawFormattedText2(cache,'sx',-300,'transform',{'flip',1});
    Screen('FrameRect', w, [0 0 255], bbox);
    Screen('FrameRect', w, [255 255 0], wbounds.');
    
    Screen('Flip',w);
    % capt = Screen('GetImage', w, GrowRect(captbbox,20,20));
    KbStrokeWait;

    % draw some text, then draw it again in exact same location but rotated
    % 180 degrees. should have exact same bounding box
    [~,~,bbox1,c]=DrawFormattedText2('<size=40>t<i>e<size>x<i>t&\n<size=120>ajX\n<size=60>t<font=comic sans>estddd<color=ff0000>ddda<i>d','win',w,'sx','center','sy',200,'xalign','left','baseColor',0,'cacheMode',2);  % just testing cachemode 2. not recommended to be used for performance reasons. Only use if you want to manually change content of the cache, though note the cache format may change without warning
    [~,~,bbox2]  =DrawFormattedText2(c,'transform',{'rotate',180});
    % this is equivalent to:
    % [~,~,bbox2]  =DrawFormattedText2(c,'transform',{'flip',3});
    Screen('FrameRect',w,[255 0 0 128],bbox1,3);
    Screen('FrameRect',w,[0 255 0 128],bbox2,3);
    fprintf('Both bounding boxes exactly the same? %d\n',isequal(bbox1,bbox2));

    [~,~,bbox1,c]=DrawFormattedText2('<size=40>t<i>e<size>x<i>t&\n<size=120>ajX\n<size=60>t<font=comic sans>estddd<color=ff0000>ddda<i>d','win',w,'sx','center','sy',200,'xalign','left','baseColor',0);
    [~,~,bbox2,~,wbounds]  =DrawFormattedText2(c,'transform',{'rotate',180});
    Screen('FrameRect',w,[255 0 0 128],bbox1,3);
    Screen('FrameRect',w,[0 255 0 128],bbox2,3);
    Screen('FrameRect', w, [255 255 0 128], GrowRect(wbounds, 2, 2)');

    Screen('Flip',w);
    KbStrokeWait;
    
    
    % Read a text file:
    fd = fopen([PsychtoolboxRoot 'Contents.m'], 'rt');
    if fd==-1
        error('Could not open Contents.m file in PTB root folder!');
    end
    t = fread(fd,inf,'*char').';
    fclose(fd);
    % flop it all on the screen
    [~,~,~,~,wbounds] = DrawFormattedText2(t,'win',w,'sx','center','xalign','center','sy',150,'baseColor',0);
    Screen('FrameRect', w, [255 255 0 128], GrowRect(wbounds, 2, 2)');

    Screen('Flip',w);
    KbStrokeWait;
    
    % now scroll it over the screen. first pregenerate whole text at middle
    % of screen, and get cache only
    [~,~,bbox,cache]=DrawFormattedText2(t,'win',w,'sx','center','xalign','center','sy','center','baseColor',0,'cacheOnly',true);
    % scroll over screen in 5 seconds
    frate = Screen('FrameRate',screenNumber);
    if frate == 0
        % Deal with Apples trainwreck not reporting framerate on Mac
        % builtin displays, but zero:
        frate = 60;
    end

    textHeight = RectHeight(bbox);
    step = textHeight/frate/5;
    
    tp=zeros(1, frate*5);
    for p=1:frate*5
        [~,~,bbox]=DrawFormattedText2(cache,'sy',-p*step);
        Screen('FrameRect', w, [255 0 0 128], bbox,2);

        tp(p) = Screen('Flip', w);

        if KbCheck
            break;
        end
    end
    tp = tp(1:p);
    fprintf('\nAverage redraw duration for scrolling in msecs: %f\n', 1000 * mean(diff(tp)));
    
    % End of demo, close window:
    sca;
catch me
    % This "catch" section executes in case of an error in the "try"
    % section above. Importantly, it closes the onscreen window if it's
    % open.
    sca;
    rethrow(me)
end

% image(capt)