Skip to content

Commit

Permalink
8263928: Add JAWT test files for mac
Browse files Browse the repository at this point in the history
Reviewed-by: jdv
  • Loading branch information
prsadhuk committed Mar 26, 2021
1 parent 4fbb7c2 commit f3eed05
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 0 deletions.
98 changes: 98 additions & 0 deletions test/jdk/java/awt/JAWT/MyMacCanvas.java
@@ -0,0 +1,98 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyMacCanvas extends Canvas {

static {
try {
System.loadLibrary("mylib");
} catch (Throwable t) {
System.out.println("Test failed!!");
t.printStackTrace();
System.exit(1);
}
}

public void addNotify() {
super.addNotify();
addNativeCoreAnimationLayer();
}

public native void addNativeCoreAnimationLayer();

static JAWTFrame f;
public static void main(String[] args) {
try {
Robot robot = new Robot();
EventQueue.invokeLater(new Runnable() {
public void run() {
f = new JAWTFrame("JAWTExample");
f.setBackground(Color.white);
f.setLayout(new BorderLayout(10, 20));
f.setLocation(50, 50);
((JComponent) f.getContentPane()).setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, Color.cyan));
f.addNotify();
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
});
robot.delay(5000);
Color col1 = new Color(0, 0, 0);
Color col2 = robot.getPixelColor(f.getX()+50, f.getY()+50);
if (col1.equals(col2)) {
System.out.println("Test passed!");
} else {
System.out.println("col1 " + col1 + " col2 " + col2);
throw new RuntimeException("Color of JAWT canvas is wrong or " +
"it was not rendered. " + "Check that other windows " +
"do not block the test frame.");
}
System.exit(0);
} catch (Throwable t) {
System.out.println("Test failed!");
t.printStackTrace();
System.exit(1);
}
}

private static class JAWTFrame extends JFrame {
public JAWTFrame(final String title) {
super(title);
}

public void addNotify() {
super.addNotify(); // ensures native component hierarchy is setup

final Component layerBackedCanvas = new MyMacCanvas();
layerBackedCanvas.setPreferredSize(new Dimension(400, 200));
add(layerBackedCanvas, BorderLayout.CENTER);

invalidate();
}
}
}
13 changes: 13 additions & 0 deletions test/jdk/java/awt/JAWT/jawt-mac-buildrun.sh
@@ -0,0 +1,13 @@
#!/bin/sh

set -e

JAVA_HOME='/export/lanai/build/macosx-x64-debug/jdk'

$JAVA_HOME/bin/javac MyMacCanvas.java

gcc -v myfile.m -I"$JAVA_HOME/include" -c -o myfile.o

gcc -v myfile.o -L$JAVA_HOME/lib -ljawt -framework AppKit -framework OpenGL -framework Metal -framework Quartz -shared -o libmylib.jnilib

$JAVA_HOME/bin/java -Djava.library.path=. -Dsun.java2d.metal=True MyMacCanvas
117 changes: 117 additions & 0 deletions test/jdk/java/awt/JAWT/myfile.m
@@ -0,0 +1,117 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

#import "JAVAVM/jawt_md.h"
#import <Quartz/Quartz.h>

/*
* Pass the block to a selector of a class that extends NSObject
* There is no need to copy the block since this class always waits.
*/
@interface BlockRunner : NSObject { }

+ (void)invokeBlock:(void (^)())block;
@end

@implementation BlockRunner

+ (void)invokeBlock:(void (^)())block{
block();
}

+ (void)performBlock:(void (^)())block {
[self performSelectorOnMainThread:@selector(invokeBlock:) withObject:block waitUntilDone:YES];
}

@end


/*
* Class: MyMacCanvas
* Method: paint
* SIgnature: (Ljava/awt/Graphics;)V
*/
JNIEXPORT void JNICALL Java_MyMacCanvas_addNativeCoreAnimationLayer
(JNIEnv* env, jobject canvas, jobject graphics)
{
printf("paint called\n");

JAWT awt;
awt.version = JAWT_VERSION_1_4 | JAWT_MACOSX_USE_CALAYER;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
printf("AWT Not found\n");
return;
}

printf("JAWT found\n");

/* Get the drawing surface */
JAWT_DrawingSurface* ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL) {
printf("NULL drawing surface\n");
return;
}

/* Lock the drawing surface */
jint lock = ds->Lock(ds);
printf("Lock value %d\n", (int)lock);
if((lock & JAWT_LOCK_ERROR) != 0) {
printf("Error locking surface");
return;
}

/* Get the drawing surface info */
JAWT_DrawingSurfaceInfo *dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL) {
printf("Error getting surface info\n");
ds->Unlock(ds);
return;
}

// create and attach the layer on the AppKit thread
void (^block)() = ^(){
// attach the "root layer" to the AWT Canvas surface layers
CALayer *layer = [[CALayer new] autorelease];
id <JAWT_SurfaceLayers> surfaceLayers = (id <JAWT_SurfaceLayers>)dsi->platformInfo;
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB ();
CGFloat rgba[4] = {0.0, 0.0, 0.0, 1.0};
CGColorRef color = CGColorCreate (colorspace, rgba);
layer.backgroundColor = color;
surfaceLayers.layer = layer;
};

if ([NSThread isMainThread]) {
block();
} else {
[BlockRunner performBlock:block];
}

/* Free the drawing surface info */
ds->FreeDrawingSurfaceInfo(dsi);

/* Unlock the drawing surface */
ds->Unlock(ds);

/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
}

0 comments on commit f3eed05

Please sign in to comment.