/*
* Copyright (c) 2011, 2019, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
package sun.java2d.opengl;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.ColorModel;
import sun.java2d.SurfaceData;
public abstract class CGLSurfaceData extends OGLSurfaceData {
private final int scale;
final int width;
final int height;
private final CGLGraphicsConfig graphicsConfig;
private native void initOps(OGLGraphicsConfig gc, long pConfigInfo,
long pPeerData, long layerPtr, int xoff,
int yoff, boolean isOpaque);
private CGLSurfaceData(CGLLayer layer, CGLGraphicsConfig gc,
ColorModel cm, int type, int width, int height) {
super(gc, cm, type);
// TEXTURE shouldn't be scaled, it is used for managed BufferedImages.
scale = type == TEXTURE ? 1 : gc.getDevice().getScaleFactor();
this.width = width * scale;
this.height = height * scale;
this.graphicsConfig = gc;
long layerPtr = 0L;
boolean isOpaque = true;
if (layer != null) {
layerPtr = layer.getPointer();
isOpaque = layer.isOpaque();
}
// TODO delete the native code: pPeerData, xoff, yoff are always zero
initOps(gc, gc.getNativeConfigInfo(), 0, layerPtr, 0, 0, isOpaque);
}
@Override //SurfaceData
public GraphicsConfiguration getDeviceConfiguration() {
return graphicsConfig;
}
Creates a SurfaceData object representing the intermediate buffer
between the Java2D flusher thread and the AppKit thread.
/**
* Creates a SurfaceData object representing the intermediate buffer
* between the Java2D flusher thread and the AppKit thread.
*/
public static CGLLayerSurfaceData createData(CGLLayer layer) {
CGLGraphicsConfig gc = (CGLGraphicsConfig) layer.getGraphicsConfiguration();
Rectangle r = layer.getBounds();
return new CGLLayerSurfaceData(layer, gc, r.width, r.height);
}
Creates a SurfaceData object representing an off-screen buffer (either a
FBO or Texture).
/**
* Creates a SurfaceData object representing an off-screen buffer (either a
* FBO or Texture).
*/
public static CGLOffScreenSurfaceData createData(CGLGraphicsConfig gc,
int width, int height, ColorModel cm, Image image, int type) {
return new CGLOffScreenSurfaceData(gc, width, height, image, cm, type);
}
@Override
public double getDefaultScaleX() {
return scale;
}
@Override
public double getDefaultScaleY() {
return scale;
}
@Override
public Rectangle getBounds() {
return new Rectangle(width, height);
}
protected native void clearWindow();
A surface which implements an intermediate buffer between
the Java2D flusher thread and the AppKit thread.
This surface serves as a buffer attached to a CGLLayer and
the layer redirects all painting to the buffer's graphics.
/**
* A surface which implements an intermediate buffer between
* the Java2D flusher thread and the AppKit thread.
*
* This surface serves as a buffer attached to a CGLLayer and
* the layer redirects all painting to the buffer's graphics.
*/
public static class CGLLayerSurfaceData extends CGLSurfaceData {
private final CGLLayer layer;
private CGLLayerSurfaceData(CGLLayer layer, CGLGraphicsConfig gc,
int width, int height) {
super(layer, gc, gc.getColorModel(), FBOBJECT, width, height);
this.layer = layer;
initSurface(this.width, this.height);
}
@Override
public SurfaceData getReplacement() {
return layer.getSurfaceData();
}
@Override
boolean isOnScreen() {
return true;
}
@Override
public Object getDestination() {
return layer.getDestination();
}
@Override
public int getTransparency() {
return layer.getTransparency();
}
@Override
public void invalidate() {
super.invalidate();
clearWindow();
}
}
SurfaceData object representing an off-screen buffer (either a FBO or
Texture).
/**
* SurfaceData object representing an off-screen buffer (either a FBO or
* Texture).
*/
public static class CGLOffScreenSurfaceData extends CGLSurfaceData {
private final Image offscreenImage;
private CGLOffScreenSurfaceData(CGLGraphicsConfig gc, int width,
int height, Image image,
ColorModel cm, int type) {
super(null, gc, cm, type, width, height);
offscreenImage = image;
initSurface(this.width, this.height);
}
@Override
public SurfaceData getReplacement() {
return restoreContents(offscreenImage);
}
Returns destination Image associated with this SurfaceData.
/**
* Returns destination Image associated with this SurfaceData.
*/
@Override
public Object getDestination() {
return offscreenImage;
}
}
}