This file is indexed.

/usr/share/psychtoolbox-3/PsychGLImageProcessing/SetCompressedStereoSideBySideParameters.m is in psychtoolbox-3-common 3.0.11.20131230.dfsg1-1build1.

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
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
function SetCompressedStereoSideBySideParameters(win, leftOffset, leftScale, rightOffset, rightScale)
% SetCompressedStereoSideBySideParameters(win, [0, 0], [0.5, 1], [0.5, 0], [0.5, 1]);
%
% Change parameters for over-under stereo to side-by-side stereo so that
% the imaging mode will work in a display that horizontally stretches left
% and right frames to fill the full res window.
%
% This routine is called automatically by PsychImaging() during onscreen
% window creation with its default parameters if ...
%
% PsychImaging('AddTask', 'General', 'SideBySideCompressedStereo');
%
% ... is called during window setup.
%
% You can call the function yourself after PsychImaging('OpenWindow', ...);
% if you want to use non-default composition parameters for side-by-side
% stereo presentation.
%
% This is how compressed side-by-side stereo works:
%
% 1. Usercode draws stimuli into the left-eye and righ-eye framebuffers at
%    full display resolution.
%
% 2. Screen('Flip') compresses those stimuli horizontally into the output
%    framebuffer.
%
% 3. At display time, the display stretches half frames to full width:
%    _________        _________       _________
%    | L | R |   ---> | <-L->  |  +   | <-R->  |
%    ---------        ----------      ----------
%
% Side-by-side compressed images are one of several popular stereo HDMI
% formats.
%
% The stereo mode must have been set to 2 or 3 for this to work, or the
% above mentioned PsychImaging() function must have been called for setup.
%
% Example function call:
%
% SetCompressedStereoSideBySideParameters(win, [0, 0], [0.5, 1], [0.5, 0], [0.5, 1])
%
% Call this function after the win = PsychImaging('OpenWindow',...); call
% on an onscreen window in Top/Bottom stereo mode to change the parameters
% of drawing the stereo views.
%
% All parameters except the onscreen 'win'dowhandle are optional and have
% reasonable builtin defaults:
%
% 'leftOffset' = Top-Left [x,y] offset of left eye framebuffer in relative
% coordinates [0,0] == top-left of framebuffer, [1,0] == 1 display window
% width to the right, [2,0] == 2 display window widths to the right etc.
%
% 'leftScale' = Scaling of left eye image buffer. E.g., [1,1] == Don't
% scale. [0.75, 0.5] scale to 75% of original width, 50% of original
% height.
%
% 'rightOffset', 'rightScale' == Ditto for right eye image.
%
% This function was inspired and co-implemented by David Hoffman.
%

% History:
%
% 23.12.2012  mk  Derived from code by David Hoffman, which was derived
%                 from SetStereoSideBySideParameters.m by mk.

% Test if a windowhandle is provided...
if nargin < 1
    error('You must provide the windowhandle for the onscreen window as 1st parameter!');
end

% ... and if it is a valid onscreen window in top-bottom stereo mode:
if Screen('WindowKind', win) ~= 1
    error('Provided windowhandle is not a valid and open onscreen window!');
end

winfo = Screen('GetWindowInfo', win);
if ~ismember(winfo.StereoMode, [2,3])
    % Only do conversion if we are in top-bottom mode, else abort and do
    % normal processing
    fprintf('SetCompressedStereoSideBySideParameters: Info: Provided onscreen window is not in appropriate stereo mode. Call ignored.\n');
    
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  ******Aborting Side_by_Side Conversion*******')
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  *********************************************')
    fprintf('WARNING:  *********************************************')
    
    return;
end

% Query true size of onscreen window in pixels w x h:
[w, h] = Screen('WindowSize', win, 1);

% Parse other arguments, assign defaults if none passed:
if nargin < 2 || isempty(leftOffset)
    leftOffset = [0, 0];
end

if nargin < 3 || isempty(leftScale)
    leftScale = [0.5, 1];
end

if nargin < 4 || isempty(rightOffset)
    rightOffset = [0.5, 0];
end

if nargin < 5 || isempty(rightScale)
    rightScale = [0.5, 1];
end

% Query full specification of processing slot for left eye view shader:
% 'slot' is position in processing chain, others are parameters for the
% operation:
[slot shaderid blittercfg voidptr glsl] = Screen('HookFunction', win, 'Query', 'StereoCompositingBlit', 'StereoCompositingShaderCompressedTop'); %#ok<ASGLU>
if slot == -1
    disp('ERROR: Could not find processing slot for left-eye view!... Please check that StereoMode is set to 2 or 3');
    error('Could not find processing slot for left-eye view!... Please check that StereoMode is set to 2 or 3');
end

% Delete old processing slot from pipeline:
Screen('HookFunction', win, 'Remove', 'StereoCompositingBlit' , slot);

% Define new blitter configuration for changed parameters:
leftOffset(1) = floor(leftOffset(1) * w);
leftOffset(2) = floor(leftOffset(2) * h);
blittercfg = sprintf('Builtin:IdentityBlit:Offset:%i:%i:Scaling:%f:%f', leftOffset(1), leftOffset(2), leftScale(1), leftScale(2));

% Insert modified processing function at old position (slot) in the
% pipeline, effectively replacing the slot:
posstring = sprintf('InsertAt%iShader', slot);
Screen('Hookfunction', win, posstring, 'StereoCompositingBlit', shaderid, glsl, blittercfg);

% Query full specification of processing slot for right eye view shader:
% 'slot' is position in processing chain, others are parameters for the
% operation:
[slot shaderid blittercfg voidptr glsl] = Screen('HookFunction', win, 'Query', 'StereoCompositingBlit', 'StereoCompositingShaderCompressedBottom'); %#ok<ASGLU>
if slot == -1
    disp('ERROR: Could not find processing slot for right-eye view!... Please check that StereoMode is set to 2 or 3');
    error('Could not find processing slot for right-eye view!... Please check that StereoMode is set to 2 or 3');
end

% Delete old processing slot from pipeline:
Screen('HookFunction', win, 'Remove', 'StereoCompositingBlit' , slot);

% Define new blitter configuration for changed parameters:
rightOffset(1) = floor(rightOffset(1) * w);
rightOffset(2) = floor(rightOffset(2) * h);
blittercfg = sprintf('Builtin:IdentityBlit:Offset:%i:%i:Scaling:%f:%f', rightOffset(1), rightOffset(2), rightScale(1), rightScale(2));

% Insert modified processing function at old position (slot) in the
% pipeline, effectively replacing the slot:
posstring = sprintf('InsertAt%iShader', slot);
Screen('Hookfunction', win, posstring, 'StereoCompositingBlit', shaderid, glsl, blittercfg);

% Done.
return;