blob: c7cfdafb4beca09f182844712c9c22edb912b938 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.java2d.x11;
27
28import java.awt.GraphicsConfiguration;
29import java.awt.ImageCapabilities;
30import java.awt.Transparency;
31import java.awt.image.ColorModel;
32import sun.awt.X11GraphicsConfig;
33import sun.awt.image.SunVolatileImage;
34import sun.awt.image.VolatileSurfaceManager;
35import sun.java2d.SurfaceData;
36
37/**
38 * X11 platform implementation of the VolatileSurfaceManager class.
39 * The class attempts to create and use a pixmap-based SurfaceData
40 * object (X11PixmapSurfaceData).
41 * If this object cannot be created or re-created as necessary, the
42 * class falls back to a system memory based SurfaceData object
43 * (BufImgSurfaceData) that will be used until the accelerated
44 * SurfaceData can be restored.
45 */
46public class X11VolatileSurfaceManager extends VolatileSurfaceManager {
47
48 private boolean accelerationEnabled;
49
50 public X11VolatileSurfaceManager(SunVolatileImage vImg, Object context) {
51 super(vImg, context);
52
53 // We only accelerated opaque vImages currently
54 accelerationEnabled = X11SurfaceData.isAccelerationEnabled() &&
55 (vImg.getTransparency() == Transparency.OPAQUE);
56
57 if ((context != null) && !accelerationEnabled) {
58 // if we're wrapping a backbuffer drawable, we must ensure that
59 // the accelerated surface is initialized up front, regardless
60 // of whether acceleration is enabled. But we need to set
61 // the accelerationEnabled field to true to reflect that this
62 // SM is actually accelerated.
63 accelerationEnabled = true;
64 sdAccel = initAcceleratedSurface();
65 sdCurrent = sdAccel;
66
67 if (sdBackup != null) {
68 // release the system memory backup surface, as we won't be
69 // needing it in this case
70 sdBackup = null;
71 }
72 }
73 }
74
75 protected boolean isAccelerationEnabled() {
76 return accelerationEnabled;
77 }
78
79 /**
80 * Create a pixmap-based SurfaceData object
81 */
82 protected SurfaceData initAcceleratedSurface() {
83 SurfaceData sData;
84
85 try {
86 X11GraphicsConfig gc = (X11GraphicsConfig)vImg.getGraphicsConfig();
87 ColorModel cm = gc.getColorModel();
88 long drawable = 0;
89 if (context instanceof Long) {
90 drawable = ((Long)context).longValue();
91 }
92 sData = X11SurfaceData.createData(gc,
93 vImg.getWidth(),
94 vImg.getHeight(),
95 cm, vImg, drawable,
96 Transparency.OPAQUE);
97 } catch (NullPointerException ex) {
98 sData = null;
99 } catch (OutOfMemoryError er) {
100 sData = null;
101 }
102
103 return sData;
104 }
105
106 protected boolean isConfigValid(GraphicsConfiguration gc) {
107 // REMIND: we might be too paranoid here, requiring that
108 // the GC be exactly the same as the original one. The
109 // real answer is one that guarantees that pixmap copies
110 // will be correct (which requires like bit depths and
111 // formats).
112 return ((gc == null) || (gc == vImg.getGraphicsConfig()));
113 }
114
115 /**
116 * Need to override the default behavior because Pixmaps-based
117 * images are accelerated but not volatile.
118 */
119 @Override
120 public ImageCapabilities getCapabilities(GraphicsConfiguration gc) {
121 if (isConfigValid(gc) && isAccelerationEnabled()) {
122 // accelerated but not volatile
123 return new ImageCapabilities(true);
124 }
125 // neither accelerated nor volatile
126 return new ImageCapabilities(false);
127 }
128}