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