File: SCREENRect.c

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 (77 lines) | stat: -rw-r--r-- 3,067 bytes parent folder | download | duplicates (3)
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
/*
    SCREENRect.c

    AUTHORS:

        Allen.Ingling@nyu.edu           awi
        mario.kleiner.de@gmail.com      mk

    PLATFORMS:

        All.

    HISTORY:

        1/14/03         awi     Created.
        11/14/08        mk      Cleaned up.
*/

#include "Screen.h"

// If you change the useString then also change the corresponding synopsis string in ScreenSynopsis.c
static char useString[] = "rect=Screen('Rect', windowPointerOrScreenNumber [, realFBSize=0]);";
//                                             1                              2
static char synopsisString[] =
    "Get local rect of window, texture or screen. This has its top-left corner always at (0,0) "
    "and encodes the useable size of the window or screen. E.g., in certain stereo "
    "display modes or other special output modes, the actual useable window area for "
    "stimulus drawing may be much smaller than the real area occupied by the window. "
    "Example: In interleaved stereo modes, the effective useable height of a window "
    "is only half the real height of the window. Use this function to get the actual "
    "useable drawing area for a window or screen.\n"
    "If the optional 'realFBSize' flag is set to 1, then the function returns the "
    "real size of the windows framebuffer. This is mostly for Psychtoolbox internal "
    "use, not for regular user-code.\n";
static char seeAlsoString[] = "";

PsychError SCREENRect(void)
{
    PsychWindowRecordType *windowRecord;
    int screenNumber;
    PsychRectType rect;
    long fbWidth, fbHeight;
    int realFBSize = 0;

    //all sub functions should have these two lines
    PsychPushHelp(useString, synopsisString,seeAlsoString);
    if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);};

    //check for superfluous arguments
    PsychErrorExit(PsychCapNumInputArgs(2));        //The maximum number of inputs
    PsychErrorExit(PsychRequireNumInputArgs(1));    //Insist that the argument be present.
    PsychErrorExit(PsychCapNumOutputArgs(1));        //The maximum number of outputs

    // Get optional 'realFBSize' flag: Defaults to zero.
    PsychCopyInIntegerArg(2, FALSE, &realFBSize);

    if (PsychIsScreenNumberArg(1)) {
        PsychCopyInScreenNumberArg(1, TRUE, &screenNumber);
        if (realFBSize) {
            // Physical size in pixels:
            PsychGetScreenPixelSize(screenNumber, &fbWidth, &fbHeight);
            PsychMakeRect(rect, 0, 0, (double) fbWidth, (double) fbHeight);
        }
        else {
            // Logical size in points:
            PsychGetScreenRect(screenNumber, rect);
        }
        PsychCopyOutRectArg(1, FALSE, rect);
    } else if (PsychIsWindowIndexArg(1)) {
        PsychAllocInWindowRecordArg(1, TRUE, &windowRecord);
        PsychOSProcessEvents(windowRecord, 0);
        PsychCopyOutRectArg(1, FALSE, (realFBSize) ? windowRecord->rect : windowRecord->clientrect);
    } else
        PsychErrorExitMsg(PsychError_user, "Argument was recognized as neither a window index nor a screen pointer");

    return(PsychError_none);
}