// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package common; import java.awt.image.IndexColorModel; import java.util.HashSet; import java.util.Set; /** * VncScreenDescription - contains information about remote VNC screen. */ public class ScreenDescription { protected Set<SizeChangeListener> sizeChangeListeners = new HashSet<SizeChangeListener>(); // Frame buffer size protected int framebufferWidth = -1; protected int framebufferHeight = -1; // Desktop name protected String desktopName = null; // Bytes per pixel protected int bytesPerPixel; protected int colorDepth; protected int bitsPerPixel; protected int redShift; protected int greenShift; protected int blueShift; protected int redMax; protected int greenMax; protected int blueMax; protected boolean bigEndianFlag; protected boolean trueColorFlag; public IndexColorModel colorMap = null; public ScreenDescription() { } /** * Store information about server pixel format. */ public void setPixelFormat(int bitsPerPixel, int depth, boolean bigEndianFlag, boolean trueColorFlag, int redMax, int greenMax, int blueMax, int redShift, int greenShift, int blueShift) { bytesPerPixel = (bitsPerPixel + 7) / 8; this.bitsPerPixel = bitsPerPixel; colorDepth = depth; this.bigEndianFlag = bigEndianFlag; this.trueColorFlag = trueColorFlag; this.redMax = redMax; this.greenMax = greenMax; this.blueMax = blueMax; this.redShift = redShift; this.greenShift = greenShift; this.blueShift = blueShift; } /** * Store information about server pixel format. */ public void setPixelFormatRGBTrueColor(int bitsPerPixel) { switch (bitsPerPixel) { case 8: setPixelFormat(8, 8, false, false, -1, -1, -1, -1, -1, -1); break; case 15: setPixelFormat(16, 15, false, true, 31, 31, 31, 0, 5, 10); break; case 16: setPixelFormat(16, 16, false, true, 31, 63, 31, 0, 5, 11); break; case 24: setPixelFormat(24, 24, false, true, 255, 255, 255, 0, 8, 16); break; case 32: setPixelFormat(32, 24, false, true, 255, 255, 255, 0, 8, 16); break; default: throw new RuntimeException("Unknown color depth."); } } /** * Store information about server screen size. */ public void setFramebufferSize(int width, int height) { if (height <= 0 || width <= 0) throw new RuntimeException("Incorrect framebuffer size: " + width + "x" + height + "."); framebufferWidth = width; framebufferHeight = height; callSizeChangeListeners(width, height); } protected void callSizeChangeListeners(int width, int height) { for (SizeChangeListener listener : sizeChangeListeners) { listener.sizeChanged(width, height); } } /** * Store server desktop name. */ public void setDesktopName(String desktopName) { this.desktopName = desktopName; } // Getters for variables, as usual public String getDesktopName() { return desktopName; } public int getBytesPerPixel() { return bytesPerPixel; } public int getFramebufferHeight() { return framebufferHeight; } public int getFramebufferWidth() { return framebufferWidth; } public boolean isRGB888_32_LE() { return (colorDepth == 24 && bitsPerPixel == 32 && redShift == 0 && greenShift == 8 && blueShift == 16 && redMax == 255 && greenMax == 255 && blueMax == 255 && !bigEndianFlag && trueColorFlag); } @Override public String toString() { return "ScreenDescription [framebufferWidth=" + framebufferWidth + ", framebufferHeight=" + framebufferHeight + ", desktopName=" + desktopName + ", bytesPerPixel=" + bytesPerPixel + ", depth=" + colorDepth + ", bitsPerPixel=" + bitsPerPixel + ", redShift=" + redShift + ", greenShift=" + greenShift + ", blueShift=" + blueShift + ", redMax=" + redMax + ", greenMax=" + greenMax + ", blueMax=" + blueMax + ", bigEndianFlag=" + bigEndianFlag + ", trueColorFlag=" + trueColorFlag + "]"; } public void addSizeChangeListener(SizeChangeListener sizeChangeListener) { sizeChangeListeners.add(sizeChangeListener); } public int getColorDeph() { return colorDepth; } }