2010-08-09 13:28:56 +00:00
|
|
|
#include <ddraw.h>
|
2017-07-24 05:23:40 +00:00
|
|
|
#undef interface
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
static LRESULT CALLBACK VideoDirectDraw7_WindowProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
2019-09-06 14:54:58 +00:00
|
|
|
if(msg == WM_SYSKEYDOWN && wparam == VK_F4) return false;
|
2019-07-07 09:44:09 +00:00
|
|
|
return DefWindowProc(hwnd, msg, wparam, lparam);
|
|
|
|
}
|
|
|
|
|
2018-08-05 09:00:15 +00:00
|
|
|
struct VideoDirectDraw : VideoDriver {
|
|
|
|
VideoDirectDraw& self = *this;
|
2019-07-07 09:44:09 +00:00
|
|
|
VideoDirectDraw(Video& super) : VideoDriver(super) { construct(); }
|
|
|
|
~VideoDirectDraw() { destruct(); }
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2018-08-05 09:00:15 +00:00
|
|
|
auto create() -> bool override {
|
2019-08-16 10:44:16 +00:00
|
|
|
VideoDriver::shader = "Blur";
|
2018-08-05 09:00:15 +00:00
|
|
|
return initialize();
|
|
|
|
}
|
|
|
|
|
2018-08-09 04:15:56 +00:00
|
|
|
auto driver() -> string override { return "DirectDraw 7.0"; }
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto ready() -> bool override { return _ready; }
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2019-08-16 10:44:16 +00:00
|
|
|
auto hasFullScreen() -> bool override { return true; }
|
|
|
|
auto hasMonitor() -> bool override { return true; }
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto hasContext() -> bool override { return true; }
|
|
|
|
auto hasBlocking() -> bool override { return true; }
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2019-08-16 10:44:16 +00:00
|
|
|
auto setFullScreen(bool fullScreen) -> bool override {
|
|
|
|
return initialize();
|
|
|
|
}
|
|
|
|
|
2019-08-17 14:41:44 +00:00
|
|
|
auto setMonitor(string monitor) -> bool override {
|
2019-07-07 09:44:09 +00:00
|
|
|
return initialize();
|
|
|
|
}
|
|
|
|
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto setContext(uintptr context) -> bool override {
|
2017-07-24 05:23:40 +00:00
|
|
|
return initialize();
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto setBlocking(bool blocking) -> bool override {
|
2017-07-24 05:23:40 +00:00
|
|
|
return true;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2020-02-23 11:23:25 +00:00
|
|
|
auto focused() -> bool override {
|
|
|
|
if(self.fullScreen && self.exclusive) return true;
|
|
|
|
auto focused = GetFocus();
|
|
|
|
return _context == focused || IsChild(_context, focused);
|
|
|
|
}
|
|
|
|
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto clear() -> void override {
|
2019-07-07 09:44:09 +00:00
|
|
|
DDBLTFX fx{};
|
2010-08-09 13:28:56 +00:00
|
|
|
fx.dwSize = sizeof(DDBLTFX);
|
|
|
|
fx.dwFillColor = 0x00000000;
|
2017-07-24 05:23:40 +00:00
|
|
|
_screen->Blt(0, 0, 0, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
|
|
|
|
_raster->Blt(0, 0, 0, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
auto size(uint& width, uint& height) -> void override {
|
|
|
|
RECT rectangle;
|
|
|
|
GetClientRect(_context, &rectangle);
|
|
|
|
width = rectangle.right - rectangle.left;
|
|
|
|
height = rectangle.bottom - rectangle.top;
|
|
|
|
}
|
|
|
|
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto acquire(uint32_t*& data, uint& pitch, uint width, uint height) -> bool override {
|
2017-07-24 05:23:40 +00:00
|
|
|
if(width != _width || height != _height) resize(_width = width, _height = height);
|
|
|
|
DDSURFACEDESC2 description = {};
|
|
|
|
description.dwSize = sizeof(DDSURFACEDESC2);
|
|
|
|
if(_raster->Lock(0, &description, DDLOCK_WAIT, 0) != DD_OK) {
|
|
|
|
_raster->Restore();
|
|
|
|
if(_raster->Lock(0, &description, DDLOCK_WAIT, 0) != DD_OK) return false;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
2017-07-24 05:23:40 +00:00
|
|
|
pitch = description.lPitch;
|
|
|
|
return data = (uint32_t*)description.lpSurface;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
Update to 20180729 release.
byuu wrote:
Sigh ...
asio.hpp needs #include <nall/windows/registry.hpp>
[Since the last WIP, byuu also posted the following message. -Ed.]
ruby drivers have all been updated (but not tested outside of BSD), and
I redesigned the settings window. The driver functionality all exists on
a new "Drivers" panel, the emulator/hack settings go to a
"Configuration" panel, and the video/audio panels lose driver settings.
As does the settings menu and its synchronize options.
I want to start pushing toward a v107 release. Critically, I will need
DirectSound and ALSA to support dynamic rate control. I'd also like to
eliminate the other system manifest.bml files. I need to update the
cheat code database format, and bundle at least a few quark shaders --
although I still need to default to Direct3D on Windows.
Turbo keys would be nice, if it's not too much effort. Aside from
netplay, it's the last significant feature I'm missing.
I think for v107, higan is going to be a bit rough around the edges
compared to bsnes. And I don't think it's practical to finish the bsnes
localization support.
I'm thinking we probably want another WIP to iron out any critical
issues, but this time there should be a feature freeze with the next
WIP.
2018-07-29 13:24:38 +00:00
|
|
|
auto release() -> void override {
|
2017-07-24 05:23:40 +00:00
|
|
|
_raster->Unlock(0);
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
auto output(uint width, uint height) -> void override {
|
|
|
|
uint windowWidth, windowHeight;
|
|
|
|
size(windowWidth, windowHeight);
|
|
|
|
|
2018-08-05 09:00:15 +00:00
|
|
|
if(self.blocking) while(true) {
|
2017-07-24 05:23:40 +00:00
|
|
|
BOOL vblank;
|
|
|
|
_interface->GetVerticalBlankStatus(&vblank);
|
|
|
|
if(vblank) break;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
RECT source;
|
|
|
|
SetRect(&source, 0, 0, _width, _height);
|
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
POINT point{0, 0};
|
|
|
|
ClientToScreen(_context, &point);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
RECT target;
|
2019-07-07 09:44:09 +00:00
|
|
|
GetClientRect(_context, &target);
|
2017-07-24 05:23:40 +00:00
|
|
|
OffsetRect(&target, point.x, point.y);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
target.left += ((int)windowWidth - (int)width) / 2;
|
|
|
|
target.top += ((int)windowHeight - (int)height) / 2;
|
|
|
|
target.right = target.left + width;
|
|
|
|
target.bottom = target.top + height;
|
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
if(_screen->Blt(&target, _raster, &source, DDBLT_WAIT, 0) == DDERR_SURFACELOST) {
|
|
|
|
_screen->Restore();
|
|
|
|
_raster->Restore();
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
private:
|
2019-07-07 09:44:09 +00:00
|
|
|
auto construct() -> void {
|
|
|
|
WNDCLASS windowClass{};
|
|
|
|
windowClass.cbClsExtra = 0;
|
|
|
|
windowClass.cbWndExtra = 0;
|
|
|
|
windowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
|
|
|
windowClass.hCursor = LoadCursor(0, IDC_ARROW);
|
|
|
|
windowClass.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
|
|
|
|
windowClass.hInstance = GetModuleHandle(0);
|
|
|
|
windowClass.lpfnWndProc = VideoDirect3D9_WindowProcedure;
|
|
|
|
windowClass.lpszClassName = L"VideoDirectDraw7_Window";
|
|
|
|
windowClass.lpszMenuName = 0;
|
|
|
|
windowClass.style = CS_HREDRAW | CS_VREDRAW;
|
|
|
|
RegisterClass(&windowClass);
|
|
|
|
}
|
|
|
|
|
|
|
|
auto destruct() -> void {
|
|
|
|
terminate();
|
|
|
|
}
|
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
auto initialize() -> bool {
|
|
|
|
terminate();
|
2019-08-16 10:44:16 +00:00
|
|
|
if(!self.fullScreen && !self.context) return false;
|
2019-07-07 09:44:09 +00:00
|
|
|
|
2019-08-16 10:44:16 +00:00
|
|
|
auto monitor = Video::monitor(self.monitor);
|
|
|
|
_monitorX = monitor.x;
|
|
|
|
_monitorY = monitor.y;
|
|
|
|
_monitorWidth = monitor.width;
|
|
|
|
_monitorHeight = monitor.height;
|
|
|
|
|
|
|
|
if(self.fullScreen) {
|
|
|
|
_context = _window = CreateWindowEx(WS_EX_TOPMOST, L"VideoDirectDraw7_Window", L"", WS_VISIBLE | WS_POPUP,
|
|
|
|
_monitorX, _monitorY, _monitorWidth, _monitorHeight,
|
2019-07-07 09:44:09 +00:00
|
|
|
nullptr, nullptr, GetModuleHandle(0), nullptr);
|
|
|
|
} else {
|
|
|
|
_context = (HWND)self.context;
|
|
|
|
}
|
2017-07-24 05:23:40 +00:00
|
|
|
|
|
|
|
LPDIRECTDRAW interface = nullptr;
|
|
|
|
DirectDrawCreate(0, &interface, 0);
|
|
|
|
interface->QueryInterface(IID_IDirectDraw7, (void**)&_interface);
|
|
|
|
interface->Release();
|
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
_interface->SetCooperativeLevel(_context, DDSCL_NORMAL);
|
2017-07-24 05:23:40 +00:00
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
DDSURFACEDESC2 description{};
|
2017-07-24 05:23:40 +00:00
|
|
|
description.dwSize = sizeof(DDSURFACEDESC2);
|
|
|
|
description.dwFlags = DDSD_CAPS;
|
|
|
|
description.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
|
|
|
_interface->CreateSurface(&description, &_screen, 0);
|
|
|
|
|
|
|
|
_interface->CreateClipper(0, &_clipper, 0);
|
2019-07-07 09:44:09 +00:00
|
|
|
_clipper->SetHWnd(0, _context);
|
2017-07-24 05:23:40 +00:00
|
|
|
_screen->SetClipper(_clipper);
|
|
|
|
|
|
|
|
_raster = nullptr;
|
|
|
|
_surfaceWidth = 0;
|
|
|
|
_surfaceHeight = 0;
|
|
|
|
resize(_width = 256, _height = 256);
|
|
|
|
return _ready = true;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
auto terminate() -> void {
|
|
|
|
_ready = false;
|
|
|
|
if(_clipper) { _clipper->Release(); _clipper = nullptr; }
|
|
|
|
if(_raster) { _raster->Release(); _raster = nullptr; }
|
|
|
|
if(_screen) { _screen->Release(); _screen = nullptr; }
|
|
|
|
if(_interface) { _interface->Release(); _interface = nullptr; }
|
2019-08-16 10:44:16 +00:00
|
|
|
if(_window) { DestroyWindow(_window); _window = nullptr; }
|
2019-07-07 09:44:09 +00:00
|
|
|
_context = nullptr;
|
2017-07-24 05:23:40 +00:00
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
auto resize(uint width, uint height) -> void {
|
|
|
|
if(_surfaceWidth >= width && _surfaceHeight >= height) return;
|
|
|
|
|
|
|
|
_surfaceWidth = max(width, _surfaceWidth);
|
|
|
|
_surfaceHeight = max(height, _surfaceHeight);
|
|
|
|
|
|
|
|
if(_raster) _raster->Release();
|
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
DDSURFACEDESC2 description{};
|
2017-07-24 05:23:40 +00:00
|
|
|
description.dwSize = sizeof(DDSURFACEDESC2);
|
|
|
|
_screen->GetSurfaceDesc(&description);
|
|
|
|
int depth = description.ddpfPixelFormat.dwRGBBitCount;
|
|
|
|
if(depth == 32) goto tryNativeSurface;
|
|
|
|
|
|
|
|
memory::fill(&description, sizeof(DDSURFACEDESC2));
|
|
|
|
description.dwSize = sizeof(DDSURFACEDESC2);
|
|
|
|
description.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
|
|
|
|
description.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; //DDSCAPS_SYSTEMMEMORY
|
|
|
|
description.dwWidth = _surfaceWidth;
|
|
|
|
description.dwHeight = _surfaceHeight;
|
|
|
|
|
|
|
|
description.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
|
|
|
|
description.ddpfPixelFormat.dwFlags = DDPF_RGB;
|
|
|
|
description.ddpfPixelFormat.dwRGBBitCount = 32;
|
|
|
|
description.ddpfPixelFormat.dwRBitMask = 0xff0000;
|
|
|
|
description.ddpfPixelFormat.dwGBitMask = 0x00ff00;
|
|
|
|
description.ddpfPixelFormat.dwBBitMask = 0x0000ff;
|
|
|
|
|
|
|
|
if(_interface->CreateSurface(&description, &_raster, 0) == DD_OK) return clear();
|
|
|
|
|
|
|
|
tryNativeSurface:
|
|
|
|
memory::fill(&description, sizeof(DDSURFACEDESC2));
|
|
|
|
description.dwSize = sizeof(DDSURFACEDESC2);
|
|
|
|
description.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
|
|
|
|
description.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; //DDSCAPS_SYSTEMMEMORY
|
|
|
|
description.dwWidth = _surfaceWidth;
|
|
|
|
description.dwHeight = _surfaceHeight;
|
|
|
|
|
|
|
|
if(_interface->CreateSurface(&description, &_raster, 0) == DD_OK) return clear();
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
bool _ready = false;
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2019-08-16 10:44:16 +00:00
|
|
|
int _monitorX = 0;
|
|
|
|
int _monitorY = 0;
|
|
|
|
int _monitorWidth = 0;
|
|
|
|
int _monitorHeight = 0;
|
|
|
|
|
2017-07-24 05:23:40 +00:00
|
|
|
uint _width = 0;
|
|
|
|
uint _height = 0;
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2019-07-07 09:44:09 +00:00
|
|
|
HWND _context = nullptr;
|
2019-08-16 10:44:16 +00:00
|
|
|
HWND _window = nullptr;
|
2017-07-24 05:23:40 +00:00
|
|
|
LPDIRECTDRAW7 _interface = nullptr;
|
|
|
|
LPDIRECTDRAWSURFACE7 _screen = nullptr;
|
|
|
|
LPDIRECTDRAWSURFACE7 _raster = nullptr;
|
|
|
|
LPDIRECTDRAWCLIPPER _clipper = nullptr;
|
|
|
|
uint _surfaceWidth = 0;
|
|
|
|
uint _surfaceHeight = 0;
|
2010-08-09 13:28:56 +00:00
|
|
|
};
|