0N/A/*
2362N/A * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.java2d.x11;
0N/A
0N/Aimport java.awt.GraphicsConfiguration;
0N/Aimport java.awt.ImageCapabilities;
0N/Aimport java.awt.Transparency;
0N/Aimport java.awt.image.ColorModel;
0N/Aimport sun.awt.X11GraphicsConfig;
0N/Aimport sun.awt.image.SunVolatileImage;
0N/Aimport sun.awt.image.VolatileSurfaceManager;
0N/Aimport sun.java2d.SurfaceData;
0N/A
0N/A/**
0N/A * X11 platform implementation of the VolatileSurfaceManager class.
0N/A * The class attempts to create and use a pixmap-based SurfaceData
0N/A * object (X11PixmapSurfaceData).
0N/A * If this object cannot be created or re-created as necessary, the
0N/A * class falls back to a system memory based SurfaceData object
0N/A * (BufImgSurfaceData) that will be used until the accelerated
0N/A * SurfaceData can be restored.
0N/A */
0N/Apublic class X11VolatileSurfaceManager extends VolatileSurfaceManager {
0N/A
0N/A private boolean accelerationEnabled;
0N/A
0N/A public X11VolatileSurfaceManager(SunVolatileImage vImg, Object context) {
0N/A super(vImg, context);
0N/A
0N/A // We only accelerated opaque vImages currently
0N/A accelerationEnabled = X11SurfaceData.isAccelerationEnabled() &&
0N/A (vImg.getTransparency() == Transparency.OPAQUE);
0N/A
0N/A if ((context != null) && !accelerationEnabled) {
0N/A // if we're wrapping a backbuffer drawable, we must ensure that
0N/A // the accelerated surface is initialized up front, regardless
0N/A // of whether acceleration is enabled. But we need to set
0N/A // the accelerationEnabled field to true to reflect that this
0N/A // SM is actually accelerated.
0N/A accelerationEnabled = true;
0N/A sdAccel = initAcceleratedSurface();
0N/A sdCurrent = sdAccel;
0N/A
0N/A if (sdBackup != null) {
0N/A // release the system memory backup surface, as we won't be
0N/A // needing it in this case
0N/A sdBackup = null;
0N/A }
0N/A }
0N/A }
0N/A
0N/A protected boolean isAccelerationEnabled() {
0N/A return accelerationEnabled;
0N/A }
0N/A
0N/A /**
0N/A * Create a pixmap-based SurfaceData object
0N/A */
0N/A protected SurfaceData initAcceleratedSurface() {
0N/A SurfaceData sData;
0N/A
0N/A try {
0N/A X11GraphicsConfig gc = (X11GraphicsConfig)vImg.getGraphicsConfig();
0N/A ColorModel cm = gc.getColorModel();
0N/A long drawable = 0;
0N/A if (context instanceof Long) {
0N/A drawable = ((Long)context).longValue();
0N/A }
0N/A sData = X11SurfaceData.createData(gc,
0N/A vImg.getWidth(),
0N/A vImg.getHeight(),
0N/A cm, vImg, drawable,
0N/A Transparency.OPAQUE);
0N/A } catch (NullPointerException ex) {
0N/A sData = null;
0N/A } catch (OutOfMemoryError er) {
0N/A sData = null;
0N/A }
0N/A
0N/A return sData;
0N/A }
0N/A
0N/A protected boolean isConfigValid(GraphicsConfiguration gc) {
0N/A // REMIND: we might be too paranoid here, requiring that
0N/A // the GC be exactly the same as the original one. The
0N/A // real answer is one that guarantees that pixmap copies
0N/A // will be correct (which requires like bit depths and
0N/A // formats).
0N/A return ((gc == null) || (gc == vImg.getGraphicsConfig()));
0N/A }
0N/A
0N/A /**
0N/A * Need to override the default behavior because Pixmaps-based
0N/A * images are accelerated but not volatile.
0N/A */
0N/A @Override
0N/A public ImageCapabilities getCapabilities(GraphicsConfiguration gc) {
0N/A if (isConfigValid(gc) && isAccelerationEnabled()) {
0N/A // accelerated but not volatile
0N/A return new ImageCapabilities(true);
0N/A }
0N/A // neither accelerated nor volatile
0N/A return new ImageCapabilities(false);
0N/A }
0N/A}