VBoxFrameBuffer.h revision 65a24a6d074ca3422fd58830484323b3fd8096b2
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/** @file
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * VBox frontends: Qt GUI ("VirtualBox"):
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * VBoxFrameBuffer class and subclasses declarations
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/*
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * available from http://www.virtualbox.org. This file is free software;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * General Public License (GPL) as published by the Free Software
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * additional information or have any questions.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#ifndef __VBoxFrameBuffer_h__
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#define __VBoxFrameBuffer_h__
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include "COMDefs.h"
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/* Qt includes */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <QImage>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <QPixmap>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <QMutex>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (VBOX_GUI_USE_SDL)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <SDL.h>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <signal.h>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (Q_WS_WIN) && defined (VBOX_GUI_USE_DDRAW)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync// VBox/cdefs.h defines these:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#undef LOWORD
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#undef HIWORD
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#undef LOBYTE
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#undef HIBYTE
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <ddraw.h>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxConsoleView;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync//#define VBOX_GUI_FRAMEBUF_STAT
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (VBOX_GUI_DEBUG) && defined (VBOX_GUI_FRAMEBUF_STAT)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#define FRAMEBUF_DEBUG_START(prefix) \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uint64_t prefix##elapsed = VMCPUTimer::ticks();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#define FRAMEBUF_DEBUG_STOP(prefix,w,h) { \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync prefix##elapsed = VMCPUTimer::ticks() - prefix##elapsed; \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync V_DEBUG(( "Last update: %04d x %04d px, %03.3f ms, %.0f ticks", \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync (w), (h), \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync (double) prefix##elapsed / (double) VMCPUTimer::ticksPerMsec(), \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync (double) prefix##elapsed \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync )); \
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#else
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#define FRAMEBUF_DEBUG_START(prefix) {}
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#define FRAMEBUF_DEBUG_STOP(prefix,w,h) {}
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/////////////////////////////////////////////////////////////////////////////
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Frame buffer resize event.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxResizeEvent : public QEvent
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxResizeEvent (ulong aPixelFormat, uchar *aVRAM,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong aBitsPerPixel, ulong aBytesPerLine,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong aWidth, ulong aHeight) :
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QEvent ((QEvent::Type) VBoxDefs::ResizeEventType),
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync mPixelFormat (aPixelFormat), mVRAM (aVRAM), mBitsPerPixel (aBitsPerPixel),
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync mBytesPerLine (aBytesPerLine), mWidth (aWidth), mHeight (aHeight) {}
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong pixelFormat() { return mPixelFormat; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uchar *VRAM() { return mVRAM; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bitsPerPixel() { return mBitsPerPixel; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bytesPerLine() { return mBytesPerLine; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong width() { return mWidth; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong height() { return mHeight; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsyncprivate:
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mPixelFormat;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uchar *mVRAM;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mBitsPerPixel;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mBytesPerLine;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mWidth;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mHeight;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Frame buffer repaint event.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxRepaintEvent : public QEvent
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxRepaintEvent (int x, int y, int w, int h) :
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QEvent ((QEvent::Type) VBoxDefs::RepaintEventType),
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ex (x), ey (y), ew (w), eh (h)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {}
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int x() { return ex; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int y() { return ey; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int width() { return ew; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int height() { return eh; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprivate:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int ex, ey, ew, eh;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Frame buffer set region event.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxSetRegionEvent : public QEvent
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxSetRegionEvent (const QRegion &aReg)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync : QEvent ((QEvent::Type) VBoxDefs::SetRegionEventType)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync , mReg (aReg) {}
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QRegion region() { return mReg; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprivate:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QRegion mReg;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/////////////////////////////////////////////////////////////////////////////
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Common IFramebuffer implementation for all methods used by GUI to maintain
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * the VM display video memory.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Note that although this class can be called from multiple threads
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * (in particular, the GUI thread and EMT) it doesn't protect access to every
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * data field using its mutex lock. This is because all synchronization between
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * the GUI and the EMT thread is supposed to be done using the
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * IFramebuffer::NotifyUpdate() and IFramebuffer::RequestResize() methods
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * (in particular, the \a aFinished parameter of these methods is responsible
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * for the synchronization). These methods are always called on EMT and
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * therefore always follow one another but never in parallel.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Using this object's mutex lock (exposed also in IFramebuffer::Lock() and
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * IFramebuffer::Unlock() implementations) usually makes sense only if some
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * third-party thread (i.e. other than GUI or EMT) needs to make sure that
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * *no* VM display update or resize event can occur while it is accessing
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * IFramebuffer properties or the underlying display memory storage area.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * See IFramebuffer documentation for more info.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxFrameBuffer : public IFramebuffer
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxFrameBuffer (VBoxConsoleView *aView);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual ~VBoxFrameBuffer();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync NS_DECL_ISUPPORTS
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (Q_OS_WIN32)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD_(ULONG, AddRef)()
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return ::InterlockedIncrement (&refcnt);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD_(ULONG, Release)()
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync long cnt = ::InterlockedDecrement (&refcnt);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync if (cnt == 0)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync delete this;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return cnt;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(QueryInterface) (REFIID riid , void **ppObj)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync if (riid == IID_IUnknown) {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *ppObj = this;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync AddRef();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return S_OK;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync if (riid == IID_IFramebuffer) {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *ppObj = this;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync AddRef();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return S_OK;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *ppObj = NULL;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return E_NOINTERFACE;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync // IFramebuffer COM methods
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(Address)) (BYTE **aAddress);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(Width)) (ULONG *aWidth);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(Height)) (ULONG *aHeight);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(BitsPerPixel)) (ULONG *aBitsPerPixel);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(BytesPerLine)) (ULONG *aBytesPerLine);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(PixelFormat)) (ULONG *aPixelFormat);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(UsesGuestVRAM)) (BOOL *aUsesGuestVRAM);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(HeightReduction)) (ULONG *aHeightReduction);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(Overlay)) (IFramebufferOverlay **aOverlay);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(COMGETTER(WinId)) (ULONG64 *winId);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(Lock)();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(Unlock)();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(RequestResize) (ULONG aScreenId, ULONG aPixelFormat,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BYTE *aVRAM, ULONG aBitsPerPixel, ULONG aBytesPerLine,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aWidth, ULONG aHeight,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BOOL *aFinished);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(OperationSupported)(FramebufferAccelerationOperation_T aOperation,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BOOL *aSupported);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(VideoModeSupported) (ULONG aWidth, ULONG aHeight, ULONG aBPP,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BOOL *aSupported);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(SolidFill) (ULONG aX, ULONG aY, ULONG aWidth, ULONG aHeight,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aColor, BOOL *aHandled);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(CopyScreenBits) (ULONG aXDst, ULONG aYDst, ULONG aXSrc, ULONG aYSrc,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aWidth, ULONG aHeight, BOOL *aHandled);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync STDMETHOD(GetVisibleRegion)(BYTE *aRectangles, ULONG aCount, ULONG *aCountCopied);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync STDMETHOD(SetVisibleRegion)(BYTE *aRectangles, ULONG aCount);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ulong width() { return mWdt; }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ulong height() { return mHgt; }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync virtual ulong pixelFormat()
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync {
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync return FramebufferPixelFormat_FOURCC_RGB;
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync virtual bool usesGuestVRAM()
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync {
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync return false;
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync void lock() { mMutex->lock(); }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync void unlock() { mMutex->unlock(); }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync virtual uchar *address() = 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual ulong bitsPerPixel() = 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual ulong bytesPerLine() = 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Called on the GUI thread (from VBoxConsoleView) when some part of the
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * VM display viewport needs to be repainted on the host screen.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual void paintEvent (QPaintEvent *pe) = 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Called on the GUI thread (from VBoxConsoleView) after it gets a
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * VBoxResizeEvent posted from the RequestResize() method implementation.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual void resizeEvent (VBoxResizeEvent *re)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync mWdt = re->width();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync mHgt = re->height();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /**
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * Called on the GUI thread (from VBoxConsoleView) when the VM console
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * window is moved.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual void moveEvent (QMoveEvent * /*me*/ ) {}
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprotected:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxConsoleView *mView;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QMutex *mMutex;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int mWdt;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int mHgt;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (Q_OS_WIN32)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprivate:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync long refcnt;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/////////////////////////////////////////////////////////////////////////////
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (VBOX_GUI_USE_QIMAGE)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxQImageFrameBuffer : public VBoxFrameBuffer
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxQImageFrameBuffer (VBoxConsoleView *aView);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aW, ULONG aH,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BOOL *aFinished);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong pixelFormat() { return mPixelFormat; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync bool usesGuestVRAM() { return mUsesGuestVRAM; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uchar *address() { return mImg.bits(); }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bitsPerPixel() { return mImg.depth(); }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bytesPerLine() { return mImg.bytesPerLine(); }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void paintEvent (QPaintEvent *pe);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void resizeEvent (VBoxResizeEvent *re);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprivate:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QPixmap mPM;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync QImage mImg;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mPixelFormat;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync bool mUsesGuestVRAM;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/////////////////////////////////////////////////////////////////////////////
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (VBOX_GUI_USE_SDL)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxSDLFrameBuffer : public VBoxFrameBuffer
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxSDLFrameBuffer (VBoxConsoleView *aView);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual ~VBoxSDLFrameBuffer();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aW, ULONG aH,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BOOL *aFinished);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uchar *address()
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync SDL_Surface *surf = mSurfVRAM ? mSurfVRAM : mScreen;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return surf ? (uchar *) (uintptr_t) surf->pixels : 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bitsPerPixel()
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync SDL_Surface *surf = mSurfVRAM ? mSurfVRAM : mScreen;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return surf ? surf->format->BitsPerPixel : 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bytesPerLine()
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync SDL_Surface *surf = mSurfVRAM ? mSurfVRAM : mScreen;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return surf ? surf->pitch : 0;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong pixelFormat()
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return mPixelFormat;
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync bool usesGuestVRAM()
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync return mSurfVRAM != NULL;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void paintEvent (QPaintEvent *pe);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void resizeEvent (VBoxResizeEvent *re);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprivate:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync SDL_Surface *mScreen;
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync SDL_Surface *mSurfVRAM;
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ulong mPixelFormat;
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync};
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync#endif
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync/////////////////////////////////////////////////////////////////////////////
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync#if defined (VBOX_GUI_USE_DDRAW)
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsyncclass VBoxDDRAWFrameBuffer : public VBoxFrameBuffer
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync{
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsyncpublic:
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync VBoxDDRAWFrameBuffer (VBoxConsoleView *aView);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync virtual ~VBoxDDRAWFrameBuffer();
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY,
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ULONG aW, ULONG aH,
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync BOOL *aFinished);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync uchar *address() { return (uchar *) mSurfaceDesc.lpSurface; }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ulong bitsPerPixel() { return mSurfaceDesc.ddpfPixelFormat.dwRGBBitCount; }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ulong bytesPerLine() { return (ulong) mSurfaceDesc.lPitch; }
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ulong pixelFormat() { return mPixelFormat; };
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync bool usesGuestVRAM() { return mUsesGuestVRAM; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync void paintEvent (QPaintEvent *pe);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync void resizeEvent (VBoxResizeEvent *re);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync void moveEvent (QMoveEvent *me);
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsyncprivate:
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync void releaseObjects();
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync bool createSurface (ULONG aPixelFormat, uchar *pvVRAM,
1e8d9e04805e6cf8e90e57ee08344105c76f23fevboxsync ULONG aBitsPerPixel, ULONG aBytesPerLine,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aWidth, ULONG aHeight);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void deleteSurface();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void drawRect (ULONG x, ULONG y, ULONG w, ULONG h);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void getWindowPosition (void);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync LPDIRECTDRAW7 mDDRAW;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync LPDIRECTDRAWCLIPPER mClipper;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync LPDIRECTDRAWSURFACE7 mSurface;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync DDSURFACEDESC2 mSurfaceDesc;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync LPDIRECTDRAWSURFACE7 mPrimarySurface;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mPixelFormat;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync bool mUsesGuestVRAM;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int mWndX;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync int mWndY;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync bool mSynchronousUpdates;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync/////////////////////////////////////////////////////////////////////////////
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#if defined (Q_WS_MAC) && defined (VBOX_GUI_USE_QUARTZ2D)
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#include <Carbon/Carbon.h>
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncclass VBoxQuartz2DFrameBuffer : public VBoxFrameBuffer
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync{
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncpublic:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync VBoxQuartz2DFrameBuffer (VBoxConsoleView *aView);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync virtual ~VBoxQuartz2DFrameBuffer ();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD (NotifyUpdate) (ULONG aX, ULONG aY,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG aW, ULONG aH,
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync BOOL *aFinished);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync STDMETHOD (SetVisibleRegion) (BYTE *aRectangles, ULONG aCount);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uchar *address() { return mDataAddress; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bitsPerPixel() { return CGImageGetBitsPerPixel (mImage); }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong bytesPerLine() { return CGImageGetBytesPerRow (mImage); }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong pixelFormat() { return mPixelFormat; };
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync bool usesGuestVRAM() { return mBitmapData == NULL; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync const CGImageRef imageRef() const { return mImage; }
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void paintEvent (QPaintEvent *pe);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void resizeEvent (VBoxResizeEvent *re);
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsyncprivate:
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void clean();
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync uchar *mDataAddress;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync void *mBitmapData;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ulong mPixelFormat;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync CGImageRef mImage;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync typedef struct
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync {
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /** The size of this structure expressed in rcts entries. */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG allocated;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /** The number of entries in the rcts array. */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync ULONG used;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /** Variable sized array of the rectangle that makes up the region. */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync CGRect rcts[1];
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync } RegionRects;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /** The current valid region, all access is by atomic cmpxchg or atomic xchg.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync *
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * The protocol for updating and using this has to take into account that
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * the producer (SetVisibleRegion) and consumer (paintEvent) are running
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * on different threads. Therefore the producer will create a new RegionRects
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * structure before atomically replace the existing one. While the consumer
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * will read the value by atomically replace it by NULL, and then when its
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * done try restore it by cmpxchg. If the producer has already put a new
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * region there, it will be discarded (see mRegionUnused).
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync RegionRects volatile *mRegion;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync /** For keeping the unused region and thus avoid some RTMemAlloc/RTMemFree calls.
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync * This is operated with atomic cmpxchg and atomic xchg. */
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync RegionRects volatile *mRegionUnused;
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync};
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync#endif // !__VBoxFrameBuffer_h__
b0af0b78d25ede09c0d23b2be9163cf43c7ca6f8vboxsync