modified for rtems

This commit is contained in:
gengyue
2019-04-24 20:10:36 +08:00
32 changed files with 756 additions and 942 deletions
+108 -108
View File
@@ -5,55 +5,55 @@ A mature and proven cross-platform GUI system for embedded and smart IoT devices
## TABLE OF CONTENTS
1. Introduction
1. A brief building instruction
1. New features in version 3.2.x
1. The runtime modes of MiniGUI
1. History
1. About the authors
1. If you have a problem
1. A little FAQ
1. Not free for commercial use
1. Introduction
1. A brief building instruction
1. New features in version 3.2.x
1. The runtime modes of MiniGUI
1. History
1. About the authors
1. If you have a problem
1. A little FAQ
1. Not free for commercial use
1. Copying
## INTRODUCTION
MiniGUI is a mature cross-platform windowing system and a GUI (Graphics
MiniGUI is a mature cross-platform windowing system and a GUI (Graphics
User Interface) support system for embedded systems and smart IoT devices.
This is the version 3.2.x of MiniGUI maintained by WEI Yongming
This is the version 3.2.x of MiniGUI maintained by WEI Yongming
(Vincent Wei, https://github.com/VincentWei).
MiniGUI is released under GPLv3 and the dual-licensing applies to commercial
use.
MiniGUI aims to provide a fast, stable, full-featured, and cross-platform
windowing and GUI support system, which is especially fit for
embedded systems or smart IoT devices based-on Linux/uClinux, eCos, and other
traditional RTOSes, such as VxWorks, ThreadX, Nucleus, pSOS, uC/OS-II,
windowing and GUI support system, which is especially fit for
embedded systems or smart IoT devices based-on Linux/uClinux, eCos, and other
traditional RTOSes, such as VxWorks, ThreadX, Nucleus, pSOS, uC/OS-II,
and OSE.
This is the MiniGUI core source tree, which provides windowing
and graphics interfaces as well as a lot of standard controls (tookit).
This is the MiniGUI core source tree, which provides windowing
and graphics interfaces as well as a lot of standard controls (tookit).
Besides MiniGUI core, FMSoft also provides some components
for the developers to develop app much easier:
* mGUtils: A MiniGUI component which contains miscellaneous utilities
like ColorSelectionDialogBox, FileOpenDialogBox, and so on.
* mGUtils: A MiniGUI component which contains miscellaneous utilities
like ColorSelectionDialogBox, FileOpenDialogBox, and so on.
* mGPlus: A MiniGUI component which provides support for advanced graphics
* mGPlus: A MiniGUI component which provides support for advanced graphics
functions like path, gradient, anti-aliase stretch, and color combination.
* mGEff: mGEff provides an animation framework for MiniGUI app.
* mGEff: mGEff provides an animation framework for MiniGUI app.
It also provides some popular UI/UE special effects.
* mGNCS: This component provides a new control set for MiniGUI app.
By using mGNCS, you can use miniStudio to develop MiniGUI app in
WYSIWYG way.
* mGNCS: This component provides a new control set for MiniGUI app.
By using mGNCS, you can use miniStudio to develop MiniGUI app in
WYSIWYG way.
* mGNCS4Touch: This component provides some new controls, which are
compliant to the new control API spec of mGNCS, for devices with
* mGNCS4Touch: This component provides some new controls, which are
compliant to the new control API spec of mGNCS, for devices with
a touch screen.
There are also some legacy MiniGUI components. We will not maintain these
@@ -61,7 +61,7 @@ components for MiniGUI core v3.2:
* mGi: An input method component for MiniGUI. This component provides
some typical input methods (such as softkey, hand-writing, and predict
text input for mobile phone) for MiniGUI apps.
text input for mobile phone) for MiniGUI apps.
* mGp: A printing component for MiniGUI. By using mGp, you can print
out the graphics created by MiniGUI app to general-purpose printers.
@@ -70,11 +70,11 @@ components for MiniGUI core v3.2:
provides a simple 3D API for app. You can use mG3d to create simple
3D UI.
MiniGUI is a free software project. In December 1998, the initiator of
FMSoft, Wei Yongming, began to develop MiniGUI under the GNU General Public
License (GPL). In September 2002, the core developers of
MiniGUI founded FMSoft and started the commercial marketing with
the free software. By now, FMSoft still continues to release MiniGUI
MiniGUI is a free software project. In December 1998, the initiator of
FMSoft, Wei Yongming, began to develop MiniGUI under the GNU General Public
License (GPL). In September 2002, the core developers of
MiniGUI founded FMSoft and started the commercial marketing with
the free software. By now, FMSoft still continues to release MiniGUI
as a free software project.
You can download the source code tarball of MiniGUI and the dependent libraries
@@ -82,27 +82,27 @@ from the download zone of the site:
http://www.minigui.com
FMSoft also releases some open source apps for MiniGUI on the site above,
FMSoft also releases some open source apps for MiniGUI on the site above,
for examples:
* mDolphin, licensed under Apache 2.0, is a full-featured
WEB/WAP browser, which is developed based on the open source browser
* mDolphin, licensed under Apache 2.0, is a full-featured
WEB/WAP browser, which is developed based on the open source browser
core WebKit and uses MiniGUI as its underlying graphics support system.
* mGallery, licensed under Apache 2.0, intends to
provide a total solution for PMP (Portable Multimedia Player),
* mGallery, licensed under Apache 2.0, intends to
provide a total solution for PMP (Portable Multimedia Player),
which uses MiniGUI as the graphics platform.
* mSpider, licensed under GPL 3.0, intends to provide a
* mSpider, licensed under GPL 3.0, intends to provide a
light-weight MiniGUI-based web browser (HTML 3.2 and part JavaScript)
* mEagle, licensed under GPL 3.0, is an embedded GIS development platform
* mEagle, licensed under GPL 3.0, is an embedded GIS development platform
which addresses the needs of map browse, query, analysis, etc
FMSoft had created the public repositories for MiniGUI core, MiniGUI
FMSoft had created the public repositories for MiniGUI core, MiniGUI
components, and other open source apps on GitHub. You can visit them on:
https://github.com/VincentWei
https://github.com/VincentWei
FMSoft also releases miniStudio, which is a WYSIWYG IDE for MiniGUI, as a shareware.
You can also download it from the official site of MiniGUI.
@@ -154,7 +154,7 @@ We introduce some new features in MiniGUI Version 3.2.x:
to support 64-bit platform. For more information, please refer to
RELEASE-NOTES.md file.
Because of the changes of some APIs, we recommended strongly that you
Because of the changes of some APIs, we recommended strongly that you
use this version for new projects.
## THE RUNTIME MODES OF MINIGUI
@@ -164,64 +164,64 @@ You can configure and compile MiniGUI as one of three runtime modes:
* 'MiniGUI-Threads': A program running on MiniGUI-Threads can create
multiple cascaded windows in different threads, and all the windows
belong to a single process. MiniGUI-Threads is fit for some real-time
systems on Linux/uClinux, eCos, uC/OS-II, VxWorks, pSOS, ThreadX,
systems on Linux/uClinux, eCos, uC/OS-II, VxWorks, pSOS, ThreadX,
and OSE.
* 'MiniGUI-Processes': A program running on MiniGUI-Processes is
an independent process, which can also create multiple windows.
MiniGUI-Processes is fit for some complex embedded systems, such as
PDAs, Thin-Clients or STBs. This mode is only useful for full-featured
* 'MiniGUI-Processes': A program running on MiniGUI-Processes is
an independent process, which can also create multiple windows.
MiniGUI-Processes is fit for some complex embedded systems, such as
PDAs, Thin-Clients or STBs. This mode is only useful for full-featured
UNIX-like operating systems, like Linux.
* 'MiniGUI-Standalone': A single process version of MiniGUI. This mode
is useful for some small systems, like uClinux or RTOSes.
The original MiniGUI (version 1.0) run in MiniGUI-Threads mode.
It is based on POSIX-compliant thread library. And this thread-based
architecture of MiniGUI is very fit for most traditional embedded
operating systems, such as eCos, uC/OS-II, and VxWorks. However,
if you use embedded Linux, the architecture like X Window will have
better stability and scalability, because of the independent memory
It is based on POSIX-compliant thread library. And this thread-based
architecture of MiniGUI is very fit for most traditional embedded
operating systems, such as eCos, uC/OS-II, and VxWorks. However,
if you use embedded Linux, the architecture like X Window will have
better stability and scalability, because of the independent memory
address space of every process.
Since version 2.0, we provides a new runtime mode called MiniGUI-Processes.
You can use MiniGUI-Processes to run more than one MiniGUI-based
program in the form of UNIX process at the same time. MiniGUI-Processes
is a full-featured multi-process version of original MiniGUI -- You
can run a program based on MiniGUI-Processes from a program called
'mginit'. Just like X Window, the former process is called a client,
and the latter the server.
You can use MiniGUI-Processes to run more than one MiniGUI-based
program in the form of UNIX process at the same time. MiniGUI-Processes
is a full-featured multi-process version of original MiniGUI -- You
can run a program based on MiniGUI-Processes from a program called
'mginit'. Just like X Window, the former process is called a client,
and the latter the server.
Clients connect to the server via UNIX domain socket, and the server
receives and responses requests from clients. The server provides shared
resources for clients, manage window objects, and sends mouse
(or touch screen) and keyboard events to the active top-most client.
If a client exits or dies for some reasons, it will not damage other
Clients connect to the server via UNIX domain socket, and the server
receives and responses requests from clients. The server provides shared
resources for clients, manage window objects, and sends mouse
(or touch screen) and keyboard events to the active top-most client.
If a client exits or dies for some reasons, it will not damage other
clients and the server.
## HISTORY
About ten years have pasted since MiniGUI was initially created at
the end of 1998, and now it becomes much reliable and stable.
During the past years, many remarkable changes have taken place in
About ten years have pasted since MiniGUI was initially created at
the end of 1998, and now it becomes much reliable and stable.
During the past years, many remarkable changes have taken place in
the MiniGUI project.
At the original, the version 0.2.xx was based on SVGALib and PThread
(LinuxThreads). Then the version 0.3.xx had many enhanced features
including Graphics Abstract Layer (GAL), Input Abstract Layer (IAL),
and the support for multiple charsets and multiple fonts.
At the original, the version 0.2.xx was based on SVGALib and PThread
(LinuxThreads). Then the version 0.3.xx had many enhanced features
including Graphics Abstract Layer (GAL), Input Abstract Layer (IAL),
and the support for multiple charsets and multiple fonts.
In version 1.0.00, we designed MiniGUI-Lite, which was more fit for
some complex embedded systems, such as PDAs, Thin-Clients, or STBs.
MiniGUI-Lite made the embedded systems more stable and efficient.
The version 1.0.00 provided the native fbcon engine based on Linux
frame buffer device directly as well.
In version 1.0.00, we designed MiniGUI-Lite, which was more fit for
some complex embedded systems, such as PDAs, Thin-Clients, or STBs.
MiniGUI-Lite made the embedded systems more stable and efficient.
The version 1.0.00 provided the native fbcon engine based on Linux
frame buffer device directly as well.
In the development of version 1.1.00, we re-wrote the GAL and GDI
interfaces, and provided some advanced video features, such as raster
operation, transparent blitting, alpha blending, and video hardware
acceleration. We also provided some important GDI functions, such as
In the development of version 1.1.00, we re-wrote the GAL and GDI
interfaces, and provided some advanced video features, such as raster
operation, transparent blitting, alpha blending, and video hardware
acceleration. We also provided some important GDI functions, such as
Ellipse, Arc, Polygon, and FloodFill.
In the development of version 1.6.0, we added advanced 2D graphics
@@ -238,7 +238,7 @@ A brief history description of the development progress lay below:
0) 1994 ~ 1996: MiniGUI DOS version.
1) Dec, 1998: Began to write.
2) Apr, 1999: The skeleton of MiniGUI, windowing sub-system
2) Apr, 1999: The skeleton of MiniGUI, windowing sub-system
and basic graphics device interfaces.
3) May, 1999: Timer, menu, and the skeleton of control sub-system.
4) Jun, 1999: Chinese input method (by Kang Xiaoning).
@@ -247,29 +247,29 @@ A brief history description of the development progress lay below:
7) Sep, 1999: Dialog boxes and message boxes.
8) Sep, 1999: Snapshot of screen or window.
9) Jan., 2000: VCOnGUI (Virtual Console on MiniGUI) version 0.2.02.
10) Mar., 2000: Linux distribution installer based-on MiniGUI for
10) Mar., 2000: Linux distribution installer based-on MiniGUI for
HappyLinux 1.0.
11) Jun., 2000: Began to develop version 1.0.xx.
12) Sep., 2000: MiniGUI version 0.3.06 released.
13) Oct., 2000: MiniGUI version 0.9.00 released.
14) Nov., 2000: MiniGUI version 0.9.96 released.
15) Jan., 2001: MiniGUI version 0.9.98 released. You can build
13) Oct., 2000: MiniGUI version 0.9.00 released.
14) Nov., 2000: MiniGUI version 0.9.96 released.
15) Jan., 2001: MiniGUI version 0.9.98 released. You can build
MiniGUI-Lite from this version.
16) Jan., 2001: MiniGUI version 1.0.00Beta1 released.
17) Feb., 2001: MiniGUI version 1.0.00Pre1 released.
18) Apr., 2001: MiniGUI version 1.0.00 released (2001/04/16).
18) Sep., 2001: MiniGUI version 1.1.0Pre1 released (2001/09/12).
19) Sep., 2001: MiniGUI version 1.0.9 released (2001/09/17),
this will be the last version of source branch 1.0.x.
20) Oct., 2001: MiniGUI version 1.1.0Pre4 released (2001/10/22).
19) Sep., 2001: MiniGUI version 1.0.9 released (2001/09/17),
this will be the last version of source branch 1.0.x.
20) Oct., 2001: MiniGUI version 1.1.0Pre4 released (2001/10/22).
This version have new GAL and GDI interfaces.
21) Mar., 2002: MiniGUI official version 1.1.0 released (2002/03/08).
21) Mar., 2002: MiniGUI official version 1.1.0 released (2002/03/08).
MiniGUI API Reference documentation version 0.9 released.
22) Mar., 2002: MiniGUI API Reference documentation version 1.0 released.
23) Apr., 2002: MiniGUI the new stable version 1.2.0 released (2002/04/11).
24) Sep., 2002: The main developers of MiniGUI founded a
new software corporation: Beijing FMSoft Technology Co., Ltd..
And the development and maintenance of MiniGUI changes from
23) Apr., 2002: MiniGUI the new stable version 1.2.0 released (2002/04/11).
24) Sep., 2002: The main developers of MiniGUI founded a
new software corporation: Beijing FMSoft Technology Co., Ltd..
And the development and maintenance of MiniGUI changes from
loosely-knit team to business organization.
25) Mar., 2003: MiniGUI official version 1.2.5 released (2003/03/23).
25) May., 2003: MiniGUI official version 1.2.6 released (2003/05/18).
@@ -299,14 +299,14 @@ A brief history description of the development progress lay below:
## ABOUT THE AUTHORS
The original author of MiniGUI is WEI Yongming, and now MiniGUI is
maintained by FMSoft. For more information, please browse
The original author of MiniGUI is WEI Yongming, and now MiniGUI is
maintained by FMSoft. For more information, please browse
our home page: http://www.fmsoft.cn.
## IF YOU HAVE A PROBLEM
If you have any technical problem, advice or comment, please send
If you have any technical problem, advice or comment, please send
messages to consult@minigui.com.
@@ -314,15 +314,15 @@ messages to consult@minigui.com.
Q: Is GPL'd MiniGUI free for commercial use?
A: Simply no. FMSoft releases MiniGUI under GPLv3 license.
It is free for those who are 100% GPL and those who never copy, modify
and distribute MiniGUI. But if you want to use these GPL'd versions
A: Simply no. FMSoft releases MiniGUI under GPLv3 license.
It is free for those who are 100% GPL and those who never copy, modify
and distribute MiniGUI. But if you want to use these GPL'd versions
for commerce, you should get the commercial license from FMSoft first.
Q: Which operating system does MiniGUI support?
A: MiniGUI can run on Linux/uClinux, uC/OS-II, eCos, ThreadX, pSOS,
VxWorks, ThreadX, OSE, and even Win32. Any other real-time OSes can
A: MiniGUI can run on Linux/uClinux, uC/OS-II, eCos, ThreadX, pSOS,
VxWorks, ThreadX, OSE, and even Win32. Any other real-time OSes can
be supported theoretically.
Q: Which architecture does MiniGUI support?
@@ -332,24 +332,24 @@ A: x86 32/64-bit, ARM 32/64-bit (e.g., ARMv7 and ARM Cortex-A7),
Q: Does MiniGUI offer the support for grey LCD with 4bpp (bits per pixel)?
A: Yes, it offers. It even offers the support for 1bpp and 2bpp LCD.
A: Yes, it offers. It even offers the support for 1bpp and 2bpp LCD.
## NOT FREE FOR COMMERCIAL USE
MiniGUI and its components are licensed under the GPL license.
So any links about MiniGUI must follow GPL. If you cannot accept GPL,
you need to be licensed from FMSoft. If you wonder that if you need
MiniGUI and its components are licensed under the GPL license.
So any links about MiniGUI must follow GPL. If you cannot accept GPL,
you need to be licensed from FMSoft. If you wonder that if you need
the commercial license of MiniGUI, please refer to the LICENSE-POLICY file.
We provide you the commercial license of MiniGUI according to the number
of the run-time binary copies of MiniGUI. If you are interested in
the commercial license of MiniGUI, please write to sales@minigui.com.
We provide you the commercial license of MiniGUI according to the number
of the run-time binary copies of MiniGUI. If you are interested in
the commercial license of MiniGUI, please write to sales@minigui.com.
## COPYING
Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
Copyright (C) 2002~2019, Beijing FMSoft Technologies Co., Ltd.
Copyright (C) 1998~2002, WEI Yongming
This program is free software: you can redistribute it and/or modify
+6 -5
View File
@@ -16,8 +16,10 @@ Please report any bugs and incompatibilities in
represents the shadow frame buffer of the screen.
* configure option: `--enable-syncupdate`
* macro: `_MGUSE_SYNC_UPDATE`
1. New API: `UpdateInvalidClient`. You can use this function to update
1. New API `UpdateInvalidClient`. You can use this function to update
the invalid client region of a window instantly.
1. New API `LoadDevFontFromFile`. You can use this function to load
a device font from incore data.
1. Use different colors for the output of `_DBG_PRINTF` and `_ERR_PRINTF`.
1. Add `__mg_save_jpg` function for storing MYBITMAP as JPEG file (10km).
1. Modified logic for checking JPEG format (10km).
@@ -32,13 +34,15 @@ Please report any bugs and incompatibilities in
1. Enhance commlcd engint to support more pixel type and synchronously update.
1. New USVFB IAL engine and NEWGAL engine for web display server.
1. New type: `QDWORD` for a quauter of DWORD. This type is 16-bit long on
64-bit architecture, and 8-bit long on 32-bit.
64-bit architecture, and 8-bit long on 32-bit.
1. New macros for QDWORD:
* `MAKEDWORD`: Make a DWROD from four QDWORDs.
* `FIRST_QDWORD`: get the first (LSB) QDWORD from a DWORD.
* `SECOND_QDWORD`: get the second (LSB) QDWORD from a DWORD.
* `THIRD_QDWORD`: get the third (LSB) QDWORD from a DWORD.
* `FOURTH_QDWORD`: get the fourth (LSB) QDWORD from a DWORD.
1. New header for CommLCD NEWGAL engine and COMM IAL engine:
`<minigui/exstubs.h>`.
* BUGFIXING:
1. handle `PNG_COLOR_TYPE_GRAY_ALPHA` color type of PNG files.
@@ -51,9 +55,6 @@ Please report any bugs and incompatibilities in
1. Tune cache implementation of FreeType2 font engine.
* Enable cache for rotated LOGFONT.
* TUNNING:
1. Tune GLYPHINFO structure and GetGlyphInfo to return BIDI glyph type.
## Version 3.2.0
The MiniGUI development team announces the availability of MiniGUI 3.2.0.
+18 -14
View File
@@ -389,7 +389,7 @@ AC_ARG_ENABLE(netial,
build_net_ial_engine=$enableval)
AC_ARG_ENABLE(cisco_touchpad_ial,
[ --enable-cisco_touchpad_ial build the IAL engine for Cisco Touchpad <default=no>],
[ --enable-cisco_touchpad_ial build the IAL engine for Cisco Touchpad <default=no>],
build_cisco_touchpad_ial_engine=$enableval)
AC_ARG_ENABLE(mstar_ial,
@@ -892,21 +892,21 @@ CheckXVFB()
[ --enable-videortosxvfb include RTOS Virtual FrameBuffer NEWGAL engine <default=no>. Please disable pcxvfb to enable rtosxvfb],
enable_video_rtos_xvfb=$enableval)
if test "x$enable_video_pc_xvfb" = "xyes"; then
dnl CheckPCXVFB
if test "x$enable_video_pc_xvfb" = "xyes"; then
dnl CheckPCXVFB
AC_DEFINE(_MGGAL_PCXVFB, 1,
[Define if include PC Virtual FrameBuffer NEWGAL engine])
VIDEO_SUBDIRS="$VIDEO_SUBDIRS pcxvfb"
VIDEO_DRIVERS="$VIDEO_DRIVERS pcxvfb/libvideo_pcxvfb.la"
else
if test "x$enable_video_rtos_xvfb" = "xyes"; then
dnl CheckRTOSXVFB
else
if test "x$enable_video_rtos_xvfb" = "xyes"; then
dnl CheckRTOSXVFB
AC_DEFINE(_MGGAL_RTOSXVFB, 1,
[Define if include RTOS Virtual FrameBuffer NEWGAL engine])
VIDEO_SUBDIRS="$VIDEO_SUBDIRS rtos_xvfb"
VIDEO_DRIVERS="$VIDEO_DRIVERS rtos_xvfb/libvideo_rtos_xvfb.la"
fi
fi
fi
fi
}
@@ -1519,13 +1519,17 @@ AC_ARG_WITH(targetname,
S3C6410/S3C2440/S3C2410/hi3560a/movidius Define the target board name])
case "$with_targetname" in
external)
AC_DEFINE(__TARGET_EXTERNAL__, 1,
[Define for targets which use GAL and/or IAL engines and define the interfaces externally])
;;
fmsoft)
AC_DEFINE(__TARGET_FMSOFT__, 1,
[Define for FMSoft internal use])
[Define for FMSoft internal use])
;;
mstudio)
AC_DEFINE(__TARGET_MSTUDIO__, 1,
[Define for FMSoft miniStudio])
[Define for FMSoft miniStudio])
;;
stb810)
AC_DEFINE(__TARGET_STB810__, 1,
@@ -1553,11 +1557,11 @@ case "$with_targetname" in
;;
bfin)
AC_DEFINE(__TARGET_BLACKFIN__, 1,
[Define for Blackfin run uClinux])
[Define for Blackfin run uClinux])
;;
c33l05)
AC_DEFINE(__TARGET_C33L05__, 1,
[Define for EPSON C33L05 (axLinux)])
[Define for EPSON C33L05 (axLinux)])
;;
S3C6410)
CFLAGS="$CFLAGS -D_WITH_TARGET_S3C6410"
@@ -2440,8 +2444,8 @@ fi
if test "x$build_ctrl_textedit_new" = "xyes"; then
AC_DEFINE(_MGCTRL_TEXTEDIT, 1,
[Define if include TEXTEDIT control])
AC_DEFINE(_MGCTRL_TEXTEDIT_USE_NEW_IMPL, 1,
[Define if use new implementation of TEXTEDIT control])
AC_DEFINE(_MGCTRL_TEXTEDIT_USE_NEW_IMPL, 1,
[Define if use new implementation of TEXTEDIT control])
fi
if test "x$build_splash" = "xyes"; then
+2 -2
View File
@@ -11,8 +11,8 @@ COMM_HDRS = \
common.h endianrw.h fixedmath.h \
minigui.h gdi.h window.h control.h \
own_malloc.h own_stdio.h \
xvfb.h customial.h \
dti.c
xvfb.h customial.h exstubs.h \
dti.c
UCOSII_HDRS=ucos2_pthread.h ucos2_semaphore.h
THREADX_HDRS=threadx_pthread.h threadx_semaphore.h
+14 -14
View File
@@ -51,11 +51,6 @@
#ifndef GUI_IAL_CUSTOM_H
#define GUI_IAL_CUSTOM_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define IAL_MOUSE_LEFTBUTTON 1
#define IAL_MOUSE_RIGHTBUTTON 2
#define IAL_MOUSE_MIDDLEBUTTON 4
@@ -67,12 +62,12 @@ extern "C" {
#define IAL_MOUSEEVENT 1
#define IAL_KEYEVENT 2
typedef struct tagINPUT
{
typedef struct tagINPUT {
char* id;
// Initialization and termination
BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype);
BOOL (*init_input) (struct tagINPUT *input, const char* mdev,
const char* mtype);
void (*term_input) (void);
// Mouse operations
@@ -92,21 +87,26 @@ typedef struct tagINPUT
void (*set_leds) (unsigned int leds);
// Event
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out,
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out,
fd_set *except, struct timeval *timeout);
char mdev [MAX_PATH + 1];
}INPUT;
} INPUT;
#ifdef _MGIAL_CUSTOM
extern BOOL InitCustomInput (INPUT* input, const char* mdev, const char* mtype);
extern void TermCustomInput (void);
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
BOOL InitCustomInput (INPUT* input, const char* mdev, const char* mtype);
void TermCustomInput (void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _MGIAL_CUSTOM */
#endif /* GUI_IAL_CUSTOM_H */
+114
View File
@@ -0,0 +1,114 @@
/**
* \file exstubs.h
* \author Wei Yongming <vincent@minigui.org>
* \date 2019/04/07
*
* \brief This file is the header for NEWGAL/IAL engines which should be
* implemented by an external module.
*
\verbatim
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) 2007~2018, Beijing FMSoft Technologies Co., Ltd.
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/>.
\endverbatim
*/
/*
* MiniGUI for Linux/uClinux, eCos, uC/OS-II, VxWorks,
* pSOS, ThreadX, NuCleus, OSE, and Win32.
*/
#ifndef GUI_EXSTUBS_H
#define GUI_EXSTUBS_H
/* The pixel format defined by depth */
#define COMMLCD_PSEUDO_RGB332 1
#define COMMLCD_TRUE_RGB555 2
#define COMMLCD_TRUE_RGB565 3
#define COMMLCD_TRUE_RGB888 4
#define COMMLCD_TRUE_RGB0888 5
#define COMMLCD_TRUE_ARGB1555 6
#define COMMLCD_TRUE_ARGB8888 7
#define COMMLCD_TRUE_ABRG8888 8
#define COMMLCD_UPDATE_NONE 0
#define COMMLCD_UPDATE_SYNC 1
#define COMMLCD_UPDATE_ASYNC 2
struct commlcd_info {
int height; // vertical resolution of the screen
int width; // horinzontal resolution of the screen
int pitch; // Length of one scan line in bytes
int bpp; // Depth (bits-per-pixel)
int type; // Pixel type
int update_method; // Update method: none, asynchronously, or synchronously.
Uint8* fb; // Frame buffer
};
#define COMM_MOUSEINPUT 0x01
#define COMM_KBINPUT 0x02
#define COMM_MOUSELBUTTON 0x01
#define COMM_MOUSERBUTTON 0x04
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* external stubs for COMMLCD NEWGAL engine */
#ifdef _MGGAL_COMMLCD
int __commlcd_drv_init (void);
int __commlcd_drv_getinfo (struct commlcd_info *li,
int width, int height, int depth);
int __commlcd_drv_release (void);
int __commlcd_drv_setclut (int firstcolor, int ncolors, GAL_Color *colors);
int __commlcd_drv_update (const RECT* rc_dirty);
#endif /* _MGGAL_COMMLCD */
#ifdef _MGIAL_COMM
int __comminput_init (void);
int __comminput_ts_getdata (short *x, short *y, short *button);
int __comminput_kb_getdata (short *key, short *status);
int __comminput_wait_for_input (struct timeval *timeout);
void __comminput_deinit (void);
#endif /* _MGIAL_COMM */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* GUI_EXSTUBS_H */
+22 -17
View File
@@ -2769,7 +2769,7 @@ MG_EXPORT void GUIAPI RGB2Pixels (HDC hdc, const RGB* rgbs,
*/
static inline gal_pixel RGB2Pixel (HDC hdc, Uint8 r, Uint8 g, Uint8 b)
{
RGB rgb = {r, g, b, 0};
RGB rgb = {r, g, b, 0xFF};
gal_pixel pixel;
RGB2Pixels (hdc, &rgb, &pixel, 1);
@@ -6258,7 +6258,6 @@ MG_EXPORT BOOL GUIAPI ft2SetLcdFilter (LOGFONT* logfont, mg_FT_LcdFilter filter)
#endif
#if defined(_MGFONT_QPF) || defined(_MGFONT_FT2) || defined(_MGFONT_TTF) || defined(_MGFONT_UPF)
/**
* \fn DEVFONT* GUIAPI LoadDevFontFromFile (const char* devfont_name, \
* const char* file_name)
@@ -6275,9 +6274,26 @@ MG_EXPORT BOOL GUIAPI ft2SetLcdFilter (LOGFONT* logfont, mg_FT_LcdFilter filter)
*
* \sa GetNextDevFont, DestroyDynamicDevFont
*/
MG_EXPORT DEVFONT* GUIAPI LoadDevFontFromFile (const char *devfont_name,
MG_EXPORT DEVFONT* GUIAPI LoadDevFontFromFile (const char *devfont_name,
const char *file_name);
/**
* \fn DEVFONT* GUIAPI LoadDevFontFromIncoreData (const char* devfont_name, \
* const void* data)
* \brief Load device font from incore data.
*
* This function can be used to load device font from incore data.
*
* \param devfont_name The device font name.
* \param data The pointer to the incore font data.
*
* \return the pointer to the new device font on success, NULL on error.
*
* \sa GetNextDevFont, DestroyDynamicDevFont
*/
MG_EXPORT DEVFONT* GUIAPI LoadDevFontFromIncoreData (const char *devfont_name,
const void *data);
/**
* \fn void GUIAPI DestroyDynamicDevFont (DEVFONT **devfont)
* \brief Destroy device font loaded dynamically from font file.
@@ -6288,7 +6304,6 @@ MG_EXPORT DEVFONT* GUIAPI LoadDevFontFromFile (const char *devfont_name,
* \sa LoadDevFontFromFile
*/
MG_EXPORT void GUIAPI DestroyDynamicDevFont (DEVFONT **devfont);
#endif
/** @} end of font_fns */
@@ -8760,10 +8775,8 @@ MG_EXPORT int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
MG_EXPORT int GUIAPI DrawGlyphString (HDC hdc, int x, int y, Glyph32* glyph_string,
int len, int* adv_x, int* adv_y);
#define GLYPH_INFO_TYPE 0x01
#define GLYPH_INFO_BIDI_TYPE 0x02
#define GLYPH_INFO_METRICS 0x04
#define GLYPH_INFO_BMP 0x10
#define GLYPH_INFO_METRICS 0x01
#define GLYPH_INFO_BMP 0x02
/*the type of glyph bitmap*/
#define GLYPHBMP_TYPE_MONO 0x00
@@ -8780,18 +8793,10 @@ typedef struct _GLYPHINFO
/**
* The mask indicates if you want to get glyph type info, metrics,
* or bitmap infomation you want. Or'ed with the following values:
* - GLYPH_INFO_TYPE
* - GLYPH_INFO_BIDI_TYPE
* - GLYPH_INFO_METRICS
* - GLYPH_INFO_BMP
*/
unsigned char mask;
/** The basic glyph type */
unsigned int glyph_type;
/** The BIDI glyph type */
unsigned int bidi_glyph_type;
Uint32 mask;
/** The height of the glyph */
int height;
+72 -21
View File
@@ -2565,10 +2565,6 @@ MG_EXPORT void GUIAPI FreeFixStr (char* str);
* @{
*/
#ifndef _MGHAVE_CURSOR
static inline void do_nothing (void) { return; }
#endif
#ifdef _MGHAVE_CURSOR
/**
@@ -2731,12 +2727,38 @@ MG_EXPORT HCURSOR GUIAPI GetSystemCursor (int csrid);
*/
MG_EXPORT HCURSOR GUIAPI GetCurrentCursor (void);
#else
#define LoadCursorFromFile(filename) (do_nothing(), 0)
#define CreateCursor(x, y, w, h, ANDbs, XORbs, cr) (do_nothing(), 0)
#define DestroyCursor(hcsr) (do_nothing(), 0)
// #define GetSystemCursor(csrid) (do_nothing(), 0)
#define GetCurrentCursor() (do_nothing(), 0)
static inline HCURSOR GetSystemCursor(int csrid) { return (HCURSOR) 0;}
// #define LoadCursorFromFile(filename) (do_nothing(), 0)
// #define CreateCursor(x, y, w, h, ANDbs, XORbs, cr) (do_nothing(), 0)
// #define DestroyCursor(hcsr) (do_nothing(), 0)
//// #define GetSystemCursor(csrid) (do_nothing(), 0)
// #define GetCurrentCursor() (do_nothing(), 0)
//static inline HCURSOR GetSystemCursor(int csrid) { return (HCURSOR) 0;}
static inline HCURSOR LoadCursorFromFile(const char* filename) {
return (HCURSOR)0;
}
static inline HCURSOR CreateCursor(int xhotspot, int yhotspot, int w, int h,
const BYTE* pANDBits, const BYTE* pXORBits, int colornum) {
return (HCURSOR)0;
}
static inline HCURSOR GUIAPI CopyCursor (HCURSOR hcsr) {
return (HCURSOR)0;
}
static inline BOOL DestroyCursor (HCURSOR hcsr) {
return TRUE;
}
static inline HCURSOR GetSystemCursor (int csrid) {
return (HCURSOR)0;
}
static inline HCURSOR GUIAPI GetCurrentCursor (void) {
return (HCURSOR)0;
}
#endif /* _MGHAVE_CURSOR */
#define MAX_SYSCURSORINDEX 22
@@ -2864,6 +2886,29 @@ MG_EXPORT void GUIAPI SetCursorPos (int x, int y);
*/
MG_EXPORT HCURSOR GUIAPI SetCursorEx (HCURSOR hcsr, BOOL set_def);
/**
* \fn HCURSOR GUIAPI GetDefaultCursor (void)
* \brief Gets the default cursor.
*
* This function gets the current default cursor.
*
* \return The current default cursor handle.
*
* \sa SetCursorEx, SetDefaultCursor
*/
MG_EXPORT HCURSOR GUIAPI GetDefaultCursor (void);
#else
static inline HCURSOR SetCursorEx(HCURSOR hcsr, BOOL set_def) {
return (HCURSOR)0;
}
static inline HCURSOR GetDefaultCursor(void) {
return (HCURSOR)0;
}
#endif /* _MGHAVE_CURSOR */
/**
* \def SetCursor(hcsr)
* \brief Changes the current cursor.
@@ -2907,18 +2952,18 @@ MG_EXPORT void GUIAPI SetCursorPos (int x, int y);
*
* \sa SetCursorEx, SetDefaultCursor
*/
MG_EXPORT HCURSOR GUIAPI GetDefaultCursor (void);
//MG_EXPORT HCURSOR GUIAPI GetDefaultCursor (void);
#else
// #define SetCursorEx(hcsr, set_def) (do_nothing(), (HCURSOR)0)
// #define SetCursor(hcsr) (do_nothing(), (HCURSOR)0)
// #define SetDefaultCursor(hcsr) (do_nothing(), (HCURSOR)0)
// #define GetDefaultCursor() (do_nothing(), (HCURSOR)0)
//// #define SetCursorEx(hcsr, set_def) (do_nothing(), (HCURSOR)0)
//// #define SetCursor(hcsr) (do_nothing(), (HCURSOR)0)
//// #define SetDefaultCursor(hcsr) (do_nothing(), (HCURSOR)0)
//// #define GetDefaultCursor() (do_nothing(), (HCURSOR)0)
static inline HCURSOR SetCursorEx(HCURSOR hcsr, BOOL set_def) { return (HCURSOR) 0;}
static inline HCURSOR SetCursor(HCURSOR hcsr) { return (HCURSOR) 0;}
static inline HCURSOR SetDefaultCursor(HCURSOR hcsr) { return (HCURSOR) 0;}
static inline HCURSOR GetDefaultCursor(void) { return (HCURSOR) 0;}
//static inline HCURSOR SetCursorEx(HCURSOR hcsr, BOOL set_def) { return (HCURSOR) 0;}
//static inline HCURSOR SetCursor(HCURSOR hcsr) { return (HCURSOR) 0;}
//static inline HCURSOR SetDefaultCursor(HCURSOR hcsr) { return (HCURSOR) 0;}
//static inline HCURSOR GetDefaultCursor(void) { return (HCURSOR) 0;}
#endif /* _MGHAVE_CURSOR */
@@ -2939,9 +2984,15 @@ static inline HCURSOR GetDefaultCursor(void) { return (HCURSOR) 0;}
* \return Cursor showing count value.
*/
MG_EXPORT int GUIAPI ShowCursor (BOOL fShow);
#else
// #define ShowCursor(fShow) (do_nothing(), (HCURSOR)0)
static inline int ShowCursor(BOOL fShow) {return 0;}
//// #define ShowCursor(fShow) (do_nothing(), (HCURSOR)0)
//static inline int ShowCursor(BOOL fShow) {return 0;}
static inline int GUIAPI ShowCursor (BOOL fShow) {
return 0;
}
#endif /* _MGHAVE_CURSOR */
/** @} end of cursor_fns */
+5 -6
View File
@@ -4584,17 +4584,16 @@ typedef unsigned long RES_KEY;
/* define the incore res type */
typedef struct _INNER_RES {
RES_KEY key;
Uint8* data;
const Uint8* data;
int data_len;
/* special param recognized by the TYPE_OPS
* normal is null.
* is the data is a mem of raw png, jpeg, bmp
/* The special param recognized by the TYPE_OPS normally it is NULL.
* If data is the data is a mem of raw png, jpeg, bmp
* and so on, it should be the extention name
* of the filename. eg.
* of the filename. eg.
* INNER_RES res[]= { ... { ..., ... ,.., "png" } .. };
* */
void* additional;
const void* additional;
} INNER_RES;
/* the type of resource */
+109 -62
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/>.
*/
@@ -103,7 +103,7 @@ void font_ResetDevFont (void)
#define MATCHED_FAMILY 0x02
#define MATCHED_CHARSET 0x04
static DEVFONT* get_matched_devfont (LOGFONT* log_font, DEVFONT* list_head,
static DEVFONT* get_matched_devfont (LOGFONT* log_font, DEVFONT* list_head,
int list_len, char* req_charset)
{
int i = 0;
@@ -160,8 +160,8 @@ static DEVFONT* get_matched_devfont (LOGFONT* log_font, DEVFONT* list_head,
if ((match_bits [i] & MATCHED_TYPE)
&& (match_bits [i] & MATCHED_FAMILY)
&& (match_bits [i] & MATCHED_CHARSET)) {
error = log_font->size -
(*dev_font->font_ops->get_font_size) (log_font, dev_font,
error = log_font->size -
(*dev_font->font_ops->get_font_size) (log_font, dev_font,
log_font->size);
error = ABS (error);
if (min_error >= error) { /* use >=, make the later has a higher priority */
@@ -178,7 +178,7 @@ static DEVFONT* get_matched_devfont (LOGFONT* log_font, DEVFONT* list_head,
FreeFixStr ((char*)match_bits);
#endif
matched_font->font_ops->get_font_size (log_font, matched_font,
matched_font->font_ops->get_font_size (log_font, matched_font,
log_font->size);
return matched_font;
@@ -189,7 +189,7 @@ static DEVFONT* get_matched_devfont (LOGFONT* log_font, DEVFONT* list_head,
for (i = 0; i < list_len; i++) {
int error;
if (match_bits [i] & MATCHED_CHARSET) {
error = log_font->size -
error = log_font->size -
(*dev_font->font_ops->get_font_size) (log_font, dev_font, log_font->size);
error = ABS (error);
if (min_error >= error) { /* use >=, make the later has a higher priority */
@@ -218,12 +218,12 @@ DEVFONT* font_GetMatchedSBDevFont (LOGFONT* log_font)
/*mbc logfont --- sbc devfont*/
char sysfont_charset [LEN_FONT_NAME + 1];
fontGetCharsetFromName (g_SysLogFont[0]->sbc_devfont->name, sysfont_charset);
matched_devfont = get_matched_devfont (log_font, sb_dev_font_head,
matched_devfont = get_matched_devfont (log_font, sb_dev_font_head,
nr_sb_dev_fonts, sysfont_charset);
}
else {
/*sbc logfont --- sbc devfont*/
matched_devfont = get_matched_devfont (log_font, sb_dev_font_head,
matched_devfont = get_matched_devfont (log_font, sb_dev_font_head,
nr_sb_dev_fonts,log_font->charset);
}
@@ -240,7 +240,7 @@ DEVFONT* font_GetMatchedMBDevFont (LOGFONT* log_font)
return NULL;
/*mbc logfont --- mbc devfont*/
else
return get_matched_devfont (log_font, mb_dev_font_head,
return get_matched_devfont (log_font, mb_dev_font_head,
nr_mb_dev_fonts, log_font->charset);
}
@@ -265,7 +265,7 @@ unsigned short font_GetBestScaleFactor (int height, int expect)
{
int error, min_error;
unsigned short scale = 1;
min_error = height - expect;
min_error = ABS (min_error);
@@ -322,10 +322,10 @@ void dbg_dumpDevFonts (void)
/***** Added in MiniGUI V2.2 for bitmap font *****/
/*
/*
* Removes an element from single-byte devfont linked list. If two elements
* contain the same data, only the first is removed. If none of the elements
* contain the data, the single-byte devfont linked list is unchanged
* contain the data, the single-byte devfont linked list is unchanged
*/
void font_DelSBDevFont (DEVFONT* dev_font)
{
@@ -334,27 +334,27 @@ void font_DelSBDevFont (DEVFONT* dev_font)
tmp = sb_dev_font_head;
while (tmp != NULL) {
if (tmp == dev_font) {
if (prev != NULL)
if (prev != NULL)
prev->next = tmp->next;
else
else
sb_dev_font_head = tmp->next;
nr_sb_dev_fonts --;
break;
break;
}
prev = tmp;
tmp = prev->next;
}
return;
}
/*
/*
* Removes an element from multiple-byte devfont linked list. If two elements
* contain the same data, only the first is removed. If none of the elements
* contain the data, the multiple-byte devfont linked list is unchanged
* contain the data, the multiple-byte devfont linked list is unchanged
*/
void font_DelMBDevFont (DEVFONT* dev_font)
{
@@ -369,31 +369,55 @@ void font_DelMBDevFont (DEVFONT* dev_font)
mb_dev_font_head = tmp->next;
nr_mb_dev_fonts --;
break;
break;
}
prev = tmp;
tmp = prev->next;
}
return;
}
//////////////////////////////////////////////////////////////////////
static DEVFONT* make_devfont (const char* font_name, void* data, BOOL is_filename)
static DEVFONT* find_devfont(const char* font_name, BOOL is_mbc_list)
{
DEVFONT* head;
DEVFONT* cur;
if (is_mbc_list) {
head = mb_dev_font_head;
}
else {
head = sb_dev_font_head;
}
cur = head;
while (cur) {
if (strcasecmp (cur->name, font_name) == 0) {
return cur;
}
cur = cur->next;
}
return NULL;
}
static DEVFONT* make_devfont (const char* font_name, const void* data, BOOL is_filename)
{
FONTOPS_INFO* fontops_info = __mg_fontops_infos;
DEVFONT* devfont;
CHARSETOPS* charset_ops;
char charset [LEN_FONT_NAME + 1];
/*find the FONTOPS and LOADER*/
while (fontops_info->type) {
if (strncmp (font_name, fontops_info->type, FONT_TYPE_NAME_LEN) == 0)
break;
fontops_info++;
}
if (fontops_info->type == NULL) {
_MG_PRINTF ("FONT>DevFont: invalid font type: %s.\n", font_name);
return NULL;
@@ -406,11 +430,17 @@ static DEVFONT* make_devfont (const char* font_name, void* data, BOOL is_filenam
}
if ((charset_ops = GetCharsetOpsEx (charset)) == NULL) {
_MG_PRINTF ("FONT>DevFont: Invalid charset name %s of font %s.\n",
_MG_PRINTF ("FONT>DevFont: Invalid charset name %s of font %s.\n",
charset, font_name);
return NULL;
}
if (find_devfont(font_name, (charset_ops->bytes_maxlen_char > 1))) {
_MG_PRINTF ("FONT>DevFont: Duplicated devfont name (%s)",
font_name);
return NULL;
}
devfont = calloc (1, sizeof (DEVFONT));
devfont->font_ops = fontops_info->fontops;
@@ -421,7 +451,7 @@ static DEVFONT* make_devfont (const char* font_name, void* data, BOOL is_filenam
devfont->data = devfont->font_ops->load_font_data (font_name, data);
if (devfont->data == NULL) {
_MG_PRINTF ("FONT>DevFont: error in loading font %s from %s file.\n",
_MG_PRINTF ("FONT>DevFont: error in loading font %s from %s file.\n",
font_name, (const char*) data);
free (devfont);
return NULL;
@@ -429,7 +459,7 @@ static DEVFONT* make_devfont (const char* font_name, void* data, BOOL is_filenam
devfont->need_unload = TRUE;
}
else {
devfont->data = data;
devfont->data = (void*)data;
devfont->need_unload = FALSE;
}
@@ -562,7 +592,7 @@ static UPFINFO* incore_upfonts [] = {
&__mgif_upf_times_12x10,
&__mgif_upf_times_17x14,
#endif
NULL
NULL
};
#define NR_UPFONTS (sizeof (incore_upfonts) / sizeof (UPFINFO*))
@@ -649,7 +679,7 @@ static void del_all_devfonts (void)
DEVFONT* cur;
DEVFONT* head;
head = sb_dev_font_head;
head = sb_dev_font_head;
one_list:
cur = head;
while (cur) {
@@ -674,8 +704,8 @@ one_list:
*/
static inline void del_devfont_from_list(const char* font_name, BOOL is_mbc_list)
{
static inline void del_devfont_from_list(const char* font_name, BOOL is_mbc_list)
{
DEVFONT* head;
DEVFONT* cur;
DEVFONT* prev;
@@ -691,11 +721,11 @@ static inline void del_devfont_from_list(const char* font_name, BOOL is_mbc_list
prev = NULL;
}
while (cur) {
if (strcmp (cur->name, font_name) == 0) {
/*unload cur->data*/
if (!cur->relationship && cur->need_unload)
cur->font_ops->unload_font_data (cur->data);
while (cur) {
if (strcmp (cur->name, font_name) == 0) {
/*unload cur->data*/
if (!cur->relationship && cur->need_unload)
cur->font_ops->unload_font_data (cur->data);
if (cur == head) {
cur = cur->next;
@@ -705,20 +735,20 @@ static inline void del_devfont_from_list(const char* font_name, BOOL is_mbc_list
}
else {
prev->next = cur->next;
free (cur);
cur = prev->next;
free (cur);
cur = prev->next;
}
if (is_mbc_list)
nr_mb_dev_fonts--;
else
nr_sb_dev_fonts--;
}
else {
}
else {
prev = cur;
cur = cur->next;
}
}
}
}
if (is_mbc_list)
mb_dev_font_head = head;
@@ -738,10 +768,22 @@ static void font_DelDevFont (const char* font_name)
del_devfont_from_list(font_name, FALSE);
}
DEVFONT* GUIAPI LoadDevFontFromFile
(const char *devfont_name, const char *file_name)
DEVFONT* GUIAPI LoadDevFontFromIncoreData(const char *devfont_name,
const void *data)
{
DEVFONT* devfont = make_devfont (devfont_name, (char*)file_name, TRUE);
DEVFONT* devfont = make_devfont (devfont_name, data, FALSE);
if (devfont == NULL)
return NULL;
ADD_DEVFONT_TO_LINKLIST (devfont);
add_relating_devfonts_to_list (devfont);
return devfont;
}
DEVFONT* GUIAPI LoadDevFontFromFile(const char *devfont_name,
const char *file_name)
{
DEVFONT* devfont = make_devfont (devfont_name, file_name, TRUE);
if (devfont == NULL)
return NULL;
@@ -752,7 +794,12 @@ DEVFONT* GUIAPI LoadDevFontFromFile
void GUIAPI DestroyDynamicDevFont (DEVFONT** devfont)
{
font_DelDevFont ((*devfont)->name);
char font_name [LEN_UNIDEVFONT_NAME + 1];
memset(font_name, 0, LEN_UNIDEVFONT_NAME + 1);
strncpy(font_name, (*devfont)->name, LEN_UNIDEVFONT_NAME);
font_DelDevFont (font_name);
*devfont = NULL;
}
@@ -763,13 +810,13 @@ static BOOL init_or_term_specifical_fonts (char* etc_section, BOOL is_unload)
char font_name [LEN_UNIDEVFONT_NAME + 1];
char font_file [MAX_PATH+1];
char font_path [MAX_PATH+1];
char *font_file_name = NULL;
MEM_RES* memres = NULL;
char *font_file_name = NULL;
MEM_RES* memres = NULL;
char key[12];
int added_num = 0;
font_file_name = font_file;
font_file_name = font_file;
/*get font number in minigui etc*/
if (GetMgEtcIntValue (etc_section, "font_number", &font_num) < 0 ) {
@@ -782,14 +829,14 @@ static BOOL init_or_term_specifical_fonts (char* etc_section, BOOL is_unload)
for (i=0; i<font_num; i++) {
snprintf (key, sizeof(key)-1, "name%d", i);
if (GetMgEtcValue (etc_section, key, font_name, LEN_UNIDEVFONT_NAME) < 0) {
_MG_PRINTF ("FONT>DevFont: can't get name of key %s in section %s.\n",
_MG_PRINTF ("FONT>DevFont: can't get name of key %s in section %s.\n",
key, etc_section);
continue;
}
snprintf (key, sizeof(key)-1, "fontfile%d", i);
if (GetMgEtcValue (etc_section, key, font_file_name, MAX_PATH) < 0) {
_MG_PRINTF ("FONT>DevFont: can't get font_file of key %s in section %s.\n",
_MG_PRINTF ("FONT>DevFont: can't get font_file of key %s in section %s.\n",
key, etc_section);
continue;
}
@@ -808,7 +855,7 @@ static BOOL init_or_term_specifical_fonts (char* etc_section, BOOL is_unload)
else {
/* [DK] Fix Bug #4801, which introduce a absolute path check error in Windows,
* first to load from sytem res path, else load it directly(relative or absolute path).*/
if ((0 == mg_path_joint(font_path, MAX_PATH + 1, sysres_get_system_res_path(), font_file))
if ((0 == mg_path_joint(font_path, MAX_PATH + 1, sysres_get_system_res_path(), font_file))
&& ((AddDevFont (font_name, font_path, TRUE)) == TRUE))
added_num++;
else if ((AddDevFont (font_name, font_file, TRUE)) == TRUE)
+12 -27
View File
@@ -1,39 +1,39 @@
/*
* 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/>.
*/
/*
** comminput.c: Common Input Engine for eCos, uC/OS-II, VxWorks, ...
**
**
** Created by Zhong Shuyi, 2004/02/29
*/
@@ -50,24 +50,9 @@
#include "comminput.h"
#define COMM_MOUSEINPUT 0x01
#define COMM_KBINPUT 0x02
#define COMM_MOUSELBUTTON 0x01
#define COMM_MOUSERBUTTON 0x04
#include "exstubs.h"
/* ----------------------------------------------------------------------- */
// OS input driver or application must implement these input functions
// hardware must be initialized before this engine can be used.
extern int __comminput_init (void);
extern int __comminput_ts_getdata (short *x, short *y, short *button);
extern int __comminput_kb_getdata (short *key, short *status);
extern int __comminput_wait_for_input (struct timeval *timeout);
extern void __comminput_deinit (void);
/* ----------------------------------------------------------------------- */
static short MOUSEX = 0, MOUSEY = 0, MOUSEBUTTON = 0;
static short KEYCODE = 0, KEYSTATUS = 0;
@@ -142,7 +127,7 @@ static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *ex
else if (retvalue < 0) {
retvalue = -1;
}
return retvalue;
}
+1
View File
@@ -37,6 +37,7 @@
#include <stdio.h>
#include <sys/types.h>
#include <sys/sysmacros.h> // for makedev
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+91 -90
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/>.
*/
@@ -39,11 +39,12 @@
#include <unistd.h>
#include <fcntl.h>
#include "mgconfig.h"
#include "common.h"
#ifdef _MGIAL_NET
#include "minigui.h"
#include "netial.h"
#ifdef _MGIAL_NET
#include <sys/ioctl.h>
//#include <sys/poll.h>
@@ -74,9 +75,9 @@ typedef struct {
typedef struct
{
int x;
int y;
int pressure;
int x;
int y;
int pressure;
}MOUSE_EVENT;
static int mousex = 0;
@@ -108,15 +109,15 @@ static int mouse_update(void)
static void mouse_getxy(int *x, int* y)
{
if (mousex < 0)
mousex = 0;
if (mousex > g_rcScr.right)
mousex = g_rcScr.right;
if (mousex < 0)
mousex = 0;
if (mousex > g_rcScr.right)
mousex = g_rcScr.right;
if (mousey < 0)
mousey = 0;
if (mousey > g_rcScr.bottom)
mousey = g_rcScr.bottom;
if (mousey < 0)
mousey = 0;
if (mousey > g_rcScr.bottom)
mousey = g_rcScr.bottom;
*x = mousex;
*y = mousey;
}
@@ -149,98 +150,98 @@ static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *ex
e = select (FD_SETSIZE, in, out, except, timeout) ;
#endif
if (e > 0)
{
if (temp_sock_descriptor >= 0 && FD_ISSET (temp_sock_descriptor, in))
{
FD_CLR (temp_sock_descriptor, in);
n = recv (temp_sock_descriptor, event_buf, 100, 0);
if (n == 0)
{
printf ("recv == 0\n");
exit (1);
}
if (n == sizeof (MOUSE_EVENT)/sizeof (char))
{
mouse_event = (MOUSE_EVENT*)event_buf;
mousex += mouse_event->x * 2;
mousey += mouse_event->y * 2;
switch (mouse_event->pressure)
{
case 1:
ts_event.pressure = IAL_MOUSE_LEFTBUTTON;
break;
case 2:
ts_event.pressure = IAL_MOUSE_RIGHTBUTTON;
break;
case 0:
ts_event.pressure = 0;
break;
}
return IAL_MOUSEEVENT;
}
}
}
else if (e < 0)
{
return -1;
}
if (e > 0)
{
if (temp_sock_descriptor >= 0 && FD_ISSET (temp_sock_descriptor, in))
{
FD_CLR (temp_sock_descriptor, in);
n = recv (temp_sock_descriptor, event_buf, 100, 0);
if (n == 0)
{
printf ("recv == 0\n");
exit (1);
}
if (n == sizeof (MOUSE_EVENT)/sizeof (char))
{
mouse_event = (MOUSE_EVENT*)event_buf;
mousex += mouse_event->x * 2;
mousey += mouse_event->y * 2;
switch (mouse_event->pressure)
{
case 1:
ts_event.pressure = IAL_MOUSE_LEFTBUTTON;
break;
case 2:
ts_event.pressure = IAL_MOUSE_RIGHTBUTTON;
break;
case 0:
ts_event.pressure = 0;
break;
}
return IAL_MOUSEEVENT;
}
}
}
else if (e < 0)
{
return -1;
}
return 0;
return 0;
}
BOOL InitNetInput (INPUT* input, const char* mdev, const char* mtype)
{
sock_descriptor = socket (AF_INET, SOCK_STREAM, 0);
if (sock_descriptor == -1)
{
perror ("call to socket");
exit (1);
}
sock_descriptor = socket (AF_INET, SOCK_STREAM, 0);
if (sock_descriptor == -1)
{
perror ("call to socket");
exit (1);
}
bzero (&sin, sizeof (sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons (port);
bzero (&sin, sizeof (sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons (port);
if (bind (sock_descriptor, (struct sockaddr*)&sin, sizeof (sin)) == -1)
{
perror("call to bind");
exit (1);
}
if (bind (sock_descriptor, (struct sockaddr*)&sin, sizeof (sin)) == -1)
{
perror("call to bind");
exit (1);
}
if (listen (sock_descriptor, 20) == -1)
{
perror ("call to listen");
exit (1);
}
printf ("Please start the PC side of the client process.\n");
if (listen (sock_descriptor, 20) == -1)
{
perror ("call to listen");
exit (1);
}
printf ("Please start the PC side of the client process.\n");
temp_sock_descriptor = accept (sock_descriptor, (struct sockaddr *)&pin, (socklen_t *)&address_size); // gengyue
if (temp_sock_descriptor == -1)
{
perror ("call to accept");
exit (1);
}
temp_sock_descriptor = accept (sock_descriptor, (struct sockaddr *)&pin, &address_size);
if (temp_sock_descriptor == -1)
{
perror ("call to accept");
exit (1);
}
input->update_mouse = mouse_update;
input->get_mouse_xy = mouse_getxy;
input->set_mouse_xy = NULL;
input->get_mouse_button = mouse_getbutton;
input->set_mouse_range = NULL;
input->update_keyboard = NULL;
input->update_keyboard = NULL;
input->get_keyboard_state = NULL;
input->wait_event = wait_event;
return TRUE;
}
void TermNetInput(void)
{
if (temp_sock_descriptor >= 0)
close(temp_sock_descriptor);
close(temp_sock_descriptor);
}
#endif /* _MGIAL_NET */
+2 -34
View File
@@ -35,10 +35,11 @@
#ifndef GUI_IAL_NET_H
#define GUI_IAL_NET_H
#include "ial.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "customial.h"
#define IAL_MOUSE_LEFTBUTTON 1
#define IAL_MOUSE_RIGHTBUTTON 2
@@ -50,42 +51,9 @@ extern "C" {
#define IAL_MOUSEEVENT 1
#define IAL_KEYEVENT 2
/*
typedef struct tagINPUT
{
char* id;
// Initialization and termination
BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype);
void (*term_input) (void);
// Mouse operations
int (*update_mouse) (void);
void (*get_mouse_xy) (int* x, int* y);
void (*set_mouse_xy) (int x, int y);
int (*get_mouse_button) (void);
void (*set_mouse_range) (int minx, int miny, int maxx, int maxy);
void (*suspend_mouse) (void);
int (*resume_mouse) (void);
// Keyboard operations
int (*update_keyboard) (void);
const char* (*get_keyboard_state) (void);
void (*suspend_keyboard) (void);
int (*resume_keyboard) (void);
void (*set_leds) (unsigned int leds);
// Event
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out,
fd_set *except, struct timeval *timeout);
char mdev [MAX_PATH + 1];
}INPUT;
*/
#ifdef _MGIAL_NET
extern BOOL InitNetInput (INPUT* input, const char* mdev, const char* mtype);
extern void TermNetInput (void);
#endif
#ifdef __cplusplus
}
+34 -32
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/>.
*/
@@ -72,6 +72,7 @@ extern "C" {
#define _ROT_DIR_HFLIP 0x08
#define _ROT_DIR_VFLIP 0x10
#endif
extern void (*__mg_ial_change_mouse_xy_hook) (int* x, int* y);
extern DWORD __mg_shadow_rotate_flags;
@@ -89,36 +90,36 @@ extern INPUT* __mg_cur_input;
#define IAL_UpdateMouse (*__mg_cur_input->update_mouse)
//#define IAL_GetMouseXY (*__mg_cur_input->get_mouse_xy)
static inline void IAL_GetMouseXY(int *x, int* y) {
if (__mg_cur_input && __mg_cur_input->get_mouse_xy) {
(*__mg_cur_input->get_mouse_xy) (x, y);
static inline void IAL_GetMouseXY(int *x, int* y)
{
if (__mg_cur_input && __mg_cur_input->get_mouse_xy) {
(*__mg_cur_input->get_mouse_xy) (x, y);
#ifdef _MGHAVE_MOUSECALIBRATE
__mg_mouse_org_pos.x = *x;
__mg_mouse_org_pos.y = *y;
__mg_mouse_org_pos.x = *x;
__mg_mouse_org_pos.y = *y;
#endif
}
}
#ifdef _MGHAVE_MOUSECALIBRATE
if (__mg_do_mouse_calibrate) __mg_do_mouse_calibrate (x, y);
if (__mg_do_mouse_calibrate) __mg_do_mouse_calibrate (x, y);
#endif
if (*x < 0) *x = 0;
if (*y < 0) *y = 0;
if (__mg_ial_change_mouse_xy_hook)
__mg_ial_change_mouse_xy_hook (x, y);
else
{
if (*x > (__gal_screen->w-1)) *x = (__gal_screen->w-1);
if (*y > (__gal_screen->h-1)) *y = (__gal_screen->h-1);
}
if (*x < 0) *x = 0;
if (*y < 0) *y = 0;
if (__mg_ial_change_mouse_xy_hook)
__mg_ial_change_mouse_xy_hook (x, y);
else
{
if (*x > (__gal_screen->w-1)) *x = (__gal_screen->w-1);
if (*y > (__gal_screen->h-1)) *y = (__gal_screen->h-1);
}
}
#define IAL_GetMouseButton (*__mg_cur_input->get_mouse_button)
//#define IAL_SetMouseXY if (__mg_cur_input->set_mouse_xy) (*__mg_cur_input->set_mouse_xy)
static inline void IAL_SetMouseXY (int x, int y) {
static inline void IAL_SetMouseXY (int x, int y)
{
if (__mg_cur_input->set_mouse_xy) {
#ifdef _MGGAL_SHADOW
if (__mg_shadow_rotate_flags & _ROT_DIR_CW){
@@ -140,14 +141,15 @@ static inline void IAL_SetMouseXY (int x, int y) {
}
}
//#define IAL_SetMouseRange if (__mg_cur_input->set_mouse_range) (*__mg_cur_input->set_mouse_range)
static inline void IAL_SetMouseRange (int minx, int miny, int maxx, int maxy) {
static inline void IAL_SetMouseRange (int minx, int miny, int maxx, int maxy)
{
#ifdef _MGGAL_SHADOW
if (__mg_shadow_rotate_flags)
return;
#endif
if (__mg_cur_input->set_mouse_range) (*__mg_cur_input->set_mouse_range)(minx, miny, maxx, maxy);
if (__mg_cur_input->set_mouse_range)
__mg_cur_input->set_mouse_range(minx, miny, maxx, maxy);
}
+9 -14
View File
@@ -248,36 +248,31 @@ failure:
static void sig_handler (int v)
{
if (v == SIGSEGV) {
#ifdef WIN32
raise(SIGABRT);
#else
kill (getpid(), SIGABRT); /* cause core dump */
#endif
}else if (__mg_quiting_stage > 0) {
}
else if (v == SIGINT) {
_exit(1); /* force to quit */
}
else if (__mg_quiting_stage > 0) {
ExitGUISafely(-1);
}else{
}
else {
exit(1); /* force to quit */
}
}
static BOOL InstallSEGVHandler (void)
{
#ifdef WIN32
signal(SIGSEGV, sig_handler);
signal(SIGTERM, sig_handler);
signal(SIGINT, sig_handler);
#else
struct sigaction siga;
siga.sa_handler = sig_handler;
siga.sa_flags = 0;
memset (&siga.sa_mask, 0, sizeof (sigset_t));
sigaction (SIGSEGV, &siga, NULL);
sigaction (SIGTERM, &siga, NULL);
sigaction (SIGINT, &siga, NULL);
sigaction (SIGPIPE, &siga, NULL);
#endif
return TRUE;
}
+9 -4
View File
@@ -321,9 +321,14 @@ static void sig_handler (int v)
{
if (v == SIGSEGV) {
kill (getpid(), SIGABRT); /* cause core dump */
}else if (__mg_quiting_stage > 0) {
}
else if (v == SIGINT) {
_exit(1);
}
else if (__mg_quiting_stage > 0) {
ExitGUISafely(-1);
}else{
}
else {
exit(1); /* force to quit */
}
}
@@ -331,10 +336,10 @@ static void sig_handler (int v)
static BOOL InstallSEGVHandler (void)
{
struct sigaction siga;
siga.sa_handler = sig_handler;
siga.sa_flags = 0;
memset (&siga.sa_mask, 0, sizeof (sigset_t));
sigaction (SIGSEGV, &siga, NULL);
sigaction (SIGTERM, &siga, NULL);
+3 -1
View File
@@ -83,8 +83,10 @@ static pthread_mutex_t timerLock;
#endif /* __LINUX__ */
#ifdef _MG_USE_BETTER_TIMER
#ifdef _MGRM_THREADS
#include <sys/times.h>
static clock_t g_timer_started;
#endif
static clock_t g_last_tick;
#endif
@@ -95,7 +97,7 @@ static void __mg_timer_action (void *data)
SHAREDRES_TIMER_COUNTER += 1;
#else
#if defined(__uClinux__) && defined(_MGRM_STANDALONE)
#if defined(_MGRM_STANDALONE)
__mg_timer_counter += 10;
#else
# ifdef _MG_USE_BETTER_TIMER
+1 -1
View File
@@ -208,7 +208,7 @@ static int L2F50113T00_getscreeninfo (struct commlcd_info *li, int width, int he
li->width = SCREEN_WIDTH;
li->fb = (void*)VRAM_ADDR_1;
li->bpp = LCD_BPP;
li->rlen = SCREEN_WIDTH * LCD_BPP_UNIT;
li->pitch = SCREEN_WIDTH * LCD_BPP_UNIT;
li->async_update = 0;
return 0;
+67 -50
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/>.
*/
@@ -47,6 +47,7 @@
#include "newgal.h"
#include "sysvideo.h"
#include "pixels_c.h"
#include "misc.h"
#ifdef _MGGAL_COMMLCD
@@ -78,6 +79,23 @@ static void COMMLCD_DeleteDevice(GAL_VideoDevice *device)
free (device);
}
static void COMMLCD_UpdateRects_Sync (_THIS, int numrects, GAL_Rect *rects)
{
int i;
/* sync update */
for (i = 0; i < numrects; i++) {
RECT rc;
SetRect (&rc, rects[i].x, rects[i].y,
rects[i].x + rects[i].w, rects[i].y + rects[i].h);
if (!IsRectEmpty (&rc)) {
__mg_commlcd_ops.update (&rc);
}
}
}
static BOOL _valid_async_updater = TRUE;
static void* task_do_update (void* data)
{
_THIS;
@@ -92,41 +110,23 @@ static void* task_do_update (void* data)
this->hidden->dirty = FALSE;
}
pthread_mutex_unlock (&this->hidden->update_lock);
usleep (50*1000); /* 50 ms */
} while (1);
__mg_os_time_delay(50); /* 50 ms */
} while (_valid_async_updater);
return NULL;
}
static void COMMLCD_UpdateRects (_THIS, int numrects, GAL_Rect *rects)
static void COMMLCD_UpdateRects_Async (_THIS, int numrects, GAL_Rect *rects)
{
int i;
RECT bound;
if (__mg_commlcd_ops.update == NULL) {
return;
}
if (this->hidden->update_th == 0) {
/* sync update */
for (i = 0; i < numrects; i++) {
RECT rc;
SetRect (&rc, rects[i].x, rects[i].y,
rects[i].x + rects[i].w, rects[i].y + rects[i].h);
if (!IsRectEmpty (&rc)) {
__mg_commlcd_ops.update (&rc);
}
}
return;
}
pthread_mutex_lock (&this->hidden->update_lock);
bound = this->hidden->rc_dirty;
for (i = 0; i < numrects; i++) {
RECT rc;
SetRect (&rc, rects[i].x, rects[i].y,
SetRect (&rc, rects[i].x, rects[i].y,
rects[i].x + rects[i].w, rects[i].y + rects[i].h);
if (IsRectEmpty (&bound))
bound = rc;
@@ -180,8 +180,8 @@ static GAL_VideoDevice *COMMLCD_CreateDevice (int devindex)
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->FreeHWSurface = COMMLCD_FreeHWSurface;
device->UpdateRects = COMMLCD_UpdateRects;
device->UpdateRects = NULL;
device->free = COMMLCD_DeleteDevice;
return device;
}
@@ -193,11 +193,11 @@ VideoBootStrap COMMLCD_bootstrap = {
static int COMMLCD_VideoInit(_THIS, GAL_PixelFormat *vformat)
{
fprintf (stderr, "NEWGAL>COMMLCD: Calling init method!\n");
_ERR_PRINTF ("NEWGAL>COMMLCD: Calling init method!\n");
/* Initialize LCD screen */
if (__mg_commlcd_ops.init ()) {
fprintf (stderr, "NEWGAL>COMMLCD: Couldn't initialize LCD\n");
_ERR_PRINTF ("NEWGAL>COMMLCD: Couldn't initialize LCD\n");
return -1;
}
@@ -214,22 +214,26 @@ static GAL_Surface *COMMLCD_SetVideoMode(_THIS, GAL_Surface *current,
int width, int height, int bpp, Uint32 flags)
{
Uint32 Rmask = 0, Gmask = 0, Bmask = 0, Amask = 0;
struct commlcd_info li;
struct commlcd_info li;
memset (&li, 0, sizeof (struct commlcd_info));
if (__mg_commlcd_ops.getinfo (&li, width, height, bpp)) {
fprintf (stderr, "NEWGAL>COMMLCD: "
_ERR_PRINTF ("NEWGAL>COMMLCD: "
"Couldn't get the LCD information\n");
return NULL;
}
if (li.bpp != bpp) {
_ERR_PRINTF ("NEWGAL>COMMLCD: "
"Returned color depth (%d) does not matched the requested color depth (%d)\n",
li.bpp, bpp);
}
this->hidden->w = li.width;
this->hidden->h = li.height;
this->hidden->pitch = li.rlen;
this->hidden->pitch = li.pitch;
this->hidden->fb = li.fb;
memset (li.fb, 0, li.rlen * height);
switch (li.type) {
case COMMLCD_PSEUDO_RGB332:
Rmask = 0xE0;
@@ -264,12 +268,11 @@ static GAL_Surface *COMMLCD_SetVideoMode(_THIS, GAL_Surface *current,
Gmask = 0x0000FF00;
Bmask = 0x000000FF;
break;
case COMMLCD_TRUE_AGBR8888:
printf("=========================================================================== i am here, type is %d\n", li.type);
case COMMLCD_TRUE_ABRG8888:
Amask = 0xFF000000;
Bmask = 0x00FF0000;
Rmask = 0x0000FF00;
Gmask = 0x000000FF;
Bmask = 0x00FF0000;
break;
}
@@ -279,7 +282,7 @@ printf("========================================================================
__mg_commlcd_ops.release ();
this->hidden->fb = NULL;
fprintf (stderr, "NEWGAL>COMMLCD: "
_ERR_PRINTF ("NEWGAL>COMMLCD: "
"Couldn't allocate new pixel format for requested mode\n");
return NULL;
}
@@ -291,17 +294,29 @@ printf("========================================================================
current->pitch = this->hidden->pitch;
current->pixels = this->hidden->fb;
if (li.async_update && __mg_commlcd_ops.update) {
if (li.update_method == COMMLCD_UPDATE_NONE) {
this->UpdateRects = NULL;
this->hidden->update_th = 0;
}
else if (li.update_method == COMMLCD_UPDATE_ASYNC) {
this->UpdateRects = COMMLCD_UpdateRects_Async;
#if 0
pthread_attr_t new_attr;
pthread_attr_init (&new_attr);
pthread_attr_setdetachstate (&new_attr, PTHREAD_CREATE_DETACHED);
pthread_create (&this->hidden->update_th, &new_attr,
pthread_create (&this->hidden->update_th, &new_attr,
task_do_update, this);
pthread_attr_destroy (&new_attr);
#else
pthread_create (&this->hidden->update_th, NULL,
task_do_update, this);
#endif
pthread_mutex_init (&this->hidden->update_lock, NULL);
}
else {
this->UpdateRects = COMMLCD_UpdateRects_Sync;
this->hidden->update_th = 0;
}
@@ -315,8 +330,10 @@ static void COMMLCD_VideoQuit (_THIS)
this->screen->pixels = NULL;
}
if (__mg_commlcd_ops.update) {
if (this->hidden->update_th) {
/* quit the update task */
_valid_async_updater = FALSE;
pthread_join(this->hidden->update_th, NULL);
}
if (__mg_commlcd_ops.release)
@@ -325,7 +342,7 @@ static void COMMLCD_VideoQuit (_THIS)
return;
}
static GAL_Rect **COMMLCD_ListModes (_THIS, GAL_PixelFormat *format,
static GAL_Rect **COMMLCD_ListModes (_THIS, GAL_PixelFormat *format,
Uint32 flags)
{
return (GAL_Rect **) -1;
@@ -342,11 +359,11 @@ static void COMMLCD_FreeHWSurface (_THIS, GAL_Surface *surface)
surface->pixels = NULL;
}
static int COMMLCD_SetColors (_THIS, int firstcolor, int ncolors,
static int COMMLCD_SetColors (_THIS, int firstcolor, int ncolors,
GAL_Color *colors)
{
if (__mg_commlcd_ops.setclut)
return __mg_commlcd_ops.setclut (firstcolor, ncolors, colors);
return __mg_commlcd_ops.setclut (firstcolor, ncolors, colors);
return 0;
}
+19 -17
View File
@@ -37,6 +37,8 @@
#include "sysvideo.h"
#include "exstubs.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@@ -57,25 +59,25 @@ struct GAL_PrivateVideoData {
};
/* The pixel format defined by depth */
#define COMMLCD_PSEUDO_RGB332 1
#define COMMLCD_TRUE_RGB555 2
#define COMMLCD_TRUE_RGB565 3
#define COMMLCD_TRUE_RGB888 4
#define COMMLCD_TRUE_RGB0888 5
#define COMMLCD_TRUE_ARGB1555 6
#define COMMLCD_TRUE_ARGB8888 7
#define COMMLCD_TRUE_AGBR8888 8
//#define COMMLCD_PSEUDO_RGB332 1
//#define COMMLCD_TRUE_RGB555 2
//#define COMMLCD_TRUE_RGB565 3
//#define COMMLCD_TRUE_RGB888 4
//#define COMMLCD_TRUE_RGB0888 5
//#define COMMLCD_TRUE_ARGB1555 6
//#define COMMLCD_TRUE_ARGB8888 7
//#define COMMLCD_TRUE_AGBR8888 8
struct commlcd_info {
short height; // vertical resolution of the screen
short width; // horinzontal resolution of the screen
short bpp; // Depth (bits-per-pixel)
short type; // Pixel type
short rlen; // Length of one scan line in bytes
void *fb; // Frame buffer
//struct commlcd_info {
// short height; // vertical resolution of the screen
// short width; // horinzontal resolution of the screen
// short bpp; // Depth (bits-per-pixel)
// short type; // Pixel type
// short rlen; // Length of one scan line in bytes
// void *fb; // Frame buffer
short async_update; // update asynchronously or synchronously. 0 for synchronously; others for asynchronously.
};
// short async_update; // update asynchronously or synchronously. 0 for synchronously; others for asynchronously.
//};
struct commlcd_ops {
/* return value: zero for OK */
+1 -1
View File
@@ -71,7 +71,7 @@ static int a_getinfo (struct commlcd_info *li, int width, int height, int bpp)
li->width = ecos_lcd_info.width;
li->fb = ecos_lcd_info.fb;
li->bpp = ecos_lcd_info.bpp;
li->rlen = ecos_lcd_info.rlen;
li->pitch = ecos_lcd_info.pitch;
li->async_update = 0;
return 0;
}
+1 -1
View File
@@ -74,7 +74,7 @@ static int a_getinfo (struct commlcd_info *li, int width, int height, int bpp)
li->height = 240;
li->width = 320;
li->bpp = 32;
li->rlen = 320 * 32 / 8;
li->pitch = 320 * 32 / 8;
li->fb = 0xe40000;
li->type = COMMLCD_TRUE_RGB0888;
return 0;
+14 -25
View File
@@ -1,50 +1,47 @@
/*
* 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/>.
*/
/*
** extern.c: A subdriver of CommonLCD NEWGAL engine for some targets
** which are defined by the external module.
** which are defined by the external module (__TARGET_EXTERNAL__).
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#ifdef _MGGAL_COMMLCD
//#ifdef _MGGAL_COMMLCD
#if defined (__VXWORKS__) || defined (__TARGET_UNKNOWN__) || defined(__RTEMS__)
//#if defined (__VXWORKS__) || defined (__TARGET_UNKNOWN__) || defined(__RTEMS__)
#if defined(_MGGAL_COMMLCD) && defined(__TARGET_EXTERNAL__)
#include "minigui.h"
#include "newgal.h"
@@ -52,12 +49,6 @@
#include "pixels_c.h"
#include "commlcd.h"
extern int __commlcd_drv_init (void);
extern int __commlcd_drv_getinfo (struct commlcd_info *li, int width, int height, int bpp);
extern int __commlcd_drv_release (void);
extern int __commlcd_drv_setclut (int firstcolor, int ncolors, GAL_Color *colors);
extern int __commlcd_drv_update (const RECT* rc_dirty);
struct commlcd_ops __mg_commlcd_ops = {
__commlcd_drv_init,
__commlcd_drv_getinfo,
@@ -66,7 +57,5 @@ struct commlcd_ops __mg_commlcd_ops = {
__commlcd_drv_update
};
#endif
#endif /* _MGGAL_COMMLCD */
#endif /* _MGGAL_COMMLCD && __TARGET_EXTERNAL__ */
+2 -2
View File
@@ -101,8 +101,8 @@ static int a_getinfo (struct commlcd_info *li, int width, int height, int bpp)
li->width = fbinfo->width;
li->fb = fbinfo->fb_ptr;
li->bpp = fbinfo->depth;
li->rlen = (li->bpp*li->width + 7) / 8;
/*li->rlen = fbinfo->fb_size;*/
li->pitch = (li->bpp*li->width + 7) / 8;
/*li->pitch = fbinfo->fb_size;*/
return 0;
}
+1 -1
View File
@@ -91,7 +91,7 @@ static int a_getinfo (struct lcd_info *li, int width, int height, int bpp)
li->width = modeInfo.width;
li->fb = modeInfo.fbAddress;
li->bpp = modeInfo.colorDepth;
li->rlen = (li->bpp*li->width + 7) / 8;
li->pitch = (li->bpp*li->width + 7) / 8;
return 0;
}
+1 -1
View File
@@ -87,7 +87,7 @@ static int a_getinfo (struct lcd_info *li, int width, int height, int bpp)
//li->bpp = modeInfo.colorDepth;
li->bpp = 32;
printf ("Current color depth is %d \n", modeInfo.colorDepth);
li->rlen = (li->bpp*1024 + 7) / 8;
li->pitch = (li->bpp*1024 + 7) / 8;
return 0;
}
+1
View File
@@ -239,6 +239,7 @@ GAL_PixelFormat *GAL_AllocFormat(int bpp,
}
return(format);
}
GAL_PixelFormat *GAL_ReallocFormat(GAL_Surface *surface, int bpp,
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
{
+12 -12
View File
@@ -75,22 +75,22 @@ static int make_alpha_pixel_format (PDC pdc)
if (pdc->alpha_pixel_format == NULL) {
switch (pdc->surface->format->BytesPerPixel) {
case 2:
Rmask = 0x0000F000;
Gmask = 0x00000F00;
Bmask = 0x000000F0;
Amask = 0x0000000F;
Amask = 0x0000F000;
Rmask = 0x00000F00;
Gmask = 0x000000F0;
Bmask = 0x0000000F;
break;
case 3:
Rmask = 0x00FC0000;
Gmask = 0x0003F000;
Bmask = 0x00000FC0;
Amask = 0x0000003F;
Amask = 0x00FC0000;
Rmask = 0x0003F000;
Gmask = 0x00000FC0;
Bmask = 0x0000003F;
break;
case 4:
Rmask = 0xFF000000;
Gmask = 0x00FF0000;
Bmask = 0x0000FF00;
Amask = 0x000000FF;
Amask = 0xFF000000;
Rmask = 0x00FF0000;
Gmask = 0x0000FF00;
Bmask = 0x000000FF;
break;
default:
return -1;
+1 -15
View File
@@ -209,20 +209,6 @@ int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
DEVFONT* devfont = SELECT_DEVFONT(logfont, glyph_value);
glyph_value = REAL_GLYPH (glyph_value);
/*get glyph type*/
if (glyph_info->mask & GLYPH_INFO_TYPE)
glyph_info->glyph_type = devfont->charset_ops->glyph_type (glyph_value);
/*get glyph type*/
if (glyph_info->mask & GLYPH_INFO_BIDI_TYPE) {
if (devfont->charset_ops->bidi_glyph_type) {
glyph_info->bidi_glyph_type = devfont->charset_ops->bidi_glyph_type (glyph_value);
}
else {
glyph_info->bidi_glyph_type = BIDI_TYPE_INVALID;
}
}
glyph_info->advance_x = 0;
glyph_info->advance_y = 0;
glyph_info->bbox_x = 0;
@@ -297,7 +283,7 @@ int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value,
return advance;
}
void GUIAPI inline GetGlyphBitmap (LOGFONT* logfont, const char* mchar,
void GUIAPI GetGlyphBitmap (LOGFONT* logfont, const char* mchar,
int mchar_len, GLYPHBITMAP* glyph_bitmap)
{
GLYPHINFO glyph_info;
-362
View File
@@ -1,362 +0,0 @@
/*
* 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/>.
*/
/*
** logfont.c: Log fonts management.
**
** Current maintainer: Wei Yongming.
**
** Created by Wei Yongming
**
** Create date: 2000/07/07
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include "window.h"
#include "cliprect.h"
#include "gal.h"
#include "internals.h"
#include "ctrlclass.h"
#include "dc.h"
#include "sysfont.h"
#include "devfont.h"
#include "fontname.h"
CHARSETOPS* GetCharsetOps (const char* charset_name);
/************************** Exported functions ******************************/
static PLOGFONT gdiCreateLogFont ( const char* type, const char* family,
const char* charset, DWORD style, int size, int rotation)
{
PLOGFONT log_font;
int sbc_descent, mbc_descent = 0;
char dev_family [LEN_FONT_NAME + 1];
DEVFONT* sbc_devfont, *mbc_devfont;
// is valid style?
if (style == 0xFFFFFFFF)
return INV_LOGFONT;
// is supported charset?
if (GetCharsetOps (charset) == NULL) {
return INV_LOGFONT;
}
if ((log_font = malloc (sizeof (LOGFONT))) == NULL)
return INV_LOGFONT;
log_font->style = style;
#if 0
fprintf (stderr, "LogFont: style: %x\n", log_font->style);
#endif
if (type) {
strncpy (log_font->type, type, LEN_FONT_NAME);
log_font->type [LEN_FONT_NAME] = '\0';
}
else
strcpy (log_font->type, FONT_TYPE_NAME_ALL);
strncpy (log_font->family, family, LEN_FONT_NAME);
log_font->family [LEN_FONT_NAME] = '\0';
strncpy (log_font->charset, charset, LEN_FONT_NAME);
log_font->charset [LEN_FONT_NAME] = '\0';
if (size > FONT_MAX_SIZE)
log_font->size = FONT_MAX_SIZE;
else if (size < FONT_MIN_SIZE)
log_font->size = FONT_MIN_SIZE;
else
log_font->size = size;
log_font->rotation = rotation;
#if 0
fprintf (stderr, "log_font: %s, %s, %s, %d.\n",
log_font->type, log_font->family, log_font->charset,
log_font->size);
#endif
sbc_devfont = font_GetMatchedSBDevFont (log_font);
if (sbc_devfont->font_ops->new_instance)
sbc_devfont = (*sbc_devfont->font_ops->new_instance) (log_font, sbc_devfont, TRUE);
if (sbc_devfont == NULL) {
free (log_font);
return INV_LOGFONT;
}
mbc_devfont = font_GetMatchedMBDevFont (log_font);
if (mbc_devfont && mbc_devfont->font_ops->new_instance)
mbc_devfont = (*mbc_devfont->font_ops->new_instance) (log_font, mbc_devfont, FALSE);
log_font->sbc_devfont = sbc_devfont;
log_font->mbc_devfont = mbc_devfont;
/*
* Adjust the logical font information
*/
// family name
if (log_font->mbc_devfont) {
fontGetFamilyFromName (log_font->mbc_devfont->name, dev_family);
strncpy (log_font->family, dev_family, LEN_FONT_NAME);
log_font->family [LEN_FONT_NAME] = '\0';
}
else {
fontGetFamilyFromName (log_font->sbc_devfont->name, dev_family);
strncpy (log_font->family, dev_family, LEN_FONT_NAME);
log_font->family [LEN_FONT_NAME] = '\0';
}
// charset name
if (log_font->mbc_devfont) {
strncpy (log_font->charset,
log_font->mbc_devfont->charset_ops->name, LEN_FONT_NAME);
log_font->charset [LEN_FONT_NAME] = '\0';
}
else {
strncpy (log_font->charset,
log_font->sbc_devfont->charset_ops->name, LEN_FONT_NAME);
log_font->charset [LEN_FONT_NAME] = '\0';
}
// size
log_font->size = (*log_font->sbc_devfont->font_ops->get_font_height)
(log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
int size = (*log_font->mbc_devfont->font_ops->get_font_height)
(log_font, log_font->mbc_devfont);
if (size > log_font->size)
log_font->size = size;
}
sbc_descent = (*log_font->sbc_devfont->font_ops->get_font_descent)
(log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
mbc_descent = (*log_font->mbc_devfont->font_ops->get_font_descent)
(log_font, log_font->mbc_devfont);
}
else
mbc_descent = sbc_descent;
log_font->size += ABS (sbc_descent - mbc_descent);
return log_font;
}
PLOGFONT GUIAPI CreateLogFontIndirect (LOGFONT *logfont)
{
return gdiCreateLogFont (logfont->type, logfont->family,
logfont->charset, logfont->style, logfont->size, logfont->rotation);
}
PLOGFONT GUIAPI CreateLogFont (const char* type, const char* family,
const char* charset, char weight, char slant, char set_width,
char spacing, char underline, char struckout, int size, int rotation)
{
DWORD style;
char style_name [7];
style_name[0] = weight;
style_name[1] = slant;
style_name[2] = set_width;
style_name[3] = spacing;
style_name[4] = underline;
style_name[5] = struckout;
style_name[6] = 0;
if ((style = fontConvertStyle (style_name)) == 0xFFFFFFFF) {
return INV_LOGFONT;
}
return gdiCreateLogFont (type, family, charset, style, size, rotation);
}
PLOGFONT GUIAPI CreateLogFontByName (const char* font_name)
{
char type[LEN_FONT_NAME + 1];
char family[LEN_FONT_NAME + 1];
char charset[LEN_FONT_NAME + 1];
DWORD style;
int height;
if (!fontGetTypeNameFromName (font_name, type) ||
!fontGetFamilyFromName (font_name, family) ||
!fontGetCharsetFromName (font_name, charset) ||
((height = fontGetHeightFromName (font_name)) == -1) ||
((style = fontGetStyleFromName (font_name)) == 0xFFFFFFFF))
return NULL;
return gdiCreateLogFont (type, family, charset, style, height, 0);
}
void GUIAPI DestroyLogFont (PLOGFONT log_font)
{
LOGFONT* logfont = (PLOGFONT)log_font;
if (log_font == NULL)
return;
if (logfont->sbc_devfont->font_ops->delete_instance)
(*logfont->sbc_devfont->font_ops->delete_instance) (logfont->sbc_devfont);
if (logfont->mbc_devfont && logfont->mbc_devfont->font_ops->delete_instance)
(*logfont->mbc_devfont->font_ops->delete_instance) (logfont->mbc_devfont);
free (logfont);
}
void GUIAPI GetLogFontInfo (HDC hdc, LOGFONT* log_font)
{
memcpy (log_font, dc_HDC2PDC (hdc)->pLogFont, sizeof (LOGFONT));
}
void GUIAPI GetFontMetrics (LOGFONT* log_font, FONTMETRICS* font_metrics)
{
int sbc_value, mbc_value;
sbc_value = log_font->sbc_devfont->font_ops->get_font_height (log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
mbc_value = log_font->mbc_devfont->font_ops->get_font_height (log_font, log_font->mbc_devfont);
font_metrics->font_height = MAX (sbc_value, mbc_value);
}
else {
font_metrics->font_height = sbc_value;
}
sbc_value = log_font->sbc_devfont->font_ops->get_font_ascent (log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
mbc_value = log_font->mbc_devfont->font_ops->get_font_ascent (log_font, log_font->mbc_devfont);
font_metrics->ascent = MAX (sbc_value, mbc_value);
}
else {
font_metrics->ascent = sbc_value;
}
sbc_value = log_font->sbc_devfont->font_ops->get_font_descent (log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
mbc_value = log_font->mbc_devfont->font_ops->get_font_descent (log_font, log_font->mbc_devfont);
font_metrics->descent = MAX (sbc_value, mbc_value);
}
else {
font_metrics->descent = sbc_value;
}
sbc_value = log_font->sbc_devfont->font_ops->get_max_width (log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
mbc_value = log_font->mbc_devfont->font_ops->get_max_width (log_font, log_font->mbc_devfont);
font_metrics->max_width = MAX (sbc_value, mbc_value);
}
else {
font_metrics->max_width = sbc_value;
}
sbc_value = log_font->sbc_devfont->font_ops->get_ave_width (log_font, log_font->sbc_devfont);
if (log_font->mbc_devfont) {
mbc_value = log_font->mbc_devfont->font_ops->get_ave_width (log_font, log_font->mbc_devfont);
font_metrics->ave_width = mbc_value;
}
else {
font_metrics->ave_width = sbc_value;
}
}
void GUIAPI GetGlyphBitmap (LOGFONT* log_font, const unsigned char* mchar, int mchar_len,
GLYPHBITMAP* glyph_bitmap)
{
DEVFONT* sbc_devfont = log_font->sbc_devfont;
DEVFONT* mbc_devfont = log_font->mbc_devfont;
DEVFONT* devfont;
if (mbc_devfont) {
int mbc_pos;
mbc_pos = mbc_devfont->charset_ops->pos_first_char(mchar, mchar_len);
if (mbc_pos == 0) {
devfont = mbc_devfont;
}
else {
devfont = sbc_devfont;
}
}
else {
devfont = sbc_devfont;
}
if (devfont->font_ops->get_char_bbox) {
glyph_bitmap->bbox_x = 0;
glyph_bitmap->bbox_y = 0;
devfont->font_ops->get_char_bbox (log_font, devfont, mchar, mchar_len,
&glyph_bitmap->bbox_x,
&glyph_bitmap->bbox_y,
&glyph_bitmap->bbox_w,
&glyph_bitmap->bbox_h);
}
else {
glyph_bitmap->bbox_x = 0;
glyph_bitmap->bbox_y = devfont->font_ops->get_font_descent (log_font, devfont);
glyph_bitmap->bbox_w = devfont->font_ops->get_char_width (log_font, devfont, mchar, mchar_len);
glyph_bitmap->bbox_h = devfont->font_ops->get_font_height (log_font, devfont);
}
if (devfont->font_ops->get_char_advance) {
devfont->font_ops->get_char_advance (log_font, devfont, mchar, mchar_len,
&glyph_bitmap->advance_x,
&glyph_bitmap->advance_y);
}
else {
glyph_bitmap->advance_x = glyph_bitmap->bbox_w;
glyph_bitmap->advance_y = 0;
}
devfont->font_ops->get_char_advance (log_font, devfont, mchar, mchar_len,
&glyph_bitmap->advance_x,
&glyph_bitmap->advance_y);
glyph_bitmap->bmp_size = devfont->font_ops->char_bitmap_size (log_font, devfont, mchar, mchar_len);
glyph_bitmap->bmp_pitch = (glyph_bitmap->bbox_w + 7) >> 3;
glyph_bitmap->bits = devfont->font_ops->get_char_bitmap (log_font, devfont, mchar, mchar_len);
}
+4 -3
View File
@@ -936,11 +936,12 @@ static void* img_get_res_data(RESOURCE* res, int src_type, DWORD usr_param)
INNER_RES* inner = res->source.inner;
if(inner->additional == NULL) //raw bitmap
{
res->data = inner->data;
res->data = (void*)inner->data;
}
else {
BITMAP *pbmp = NEW(BITMAP);
if(LoadBitmapFromMem((HDC)usr_param, pbmp, inner->data, inner->data_len, (const char*)inner->additional) != 0)
if(LoadBitmapFromMem((HDC)usr_param, pbmp, inner->data,
inner->data_len, (const char*)inner->additional) != 0)
{
DELETE(pbmp);
return NULL;
@@ -1185,7 +1186,7 @@ static void* etc_get_res_data(RESOURCE* res, int src_type, DWORD usr_param)
break;
}
case REF_SRC_INNER:
res->data = res->source.inner->data;
res->data = (void*)res->source.inner->data;
break;
default:
return NULL;