Implementation of GAL_SuspendVideo and GAL_ResumeVideo

This commit is contained in:
Vincent Wei
2019-06-14 15:51:24 +08:00
parent c445b5a80d
commit 237112bfe9
2 changed files with 201 additions and 149 deletions

View File

@@ -1,33 +1,33 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* This file is part of MiniGUI, a mature cross-platform windowing
* and Graphics User Interface (GUI) support system for embedded systems
* and smart IoT devices.
*
*
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
* Copyright (C) 1998~2002, WEI Yongming
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
* Or,
*
*
* As this program is a library, any link to this program must follow
* GNU General Public License version 3 (GPLv3). If you cannot accept
* GPLv3, you need to be licensed from FMSoft.
*
*
* If you have got a commercial license of this program, please use it
* under the terms and conditions of the commercial license.
*
*
* For more information about the commercial license, please refer to
* <http://www.minigui.com/en/about/licensing-policy/>.
*/
@@ -56,159 +56,162 @@ typedef struct _VIDEO_MEM_INFO
/* Define the GAL video driver structure */
#define _THIS GAL_VideoDevice *_this
#define _THIS GAL_VideoDevice *_this
#ifndef _STATUS
#define _STATUS GAL_status *status
#define _STATUS GAL_status *status
#endif
struct GAL_VideoDevice {
/* * * */
/* The name of this video driver */
const char *name;
/* * * */
/* The name of this video driver */
const char *name;
/* * * */
/* Initialization/Query functions */
/* * * */
/* Initialization/Query functions */
/* Initialize the native video subsystem, filling 'vformat' with the
"best" display pixel format, returning 0 or -1 if there's an error.
*/
int (*VideoInit)(_THIS, GAL_PixelFormat *vformat);
/* Initialize the native video subsystem, filling 'vformat' with the
"best" display pixel format, returning 0 or -1 if there's an error.
*/
int (*VideoInit)(_THIS, GAL_PixelFormat *vformat);
/* List the available video modes for the given pixel format, sorted
from largest to smallest.
*/
GAL_Rect **(*ListModes)(_THIS, GAL_PixelFormat *format, Uint32 flags);
/* List the available video modes for the given pixel format, sorted
from largest to smallest.
*/
GAL_Rect **(*ListModes)(_THIS, GAL_PixelFormat *format, Uint32 flags);
/* Set the requested video mode, returning a surface which will be
set to the GAL_VideoSurface. The width and height will already
be verified by ListModes(), and the video subsystem is free to
set the mode to a supported bit depth different from the one
specified -- the desired bpp will be emulated with a shadow
surface if necessary. If a new mode is returned, this function
should take care of cleaning up the current mode.
*/
GAL_Surface *(*SetVideoMode)(_THIS, GAL_Surface *current,
int width, int height, int bpp, Uint32 flags);
/* Set the requested video mode, returning a surface which will be
set to the GAL_VideoSurface. The width and height will already
be verified by ListModes(), and the video subsystem is free to
set the mode to a supported bit depth different from the one
specified -- the desired bpp will be emulated with a shadow
surface if necessary. If a new mode is returned, this function
should take care of cleaning up the current mode.
*/
GAL_Surface *(*SetVideoMode)(_THIS, GAL_Surface *current,
int width, int height, int bpp, Uint32 flags);
/* Toggle the fullscreen mode */
int (*ToggleFullScreen)(_THIS, int on);
/* Toggle the fullscreen mode */
int (*ToggleFullScreen)(_THIS, int on);
#if 0
/* This is called after the video mode has been set, to get the
initial mouse state. It should queue events as necessary to
properly represent the current mouse focus and position.
*/
void (*UpdateMouse)(_THIS);
/* This is called after the video mode has been set, to get the
initial mouse state. It should queue events as necessary to
properly represent the current mouse focus and position.
*/
void (*UpdateMouse)(_THIS);
#endif
/* Sets the color entries { firstcolor .. (firstcolor+ncolors-1) }
of the physical palette to those in 'colors'. If the device is
using a software palette (GAL_HWPALETTE not set), then the
changes are reflected in the logical palette of the screen
as well.
The return value is 1 if all entries could be set properly
or 0 otherwise.
*/
int (*SetColors)(_THIS, int firstcolor, int ncolors,
GAL_Color *colors);
/* Sets the color entries { firstcolor .. (firstcolor+ncolors-1) }
of the physical palette to those in 'colors'. If the device is
using a software palette (GAL_HWPALETTE not set), then the
changes are reflected in the logical palette of the screen
as well.
The return value is 1 if all entries could be set properly
or 0 otherwise.
*/
int (*SetColors)(_THIS, int firstcolor, int ncolors,
GAL_Color *colors);
/* This pointer should exist in the native video subsystem and should
point to an appropriate update function for the current video mode
*/
void (*UpdateRects)(_THIS, int numrects, GAL_Rect *rects);
/* This pointer should exist in the native video subsystem and should
point to an appropriate update function for the current video mode
*/
void (*UpdateRects)(_THIS, int numrects, GAL_Rect *rects);
/* Reverse the effects VideoInit() -- called if VideoInit() fails
or if the application is shutting down the video subsystem.
*/
void (*VideoQuit)(_THIS);
/* Reverse the effects VideoInit() -- called if VideoInit() fails
or if the application is shutting down the video subsystem.
*/
void (*VideoQuit)(_THIS);
/* * * */
/* Hardware acceleration functions */
/* * * */
/* Hardware acceleration functions */
/* Information about the video hardware */
GAL_VideoInfo info;
/* Information about the video hardware */
GAL_VideoInfo info;
#ifndef _MGRM_THREADS
/* Request a surface in video memory */
void (*RequestHWSurface)(_THIS, const REQ_HWSURFACE* request, REP_HWSURFACE* reply);
/* Request a surface in video memory */
void (*RequestHWSurface)(_THIS, const REQ_HWSURFACE* request, REP_HWSURFACE* reply);
#endif
/* Allocates a surface in video memory */
int (*AllocHWSurface)(_THIS, GAL_Surface *surface);
/* Allocates a surface in video memory */
int (*AllocHWSurface)(_THIS, GAL_Surface *surface);
/* Sets the hardware accelerated blit function, if any, based
on the current flags of the surface (colorkey, alpha, etc.)
*/
int (*CheckHWBlit)(_THIS, GAL_Surface *src, GAL_Surface *dst);
/* Sets the hardware accelerated blit function, if any, based
on the current flags of the surface (colorkey, alpha, etc.)
*/
int (*CheckHWBlit)(_THIS, GAL_Surface *src, GAL_Surface *dst);
/* Fills a surface rectangle with the given color */
int (*FillHWRect)(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color);
/* Fills a surface rectangle with the given color */
int (*FillHWRect)(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color);
/* Sets video mem colorkey and accelerated blit function */
int (*SetHWColorKey)(_THIS, GAL_Surface *surface, Uint32 key);
/* Sets video mem colorkey and accelerated blit function */
int (*SetHWColorKey)(_THIS, GAL_Surface *surface, Uint32 key);
/* Sets per surface hardware alpha value */
int (*SetHWAlpha)(_THIS, GAL_Surface *surface, Uint8 value);
/* Sets per surface hardware alpha value */
int (*SetHWAlpha)(_THIS, GAL_Surface *surface, Uint8 value);
#if 0
/* Returns a readable/writable surface */
int (*LockHWSurface)(_THIS, GAL_Surface *surface);
void (*UnlockHWSurface)(_THIS, GAL_Surface *surface);
/* Returns a readable/writable surface */
int (*LockHWSurface)(_THIS, GAL_Surface *surface);
void (*UnlockHWSurface)(_THIS, GAL_Surface *surface);
/* Performs hardware flipping */
int (*FlipHWSurface)(_THIS, GAL_Surface *surface);
/* Performs hardware flipping */
int (*FlipHWSurface)(_THIS, GAL_Surface *surface);
#endif
/* Frees a previously allocated video surface */
void (*FreeHWSurface)(_THIS, GAL_Surface *surface);
/* Frees a previously allocated video surface */
void (*FreeHWSurface)(_THIS, GAL_Surface *surface);
Uint16 *gamma;
Uint16 *gamma;
/* * * */
/* Data common to all drivers */
GAL_Surface *screen;
// GAL_Surface *shadow;
// GAL_Surface *visible;
GAL_Palette *physpal; /* physical palette, if != logical palette */
char *wm_title;
char *wm_icon;
int offset_x;
int offset_y;
/* * * */
/* Data common to all drivers */
GAL_Surface *screen;
// GAL_Surface *shadow;
// GAL_Surface *visible;
GAL_Palette *physpal; /* physical palette, if != logical palette */
char *wm_title;
char *wm_icon;
int offset_x;
int offset_y;
/* Driver information flags */
int handles_any_size; /* Driver handles any size video mode */
/* Driver information flags */
int handles_any_size; /* Driver handles any size video mode */
/* * * */
/* Data private to this driver */
struct GAL_PrivateVideoData *hidden;
/* * * */
/* Data private to this driver */
struct GAL_PrivateVideoData *hidden;
/* * * */
/* The function used to dispose of this structure */
/* * * */
/* The function used to dispose of this structure */
void (*free)(_THIS);
/* DeleteSurface - called if this->info->mlt_surfaces is true
* to delete a specific surface. * */
void (*DeleteSurface) (_THIS, GAL_Surface* surface);
/* Set surface Palette */
int (*SetSurfaceColors) (GAL_Surface* surface, int firstcolor, int ncolors,
GAL_Color *colors);
GAL_Color *colors);
/* Get Video Memory info */
int (*GetFBInfo) (VIDEO_MEM_INFO *video_mem_info);
/* Set surface UpdateRects*/
/* Update Rects */
void (*UpdateSurfaceRects) (_THIS, GAL_Surface* surface, int numrects, GAL_Rect *rects);
/* Since 4.0.0; used for VT switching */
int (*Suspend) (_THIS);
int (*Resume) (_THIS);
};
#undef _THIS
typedef struct VideoBootStrap {
const char *name;
const char *desc;
int (*available)(void);
GAL_VideoDevice *(*create)(int devindex);
const char *name;
const char *desc;
int (*available)(void);
GAL_VideoDevice *(*create)(int devindex);
} VideoBootStrap;
#ifdef _MGGAL_DUMMY
@@ -320,8 +323,8 @@ extern VideoBootStrap DRM_bootstrap;
/* This is the current video device */
extern GAL_VideoDevice *current_video;
#define GAL_VideoSurface (current_video->screen)
#define GAL_PublicSurface (current_video->screen)
#define GAL_VideoSurface (current_video->screen)
#define GAL_PublicSurface (current_video->screen)
GAL_VideoDevice *GAL_GetVideo(const char* driver_name);
void Slave_FreeSurface (GAL_Surface *surface);

View File

@@ -1,33 +1,33 @@
/*
* This file is part of MiniGUI, a mature cross-platform windowing
* This file is part of MiniGUI, a mature cross-platform windowing
* and Graphics User Interface (GUI) support system for embedded systems
* and smart IoT devices.
*
*
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
* Copyright (C) 1998~2002, WEI Yongming
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
* Or,
*
*
* As this program is a library, any link to this program must follow
* GNU General Public License version 3 (GPLv3). If you cannot accept
* GPLv3, you need to be licensed from FMSoft.
*
*
* If you have got a commercial license of this program, please use it
* under the terms and conditions of the commercial license.
*
*
* For more information about the commercial license, please refer to
* <http://www.minigui.com/en/about/licensing-policy/>.
*/
@@ -356,7 +356,7 @@ static Uint8 GAL_closest_depths[4][8] = {
{ 0, 32, 16, 15, 24, 8, 0, 0 }
};
int GAL_VideoModeOK (int width, int height, int bpp, Uint32 flags)
int GAL_VideoModeOK (int width, int height, int bpp, Uint32 flags)
{
int table, b, i;
int supported;
@@ -406,7 +406,7 @@ int GAL_VideoModeOK (int width, int height, int bpp, Uint32 flags)
--b;
return(GAL_closest_depths[table][b]);
}
else
else
return(0);
}
@@ -557,12 +557,12 @@ GAL_Surface * GAL_SetVideoMode (int width, int height, int bpp, Uint32 flags)
if (video->info.mlt_surfaces == 0){
if (video->SetColors)
video->SetColors(this, 0, vf->palette->ncolors,
video->SetColors(this, 0, vf->palette->ncolors,
vf->palette->colors);
}
else{
if (video->SetSurfaceColors)
video->SetSurfaceColors(this->screen, 0, vf->palette->ncolors,
video->SetSurfaceColors(this->screen, 0, vf->palette->ncolors,
vf->palette->colors);
}
}
@@ -598,7 +598,7 @@ GAL_Surface * GAL_SetVideoMode (int width, int height, int bpp, Uint32 flags)
}
#ifndef _MG_MINIMALGDI
license_get_processor_id();
license_get_processor_id();
#endif
video->info.vfmt = GAL_VideoSurface->format;
@@ -607,7 +607,7 @@ GAL_Surface * GAL_SetVideoMode (int width, int height, int bpp, Uint32 flags)
return(GAL_PublicSurface);
}
/*
/*
* Convert a surface into the video pixel format.
*/
GAL_Surface * GAL_DisplayFormat (GAL_Surface *surface)
@@ -704,7 +704,7 @@ void GAL_UpdateRect (GAL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h
if (h == 0)
h = screen->h;
if ((int)(x+w) > screen->w)
if ((int)(x+w) > screen->w)
w = screen->w - x;
if ((int)(y+h) > screen->h)
h = screen->h - x;
@@ -1057,7 +1057,7 @@ void gal_SlaveVideoQuit (GAL_Surface * surface)
video->free(video);
video = NULL;
}
else{
else{
video->DeleteSurface(video, surface);
Slave_FreeSurface (surface);
}
@@ -1065,7 +1065,7 @@ void gal_SlaveVideoQuit (GAL_Surface * surface)
return;
}
static GAL_Surface *Slave_CreateSurface (GAL_VideoDevice *this,
static GAL_Surface *Slave_CreateSurface (GAL_VideoDevice *this,
int width, int height, int depth,
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
{
@@ -1074,7 +1074,7 @@ static GAL_Surface *Slave_CreateSurface (GAL_VideoDevice *this,
surface = (GAL_Surface *)malloc(sizeof(*surface));
if ( surface == NULL ) {
GAL_OutOfMemory();
GAL_OutOfMemory();
return(NULL);
}
surface->flags = GAL_HWSURFACE;
@@ -1114,11 +1114,11 @@ static GAL_Surface *Slave_CreateSurface (GAL_VideoDevice *this,
/* The surface is ready to go */
surface->refcount = 1;
this->info.vfmt = surface->format;
return (surface);
}
static GAL_Rect ** Slave_ListModes (GAL_VideoDevice *this,
static GAL_Rect ** Slave_ListModes (GAL_VideoDevice *this,
GAL_PixelFormat *format, Uint32 flags)
{
GAL_Rect **modes;
@@ -1135,7 +1135,7 @@ static GAL_Rect ** Slave_ListModes (GAL_VideoDevice *this,
return (modes);
}
static int Slave_GetVideoMode (GAL_VideoDevice *this,
static int Slave_GetVideoMode (GAL_VideoDevice *this,
int *w, int *h, int *BitsPerPixel, Uint32 flags)
{
int table, b, i;
@@ -1160,7 +1160,7 @@ static int Slave_GetVideoMode (GAL_VideoDevice *this,
if (native_bpp == *BitsPerPixel) {
return(1);
}
if (native_bpp > 0) {
*BitsPerPixel = native_bpp;
return(1);
@@ -1172,11 +1172,11 @@ static int Slave_GetVideoMode (GAL_VideoDevice *this,
table = ((*BitsPerPixel+7)/8)-1;
GAL_closest_depths[table][0] = *BitsPerPixel;
GAL_closest_depths[table][7] = surface->format->BitsPerPixel;
for ( b = 0; !supported && GAL_closest_depths[table][b]; ++b ) {
format.BitsPerPixel = GAL_closest_depths[table][b];
sizes = Slave_ListModes(this, &format, flags);
if ( sizes == (GAL_Rect **)0 ) {
/* No sizes supported at this bit-depth */
continue;
@@ -1211,11 +1211,11 @@ static int Slave_GetVideoMode (GAL_VideoDevice *this,
GAL_SetError("NEWGAL: No video mode large enough for "
"the resolution specified.\n");
}
return(supported);
}
static GAL_Surface * Slave_SetVideoMode (GAL_VideoDevice *device,
static GAL_Surface * Slave_SetVideoMode (GAL_VideoDevice *device,
GAL_Surface* surface, int width, int height, int bpp, Uint32 flags)
{
GAL_VideoDevice *video, *this;
@@ -1233,7 +1233,7 @@ static GAL_Surface * Slave_SetVideoMode (GAL_VideoDevice *device,
video_w = width;
video_h = height;
video_bpp = bpp;
if (!Slave_GetVideoMode(this, &video_w, &video_h, &video_bpp, flags)){
GAL_SetError ("NEWGAL: Slave_GetVideoMode error, "
"not supported video mode.\n");
@@ -1251,7 +1251,7 @@ static GAL_Surface * Slave_SetVideoMode (GAL_VideoDevice *device,
video->physpal = NULL;
}
if (!(video->SetVideoMode(this, surface,
if (!(video->SetVideoMode(this, surface,
video_w, video_h, video_bpp, flags))) {
return NULL;
}
@@ -1267,12 +1267,12 @@ static GAL_Surface * Slave_SetVideoMode (GAL_VideoDevice *device,
vf->DitheredPalette = TRUE;
if (video->info.mlt_surfaces == 0){
if (video->SetColors)
video->SetColors(this, 0, vf->palette->ncolors,
video->SetColors(this, 0, vf->palette->ncolors,
vf->palette->colors);
}
else{
if (video->SetSurfaceColors)
video->SetSurfaceColors(surface, 0, vf->palette->ncolors,
video->SetSurfaceColors(surface, 0, vf->palette->ncolors,
vf->palette->colors);
}
}
@@ -1295,7 +1295,7 @@ static GAL_Surface * Slave_SetVideoMode (GAL_VideoDevice *device,
GAL_Surface *gal_SlaveVideoInit(const char* driver_name, const char* mode, int dpi)
{
GAL_Surface* surface;
GAL_Surface* surface;
GAL_VideoDevice *video;
GAL_PixelFormat vformat;
unsigned int w, h, depth;
@@ -1304,7 +1304,7 @@ GAL_Surface *gal_SlaveVideoInit(const char* driver_name, const char* mode, int d
video = GAL_GetVideo(driver_name);
if (video == NULL) {
_DBG_PRINTF ("NEWGAL: Does not find the slave video engine: %s.\n",
_DBG_PRINTF ("NEWGAL: Does not find the slave video engine: %s.\n",
driver_name);
return NULL;
}
@@ -1313,7 +1313,7 @@ GAL_Surface *gal_SlaveVideoInit(const char* driver_name, const char* mode, int d
memset(&vformat, 0, sizeof(vformat));
if ( video->VideoInit(video, &vformat) < 0 ) {
_DBG_PRINTF ("NEWGAL: Can not init the slave video engine: %s.\n",
_DBG_PRINTF ("NEWGAL: Can not init the slave video engine: %s.\n",
driver_name);
gal_SlaveVideoQuit (video->screen);
return NULL;
@@ -1345,3 +1345,52 @@ GAL_Surface *gal_SlaveVideoInit(const char* driver_name, const char* mode, int d
return surface;
}
/* Since 4.0.0; activate/deactivate video device, for switching virtual terminals */
int GAL_ResumeVideo(void)
{
#ifdef _MGRM_PROCESSES
if (mgIsSever) {
#endif
if (current_video && current_video->Resume) {
current_video->Resume(current_video);
}
#ifdef _MGRM_PROCESSES
}
#endif
#ifndef _MGRM_THREADS
__mg_switch_away = FALSE;
#endif
#ifdef _MGRM_PROCESSES
UpdateTopmostLayer (NULL);
#else
SendNotifyMessage (HWND_DESKTOP, MSG_PAINT, 0, 0);
#endif
return 0;
}
int GAL_SuspendVideo(void)
{
#ifdef _MGRM_PROCESSES
DisableClientsOutput ();
#endif
#ifndef _MGRM_THREADS
__mg_switch_away = TRUE;
#endif
#ifdef _MGRM_PROCESSES
if (mgIsSever) {
#endif
if (current_video && current_video->Suspend) {
current_video->Suspend(current_video);
}
#ifdef _MGRM_PROCESSES
}
#endif
return 0;
}