VirtualBox

source: vbox/trunk/src/VBox/Main/FramebufferImpl.cpp@ 17879

Last change on this file since 17879 was 14972, checked in by vboxsync, 16 years ago

#3285: Improve error handling API to include unique error numbers

The mega commit that implements Main-wide usage of new CheckCom*
macros, mostly CheckComArgNotNull, CheckComArgStrNotEmptyOrNull,
CheckComArgOutSafeArrayPointerValid, CheckComArgExpr.
Note that some methods incorrectly returned E_INVALIDARG where they
should have returned E_POINTER and vice versa. If any higher level
function tests these, they will behave differently now...

Special thanks to: vi macros, making it easy to semi-automatically
find and replace several hundred instances of if (!aName) ...

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.4 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#include "FramebufferImpl.h"
23#include <iprt/semaphore.h>
24
25// constructor / destructor
26/////////////////////////////////////////////////////////////////////////////
27
28InternalFramebuffer::InternalFramebuffer()
29{
30 mData = NULL;
31 RTSemMutexCreate(&mMutex);
32}
33
34InternalFramebuffer::~InternalFramebuffer()
35{
36 RTSemMutexDestroy(mMutex);
37 if (mData)
38 delete mData;
39}
40
41// public methods only for internal purposes
42/////////////////////////////////////////////////////////////////////////////
43
44HRESULT InternalFramebuffer::init(ULONG width, ULONG height, ULONG depth)
45{
46 mWidth = width;
47 mHeight = height;
48 mBitsPerPixel = depth;
49 mBytesPerLine = ((width * depth + 31) / 32) * 4;
50 mData = new uint8_t [mBytesPerLine * height];
51 memset (mData, 0, mBytesPerLine * height);
52
53 return S_OK;
54}
55
56// IFramebuffer properties
57/////////////////////////////////////////////////////////////////////////////
58
59STDMETHODIMP InternalFramebuffer::COMGETTER(Address) (BYTE **address)
60{
61 CheckComArgOutPointerValid(address);
62 *address = mData;
63 return S_OK;
64}
65
66STDMETHODIMP InternalFramebuffer::COMGETTER(Width) (ULONG *width)
67{
68 CheckComArgOutPointerValid(width);
69 *width = mWidth;
70 return S_OK;
71}
72
73STDMETHODIMP InternalFramebuffer::COMGETTER(Height) (ULONG *height)
74{
75 CheckComArgOutPointerValid(height);
76 *height = mHeight;
77 return S_OK;
78}
79
80STDMETHODIMP InternalFramebuffer::COMGETTER(BitsPerPixel) (ULONG *bitsPerPixel)
81{
82 CheckComArgOutPointerValid(bitsPerPixel);
83 *bitsPerPixel = mBitsPerPixel;
84 return S_OK;
85}
86
87STDMETHODIMP InternalFramebuffer::COMGETTER(BytesPerLine) (ULONG *bytesPerLine)
88{
89 CheckComArgOutPointerValid(bytesPerLine);
90 *bytesPerLine = mBytesPerLine;
91 return S_OK;
92}
93
94STDMETHODIMP InternalFramebuffer::COMGETTER(PixelFormat) (ULONG *pixelFormat)
95{
96 CheckComArgOutPointerValid(pixelFormat);
97 *pixelFormat = FramebufferPixelFormat_FOURCC_RGB;
98 return S_OK;
99}
100
101STDMETHODIMP InternalFramebuffer::COMGETTER(UsesGuestVRAM) (BOOL *usesGuestVRAM)
102{
103 CheckComArgOutPointerValid(usesGuestVRAM);
104 *usesGuestVRAM = FALSE;
105 return S_OK;
106}
107
108STDMETHODIMP InternalFramebuffer::COMGETTER(HeightReduction) (ULONG *heightReduction)
109{
110 CheckComArgOutPointerValid(heightReduction);
111 /* no reduction */
112 *heightReduction = 0;
113 return S_OK;
114}
115
116STDMETHODIMP InternalFramebuffer::COMGETTER(Overlay) (IFramebufferOverlay **aOverlay)
117{
118 CheckComArgOutPointerValid(aOverlay);
119 /* no overlay */
120 *aOverlay = 0;
121 return S_OK;
122}
123
124STDMETHODIMP InternalFramebuffer::COMGETTER(WinId) (ULONG64 *winId)
125{
126 CheckComArgOutPointerValid(winId);
127 *winId = 0;
128 return S_OK;
129}
130
131// IFramebuffer methods
132/////////////////////////////////////////////////////////////////////////////
133
134STDMETHODIMP InternalFramebuffer::Lock()
135{
136 RTSemMutexRequest(mMutex, RT_INDEFINITE_WAIT);
137 return S_OK;
138}
139
140STDMETHODIMP InternalFramebuffer::Unlock()
141{
142 RTSemMutexRelease(mMutex);
143 return S_OK;
144}
145
146STDMETHODIMP InternalFramebuffer::NotifyUpdate(ULONG x, ULONG y,
147 ULONG w, ULONG h,
148 BOOL *finished)
149{
150 CheckComArgOutPointerValid(finished);
151 // no need for the caller to wait
152 *finished = true;
153 return S_OK;
154}
155
156STDMETHODIMP
157InternalFramebuffer::RequestResize(ULONG iScreenId, ULONG pixelFormat, BYTE *vram,
158 ULONG bpp, ULONG bpl, ULONG w, ULONG h,
159 BOOL *finished)
160{
161 NOREF (bpp);
162 NOREF (bpl);
163
164 CheckComArgOutPointerValid(finished);
165 // no need for the caller to wait
166 *finished = true;
167
168 // allocate a new buffer
169 delete mData;
170 mWidth = w;
171 mHeight = h;
172 mBytesPerLine = ((w * mBitsPerPixel + 31) / 32) * 4;
173 mData = new uint8_t [mBytesPerLine * h];
174 memset (mData, 0, mBytesPerLine * h);
175
176 return S_OK;
177}
178
179STDMETHODIMP InternalFramebuffer::OperationSupported(FramebufferAccelerationOperation_T operation,
180 BOOL *supported)
181{
182 CheckComArgOutPointerValid(supported);
183 /* no acceleration please, we're a slow fallback implementation! */
184 *supported = false;
185 return S_OK;
186}
187
188STDMETHODIMP InternalFramebuffer::VideoModeSupported(ULONG width, ULONG height, ULONG bpp,
189 BOOL *supported)
190{
191 CheckComArgOutPointerValid(supported);
192 /* whatever you want! */
193 *supported = true;
194 return S_OK;
195}
196
197STDMETHODIMP InternalFramebuffer::SolidFill(ULONG x, ULONG y, ULONG width, ULONG height,
198 ULONG color, BOOL *handled)
199{
200 CheckComArgOutPointerValid(handled);
201 /* eek, what do you expect from us?! */
202 *handled = false;
203 return S_OK;
204}
205
206STDMETHODIMP InternalFramebuffer::CopyScreenBits(ULONG xDst, ULONG yDst, ULONG xSrc, ULONG ySrc,
207 ULONG width, ULONG height, BOOL *handled)
208{
209 CheckComArgOutPointerValid(handled);
210 /* eek, what do you expect from us?! */
211 *handled = false;
212 return S_OK;
213}
214
215STDMETHODIMP InternalFramebuffer::GetVisibleRegion(BYTE *aRectangles, ULONG aCount,
216 ULONG *aCountCopied)
217{
218 CheckComArgOutPointerValid(aRectangles);
219
220 PRTRECT rects = (PRTRECT)aRectangles;
221
222 /// @todo
223
224 NOREF(rects);
225 NOREF(aCount);
226 NOREF(aCountCopied);
227
228 return S_OK;
229}
230
231STDMETHODIMP InternalFramebuffer::SetVisibleRegion(BYTE *aRectangles, ULONG aCount)
232{
233 CheckComArgOutPointerValid(aRectangles);
234
235 PRTRECT rects = (PRTRECT)aRectangles;
236
237 /// @todo
238
239 NOREF(rects);
240 NOREF(aCount);
241
242 return S_OK;
243}
244/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette