File: SCREENWindowSize.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 (130 lines) | stat: -rw-r--r-- 5,647 bytes parent folder | download | duplicates (4)
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
/*
    SCREENWindowSize.c

    AUTHORS:

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

    PLATFORMS:

        All

    HISTORY:

        2/26/05  awi        Created.  Inspired by Frans Cornelissen's script "WindowSize".

*/

#include "Screen.h"

// If you change the useString then also change the corresponding synopsis string in ScreenSynopsis.c
static char useString[] = "[width, height]=Screen('WindowSize', windowPointerOrScreenNumber [, realFBSize=0]);";
//                          1      2                            1                              2
static char synopsisString[] =
    "Return the width and height of a window or screen in units of pixels.\n"
    "By default, the useable size in pixels is returned, ie., the size of the "
    "area usercode can draw to. If the optional 'realFBSize' flag is set to 1, "
    "the real size of the windows framebuffer is returned. Those sizes can differ, "
    "e.g., because certain stereo display modes or high color precision display "
    "modes require adjustments. The 'realFBSize' 1 setting is mostly for Psychtoolbox "
    "internal use, not for regular user-code.\n";

static char seeAlsoString[] = "Screen('Rect')";

PsychError SCREENWindowSize(void)
{
    PsychWindowRecordType *windowRecord;
    int screenNumber;
    double rectWidth, rectHeight;
    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(2));       //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);
        }
        else {
            // Logical size in points:
            PsychGetScreenSize(screenNumber, &fbWidth, &fbHeight);
        }
        PsychCopyOutDoubleArg(1, kPsychArgOptional, fbWidth);
        PsychCopyOutDoubleArg(2, kPsychArgOptional, fbHeight);
    } else if (PsychIsWindowIndexArg(1)) {
        PsychAllocInWindowRecordArg(1, TRUE, &windowRecord);
        PsychOSProcessEvents(windowRecord, 0);

        rectWidth=PsychGetWidthFromRect((realFBSize) ? windowRecord->rect : windowRecord->clientrect);
        rectHeight=PsychGetHeightFromRect((realFBSize) ? windowRecord->rect : windowRecord->clientrect);

        PsychCopyOutDoubleArg(1, kPsychArgOptional, rectWidth);
        PsychCopyOutDoubleArg(2, kPsychArgOptional, rectHeight);
    } else
        PsychErrorExitMsg(PsychError_user, "Argument was recognized as neither a window index nor a screen pointer");

    return(PsychError_none);
}

PsychError SCREENDisplaySize(void)
{
    static char useString[] = "[width, height]=Screen('DisplaySize', ScreenNumber);";
    static char synopsisString[] =
    "Return the physical width and height of the output display device associated with 'ScreenNumber'. "
    "The size is returned in units of millimeters as reported by the display device itself to the OS. "
    "On MacOS-X, if Extended Display Identification Data (EDID) for the display device is not "
    "available, the size is estimated by OS-X based on the device width and height in pixels, with an "
    "assumed resolution of 2.835 pixels/mm or 72 DPI, a reasonable guess for displays predating "
    "EDID support. On M$-Windows and GNU/Linux, the behaviour in case of missing EDID data is "
    "unknown. This function returns a width and height of zero if physical display size can't be "
    "queried from the operating system. Please handle the returned information with great caution. "
    "It is unclear how accurate the EDID data for typical monitors or video beamers really is. This "
    "information could be pretty unreliable and therefore misleading!";

    static char seeAlsoString[] = "";
    PsychWindowRecordType *windowRecord;
    int screenNumber, Width, Height;

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

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

    // Retrieve screen number:
    PsychCopyInScreenNumberArg(1, TRUE, &screenNumber);

    // Query physical size of this screen in millimeters:
    PsychGetDisplaySize(screenNumber, &Width, &Height);

    // External display backend?
    if (PsychIsWindowIndexArg(1) &&
        PsychAllocInWindowRecordArg(1, TRUE, &windowRecord) &&
        (windowRecord->imagingMode & kPsychNeedFinalizedFBOSinks)) {
        // Yes: Our queried values are invalid for it, and its values are
        // unknown, so return "Don't know" zero return values:
        Width = Height = 0;
    }

    // Return it:
    PsychCopyOutDoubleArg(1, kPsychArgOptional, (double) Width);
    PsychCopyOutDoubleArg(2, kPsychArgOptional, (double) Height);

    return(PsychError_none);
}