/*
* Copyright (c) 2013, 2016, 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 com.sun.prism;
import com.sun.glass.ui.Application;
import com.sun.glass.ui.Pixels;
import com.sun.glass.ui.Screen;
import com.sun.glass.ui.View;
import com.sun.glass.ui.Window;
PresentableState is intended to provide for a shadow copy of View/Window
state for use off the event thread. It is the task of the invoker of
Prism to make sure that the state is consistent for a rendering probably
by use of the AbstractPainter.renderLock to ensure consistent state.
/**
* PresentableState is intended to provide for a shadow copy of View/Window
* state for use off the event thread. It is the task of the invoker of
* Prism to make sure that the state is consistent for a rendering probably
* by use of the AbstractPainter.renderLock to ensure consistent state.
*/
public abstract class PresentableState {
The underlying Window and View /** The underlying Window and View */
protected Window window;
protected View view;
// Captured state
protected int nativeFrameBuffer;
protected int windowX, windowY;
protected float windowAlpha;
protected long nativeWindowHandle;
protected long nativeView;
protected int viewWidth, viewHeight;
protected float renderScaleX, renderScaleY;
protected int renderWidth, renderHeight;
protected float outputScaleX, outputScaleY;
protected int outputWidth, outputHeight;
protected int screenHeight;
protected int screenWidth;
protected boolean isWindowVisible;
protected boolean isWindowMinimized;
protected static final boolean hasWindowManager =
Application.GetApplication().hasWindowManager();
// Between PaintCollector and *Painter, there is a window where
// the associated View can be closed. This variable allows us
// to shortcut the queued *Painter task.
protected boolean isClosed;
protected final int pixelFormat = Pixels.getNativeFormat();
Create a PresentableState based on a View.
Must be called on the event thread.
/** Create a PresentableState based on a View.
*
* Must be called on the event thread.
*/
public PresentableState() {
}
The screen relative window X
Returns: The screen relative window X
May be called on any thread.
/**
* The screen relative window X
* @return The screen relative window X
*
* May be called on any thread.
*/
public int getWindowX() {
return windowX;
}
The screen relative window Y
Returns: The screen relative window Y
May be called on any thread.
/**
* The screen relative window Y
* @return The screen relative window Y
*
* May be called on any thread.
*/
public int getWindowY() {
return windowY;
}
Returns: the width of the View
May be called on any thread.
/**
* @return the width of the View
*
* May be called on any thread.
*/
public int getWidth() {
return viewWidth;
}
Returns: the height of the View
May be called on any thread.
/**
* @return the height of the View
*
* May be called on any thread.
*/
public int getHeight() {
return viewHeight;
}
public int getRenderWidth() {
return renderWidth;
}
public int getRenderHeight() {
return renderHeight;
}
public int getOutputWidth() {
return outputWidth;
}
public int getOutputHeight() {
return outputHeight;
}
Returns: Screen.getScale
May be called on any thread
/**
* @return Screen.getScale
*
* May be called on any thread
*/
public float getRenderScaleX() {
return renderScaleX;
}
Returns: Screen.getScale
May be called on any thread
/**
* @return Screen.getScale
*
* May be called on any thread
*/
public float getRenderScaleY() {
return renderScaleY;
}
public float getOutputScaleX() {
return outputScaleX;
}
public float getOutputScaleY() {
return outputScaleY;
}
Returns: the window's alpha level
May be called on any thread.
/**
* @return the window's alpha level
*
* May be called on any thread.
*/
public float getAlpha() {
return windowAlpha;
}
Returns: the native handle of the window represented by this
PresentableState
May be called on any thread.
/**
* @return the native handle of the window represented by this
* PresentableState
*
* May be called on any thread.
*/
public long getNativeWindow() {
return nativeWindowHandle;
}
Returns: the native handle of the View represented by this
PresentableState
May be called on any thread.
/**
* @return the native handle of the View represented by this
* PresentableState
*
* May be called on any thread.
*/
public long getNativeView() {
return nativeView;
}
Returns: the current height of the screen
May be called on any thread.
/**
* @return the current height of the screen
*
* May be called on any thread.
*/
public int getScreenHeight() {
return screenHeight;
}
Returns: the current width of the screen
May be called on any thread.
/**
* @return the current width of the screen
*
* May be called on any thread.
*/
public int getScreenWidth() {
return screenWidth;
}
Returns: true if the underlying View is closed, false otherwise
May be called on any thread.
/**
* @return true if the underlying View is closed, false otherwise
*
* May be called on any thread.
*/
public boolean isViewClosed() {
return isClosed;
}
Returns: true if the underlying Window is minimized, false otherwise
May be called on any thread.
/**
* @return true if the underlying Window is minimized, false otherwise
*
* May be called on any thread.
*/
public boolean isWindowMinimized() {
return isWindowMinimized;
}
Returns: true if the underlying Window is Visible, false otherwise
May be called on any thread.
/**
* @return true if the underlying Window is Visible, false otherwise
*
* May be called on any thread.
*/
public boolean isWindowVisible() {
return isWindowVisible;
}
Returns: true if the underlying window is managed by a window manager
external to JavaFX
May be called on any thread.
/**
* @return true if the underlying window is managed by a window manager
* external to JavaFX
*
* May be called on any thread.
*/
public boolean hasWindowManager() {
return hasWindowManager;
}
Returns: the underlying Window
May be called on any thread.
/**
* @return the underlying Window
*
* May be called on any thread.
*/
public Window getWindow() {
return window;
}
public boolean isMSAA() { return false; }
Returns: the underlying View
May be called on any thread.
/**
* @return the underlying View
*
* May be called on any thread.
*/
public View getView() {
return view;
}
Returns: native pixel format
May be called on any thread.
/**
* @return native pixel format
*
* May be called on any thread.
*/
public int getPixelFormat() {
return pixelFormat;
}
Returns: native native frame buffer
May be called on any thread.
/**
* @return native native frame buffer
*
* May be called on any thread.
*/
public int getNativeFrameBuffer() {
return nativeFrameBuffer;
}
Locks the underlying view for rendering
Must be called on Prism renderer thread.
/**
* Locks the underlying view for rendering
*
* Must be called on Prism renderer thread.
*/
public void lock() {
if (view != null) {
view.lock();
nativeFrameBuffer = view.getNativeFrameBuffer();
}
}
Unlocks the underlying view after rendering
Must be called on Prism renderer thread.
/**
* Unlocks the underlying view after rendering
*
* Must be called on Prism renderer thread.
*/
public void unlock() {
if (view != null) view.unlock();
}
Put the pixels on the screen.
Params: - source – - the source for the Pixels object to be uploaded
/**
* Put the pixels on the screen.
*
* @param source - the source for the Pixels object to be uploaded
*/
public void uploadPixels(PixelSource source) {
Pixels pixels = source.getLatestPixels();
if (pixels != null) {
try {
view.uploadPixels(pixels);
} finally {
source.doneWithPixels(pixels);
}
}
}
private int scale(int dim, float fromScale, float toScale) {
return (fromScale == toScale)
? dim
: (int) Math.ceil(dim * toScale / fromScale);
}
protected void update(float viewScaleX, float viewScaleY,
float renderScaleX, float renderScaleY,
float outputScaleX, float outputScaleY)
{
this.renderScaleX = renderScaleX;
this.renderScaleY = renderScaleY;
this.outputScaleX = outputScaleX;
this.outputScaleY = outputScaleY;
if (renderScaleX == viewScaleX && renderScaleY == viewScaleY) {
renderWidth = viewWidth;
renderHeight = viewHeight;
} else {
renderWidth = scale(viewWidth, viewScaleX, renderScaleX);
renderHeight = scale(viewHeight, viewScaleY, renderScaleY);
}
if (outputScaleX == viewScaleX && outputScaleY == viewScaleY) {
outputWidth = viewWidth;
outputHeight = viewHeight;
} else if (outputScaleX == renderScaleX && outputScaleY == renderScaleY) {
outputWidth = renderWidth;
outputHeight = renderHeight;
} else {
outputWidth = scale(viewWidth, viewScaleX, outputScaleX);
outputHeight = scale(viewHeight, viewScaleY, outputScaleY);
}
}
Updates the state of this object based on the current state of its
nativeWindow.
May only be called from the event thread.
/** Updates the state of this object based on the current state of its
* nativeWindow.
*
* May only be called from the event thread.
*/
public void update() {
// should only be called on the event thread
if (view != null) {
viewWidth = view.getWidth();
viewHeight = view.getHeight();
window = view.getWindow();
} else {
viewWidth = viewHeight = -1;
window = null;
}
if (window != null) {
windowX = window.getX();
windowY = window.getY();
windowAlpha = window.getAlpha();
nativeView = view.getNativeView();
nativeWindowHandle = window.getNativeWindow();
isClosed = view.isClosed();
isWindowVisible = window.isVisible();
isWindowMinimized = window.isMinimized();
update(window.getPlatformScaleX(), window.getPlatformScaleY(),
window.getRenderScaleX(), window.getRenderScaleY(),
window.getOutputScaleX(), window.getOutputScaleY());
Screen screen = window.getScreen();
if (screen != null) {
// note only used by Embedded Z order painting
// !hasWindowManager so should be safe to ignore
// when null, most likely because of "In Browswer"
screenHeight = screen.getHeight();
screenWidth = screen.getWidth();
}
} else {
//TODO - should other variables be cleared?
nativeView = -1;
nativeWindowHandle = -1;
isClosed = true;
}
}
}