jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CGraphicsDevice.m
author serb
Sat, 26 Sep 2015 22:38:36 +0300
changeset 32872 abca6234313d
parent 26751 70bac69b37c9
permissions -rw-r--r--
8079965: Stop ignoring warnings for libawt_lwawt Reviewed-by: prr, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     1
/*
24545
5f998bcc934e 8042212: [macosx] Toolkit.getScreenResolution() can return incorrect resolution
serb
parents: 24536
diff changeset
     2
 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     4
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    10
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    15
 * accompanied this code).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    16
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    20
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    23
 * questions.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    24
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    25
15989
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
    26
#import "LWCToolkit.h"
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
    27
#import "ThreadUtilities.h"
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    28
32872
abca6234313d 8079965: Stop ignoring warnings for libawt_lwawt
serb
parents: 26751
diff changeset
    29
#import <JavaNativeFoundation/JavaNativeFoundation.h>
abca6234313d 8079965: Stop ignoring warnings for libawt_lwawt
serb
parents: 26751
diff changeset
    30
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    31
/*
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    32
 * Convert the mode string to the more convinient bits per pixel value
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    33
 */
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
    34
static int getBPPFromModeString(CFStringRef mode)
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    35
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    36
    if ((CFStringCompare(mode, CFSTR(kIO30BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo)) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    37
        // This is a strange mode, where we using 10 bits per RGB component and pack it into 32 bits
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    38
        // Java is not ready to work with this mode but we have to specify it as supported
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    39
        return 30;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    40
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    41
    else if (CFStringCompare(mode, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    42
        return 32;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    43
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    44
    else if (CFStringCompare(mode, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    45
        return 16;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    46
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    47
    else if (CFStringCompare(mode, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    48
        return 8;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    49
    }
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
    50
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    51
    return 0;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    52
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    53
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    54
static BOOL isValidDisplayMode(CGDisplayModeRef mode){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    55
    return (1 < CGDisplayModeGetWidth(mode) && 1 < CGDisplayModeGetHeight(mode));
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    56
}
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    57
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    58
static CFMutableArrayRef getAllValidDisplayModes(jint displayID){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    59
    CFArrayRef allModes = CGDisplayCopyAllDisplayModes(displayID, NULL);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    60
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    61
    CFIndex numModes = CFArrayGetCount(allModes);
25199
4f8ea6dda40d 8047061: [macosx] Crash when setting display mode
pchelko
parents: 24545
diff changeset
    62
    CFMutableArrayRef validModes = CFArrayCreateMutable(kCFAllocatorDefault, numModes + 1, &kCFTypeArrayCallBacks);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    63
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    64
    CFIndex n;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    65
    for (n=0; n < numModes; n++) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    66
        CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    67
        if (cRef != NULL && isValidDisplayMode(cRef)) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    68
            CFArrayAppendValue(validModes, cRef);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    69
        }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    70
    }
24534
07cf38b730b5 8041572: [macosx] huge native memory leak in AWTWindow.m
pchelko
parents: 16840
diff changeset
    71
    CFRelease(allModes);
07cf38b730b5 8041572: [macosx] huge native memory leak in AWTWindow.m
pchelko
parents: 16840
diff changeset
    72
    
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    73
    CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(displayID);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    74
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    75
    BOOL containsCurrentMode = NO;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    76
    numModes = CFArrayGetCount(validModes);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    77
    for (n=0; n < numModes; n++) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    78
        if(CFArrayGetValueAtIndex(validModes, n) == currentMode){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    79
            containsCurrentMode = YES;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    80
            break;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    81
        }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    82
    }
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    83
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    84
    if (!containsCurrentMode) {
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    85
        CFArrayAppendValue(validModes, currentMode);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    86
    }
24534
07cf38b730b5 8041572: [macosx] huge native memory leak in AWTWindow.m
pchelko
parents: 16840
diff changeset
    87
    CGDisplayModeRelease(currentMode);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    88
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    89
    return validModes;
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    90
}
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
    91
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    92
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    93
 * Find the best possible match in the list of display modes that we can switch to based on
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    94
 * the provided parameters.
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    95
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    96
static CGDisplayModeRef getBestModeForParameters(CFArrayRef allModes, int w, int h, int bpp, int refrate) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    97
    CGDisplayModeRef bestGuess = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    98
    CFIndex numModes = CFArrayGetCount(allModes), n;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
    99
    int thisBpp = 0;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   100
    for(n = 0; n < numModes; n++ ) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   101
        CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   102
        if(cRef == NULL) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   103
            continue;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   104
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   105
        CFStringRef modeString = CGDisplayModeCopyPixelEncoding(cRef);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   106
        thisBpp = getBPPFromModeString(modeString);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   107
        CFRelease(modeString);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   108
        if (thisBpp != bpp || (int)CGDisplayModeGetHeight(cRef) != h || (int)CGDisplayModeGetWidth(cRef) != w) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   109
            // One of the key parameters does not match
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   110
            continue;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   111
        }
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   112
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   113
        if (refrate == 0) { // REFRESH_RATE_UNKNOWN
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   114
            return cRef;
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   115
        }
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   116
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   117
        // Refresh rate might be 0 in display mode and we ask for specific display rate
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   118
        // but if we do not find exact match then 0 refresh rate might be just Ok
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   119
        if (CGDisplayModeGetRefreshRate(cRef) == refrate) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   120
            // Exact match
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   121
            return cRef;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   122
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   123
        if (CGDisplayModeGetRefreshRate(cRef) == 0) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   124
            // Not exactly what was asked for, but may fit our needs if we don't find an exact match
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   125
            bestGuess = cRef;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   126
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   127
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   128
    return bestGuess;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   129
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   130
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   131
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   132
 * Create a new java.awt.DisplayMode instance based on provided CGDisplayModeRef
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   133
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   134
static jobject createJavaDisplayMode(CGDisplayModeRef mode, JNIEnv *env, jint displayID) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   135
    jobject ret = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   136
    jint h, w, bpp, refrate;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   137
    JNF_COCOA_ENTER(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   138
    CFStringRef currentBPP = CGDisplayModeCopyPixelEncoding(mode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   139
    bpp = getBPPFromModeString(currentBPP);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   140
    refrate = CGDisplayModeGetRefreshRate(mode);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   141
    h = CGDisplayModeGetHeight(mode);
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   142
    w = CGDisplayModeGetWidth(mode);
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   143
    CFRelease(currentBPP);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   144
    static JNF_CLASS_CACHE(jc_DisplayMode, "java/awt/DisplayMode");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   145
    static JNF_CTOR_CACHE(jc_DisplayMode_ctor, jc_DisplayMode, "(IIII)V");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   146
    ret = JNFNewObject(env, jc_DisplayMode_ctor, w, h, bpp, refrate);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   147
    JNF_COCOA_EXIT(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   148
    return ret;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   149
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   150
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   151
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   152
/*
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   153
 * Class:     sun_awt_CGraphicsDevice
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   154
 * Method:    nativeGetXResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   155
 * Signature: (I)D
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   156
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   157
JNIEXPORT jdouble JNICALL
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   158
Java_sun_awt_CGraphicsDevice_nativeGetXResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   159
  (JNIEnv *env, jclass class, jint displayID)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   160
{
24545
5f998bcc934e 8042212: [macosx] Toolkit.getScreenResolution() can return incorrect resolution
serb
parents: 24536
diff changeset
   161
    // CGDisplayScreenSize can return 0 if displayID is invalid
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   162
    CGSize size = CGDisplayScreenSize(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   163
    CGRect rect = CGDisplayBounds(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   164
    // 1 inch == 25.4 mm
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   165
    jfloat inches = size.width / 25.4f;
24545
5f998bcc934e 8042212: [macosx] Toolkit.getScreenResolution() can return incorrect resolution
serb
parents: 24536
diff changeset
   166
    return inches > 0 ? rect.size.width / inches : 72;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   167
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   168
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   169
/*
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   170
 * Class:     sun_awt_CGraphicsDevice
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   171
 * Method:    nativeGetYResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   172
 * Signature: (I)D
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   173
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   174
JNIEXPORT jdouble JNICALL
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   175
Java_sun_awt_CGraphicsDevice_nativeGetYResolution
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   176
  (JNIEnv *env, jclass class, jint displayID)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   177
{
24545
5f998bcc934e 8042212: [macosx] Toolkit.getScreenResolution() can return incorrect resolution
serb
parents: 24536
diff changeset
   178
    // CGDisplayScreenSize can return 0 if displayID is invalid
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   179
    CGSize size = CGDisplayScreenSize(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   180
    CGRect rect = CGDisplayBounds(displayID);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   181
    // 1 inch == 25.4 mm
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   182
    jfloat inches = size.height / 25.4f;
24545
5f998bcc934e 8042212: [macosx] Toolkit.getScreenResolution() can return incorrect resolution
serb
parents: 24536
diff changeset
   183
    return inches > 0 ? rect.size.height / inches : 72;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   184
}
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   185
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   186
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   187
 * Class:     sun_awt_CGraphicsDevice
15989
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   188
 * Method:    nativeGetScreenInsets
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   189
 * Signature: (I)D
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   190
 */
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   191
JNIEXPORT jobject JNICALL
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   192
Java_sun_awt_CGraphicsDevice_nativeGetScreenInsets
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   193
  (JNIEnv *env, jclass class, jint displayID)
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   194
{
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   195
    jobject ret = NULL;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   196
    __block NSRect frame = NSZeroRect;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   197
    __block NSRect visibleFrame = NSZeroRect;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   198
JNF_COCOA_ENTER(env);
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   199
    
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   200
    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   201
        NSArray *screens = [NSScreen screens];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   202
        for (NSScreen *screen in screens) {
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   203
            NSDictionary *screenInfo = [screen deviceDescription];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   204
            NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
32872
abca6234313d 8079965: Stop ignoring warnings for libawt_lwawt
serb
parents: 26751
diff changeset
   205
            if ([screenID unsignedIntValue] == displayID){
15989
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   206
                frame = [screen frame];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   207
                visibleFrame = [screen visibleFrame];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   208
                break;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   209
            }
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   210
        }
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   211
    }];
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   212
    // Convert between Cocoa's coordinate system and Java.
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   213
    jint bottom = visibleFrame.origin.y - frame.origin.y;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   214
    jint top = frame.size.height - visibleFrame.size.height - bottom;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   215
    jint left = visibleFrame.origin.x - frame.origin.x;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   216
    jint right = frame.size.width - visibleFrame.size.width - left;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   217
    
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   218
    static JNF_CLASS_CACHE(jc_Insets, "java/awt/Insets");
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   219
    static JNF_CTOR_CACHE(jc_Insets_ctor, jc_Insets, "(IIII)V");
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   220
    ret = JNFNewObject(env, jc_Insets_ctor, top, left, bottom, right);
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   221
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   222
JNF_COCOA_EXIT(env);
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   223
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   224
    return ret;
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   225
}
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   226
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   227
/*
0fe0985a7bde 8003169: [macosx] JVM crash after disconnecting from projector
serb
parents: 13241
diff changeset
   228
 * Class:     sun_awt_CGraphicsDevice
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   229
 * Method:    nativeSetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   230
 * Signature: (IIIII)V
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   231
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   232
JNIEXPORT void JNICALL
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   233
Java_sun_awt_CGraphicsDevice_nativeSetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   234
(JNIEnv *env, jclass class, jint displayID, jint w, jint h, jint bpp, jint refrate)
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   235
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   236
    JNF_COCOA_ENTER(env);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   237
    CFArrayRef allModes = getAllValidDisplayModes(displayID);
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   238
    CGDisplayModeRef closestMatch = getBestModeForParameters(allModes, (int)w, (int)h, (int)bpp, (int)refrate);
24536
a00719656696 8041987: [macosx] setDisplayMode crashes
pchelko
parents: 24534
diff changeset
   239
    
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   240
    __block CGError retCode = kCGErrorSuccess;
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   241
    if (closestMatch != NULL) {
24536
a00719656696 8041987: [macosx] setDisplayMode crashes
pchelko
parents: 24534
diff changeset
   242
        CGDisplayModeRetain(closestMatch);
a00719656696 8041987: [macosx] setDisplayMode crashes
pchelko
parents: 24534
diff changeset
   243
        [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   244
            CGDisplayConfigRef config;
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   245
            retCode = CGBeginDisplayConfiguration(&config);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   246
            if (retCode == kCGErrorSuccess) {
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   247
                CGConfigureDisplayWithDisplayMode(config, displayID, closestMatch, NULL);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   248
                retCode = CGCompleteDisplayConfiguration(config, kCGConfigureForAppOnly);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   249
            }
24536
a00719656696 8041987: [macosx] setDisplayMode crashes
pchelko
parents: 24534
diff changeset
   250
            CGDisplayModeRelease(closestMatch);
12840
4157f2200059 7175566: [macosx] Glich in fix for CR7124247 caused MacOS crash during PIT testing
kizune
parents: 12836
diff changeset
   251
        }];
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   252
    } else {
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   253
        [JNFException raise:env as:kIllegalArgumentException reason:"Invalid display mode"];
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   254
    }
13241
92c2140b5bb2 7182902: [macosx] Test api/java_awt/GraphicsDevice/indexTGF.html#SetDisplayMode fails on Mac OS X 10.7
alexsch
parents: 12840
diff changeset
   255
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   256
    if (retCode != kCGErrorSuccess){
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   257
        [JNFException raise:env as:kIllegalArgumentException reason:"Unable to set display mode!"];
24536
a00719656696 8041987: [macosx] setDisplayMode crashes
pchelko
parents: 24534
diff changeset
   258
    }
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   259
    CFRelease(allModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   260
    JNF_COCOA_EXIT(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   261
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   262
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   263
 * Class:     sun_awt_CGraphicsDevice
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   264
 * Method:    nativeGetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   265
 * Signature: (I)Ljava/awt/DisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   266
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   267
JNIEXPORT jobject JNICALL
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   268
Java_sun_awt_CGraphicsDevice_nativeGetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   269
(JNIEnv *env, jclass class, jint displayID)
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   270
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   271
    jobject ret = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   272
    CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(displayID);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   273
    ret = createJavaDisplayMode(currentMode, env, displayID);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   274
    CGDisplayModeRelease(currentMode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   275
    return ret;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   276
}
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   277
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   278
/*
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   279
 * Class:     sun_awt_CGraphicsDevice
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   280
 * Method:    nativeGetDisplayMode
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   281
 * Signature: (I)[Ljava/awt/DisplayModes
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   282
 */
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   283
JNIEXPORT jobjectArray JNICALL
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   284
Java_sun_awt_CGraphicsDevice_nativeGetDisplayModes
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   285
(JNIEnv *env, jclass class, jint displayID)
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   286
{
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   287
    jobjectArray jreturnArray = NULL;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   288
    JNF_COCOA_ENTER(env);
16470
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   289
    CFArrayRef allModes = getAllValidDisplayModes(displayID);
ccc74e8572d5 8007146: [macosx] Setting a display mode crashes JDK under VNC
alexsch
parents: 15989
diff changeset
   290
12836
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   291
    CFIndex numModes = CFArrayGetCount(allModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   292
    static JNF_CLASS_CACHE(jc_DisplayMode, "java/awt/DisplayMode");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   293
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   294
    jreturnArray = JNFNewObjectArray(env, &jc_DisplayMode, (jsize) numModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   295
    if (!jreturnArray) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   296
        NSLog(@"CGraphicsDevice can't create java array of DisplayMode objects");
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   297
        return nil;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   298
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   299
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   300
    CFIndex n;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   301
    for (n=0; n < numModes; n++) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   302
        CGDisplayModeRef cRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(allModes, n);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   303
        if (cRef != NULL) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   304
            jobject oneMode = createJavaDisplayMode(cRef, env, displayID);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   305
            (*env)->SetObjectArrayElement(env, jreturnArray, n, oneMode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   306
            if ((*env)->ExceptionOccurred(env)) {
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   307
                (*env)->ExceptionDescribe(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   308
                (*env)->ExceptionClear(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   309
                continue;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   310
            }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   311
            (*env)->DeleteLocalRef(env, oneMode);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   312
        }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   313
    }
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   314
    CFRelease(allModes);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   315
    JNF_COCOA_EXIT(env);
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   316
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   317
    return jreturnArray;
66cabfe1972f 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()
kizune
parents: 12047
diff changeset
   318
}
16840
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   319
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   320
/*
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   321
 * Class:     sun_awt_CGraphicsDevice
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   322
 * Method:    nativeGetScaleFactor
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   323
 * Signature: (I)D
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   324
 */
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   325
JNIEXPORT jdouble JNICALL
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   326
Java_sun_awt_CGraphicsDevice_nativeGetScaleFactor
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   327
(JNIEnv *env, jclass class, jint displayID)
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   328
{
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   329
    __block jdouble ret = 1.0f;
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   330
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   331
JNF_COCOA_ENTER(env);
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   332
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   333
    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   334
        NSArray *screens = [NSScreen screens];
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   335
        for (NSScreen *screen in screens) {
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   336
            NSDictionary *screenInfo = [screen deviceDescription];
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   337
            NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
32872
abca6234313d 8079965: Stop ignoring warnings for libawt_lwawt
serb
parents: 26751
diff changeset
   338
            if ([screenID unsignedIntValue] == displayID){
16840
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   339
                if ([screen respondsToSelector:@selector(backingScaleFactor)]) {
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   340
                    ret = [screen backingScaleFactor];
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   341
                }
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   342
                break;
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   343
            }
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   344
        }
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   345
    }];
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   346
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   347
JNF_COCOA_EXIT(env);
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   348
    return ret;
64446d4710c4 8000629: [macosx] Blurry rendering with Java 7 on Retina display
serb
parents: 16470
diff changeset
   349
}