1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyright (C) 2011-2012 Brian P.Hinz
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package com.tigervnc.vncviewer;
import java.awt.*;
import java.awt.image.*;
import java.nio.ByteOrder;
import com.tigervnc.rfb.*;
abstract public class PlatformPixelBuffer extends PixelBuffer
{
public PlatformPixelBuffer(int w, int h, CConn cc_, DesktopWindow desktop_) {
cc = cc_;
desktop = desktop_;
PixelFormat nativePF = getNativePF();
if (nativePF.depth > cc.serverPF.depth) {
setPF(cc.serverPF);
} else {
setPF(nativePF);
}
resize(w, h);
}
// resize() resizes the image, preserving the image data where possible.
abstract public void resize(int w, int h);
public PixelFormat getNativePF() {
PixelFormat pf;
cm = tk.getColorModel();
if (cm.getColorSpace().getType() == java.awt.color.ColorSpace.TYPE_RGB) {
int depth = ((cm.getPixelSize() > 24) ? 24 : cm.getPixelSize());
int bpp = (depth > 16 ? 32 : (depth > 8 ? 16 : 8));
ByteOrder byteOrder = ByteOrder.nativeOrder();
boolean bigEndian = (byteOrder == ByteOrder.BIG_ENDIAN ? true : false);
boolean trueColour = (depth > 8 ? true : false);
int redShift = cm.getComponentSize()[0] + cm.getComponentSize()[1];
int greenShift = cm.getComponentSize()[0];
int blueShift = 0;
pf = new PixelFormat(bpp, depth, bigEndian, trueColour,
(depth > 8 ? 0xff : 0),
(depth > 8 ? 0xff : 0),
(depth > 8 ? 0xff : 0),
(depth > 8 ? redShift : 0),
(depth > 8 ? greenShift : 0),
(depth > 8 ? blueShift : 0));
} else {
pf = new PixelFormat(8, 8, false, false, 7, 7, 3, 0, 3, 6);
}
vlog.debug("Native pixel format is "+pf.print());
return pf;
}
abstract public void imageRect(int x, int y, int w, int h, Object pix);
// setColourMapEntries() changes some of the entries in the colourmap.
// However these settings won't take effect until updateColourMap() is
// called. This is because getting java to recalculate its internal
// translation table and redraw the screen is expensive.
public void setColourMapEntries(int firstColour, int nColours_,
int[] rgbs) {
nColours = nColours_;
reds = new byte[nColours];
blues = new byte[nColours];
greens = new byte[nColours];
for (int i = 0; i < nColours; i++) {
reds[firstColour+i] = (byte)(rgbs[i*3] >> 8);
greens[firstColour+i] = (byte)(rgbs[i*3+1] >> 8);
blues[firstColour+i] = (byte)(rgbs[i*3+2] >> 8);
}
}
public void updateColourMap() {
cm = new IndexColorModel(8, nColours, reds, greens, blues);
}
protected static Toolkit tk = Toolkit.getDefaultToolkit();
abstract public Image getImage();
protected Image image;
int nColours;
byte[] reds;
byte[] greens;
byte[] blues;
CConn cc;
DesktopWindow desktop;
static LogWriter vlog = new LogWriter("PlatformPixelBuffer");
}
|