146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Library General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Library General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Library General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h"
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL_epocvideo.cpp
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Epoc based SDL video driver implementation
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" {
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_timer.h"
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h"
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#undef NULL
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_pixels_c.h"
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_epocvideo.h"
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_epocevents_c.h"
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <hal.h>
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <coedef.h>
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* For debugging */
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid RDebug_Print_b(char* error_str, void* param)
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    {
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TBuf8<128> error8((TUint8*)error_str);
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TBuf<128> error;
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    error.Copy(error8);
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (param) //!! Do not work if the parameter is really 0!!
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        RDebug::Print(error, param);
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    else
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        RDebug::Print(error);
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" void RDebug_Print(char* error_str, void* param)
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    {
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    RDebug_Print_b(error_str, param);
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint Debug_AvailMem2()
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    {
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //User::CompressAllHeaps();
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TMemoryInfoV1Buf membuf;
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    User::LeaveIfError(UserHal::MemoryInfo(membuf));
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TMemoryInfoV1 minfo = membuf();
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(minfo.iFreeRamInBytes);
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" int Debug_AvailMem()
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    {
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    return(Debug_AvailMem2());
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" {
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Initialization/Query functions */
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_VideoInit(_THIS, SDL_PixelFormat *vformat);
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Rect **EPOC_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Surface *EPOC_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_SetColors(_THIS, int firstcolor, int ncolors,
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			  SDL_Color *colors);
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_VideoQuit(_THIS);
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Hardware surface functions */
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_AllocHWSurface(_THIS, SDL_Surface *surface);
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_LockHWSurface(_THIS, SDL_Surface *surface);
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_FlipHWSurface(_THIS, SDL_Surface *surface);
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_UnlockHWSurface(_THIS, SDL_Surface *surface);
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_FreeHWSurface(_THIS, SDL_Surface *surface);
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_DirectUpdate(_THIS, int numrects, SDL_Rect *rects);
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_Available(void);
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_VideoDevice *EPOC_CreateDevice(int devindex);
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Mouse functions */
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic WMcursor *EPOC_CreateWMCursor(_THIS, Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_FreeWMCursor(_THIS, WMcursor *cursor);
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_ShowWMCursor(_THIS, WMcursor *cursor);
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* !! Table for fast conversion from 8 bit to 12 bit */
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic TUint16 EPOC_HWPalette_256_to_4k[256];
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerVideoBootStrap EPOC_bootstrap = {
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	"epoc", "EPOC system",
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    EPOC_Available, EPOC_CreateDevice
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerconst TUint32 WindowClientHandle = 9210; //!!
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Epoc video driver bootstrap functions */
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_Available(void)
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    return 1; /* Always available */
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_DeleteDevice(SDL_VideoDevice *device)
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_free(device->hidden);
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_free(device);
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_VideoDevice *EPOC_CreateDevice(int devindex)
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_VideoDevice *device;
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Allocate all variables that we free on delete */
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( device ) {
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_memset(device, 0, (sizeof *device));
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		device->hidden = (struct SDL_PrivateVideoData *)
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_malloc((sizeof *device->hidden));
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( (device == NULL) || (device->hidden == NULL) ) {
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_OutOfMemory();
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( device ) {
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_free(device);
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_memset(device->hidden, 0, (sizeof *device->hidden));
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the function pointers */
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->VideoInit = EPOC_VideoInit;
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->ListModes = EPOC_ListModes;
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetVideoMode = EPOC_SetVideoMode;
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetColors = EPOC_SetColors;
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UpdateRects = NULL;
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->VideoQuit = EPOC_VideoQuit;
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->AllocHWSurface = EPOC_AllocHWSurface;
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CheckHWBlit = NULL;
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FillHWRect = NULL;
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetHWColorKey = NULL;
16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetHWAlpha = NULL;
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->LockHWSurface = EPOC_LockHWSurface;
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UnlockHWSurface = EPOC_UnlockHWSurface;
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FlipHWSurface = EPOC_FlipHWSurface;
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FreeHWSurface = EPOC_FreeHWSurface;
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetIcon = NULL;
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetCaption = NULL;
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GetWMInfo = NULL;
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FreeWMCursor = EPOC_FreeWMCursor;
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CreateWMCursor = EPOC_CreateWMCursor;
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->ShowWMCursor = EPOC_ShowWMCursor;
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->WarpWMCursor = NULL;
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->InitOSKeymap = EPOC_InitOSKeymap;
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->PumpEvents = EPOC_PumpEvents;
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->free = EPOC_DeleteDevice;
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return device;
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint GetBpp(TDisplayMode displaymode)
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt numColors = TDisplayModeUtils::NumDisplayModeColors(displaymode);
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt bitsPerPixel = 1;
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    for (TInt32 i = 2; i < numColors; i <<= 1, bitsPerPixel++);
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    return bitsPerPixel;
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid ConstructWindowL(_THIS)
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	TInt	error;
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	error = Private->EPOC_WsSession.Connect();
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	User::LeaveIfError(error);
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsScreen=new(ELeave) CWsScreenDevice(Private->EPOC_WsSession);
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	User::LeaveIfError(Private->EPOC_WsScreen->Construct());
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	User::LeaveIfError(Private->EPOC_WsScreen->CreateContext(Private->EPOC_WindowGc));
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindowGroup=RWindowGroup(Private->EPOC_WsSession);
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	User::LeaveIfError(Private->EPOC_WsWindowGroup.Construct(WindowClientHandle));
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindowGroup.SetOrdinalPosition(0);
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //!!
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TBuf<32> winGroupName;
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(0);
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(0);
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(0);// uid
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(0);
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(_L("SDL")); // caption
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(0);
21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    winGroupName.Append(0); //doc name
21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindowGroup.SetName(winGroupName); //!!
21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow=RWindow(Private->EPOC_WsSession);
21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	User::LeaveIfError(Private->EPOC_WsWindow.Construct(Private->EPOC_WsWindowGroup,WindowClientHandle));
21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.SetBackgroundColor(KRgbWhite);
21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_WsWindow.Activate();
22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.SetSize(Private->EPOC_WsScreen->SizeInPixels());
22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.SetVisible(ETrue);
22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_WsWindowGroupID = Private->EPOC_WsWindowGroup.Identifier();
22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_IsWindowFocused = EFalse;
22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint EPOC_VideoInit(_THIS, SDL_PixelFormat *vformat)
22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    // !!TODO:handle leave functions!
23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    int i;
23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Initialize all variables that we clean on shutdown */
23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; i<SDL_NUMMODES; ++i ) {
23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->SDL_modelist[i] = (SDL_Rect *)SDL_malloc(sizeof(SDL_Rect));
23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->SDL_modelist[i]->x = Private->SDL_modelist[i]->y = 0;
23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Modes sorted largest to smallest !!TODO:sorting order??*/
24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->SDL_modelist[0]->w = 640; Private->SDL_modelist[0]->h = 200;
24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->SDL_modelist[1]->w = 320; Private->SDL_modelist[1]->h = 200;
24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->SDL_modelist[2]->w = 640; Private->SDL_modelist[2]->h = 400;
24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->SDL_modelist[3]->w = 640; Private->SDL_modelist[3]->h = 480;
24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->SDL_modelist[4] = NULL;
24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Construct Epoc window */
24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    ConstructWindowL(_this);
25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Initialise Epoc frame buffer */
25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TDisplayMode displayMode = Private->EPOC_WsScreen->DisplayMode();
25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #ifndef __WINS__
25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TScreenInfoV01 screenInfo;
25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	TPckg<TScreenInfoV01> sInfo(screenInfo);
25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	UserSvr::ScreenInfo(sInfo);
26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_ScreenSize		= screenInfo.iScreenSize;
26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_DisplayMode		= displayMode;
26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_HasFrameBuffer	= screenInfo.iScreenAddressValid;
26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_FrameBuffer		= Private->EPOC_HasFrameBuffer ? (TUint8*) screenInfo.iScreenAddress : NULL;
26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_BytesPerPixel	    = ((GetBpp(displayMode)-1) / 8) + 1;
26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_BytesPerScanLine	= screenInfo.iScreenSize.iWidth * Private->EPOC_BytesPerPixel;
26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* It seems that in SA1100 machines for 8bpp displays there is a 512 palette table at the
26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner     * beginning of the frame buffer. E.g. Series 7 and Netbook.
27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner     * In 12 bpp machines the table has 16 entries.
27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 */
27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_HasFrameBuffer && GetBpp(displayMode) == 8)
27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_FrameBuffer += 512;
27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_HasFrameBuffer && GetBpp(displayMode) == 12)
27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_FrameBuffer += 16 * 2;
27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #else /* defined __WINS__ */
27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Create bitmap, device and context for screen drawing */
28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_ScreenSize        = Private->EPOC_WsScreen->SizeInPixels();
28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_Bitmap = new (ELeave) CWsBitmap(Private->EPOC_WsSession);
28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_Bitmap->Create(Private->EPOC_ScreenSize, displayMode);
28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_DisplayMode	    = displayMode;
28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_HasFrameBuffer    = ETrue;
28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_FrameBuffer       = NULL; /* Private->EPOC_Bitmap->DataAddress() can change any time */
28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_BytesPerPixel	    = ((GetBpp(displayMode)-1) / 8) + 1;
28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_BytesPerScanLine  = Private->EPOC_WsScreen->SizeInPixels().iWidth * Private->EPOC_BytesPerPixel;
29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #endif /* __WINS__ */
29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    _this->info.current_w = Private->EPOC_ScreenSize.iWidth;
29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    _this->info.current_h = Private->EPOC_ScreenSize.iHeight;
29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* The "best" video format should be returned to caller. */
29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    vformat->BitsPerPixel       = /*!!GetBpp(displayMode) */ 8;
29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    vformat->BytesPerPixel      = /*!!Private->EPOC_BytesPerPixel*/ 1;
30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Activate events for me */
30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsEventStatus = KRequestPending;
30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);
30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_RedrawEventStatus = KRequestPending;
30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsSession.RedrawReady(&Private->EPOC_RedrawEventStatus);
30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_WsWindow.PointerFilter(EPointerFilterDrag, 0);
30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_ScreenOffset = 0;
31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //!! TODO: error handling
31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //if (ret != KErrNone)
31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //    return(-1);
31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //else
31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    return(0);
31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
31946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_Rect **EPOC_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (format->BitsPerPixel == 12 || format->BitsPerPixel == 8)
32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        return Private->SDL_modelist;
32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    return NULL;
32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint EPOC_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    for(int i = firstcolor; i < ncolors; i++) {
32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    // 4k value: 000rgb
33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    TUint16 color4K = 0;
33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        color4K |= (colors[i].r & 0x0000f0) << 4;
33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    color4K |= (colors[i].g & 0x0000f0);
33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    color4K |= (colors[i].b & 0x0000f0) >> 4;
33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        EPOC_HWPalette_256_to_4k[i] = color4K;
33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_Surface *EPOC_SetVideoMode(_THIS, SDL_Surface *current,
34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				int width, int height, int bpp, Uint32 flags)
34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Check parameters */
34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (!((width == 640 && height == 200 && bpp == 12) ||
34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 640 && height == 400 && bpp == 12) ||
34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 640 && height == 480 && bpp == 12) ||
34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 320 && height == 200 && bpp == 12) ||
34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 640 && height == 200 && bpp == 8) ||
34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 640 && height == 400 && bpp == 8) ||
35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 640 && height == 480 && bpp == 8) ||
35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (width == 320 && height == 200 && bpp == 8))) {
35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Requested video mode is not supported");
35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        return NULL;
35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (current && current->pixels) {
35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        SDL_free(current->pixels);
35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        current->pixels = NULL;
35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) {
36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(NULL);
36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Set up the new mode framebuffer */
36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (bpp == 8)
36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    current->flags = (SDL_FULLSCREEN|SDL_SWSURFACE|SDL_PREALLOC|SDL_HWPALETTE);
36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    else // 12 bpp
36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    current->flags = (SDL_FULLSCREEN|SDL_SWSURFACE|SDL_PREALLOC);
36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->w = width;
37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->h = height;
37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    int numBytesPerPixel = ((bpp-1)>>3) + 1;
37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->pitch = numBytesPerPixel * width; // Number of bytes in scanline
37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->pixels = SDL_malloc(width * height * numBytesPerPixel);
37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_memset(current->pixels, 0, width * height * numBytesPerPixel);
37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the blit function */
37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	_this->UpdateRects = EPOC_DirectUpdate;
37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Must buffer height be shrinked to screen by 2 ? */
38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (current->h >= 400)
38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        Private->EPOC_ShrinkedHeight = ETrue;
38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Centralize game window on device screen  */
38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_ScreenOffset = (Private->EPOC_ScreenSize.iWidth - current->w) / 2;
38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* We're done */
38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(current);
38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid RedrawWindowL(_THIS)
39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL_Rect fullScreen;
39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    fullScreen.x = 0;
39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    fullScreen.y = 0;
39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    fullScreen.w = _this->screen->w;
39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    fullScreen.h = _this->screen->h;
39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef __WINS__
39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    TBitmapUtil lock(Private->EPOC_Bitmap);
40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        lock.Begin(TPoint(0,0)); // Lock bitmap heap
40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    Private->EPOC_WindowGc->Activate(Private->EPOC_WsWindow);
40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (fullScreen.w < Private->EPOC_ScreenSize.iWidth
40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        && fullScreen.w < Private->EPOC_ScreenSize.iWidth) {
40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Draw blue stripes background */
40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef __WINS__
40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TUint16* screenBuffer = (TUint16*)Private->EPOC_Bitmap->DataAddress();
40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TUint16* screenBuffer = (TUint16*)Private->EPOC_FrameBuffer;
41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        for (int y=0; y < Private->EPOC_ScreenSize.iHeight; y++) {
41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            for (int x=0; x < Private->EPOC_ScreenSize.iWidth; x++) {
41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                TUint16 color = ((x+y)>>1) & 0xf; /* Draw pattern */
41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                *screenBuffer++ = color;
41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            }
41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Tell the system that something has been drawn */
42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	TRect  rect = TRect(Private->EPOC_WsWindow.Size());
42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner  	Private->EPOC_WsWindow.Invalidate(rect);
42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef __WINS__
42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.BeginRedraw(rect);
42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WindowGc->BitBlt(TPoint(), Private->EPOC_Bitmap);
42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.EndRedraw();
42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WindowGc->Deactivate();
43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    lock.End(); // Unlock bitmap heap
43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsSession.Flush();
43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Draw current buffer */
43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    EPOC_DirectUpdate(_this, 1, &fullScreen);
43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We don't actually allow hardware surfaces other than the main one */
44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_AllocHWSurface(_THIS, SDL_Surface *surface)
44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(-1);
44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_FreeHWSurface(_THIS, SDL_Surface *surface)
44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return;
44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_LockHWSurface(_THIS, SDL_Surface *surface)
45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_UnlockHWSurface(_THIS, SDL_Surface *surface)
45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return;
45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int EPOC_FlipHWSurface(_THIS, SDL_Surface *surface)
45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void EPOC_DirectUpdate(_THIS, int numrects, SDL_Rect *rects)
46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt focusWindowGroupId = Private->EPOC_WsSession.GetFocusWindowGroup();
46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (focusWindowGroupId != Private->EPOC_WsWindowGroupID) {
46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Force focus window to redraw again for cleaning away SDL screen graphics */
46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt pos = Private->EPOC_WsWindowGroup.OrdinalPosition();
47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        Private->EPOC_WsWindowGroup.SetOrdinalPosition(0, KMaxTInt);
47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner       	TRect  rect = TRect(Private->EPOC_WsWindow.Size());
47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        Private->EPOC_WsWindow.Invalidate(rect);
47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        Private->EPOC_WsWindowGroup.SetOrdinalPosition(pos, ECoeWinPriorityNormal);
47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* If this is not the topmost window, wait here! Sleep for 1 second to give cpu to
47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner           multitasking and poll for being the topmost window.
47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        */
48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        while (Private->EPOC_WsSession.GetFocusWindowGroup() != Private->EPOC_WsWindowGroupID)
48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            SDL_Delay(1000);
48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        RedrawWindowL(_this);
48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	TInt i;
48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt sourceNumBytesPerPixel = ((_this->screen->format->BitsPerPixel-1)>>3) + 1;
48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt targetNumBytesPerPixel = Private->EPOC_BytesPerPixel;
48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt fixedOffset = Private->EPOC_ScreenOffset;
49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt screenW = _this->screen->w;
49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt screenH = _this->screen->h;
49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt sourceScanlineLength = screenW;
49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (Private->EPOC_ShrinkedHeight) {  /* simulate 400 pixel height in 200 pixel screen */
49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        sourceScanlineLength <<= 1;
49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        screenH >>= 1;
49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TInt targetScanlineLength = Private->EPOC_ScreenSize.iWidth;
49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef __WINS__
49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	TBitmapUtil lock(Private->EPOC_Bitmap);
50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    lock.Begin(TPoint(0,0)); // Lock bitmap heap
50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WindowGc->Activate(Private->EPOC_WsWindow);
50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TUint16* screenBuffer = (TUint16*)Private->EPOC_Bitmap->DataAddress();
50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    TUint16* screenBuffer = (TUint16*)Private->EPOC_FrameBuffer;
50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Render the rectangles in the list */
50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; i < numrects; ++i ) {
51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        SDL_Rect rect2;
51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        const SDL_Rect& currentRect = rects[i];
51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        rect2.x = currentRect.x;
51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        rect2.y = currentRect.y;
51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        rect2.w = currentRect.w;
51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        rect2.h = currentRect.h;
51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if (rect2.w <= 0 || rect2.h <= 0) /* sanity check */
51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            continue;
52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if (Private->EPOC_ShrinkedHeight) {  /* simulate 400 pixel height in 200 pixel screen */
52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            rect2.y >>= 1;
52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            if (!(rect2.h >>= 1))
52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                rect2.h = 1; // always at least 1 pixel height!
52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* All variables are measured in pixels */
52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Check rects validity, i.e. upper and lower bounds */
53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt maxX = Min(screenW - 1, rect2.x + rect2.w - 1);
53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt maxY = Min(screenH - 1, rect2.y + rect2.h - 1);
53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if (maxX < 0 || maxY < 0) /* sanity check */
53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            continue;
53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        maxY = Min(maxY, 199);
53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt sourceRectWidth = maxX - rect2.x + 1;
53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt sourceRectWidthInBytes = sourceRectWidth * sourceNumBytesPerPixel;
53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt sourceRectHeight = maxY - rect2.y + 1;
53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt sourceStartOffset = rect2.x + rect2.y * sourceScanlineLength;
54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        TInt targetStartOffset = fixedOffset + rect2.x + rect2.y * targetScanlineLength;
54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        // !! Nokia9210 native mode: 12 bpp --> 12 bpp
54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if (_this->screen->format->BitsPerPixel == 12) {
54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	        TUint16* bitmapLine = (TUint16*)_this->screen->pixels + sourceStartOffset;
54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            TUint16* screenMemory = screenBuffer + targetStartOffset;
54646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            for(TInt y = 0 ; y < sourceRectHeight ; y++) {
54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                __ASSERT_DEBUG(screenMemory < (screenBuffer
54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    + Private->EPOC_ScreenSize.iWidth * Private->EPOC_ScreenSize.iHeight),
54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    User::Panic(_L("SDL"), KErrCorrupt));
55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                __ASSERT_DEBUG(screenMemory >= screenBuffer,
55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    User::Panic(_L("SDL"), KErrCorrupt));
55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                __ASSERT_DEBUG(bitmapLine < ((TUint16*)_this->screen->pixels +
55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    + (_this->screen->w * _this->screen->h)),
55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    User::Panic(_L("SDL"), KErrCorrupt));
55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                __ASSERT_DEBUG(bitmapLine >=  (TUint16*)_this->screen->pixels,
55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    User::Panic(_L("SDL"), KErrCorrupt));
55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		        Mem::Copy(screenMemory, bitmapLine, sourceRectWidthInBytes);
55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		        bitmapLine += sourceScanlineLength;
55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		        screenMemory += targetScanlineLength;
56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            }
56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        // !! 256 color paletted mode: 8 bpp  --> 12 bpp
56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        else {
56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	        TUint8* bitmapLine = (TUint8*)_this->screen->pixels + sourceStartOffset;
56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            TUint16* screenMemory = screenBuffer + targetStartOffset;
56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            for(TInt y = 0 ; y < sourceRectHeight ; y++) {
56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                TUint8* bitmapPos = bitmapLine; /* 1 byte per pixel */
56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                TUint16* screenMemoryLinePos = screenMemory; /* 2 bytes per pixel */
56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                /* Convert each pixel from 256 palette to 4k color values */
57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                for(TInt x = 0 ; x < sourceRectWidth ; x++) {
57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    __ASSERT_DEBUG(screenMemoryLinePos < (screenBuffer
57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                        + (Private->EPOC_ScreenSize.iWidth * Private->EPOC_ScreenSize.iHeight)),
57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                        User::Panic(_L("SDL"), KErrCorrupt));
57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    __ASSERT_DEBUG(screenMemoryLinePos >= screenBuffer,
57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                        User::Panic(_L("SDL"), KErrCorrupt));
57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    __ASSERT_DEBUG(bitmapPos < ((TUint8*)_this->screen->pixels +
57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                        + (_this->screen->w * _this->screen->h)),
57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                        User::Panic(_L("SDL"), KErrCorrupt));
57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    __ASSERT_DEBUG(bitmapPos >= (TUint8*)_this->screen->pixels,
58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                        User::Panic(_L("SDL"), KErrCorrupt));
58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    *screenMemoryLinePos = EPOC_HWPalette_256_to_4k[*bitmapPos];
58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    bitmapPos++;
58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                    screenMemoryLinePos++;
58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                }
58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		        bitmapLine += sourceScanlineLength;
58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		        screenMemory += targetScanlineLength;
58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            }
58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    }
58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef __WINS__
59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	TRect  rect = TRect(Private->EPOC_WsWindow.Size());
59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.Invalidate(rect);
59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.BeginRedraw(rect);
59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WindowGc->BitBlt(TPoint(), Private->EPOC_Bitmap);
59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsWindow.EndRedraw();
59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WindowGc->Deactivate();
60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    lock.End(); // Unlock bitmap heap
60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsSession.Flush();
60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Update virtual cursor */
60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    //!!Private->EPOC_WsSession.SetPointerCursorPosition(Private->EPOC_WsSession.PointerCursorPosition());
60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    return;
60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Note:  If we are terminated, this could be called in the middle of
61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   another SDL video routine -- notably UpdateRects.
61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid EPOC_VideoQuit(_THIS)
61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int i;
61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Free video mode lists */
62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; i<SDL_NUMMODES; ++i ) {
62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( Private->SDL_modelist[i] != NULL ) {
62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_free(Private->SDL_modelist[i]);
62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			Private->SDL_modelist[i] = NULL;
62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
62546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
62646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if ( _this->screen && (_this->screen->flags & SDL_HWSURFACE) ) {
62846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Direct screen access, no memory buffer */
62946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_this->screen->pixels = NULL;
63046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
63146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
63246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (_this->screen && _this->screen->pixels) {
63346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        SDL_free(_this->screen->pixels);
63446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        _this->screen->pixels = NULL;
63546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
63646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
63746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Free Epoc resources */
63846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
63946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Disable events for me */
64046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_WsEventStatus != KRequestPending)
64146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_WsSession.EventReadyCancel();
64246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_RedrawEventStatus != KRequestPending)
64346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_WsSession.RedrawReadyCancel();
64446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
64546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #ifdef __WINS__
64646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	delete Private->EPOC_Bitmap;
64746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_Bitmap = NULL;
64846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #endif
64946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_WsWindow.WsHandle())
65146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_WsWindow.Close();
65246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_WsWindowGroup.WsHandle())
65446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_WsWindowGroup.Close();
65546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	delete Private->EPOC_WindowGc;
65746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WindowGc = NULL;
65846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	delete Private->EPOC_WsScreen;
66046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Private->EPOC_WsScreen = NULL;
66146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (Private->EPOC_WsSession.WsHandle())
66346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Private->EPOC_WsSession.Close();
66446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
66546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerWMcursor *EPOC_CreateWMCursor(_THIS, Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
66846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
66946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return (WMcursor *) 9210; // it's ok to return something unuseful but true
67046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
67146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
67246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid EPOC_FreeWMCursor(_THIS, WMcursor *cursor)
67346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
67446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Disable virtual cursor */
67546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible);
67646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Private->EPOC_WsSession.SetPointerCursorMode(EPointerCursorNone);
67746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
67846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
67946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint EPOC_ShowWMCursor(_THIS, WMcursor *cursor)
68046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
68146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
68246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if (cursor ==  (WMcursor *)9210) {
68346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Enable virtual cursor */
68446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    HAL::Set(HAL::EMouseState, HAL::EMouseState_Visible);
68546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    Private->EPOC_WsSession.SetPointerCursorMode(EPointerCursorNormal);
68646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
68746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    else {
68846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Disable virtual cursor */
68946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible);
69046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        Private->EPOC_WsSession.SetPointerCursorMode(EPointerCursorNone);
69146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
69246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(1);
69446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
69546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; // extern "C"
69746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
698