mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-28 16:17:09 +08:00
Compare commits
84
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0cc3b5580 | ||
|
|
e33d98a702 | ||
|
|
84f3cf048a | ||
|
|
ea579771a7 | ||
|
|
4db97ead1f | ||
|
|
2338501d21 | ||
|
|
81c061c3c8 | ||
|
|
356bf08c4b | ||
|
|
09a27e508f | ||
|
|
0b636032ee | ||
|
|
5f78f6bb37 | ||
|
|
272bc39c84 | ||
|
|
1e006c0589 | ||
|
|
7158eaee0f | ||
|
|
abfc47159e | ||
|
|
deade3d887 | ||
|
|
cf3e0b3d4d | ||
|
|
614deba4b7 | ||
|
|
53d40508a4 | ||
|
|
39f96f407f | ||
|
|
c8c6f470ce | ||
|
|
d78b493aad | ||
|
|
26f415f3db | ||
|
|
b66ef7a2f5 | ||
|
|
9b89614569 | ||
|
|
0d170a6f74 | ||
|
|
f0dd4a74d2 | ||
|
|
692a6b81e0 | ||
|
|
cf49cf2b64 | ||
|
|
b26accf037 | ||
|
|
5913d95ff2 | ||
|
|
e1b94799a2 | ||
|
|
385db01097 | ||
|
|
d787dea652 | ||
|
|
0adddb422b | ||
|
|
c444030334 | ||
|
|
a9da4ddfba | ||
|
|
57cc74410f | ||
|
|
3cc16ababb | ||
|
|
d4097b577b | ||
|
|
7ef6c14f3f | ||
|
|
cbb4e32992 | ||
|
|
6bc85062b9 | ||
|
|
b2dee57f4f | ||
|
|
a926754a6b | ||
|
|
7e470b0e78 | ||
|
|
9f81cac662 | ||
|
|
a14bdd894a | ||
|
|
7004e156b8 | ||
|
|
e293cf03ba | ||
|
|
07f226f024 | ||
|
|
4b2503e614 | ||
|
|
2df5352356 | ||
|
|
67ccb2aafd | ||
|
|
9a124dec50 | ||
|
|
d013822979 | ||
|
|
7f44e948d0 | ||
|
|
9a94fb9a7c | ||
|
|
dfc7e95fcd | ||
|
|
362b852ec2 | ||
|
|
9141e13640 | ||
|
|
4a22a38e63 | ||
|
|
c7ce12449b | ||
|
|
824557b4f1 | ||
|
|
022542ef1b | ||
|
|
3b12e71877 | ||
|
|
9593168196 | ||
|
|
b5c5c3f8ae | ||
|
|
492bd649ed | ||
|
|
bc1a880479 | ||
|
|
0748f26f42 | ||
|
|
2f72f24a49 | ||
|
|
43e174a604 | ||
|
|
13d36a2785 | ||
|
|
9ec3e9f7e6 | ||
|
|
148f1b1745 | ||
|
|
f76c9187a8 | ||
|
|
2e8eba7dd0 | ||
|
|
abeafa313d | ||
|
|
310c0f3e7a | ||
|
|
c426894ac9 | ||
|
|
bf6998672f | ||
|
|
ea83e92a16 | ||
|
|
d95e827e93 |
@@ -29,3 +29,4 @@ Makefile.in
|
|||||||
/src/font/utils/ucd/
|
/src/font/utils/ucd/
|
||||||
/src/sysres/font_list
|
/src/sysres/font_list
|
||||||
/src/sysres/license/dat_files/
|
/src/sysres/license/dat_files/
|
||||||
|
/configure~
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
# Release Notes
|
# Release Notes
|
||||||
|
|
||||||
|
- [Version 5.0.11](#version-5011)
|
||||||
|
+ [What's new in version 5.0.11](#whats-new-in-version-5011)
|
||||||
|
- [Version 5.0.10](#version-5010)
|
||||||
|
+ [What's new in version 5.0.10](#whats-new-in-version-5010)
|
||||||
|
- [Version 5.0.9](#version-508)
|
||||||
|
+ [What's new in version 5.0.9](#whats-new-in-version-508)
|
||||||
|
- [Version 5.0.8](#version-508)
|
||||||
|
+ [What's new in version 5.0.8](#whats-new-in-version-508)
|
||||||
- [Version 5.0.6](#version-506)
|
- [Version 5.0.6](#version-506)
|
||||||
+ [What's new in version 5.0.6](#whats-new-in-version-506)
|
+ [What's new in version 5.0.6](#whats-new-in-version-506)
|
||||||
- [Version 5.0.5](#version-505)
|
- [Version 5.0.5](#version-505)
|
||||||
@@ -20,6 +28,90 @@
|
|||||||
+ [Changes leading to incompatibility](#changes-leading-to-incompatibility)
|
+ [Changes leading to incompatibility](#changes-leading-to-incompatibility)
|
||||||
+ [Deprecated APIs](#deprecated-apis)
|
+ [Deprecated APIs](#deprecated-apis)
|
||||||
|
|
||||||
|
## Version 5.0.11
|
||||||
|
|
||||||
|
On Dec. 31, 2022, FMSoft announces the availability of MiniGUI 5.0.11,
|
||||||
|
which is a bug fixing release with bug fixes and some minor enhancements
|
||||||
|
of MiniGUI 5.0.x.
|
||||||
|
|
||||||
|
### What's new in version 5.0.11
|
||||||
|
|
||||||
|
In this version, we made some enhancements
|
||||||
|
|
||||||
|
* ENHANCEMENTS:
|
||||||
|
* BUGFIXING:
|
||||||
|
- Fix a bug reported in https://github.com/VincentWei/minigui/issues/94
|
||||||
|
- Fix a bug reported in https://github.com/VincentWei/minigui/issues/96
|
||||||
|
- Fix a bug reported in https://github.com/VincentWei/minigui/issues/105
|
||||||
|
- Fix a bug reported in https://github.com/VincentWei/minigui/issues/106
|
||||||
|
* OPTIMIZATIONS:
|
||||||
|
- Optimize the refresh of scrolled.
|
||||||
|
* TUNING:
|
||||||
|
- Call `mg_FreeMsgQueueForThisThread` immediately in `TerminateGUI()`.
|
||||||
|
- Use `CreateLogFontEx` instead of `CreateLogFont` to follow the new style convention of font name when creating the system logfonts,
|
||||||
|
but the orientation is ignored for the system logfont.
|
||||||
|
|
||||||
|
## Version 5.0.10
|
||||||
|
|
||||||
|
On Sep. 30, 2022, FMSoft announces the availability of MiniGUI 5.0.10,
|
||||||
|
which is a bug fixing release with bug fixes and some minor enhancements
|
||||||
|
of MiniGUI 5.0.x.
|
||||||
|
|
||||||
|
### What's new in version 5.0.10
|
||||||
|
|
||||||
|
In this version, we made some enhancements
|
||||||
|
|
||||||
|
* ENHANCEMENTS:
|
||||||
|
- Enhance `fbcon` engine to support double buffering for Threads and Standalone mode. (Runtime option: `fbcon.double_buffering`).
|
||||||
|
- Cleanup and enhance `shadow` engine to use `SyncUpdate` method.
|
||||||
|
- Relaying `MSG_IDLE` messages to the active descendant controls in every 0.5s.
|
||||||
|
* BUGFIXING:
|
||||||
|
- Fix a bug reported in https://github.com/VincentWei/minigui/issues/83
|
||||||
|
- Fix a bug reported in https://github.com/VincentWei/minigui/issues/87
|
||||||
|
- Fix bugs reported in https://github.com/VincentWei/minigui/issues/89
|
||||||
|
- Fix some bugs when virtual window enabled under Standalone and Processes runtime modes.
|
||||||
|
* OPTIMIZATIONS:
|
||||||
|
* TUNING:
|
||||||
|
- Fix some warnings reported by GCC 12.
|
||||||
|
- Use inline functions for SetCursor and SetDefaultCursor instead of macros.
|
||||||
|
|
||||||
|
## Version 5.0.9
|
||||||
|
|
||||||
|
On Jan. 14, 2022, FMSoft announces the availability of MiniGUI 5.0.9,
|
||||||
|
which is a bug fixing release with minor enhancements of MiniGUI 5.0.x.
|
||||||
|
|
||||||
|
### What's new in version 5.0.9
|
||||||
|
|
||||||
|
In this version, we fixed some bugs:
|
||||||
|
|
||||||
|
* BUGFIXING:
|
||||||
|
- Fix a crash bug in `InitSubDC()` of `src/newgdi/gdi.c`.
|
||||||
|
* ENHANCEMENTS:
|
||||||
|
* OPTIMIZATIONS:
|
||||||
|
* TUNING:
|
||||||
|
- Change copyright year to 2022.
|
||||||
|
|
||||||
|
## Version 5.0.8
|
||||||
|
|
||||||
|
The MiniGUI development team announces the availability of MiniGUI 5.0.8,
|
||||||
|
which is a bug fixing release with minor enhancements of MiniGUI 5.0.x.
|
||||||
|
|
||||||
|
### What's new in version 5.0.8
|
||||||
|
|
||||||
|
In this version, we fixed some bugs and made some optimizations and enhancements:
|
||||||
|
|
||||||
|
* BUGFIXING:
|
||||||
|
* ENHANCEMENTS:
|
||||||
|
- Support for WebP image format based on `libwebp`.
|
||||||
|
- Support for two ARM64-based hardware platforms: PX30 and R818.
|
||||||
|
- New surface pixel format for main window: `ST_PIXEL_XRGB565` under compositing schema.
|
||||||
|
* OPTIMIZATIONS:
|
||||||
|
- Shrink heap size for fixed string.
|
||||||
|
- Optimize the memory use of blitting context.
|
||||||
|
* TUNING:
|
||||||
|
- Tune code of fbcon video engine for compositing schema.
|
||||||
|
- Fix warnings and errors for conditional compilation.
|
||||||
|
|
||||||
## Version 5.0.6
|
## Version 5.0.6
|
||||||
|
|
||||||
The MiniGUI development team announces the availability of MiniGUI 5.0.6,
|
The MiniGUI development team announces the availability of MiniGUI 5.0.6,
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
Version 5.0.8 (2021/10/25)
|
Version 5.0.11 (2022/12/31)
|
||||||
|
|
||||||
This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version.
|
This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version.
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -1,6 +1,6 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.60)
|
||||||
AC_INIT(libminigui, 5.0.8)
|
AC_INIT(libminigui, 5.0.11)
|
||||||
AC_CONFIG_SRCDIR(src/main/main.c)
|
AC_CONFIG_SRCDIR(src/main/main.c)
|
||||||
|
|
||||||
dnl Set various version strings - taken gratefully from the SDL sources
|
dnl Set various version strings - taken gratefully from the SDL sources
|
||||||
@@ -16,9 +16,9 @@ dnl Set various version strings - taken gratefully from the SDL sources
|
|||||||
#
|
#
|
||||||
MINIGUI_MAJOR_VERSION=5
|
MINIGUI_MAJOR_VERSION=5
|
||||||
MINIGUI_MINOR_VERSION=0
|
MINIGUI_MINOR_VERSION=0
|
||||||
MINIGUI_MICRO_VERSION=8
|
MINIGUI_MICRO_VERSION=11
|
||||||
MINIGUI_INTERFACE_AGE=2
|
MINIGUI_INTERFACE_AGE=1
|
||||||
MINIGUI_BINARY_AGE=2
|
MINIGUI_BINARY_AGE=1
|
||||||
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
|
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
|
||||||
|
|
||||||
AC_SUBST(MINIGUI_MAJOR_VERSION)
|
AC_SUBST(MINIGUI_MAJOR_VERSION)
|
||||||
@@ -1710,6 +1710,8 @@ case "$runtime_mode" in
|
|||||||
AC_DEFINE(_MGRM_STANDALONE, 1,
|
AC_DEFINE(_MGRM_STANDALONE, 1,
|
||||||
[Define if build MiniGUI-Standalone])
|
[Define if build MiniGUI-Standalone])
|
||||||
MINIGUI_RUNMODE="sa"
|
MINIGUI_RUNMODE="sa"
|
||||||
|
RUNMODE_LADD="standalone/libstandalone.la"
|
||||||
|
RUNMODE_SUBDIRS="standalone"
|
||||||
;;
|
;;
|
||||||
ths)
|
ths)
|
||||||
AC_DEFINE(_MGRM_THREADS, 1,
|
AC_DEFINE(_MGRM_THREADS, 1,
|
||||||
@@ -1722,6 +1724,8 @@ case "$runtime_mode" in
|
|||||||
AC_DEFINE(_MGRM_PROCESSES, 1,
|
AC_DEFINE(_MGRM_PROCESSES, 1,
|
||||||
[Define if build MiniGUI-Processes])
|
[Define if build MiniGUI-Processes])
|
||||||
MINIGUI_RUNMODE="procs"
|
MINIGUI_RUNMODE="procs"
|
||||||
|
RUNMODE_LADD="server/libserver.la client/libclient.la"
|
||||||
|
RUNMODE_SUBDIRS="server client"
|
||||||
if test "x$compositing_schema" = "xyes"; then
|
if test "x$compositing_schema" = "xyes"; then
|
||||||
surface_schema="compositing"
|
surface_schema="compositing"
|
||||||
fi
|
fi
|
||||||
@@ -2665,9 +2669,9 @@ AC_SUBST(VIDEO_SUBDIRS)
|
|||||||
AC_SUBST(VIDEO_DRIVERS)
|
AC_SUBST(VIDEO_DRIVERS)
|
||||||
AC_SUBST(DEP_LIBS)
|
AC_SUBST(DEP_LIBS)
|
||||||
AC_SUBST(MINIGUI_RUNMODE)
|
AC_SUBST(MINIGUI_RUNMODE)
|
||||||
|
AC_SUBST(RUNMODE_LADD)
|
||||||
|
AC_SUBST(RUNMODE_SUBDIRS)
|
||||||
|
|
||||||
AM_CONDITIONAL(MGRM_PROCESSES, test "x$runtime_mode" = "xprocs")
|
|
||||||
AM_CONDITIONAL(MGRM_STANDALONE, test "x$runtime_mode" = "xsa")
|
|
||||||
AM_CONDITIONAL(MGIAL_LIBINPUT, test "x$build_libinput_ial_engine" = "xyes")
|
AM_CONDITIONAL(MGIAL_LIBINPUT, test "x$build_libinput_ial_engine" = "xyes")
|
||||||
AM_CONDITIONAL(MGIAL_SINGLETOUCHKEY, test "x$buid_singletouchkey_ial_engine" = "xyes")
|
AM_CONDITIONAL(MGIAL_SINGLETOUCHKEY, test "x$buid_singletouchkey_ial_engine" = "xyes")
|
||||||
AM_CONDITIONAL(MGIAL_CONSOLE, test "x$build_console_ial_engine" = "xyes")
|
AM_CONDITIONAL(MGIAL_CONSOLE, test "x$build_console_ial_engine" = "xyes")
|
||||||
|
|||||||
+7
-1
@@ -105,6 +105,12 @@ seat=seat0
|
|||||||
[fbcon]
|
[fbcon]
|
||||||
defaultmode=1024x768-16bpp
|
defaultmode=1024x768-16bpp
|
||||||
dpi=96
|
dpi=96
|
||||||
|
|
||||||
|
# Whether double buffering is enabled (only for threads and standalone runmodes).
|
||||||
|
# Use `true` or `yes` for enabled, anything else for disabled.
|
||||||
|
# Note that under compositing schema, double buffering is always enabled.
|
||||||
|
# Since 5.0.10.
|
||||||
|
double_buffering=true
|
||||||
#}}
|
#}}
|
||||||
|
|
||||||
#{{ifdef _MGGAL_PCXVFB
|
#{{ifdef _MGGAL_PCXVFB
|
||||||
@@ -121,7 +127,7 @@ defaultmode=800x600-16bpp
|
|||||||
[shadow]
|
[shadow]
|
||||||
real_engine=pc_xvfb
|
real_engine=pc_xvfb
|
||||||
defaultmode=800x600-16bpp
|
defaultmode=800x600-16bpp
|
||||||
rotate_screen=normal
|
rotate_screen=ccw
|
||||||
#}}
|
#}}
|
||||||
|
|
||||||
#{{ifdef _MGGAL_MLSHADOW
|
#{{ifdef _MGGAL_MLSHADOW
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ MGUI_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
|
|||||||
defined(__amd64) || \
|
defined(__amd64) || \
|
||||||
(defined(__alpha__) || defined(__alpha)) || \
|
(defined(__alpha__) || defined(__alpha)) || \
|
||||||
defined(__arm__) || defined(__aarch64__) || \
|
defined(__arm__) || defined(__aarch64__) || \
|
||||||
|
defined(__loongarch__) || \
|
||||||
defined(__riscv) || \
|
defined(__riscv) || \
|
||||||
(defined(__CC_ARM) && !defined(__BIG_ENDIAN)) || \
|
(defined(__CC_ARM) && !defined(__BIG_ENDIAN)) || \
|
||||||
(defined(__mips__) && defined(__MIPSEL__)) || \
|
(defined(__mips__) && defined(__MIPSEL__)) || \
|
||||||
|
|||||||
+24
-25
@@ -131,7 +131,31 @@
|
|||||||
#define IAL_EVENT_GESTURE_PINCH_UPDATE 0x0084
|
#define IAL_EVENT_GESTURE_PINCH_UPDATE 0x0084
|
||||||
#define IAL_EVENT_GESTURE_PINCH_END 0x0085
|
#define IAL_EVENT_GESTURE_PINCH_END 0x0085
|
||||||
|
|
||||||
|
#define TABLET_TOOL_CHANGED_X (1 << 0)
|
||||||
|
#define TABLET_TOOL_CHANGED_Y (1 << 1)
|
||||||
|
#define TABLET_TOOL_CHANGED_PRESSURE (1 << 2)
|
||||||
|
#define TABLET_TOOL_CHANGED_DISTANCE (1 << 3)
|
||||||
|
#define TABLET_TOOL_CHANGED_TILT_X (1 << 4)
|
||||||
|
#define TABLET_TOOL_CHANGED_TILT_Y (1 << 5)
|
||||||
|
#define TABLET_TOOL_CHANGED_ROTATION (1 << 6)
|
||||||
|
#define TABLET_TOOL_CHANGED_SLIDER (1 << 7)
|
||||||
|
#define TABLET_TOOL_CHANGED_SIZE_MAJOR (1 << 8)
|
||||||
|
#define TABLET_TOOL_CHANGED_SIZE_MINOR (1 << 9)
|
||||||
|
#define TABLET_TOOL_CHANGED_WHEEL (1 << 10)
|
||||||
|
|
||||||
#ifndef TABLET_TOOL_X
|
#ifndef TABLET_TOOL_X
|
||||||
|
#define TABLET_TOOL_X 0
|
||||||
|
#define TABLET_TOOL_Y 1
|
||||||
|
#define TABLET_TOOL_PRESSURE 2
|
||||||
|
#define TABLET_TOOL_DISTANCE 3
|
||||||
|
#define TABLET_TOOL_TILT_X 4
|
||||||
|
#define TABLET_TOOL_TILT_Y 5
|
||||||
|
#define TABLET_TOOL_ROTATION 6
|
||||||
|
#define TABLET_TOOL_SLIDER 7
|
||||||
|
#define TABLET_TOOL_SIZE_MAJOR 8
|
||||||
|
#define TABLET_TOOL_SIZE_MINOR 9
|
||||||
|
#define TABLET_TOOL_WHEEL 10
|
||||||
|
|
||||||
#define TABLET_TOOL_PROXIMITY_STATE_INVALID 0
|
#define TABLET_TOOL_PROXIMITY_STATE_INVALID 0
|
||||||
#define TABLET_TOOL_PROXIMITY_STATE_OUT 1
|
#define TABLET_TOOL_PROXIMITY_STATE_OUT 1
|
||||||
#define TABLET_TOOL_PROXIMITY_STATE_IN 2
|
#define TABLET_TOOL_PROXIMITY_STATE_IN 2
|
||||||
@@ -149,31 +173,6 @@
|
|||||||
|
|
||||||
#define TABLET_PAD_STRIP_SOURCE_UNKNOWN 0
|
#define TABLET_PAD_STRIP_SOURCE_UNKNOWN 0
|
||||||
#define TABLET_PAD_STRIP_SOURCE_FINGER 1
|
#define TABLET_PAD_STRIP_SOURCE_FINGER 1
|
||||||
|
|
||||||
#define TABLET_TOOL_CHANGED_X (1 << 0)
|
|
||||||
#define TABLET_TOOL_CHANGED_Y (1 << 1)
|
|
||||||
#define TABLET_TOOL_CHANGED_PRESSURE (1 << 2)
|
|
||||||
#define TABLET_TOOL_CHANGED_DISTANCE (1 << 3)
|
|
||||||
#define TABLET_TOOL_CHANGED_TILT_X (1 << 4)
|
|
||||||
#define TABLET_TOOL_CHANGED_TILT_Y (1 << 5)
|
|
||||||
#define TABLET_TOOL_CHANGED_ROTATION (1 << 6)
|
|
||||||
#define TABLET_TOOL_CHANGED_SLIDER (1 << 7)
|
|
||||||
#define TABLET_TOOL_CHANGED_SIZE_MAJOR (1 << 8)
|
|
||||||
#define TABLET_TOOL_CHANGED_SIZE_MINOR (1 << 9)
|
|
||||||
#define TABLET_TOOL_CHANGED_WHEEL (1 << 10)
|
|
||||||
|
|
||||||
#define TABLET_TOOL_X 0
|
|
||||||
#define TABLET_TOOL_Y 1
|
|
||||||
#define TABLET_TOOL_PRESSURE 2
|
|
||||||
#define TABLET_TOOL_DISTANCE 3
|
|
||||||
#define TABLET_TOOL_TILT_X 4
|
|
||||||
#define TABLET_TOOL_TILT_Y 5
|
|
||||||
#define TABLET_TOOL_ROTATION 6
|
|
||||||
#define TABLET_TOOL_SLIDER 7
|
|
||||||
#define TABLET_TOOL_SIZE_MAJOR 8
|
|
||||||
#define TABLET_TOOL_SIZE_MINOR 9
|
|
||||||
#define TABLET_TOOL_WHEEL 10
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define IAL_EVENT_TABLET_TOOL_AXIS 0x0090
|
#define IAL_EVENT_TABLET_TOOL_AXIS 0x0090
|
||||||
|
|||||||
+1
-1
@@ -587,7 +587,7 @@ enum {
|
|||||||
* \sa InitBlockDataHeap, DestroyBlockDataHeap
|
* \sa InitBlockDataHeap, DestroyBlockDataHeap
|
||||||
*/
|
*/
|
||||||
typedef struct _BLOCKHEAP {
|
typedef struct _BLOCKHEAP {
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
#endif
|
#endif
|
||||||
/** Size of one block element in bytes. */
|
/** Size of one block element in bytes. */
|
||||||
|
|||||||
+8
-4
@@ -4097,7 +4097,7 @@ static inline int GUIAPI ShowCursor (BOOL fShow) {
|
|||||||
#endif /* !_MGHAVE_CURSOR */
|
#endif /* !_MGHAVE_CURSOR */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def SetCursor(hcsr)
|
* \fn HCURSOR SetCursor(HCURSOR hcsr)
|
||||||
* \brief Changes the current cursor.
|
* \brief Changes the current cursor.
|
||||||
*
|
*
|
||||||
* This function changes the current cursor to be \a hcsr.
|
* This function changes the current cursor to be \a hcsr.
|
||||||
@@ -4110,10 +4110,12 @@ static inline int GUIAPI ShowCursor (BOOL fShow) {
|
|||||||
*
|
*
|
||||||
* \sa SetCursorEx, SetDefaultCursor
|
* \sa SetCursorEx, SetDefaultCursor
|
||||||
*/
|
*/
|
||||||
#define SetCursor(hcsr) SetCursorEx (hcsr, FALSE)
|
static inline HCURSOR SetCursor(HCURSOR hcsr) {
|
||||||
|
return SetCursorEx (hcsr, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def SetDefaultCursor(hcsr)
|
* \fn HCURSOR SetDefaultCursor(HCURSOR hcsr)
|
||||||
* \brief Changes the current cursor, and set it as the default cursor.
|
* \brief Changes the current cursor, and set it as the default cursor.
|
||||||
*
|
*
|
||||||
* This function changes the current cursor to be \a hcsr, and set it as
|
* This function changes the current cursor to be \a hcsr, and set it as
|
||||||
@@ -4127,7 +4129,9 @@ static inline int GUIAPI ShowCursor (BOOL fShow) {
|
|||||||
*
|
*
|
||||||
* \sa SetCursorEx, SetCursor
|
* \sa SetCursorEx, SetCursor
|
||||||
*/
|
*/
|
||||||
#define SetDefaultCursor(hcsr) SetCursorEx (hcsr, TRUE)
|
static inline HCURSOR SetDefaultCursor(HCURSOR hcsr) {
|
||||||
|
return SetCursorEx (hcsr, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/** @} end of cursor_fns */
|
/** @} end of cursor_fns */
|
||||||
|
|
||||||
|
|||||||
@@ -2905,6 +2905,9 @@ typedef struct _WINMASKINFO {
|
|||||||
*
|
*
|
||||||
* This message is sent to the all main windows when the system
|
* This message is sent to the all main windows when the system
|
||||||
* enters idle loop.
|
* enters idle loop.
|
||||||
|
*
|
||||||
|
* Since 5.0.10, this messasge will be relayed to the active child control
|
||||||
|
* if the main window is currently active.
|
||||||
*/
|
*/
|
||||||
#define MSG_IDLE 0x0142
|
#define MSG_IDLE 0x0142
|
||||||
|
|
||||||
|
|||||||
+8
-24
@@ -1,10 +1,10 @@
|
|||||||
COMMON_SUBDIRS = libc misc main kernel sysres ial control ex_ctrl font gui mybmp include textedit
|
COMMON_SUBDIRS = libc misc main kernel sysres ial control ex_ctrl font gui mybmp include textedit newgal newgdi
|
||||||
|
|
||||||
COMMON_LADD = \
|
COMMON_LADD = \
|
||||||
libc/liblibc.la \
|
libc/liblibc.la \
|
||||||
misc/libmisc.la \
|
misc/libmisc.la \
|
||||||
control/libcontrol.la \
|
control/libcontrol.la \
|
||||||
ex_ctrl/libexctrl.la \
|
ex_ctrl/libexctrl.la \
|
||||||
font/libfont.la \
|
font/libfont.la \
|
||||||
font/in-core/libincore.la \
|
font/in-core/libincore.la \
|
||||||
ial/libial.la \
|
ial/libial.la \
|
||||||
@@ -13,31 +13,15 @@ COMMON_LADD = \
|
|||||||
mybmp/libmybmp.la \
|
mybmp/libmybmp.la \
|
||||||
kernel/libkernel.la \
|
kernel/libkernel.la \
|
||||||
sysres/libsysres.la \
|
sysres/libsysres.la \
|
||||||
textedit/libtextedit.la
|
textedit/libtextedit.la \
|
||||||
|
newgal/libnewgal.la \
|
||||||
|
newgdi/libnewgdi.la
|
||||||
|
|
||||||
if MGRM_STANDALONE
|
DIST_SUBDIRS = $(COMMON_SUBDIRS) newgal newgdi server client standalone
|
||||||
LITE_LADD = standalone/libstandalone.la
|
SUBDIRS = $(COMMON_SUBDIRS) @RUNMODE_SUBDIRS@
|
||||||
LITE_SUBDIRS = standalone
|
|
||||||
else
|
|
||||||
if MGRM_PROCESSES
|
|
||||||
LITE_LADD = server/libserver.la client/libclient.la
|
|
||||||
LITE_SUBDIRS = server client
|
|
||||||
else
|
|
||||||
LITE_LADD =
|
|
||||||
LITE_SUBDIRS =
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
NEWGAL_LADD = newgal/libnewgal.la newgdi/libnewgdi.la
|
|
||||||
NEWGAL_SUBDIRS = newgal newgdi
|
|
||||||
|
|
||||||
DIST_SUBDIRS = $(COMMON_SUBDIRS) newgal newgdi server client standalone
|
|
||||||
SUBDIRS = $(COMMON_SUBDIRS) $(NEWGAL_SUBDIRS) $(LITE_SUBDIRS)
|
|
||||||
|
|
||||||
MGSOURCES = template.c template.h
|
MGSOURCES = template.c template.h
|
||||||
MGLIBADD = $(COMMON_LADD) \
|
MGLIBADD = $(COMMON_LADD) @RUNMODE_LADD@
|
||||||
$(LITE_LADD) \
|
|
||||||
$(NEWGAL_LADD)
|
|
||||||
MGLDFLAGS = -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
MGLDFLAGS = -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||||
|
|
||||||
lib_LTLIBRARIES=libminigui_@MGLIB_SUFFIX@.la
|
lib_LTLIBRARIES=libminigui_@MGLIB_SUFFIX@.la
|
||||||
|
|||||||
+56
-46
File diff suppressed because it is too large
Load Diff
+12
-14
@@ -299,7 +299,15 @@ static void change_status_from_pose (PCONTROL pctrl, int new_pose,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*complete a click if the click if valid
|
/* DK: When the radio or check button state changes do not erase the background,
|
||||||
|
* and the prospects for direct rendering */
|
||||||
|
btnGetRects (pctrl, &rcClient, &rcContent, &rcBitmap);
|
||||||
|
if (BUTTON_IS_PUSHBTN(pctrl) || (pctrl->dwStyle & BS_PUSHLIKE))
|
||||||
|
InvalidateRect((HWND)pctrl, NULL, TRUE);
|
||||||
|
else
|
||||||
|
InvalidateRect((HWND)pctrl, &rcBitmap, FALSE);
|
||||||
|
|
||||||
|
/* complete a click if the click if valid
|
||||||
* (mouse lbutton up in button )*/
|
* (mouse lbutton up in button )*/
|
||||||
if (old_pose == BST_PUSHED && new_pose != BST_DISABLE
|
if (old_pose == BST_PUSHED && new_pose != BST_DISABLE
|
||||||
&& change_valid)
|
&& change_valid)
|
||||||
@@ -312,14 +320,6 @@ static void change_status_from_pose (PCONTROL pctrl, int new_pose,
|
|||||||
|
|
||||||
NotifyParent ((HWND)pctrl, pctrl->id, BN_CLICKED);
|
NotifyParent ((HWND)pctrl, pctrl->id, BN_CLICKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DK: When the radio or check button state changes do not erase the background,
|
|
||||||
* and the prospects for direct rendering */
|
|
||||||
btnGetRects (pctrl, &rcClient, &rcContent, &rcBitmap);
|
|
||||||
if (BUTTON_IS_PUSHBTN(pctrl) || (pctrl->dwStyle & BS_PUSHLIKE))
|
|
||||||
InvalidateRect((HWND)pctrl, NULL, TRUE);
|
|
||||||
else
|
|
||||||
InvalidateRect((HWND)pctrl, &rcBitmap, FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*btnGetRects:
|
/*btnGetRects:
|
||||||
@@ -423,8 +423,8 @@ static void draw_bitmap_button (PCONTROL pctrl, HDC hdc, DWORD dwStyle,
|
|||||||
|
|
||||||
GetClientRect ((HWND)pctrl, &prcClient);
|
GetClientRect ((HWND)pctrl, &prcClient);
|
||||||
if (dwStyle & BS_REALSIZEIMAGE) {
|
if (dwStyle & BS_REALSIZEIMAGE) {
|
||||||
x += (w - bmp->bmWidth) >> 1;
|
x += (int)(w - bmp->bmWidth) >> 1;
|
||||||
y += (h - bmp->bmHeight) >> 1;
|
y += (int)(h - bmp->bmHeight) >> 1;
|
||||||
w = h = 0;
|
w = h = 0;
|
||||||
|
|
||||||
if (bmp->bmWidth > RECTW(prcClient)){
|
if (bmp->bmWidth > RECTW(prcClient)){
|
||||||
@@ -847,8 +847,6 @@ static LRESULT ButtonCtrlProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case BM_SETSTYLE:
|
case BM_SETSTYLE:
|
||||||
pctrl->dwStyle &= 0xFFFF0000;
|
pctrl->dwStyle &= 0xFFFF0000;
|
||||||
pctrl->dwStyle |= (DWORD)(wParam & 0x0000FFFF);
|
pctrl->dwStyle |= (DWORD)(wParam & 0x0000FFFF);
|
||||||
@@ -1054,7 +1052,7 @@ static LRESULT ButtonCtrlProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefaultControlProc (hWnd, uMsg, wParam, lParam);
|
return DefaultControlProc (hWnd, uMsg, wParam, lParam);
|
||||||
|
|||||||
+8
-11
@@ -1678,7 +1678,7 @@ esright_input_char_refresh (HWND hWnd,
|
|||||||
scroll_rc.right = cur_caret_x;
|
scroll_rc.right = cur_caret_x;
|
||||||
|
|
||||||
ScrollWindow(hWnd, -scroll_len, 0, &scroll_rc, NULL);
|
ScrollWindow(hWnd, -scroll_len, 0, &scroll_rc, NULL);
|
||||||
UpdateWindow(hWnd, FALSE);
|
UpdateInvalidClient(hWnd, TRUE);
|
||||||
edtSetCaretPos (hWnd, sled);
|
edtSetCaretPos (hWnd, sled);
|
||||||
|
|
||||||
sled->changed = TRUE;
|
sled->changed = TRUE;
|
||||||
@@ -2143,9 +2143,6 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
else {
|
else {
|
||||||
chars = 1;
|
chars = 1;
|
||||||
|
|
||||||
if (charBuffer [0] == 127) // BS
|
|
||||||
charBuffer [0] = '\b';
|
|
||||||
|
|
||||||
if (dwStyle & ES_UPPERCASE) {
|
if (dwStyle & ES_UPPERCASE) {
|
||||||
charBuffer [0] = toupper (charBuffer[0]);
|
charBuffer [0] = toupper (charBuffer[0]);
|
||||||
}
|
}
|
||||||
@@ -2154,12 +2151,8 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chars == 1) {
|
if (chars == 1 && (charBuffer[0] == '\b' || charBuffer[0] == 0x7F)) {
|
||||||
if (charBuffer [0] < 0x20 && charBuffer[0] != '\b') //FIXME
|
// ASCII BS or DEL
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (charBuffer[0] == '\b') { //backspace
|
|
||||||
int del;
|
int del;
|
||||||
|
|
||||||
if (sled->editPos == 0 && sled->selStart == sled->selEnd)
|
if (sled->editPos == 0 && sled->selStart == sled->selEnd)
|
||||||
@@ -2184,7 +2177,11 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
sleInsertText (hWnd, sled, NULL, del);
|
sleInsertText (hWnd, sled, NULL, del);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else if (chars == 1 && charBuffer [0] < 0x20) {
|
||||||
|
// ignore all other ASCII control characters.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
if (dwStyle & ES_LEFT) {
|
if (dwStyle & ES_LEFT) {
|
||||||
esleft_input_char_refresh(hWnd, sled, (char*)charBuffer, chars);
|
esleft_input_char_refresh(hWnd, sled, (char*)charBuffer, chars);
|
||||||
set_edit_caret_pos(hWnd, sled);
|
set_edit_caret_pos(hWnd, sled);
|
||||||
|
|||||||
@@ -172,6 +172,10 @@ BOOL scrolled_set_cont_pos (HWND hWnd, PSCRDATA pscrdata, int cont_x, int cont_y
|
|||||||
SetScrollPos (hWnd, SB_VERT, cont_y);
|
SetScrollPos (hWnd, SB_VERT, cont_y);
|
||||||
bChange = TRUE;
|
bChange = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bChange)
|
||||||
|
UpdateInvalidClient(hWnd, FALSE);
|
||||||
|
|
||||||
return bChange;
|
return bChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -493,10 +493,15 @@ LRESULT ScrollViewCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case MSG_DESTROY:
|
case MSG_DESTROY: {
|
||||||
scrollview_destroy (psvdata);
|
/* suppress a warning about calling free() before using the pointer */
|
||||||
free (psvdata);
|
PSVDATA svdata = (PSVDATA) GetWindowAdditionalData2 (hWnd);
|
||||||
|
if (svdata) {
|
||||||
|
scrollview_destroy(svdata);
|
||||||
|
free (svdata);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case MSG_GETDLGCODE:
|
case MSG_GETDLGCODE:
|
||||||
return DLGC_WANTARROWS;
|
return DLGC_WANTARROWS;
|
||||||
|
|||||||
@@ -2096,7 +2096,6 @@ static void teOnChar (HWND hWnd, PTEDATA ptedata, WPARAM wParam)
|
|||||||
rcInv.right = ptedata->svdata.scrdata.nContWidth;
|
rcInv.right = ptedata->svdata.scrdata.nContWidth;
|
||||||
rcInv.bottom = rcInv.top + ptedata->nLineHeight - ptedata->nLineBaseH;
|
rcInv.bottom = rcInv.top + ptedata->nLineHeight - ptedata->nLineBaseH;
|
||||||
REFRESH_NODE_EX(node, &rcInv);
|
REFRESH_NODE_EX(node, &rcInv);
|
||||||
// UpdateWindow(hWnd, FALSE);
|
|
||||||
|
|
||||||
newlinenr = NODE_LINENR(node);
|
newlinenr = NODE_LINENR(node);
|
||||||
rcInv.left = 0;
|
rcInv.left = 0;
|
||||||
@@ -2104,12 +2103,10 @@ static void teOnChar (HWND hWnd, PTEDATA ptedata, WPARAM wParam)
|
|||||||
rcInv.top += ptedata->nLineHeight;
|
rcInv.top += ptedata->nLineHeight;
|
||||||
rcInv.bottom = rcInv.top + ptedata->nLineHeight - ptedata->nLineBaseH;
|
rcInv.bottom = rcInv.top + ptedata->nLineHeight - ptedata->nLineBaseH;
|
||||||
REFRESH_NODE_EX(node, &rcInv);
|
REFRESH_NODE_EX(node, &rcInv);
|
||||||
// UpdateWindow(hWnd, FALSE);
|
|
||||||
}
|
}
|
||||||
/* houhh 20090814, UpdataWindow will invalidate all edit area, but
|
/* houhh 20090814, UpdataWindow will invalidate all edit area, but
|
||||||
* erase area is not same with msg_paint area.*/
|
* erase area is not same with msg_paint area.*/
|
||||||
UpdateWindow(hWnd, FALSE);
|
UpdateInvalidClient(hWnd, TRUE);
|
||||||
//SendMessage(hWnd, MSG_PAINT, 0, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -283,7 +283,7 @@ static void DrawCoolBox (HWND hWnd, HDC hdc, PCOOLBARCTRL pdata)
|
|||||||
WINDOWINFO *info;
|
WINDOWINFO *info;
|
||||||
RECT rc;
|
RECT rc;
|
||||||
|
|
||||||
if (tmpdata->Caption == NULL || tmpdata->Caption [0] == '\0')
|
if (tmpdata->Caption [0] == '\0')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
GetTextExtent (hdc, tmpdata->Caption, -1, &size);
|
GetTextExtent (hdc, tmpdata->Caption, -1, &size);
|
||||||
|
|||||||
@@ -80,17 +80,17 @@ static void update_viewport (gvGridViewData *view, int from, int to, int is_row)
|
|||||||
{
|
{
|
||||||
RECT r;
|
RECT r;
|
||||||
|
|
||||||
GetClientRect (view->hCtrl, &r);
|
GetClientRect(view->hCtrl, &r);
|
||||||
|
|
||||||
if (is_row) {
|
if (is_row) {
|
||||||
r.top = from;
|
r.top = from;
|
||||||
ScrollWindow (view->hCtrl, 0, to, &r, NULL);
|
ScrollWindow(view->hCtrl, 0, to, &r, NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
r.left = from;
|
r.left = from;
|
||||||
ScrollWindow (view->hCtrl, to, 0, &r, NULL);
|
ScrollWindow(view->hCtrl, to, 0, &r, NULL);
|
||||||
}
|
}
|
||||||
UpdateWindow(view->hCtrl, FALSE);
|
UpdateInvalidClient(view->hCtrl, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// scroll function {{{
|
// scroll function {{{
|
||||||
|
|||||||
@@ -157,6 +157,8 @@ static int isInItem (MgList *mglst, int mouseX, int mouseY,
|
|||||||
|
|
||||||
index = row * pivlist->nCol + col;
|
index = row * pivlist->nCol + col;
|
||||||
pci = (IconviewItem *)mglist_getitem_byindex (mglst, index);
|
pci = (IconviewItem *)mglist_getitem_byindex (mglst, index);
|
||||||
|
if (pci == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (pRet)
|
if (pRet)
|
||||||
*pRet = (MgItem*)pci;
|
*pRet = (MgItem*)pci;
|
||||||
|
|||||||
+10
-17
@@ -93,14 +93,15 @@ BOOL RegisterTreeViewControl (void)
|
|||||||
const WINDOW_ELEMENT_RENDERER * rdr =
|
const WINDOW_ELEMENT_RENDERER * rdr =
|
||||||
GetDefaultWindowElementRenderer();
|
GetDefaultWindowElementRenderer();
|
||||||
|
|
||||||
|
if (!(icon_fold = (HICON)RetrieveRes(gui_GetIconFile(rdr->name,
|
||||||
if (!(icon_fold = (HICON)RetrieveRes(gui_GetIconFile(rdr->name, SYSICON_FOLD, szValue)))) {
|
SYSICON_FOLD, szValue)))) {
|
||||||
if (!(icon_fold = LoadSystemIcon (SYSICON_FOLD, 0))) {
|
if (!(icon_fold = LoadSystemIcon (SYSICON_FOLD, 0))) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(icon_unfold = (HICON)RetrieveRes(gui_GetIconFile(rdr->name, SYSICON_UNFOLD, szValue)))) {
|
if (!(icon_unfold = (HICON)RetrieveRes(gui_GetIconFile(rdr->name,
|
||||||
|
SYSICON_UNFOLD, szValue)))) {
|
||||||
if (!(icon_unfold = LoadSystemIcon (SYSICON_UNFOLD, 0))) {
|
if (!(icon_unfold = LoadSystemIcon (SYSICON_UNFOLD, 0))) {
|
||||||
DestroyIcon (icon_fold);
|
DestroyIcon (icon_fold);
|
||||||
icon_fold = 0;
|
icon_fold = 0;
|
||||||
@@ -180,6 +181,7 @@ static BOOL tvInitTVData (HWND hwnd, PTVDATA pData, DWORD dwStyle, PTVITEMINFO r
|
|||||||
tvRoot->hIconFold = root_ii->hIconFold;
|
tvRoot->hIconFold = root_ii->hIconFold;
|
||||||
else
|
else
|
||||||
tvRoot->hIconFold = ICON_FOLD;
|
tvRoot->hIconFold = ICON_FOLD;
|
||||||
|
|
||||||
if (root_ii && root_ii->hIconUnfold)
|
if (root_ii && root_ii->hIconUnfold)
|
||||||
tvRoot->hIconUnfold = root_ii->hIconUnfold;
|
tvRoot->hIconUnfold = root_ii->hIconUnfold;
|
||||||
else
|
else
|
||||||
@@ -632,22 +634,13 @@ static void tvDrawItem (HWND hWnd, HDC hdc, PTVDATA pData, int centerX, int cent
|
|||||||
centerX += (h>>1) + TV_BOXGAP;
|
centerX += (h>>1) + TV_BOXGAP;
|
||||||
|
|
||||||
if (pData->dwStyle & TVS_WITHICON) {
|
if (pData->dwStyle & TVS_WITHICON) {
|
||||||
if (!(pData->dwStyle & TVS_ICONFORSELECT)
|
if (p->child != NULL && (p->dwFlags & TVIF_FOLD)) {
|
||||||
&& (!p->child || (p->dwFlags & TVIF_FOLD))) {
|
|
||||||
if ((p->hIconFold)) {
|
if ((p->hIconFold)) {
|
||||||
DrawIcon (hdc, centerX, centerY - (h>>1),
|
DrawIcon (hdc, centerX, centerY - (h>>1), h, h, p->hIconFold);
|
||||||
h, h, p->hIconFold);
|
|
||||||
}
|
|
||||||
} else if ((pData->dwStyle & TVS_ICONFORSELECT) && p->dwFlags & TVIF_SELECTED) {
|
|
||||||
if ((p->hIconFold)) {
|
|
||||||
DrawIcon (hdc, centerX, centerY - (h>>1),
|
|
||||||
h, h, p->hIconFold);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
if ((p->hIconUnfold)) {
|
|
||||||
DrawIcon (hdc, centerX, centerY - (h>>1),
|
|
||||||
h, h, p->hIconUnfold);
|
|
||||||
}
|
}
|
||||||
|
} else if ((p->hIconUnfold)) {
|
||||||
|
DrawIcon (hdc, centerX, centerY - (h>>1), h, h, p->hIconUnfold);
|
||||||
|
}
|
||||||
centerX += h + TV_ICONGAP;
|
centerX += h + TV_ICONGAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-14
@@ -461,9 +461,8 @@ static int iso8859_6_len_first_char (const unsigned char* mstr, int len)
|
|||||||
return 2;
|
return 2;
|
||||||
else if (ignore == 2)
|
else if (ignore == 2)
|
||||||
return 3;
|
return 3;
|
||||||
else
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ISARABIC_LIG_HALF(s) ((s == 0xa5) || (s == 0xa6))
|
#define ISARABIC_LIG_HALF(s) ((s == 0xa5) || (s == 0xa6))
|
||||||
@@ -472,6 +471,7 @@ static unsigned int iso8859_6_char_type (Achar32 chv)
|
|||||||
{
|
{
|
||||||
unsigned int ch_type = ACHAR_BASIC_UNKNOWN;
|
unsigned int ch_type = ACHAR_BASIC_UNKNOWN;
|
||||||
|
|
||||||
|
chv = REAL_ACHAR(chv);
|
||||||
if (is_arabic_char_vowel (chv)) { /* is vowel */
|
if (is_arabic_char_vowel (chv)) { /* is vowel */
|
||||||
ch_type = ACHAR_BASIC_VOWEL;
|
ch_type = ACHAR_BASIC_VOWEL;
|
||||||
}
|
}
|
||||||
@@ -483,7 +483,6 @@ static unsigned int iso8859_6_char_type (Achar32 chv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
|
static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
|
||||||
#if 0
|
|
||||||
/*0x00~0x0f*/
|
/*0x00~0x0f*/
|
||||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||||
@@ -531,7 +530,6 @@ static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
|
|||||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
||||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON,
|
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON,
|
||||||
BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN,
|
BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN,
|
||||||
#endif
|
|
||||||
|
|
||||||
/*0x80~0x8f*/
|
/*0x80~0x8f*/
|
||||||
BIDI_TYPE_ON, BIDI_TYPE_AL, BIDI_TYPE_AL, BIDI_TYPE_AL,
|
BIDI_TYPE_ON, BIDI_TYPE_AL, BIDI_TYPE_AL, BIDI_TYPE_AL,
|
||||||
@@ -606,10 +604,9 @@ static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
|
|||||||
static BidiType iso8859_6_bidi_char_type (Achar32 chv)
|
static BidiType iso8859_6_bidi_char_type (Achar32 chv)
|
||||||
{
|
{
|
||||||
chv = REAL_ACHAR(chv);
|
chv = REAL_ACHAR(chv);
|
||||||
if (chv > 0x7F)
|
assert(chv < TABLESIZE(__mg_iso8859_6_bidi_char_type_map));
|
||||||
return (BidiType)__mg_iso8859_6_bidi_char_type_map[chv - 0x80];
|
|
||||||
else
|
return (BidiType)__mg_iso8859_6_bidi_char_type_map[chv];
|
||||||
return (BidiType)__mg_iso8859_1_bidi_char_type_map[chv];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_table_index(Uint8 c)
|
static int get_table_index(Uint8 c)
|
||||||
@@ -796,7 +793,7 @@ static const unsigned char* iso8859_6_get_next_word (const unsigned char* mstr,
|
|||||||
static Achar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
static Achar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
||||||
int cur_len, int shape_type)
|
int cur_len, int shape_type)
|
||||||
{
|
{
|
||||||
Achar32 chv = -1;
|
Achar32 chv = INV_ACHAR_VALUE;
|
||||||
int ignore;
|
int ignore;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
@@ -811,15 +808,14 @@ static Achar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chv == -1 || chv == 0) {
|
if (chv == INV_ACHAR_VALUE || chv == 0) {
|
||||||
if (ISARABIC_VOWEL(*cur_mchar)){
|
if (ISARABIC_VOWEL(*cur_mchar)){
|
||||||
chv = fontset_68x_get_vowel_char(*cur_mchar);
|
chv = fontset_68x_get_vowel_char(*cur_mchar);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chv == 0 || chv == -1) {
|
if (chv == 0 || chv == INV_ACHAR_VALUE) {
|
||||||
index = get_table_index(*cur_mchar);
|
index = get_table_index(*cur_mchar);
|
||||||
if (index >=0)
|
if (index >=0 ) {
|
||||||
{
|
|
||||||
switch (shape_type) {
|
switch (shape_type) {
|
||||||
case ACHAR_ISOLATED:
|
case ACHAR_ISOLATED:
|
||||||
chv = shape_info[index].isolated;
|
chv = shape_info[index].isolated;
|
||||||
@@ -841,7 +837,7 @@ static Achar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (chv == 0)
|
if (chv == 0)
|
||||||
chv =-1;
|
chv = INV_ACHAR_VALUE;
|
||||||
|
|
||||||
return chv;
|
return chv;
|
||||||
}
|
}
|
||||||
@@ -862,6 +858,7 @@ static const BIDICHAR_MIRROR_MAP __mg_iso8859_68x_mirror_table [] =
|
|||||||
|
|
||||||
static BOOL iso8859_6_bidi_mirror_char (Achar32 chv, Achar32* mirrored)
|
static BOOL iso8859_6_bidi_mirror_char (Achar32 chv, Achar32* mirrored)
|
||||||
{
|
{
|
||||||
|
chv = REAL_ACHAR(chv);
|
||||||
return get_mirror_char (__mg_iso8859_68x_mirror_table,
|
return get_mirror_char (__mg_iso8859_68x_mirror_table,
|
||||||
TABLESIZE (__mg_iso8859_68x_mirror_table), chv, mirrored);
|
TABLESIZE (__mg_iso8859_68x_mirror_table), chv, mirrored);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-6
@@ -49,6 +49,8 @@
|
|||||||
** Create date: 2000/06/13
|
** Create date: 2000/06/13
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef NDEBUG
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -969,7 +971,6 @@ static const unsigned char* iso8859_8_get_next_word (const unsigned char* mstr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
||||||
#if 0
|
|
||||||
/*0x00~0x0f*/
|
/*0x00~0x0f*/
|
||||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||||
@@ -1017,7 +1018,6 @@ static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
|||||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
||||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON,
|
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON,
|
||||||
BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN,
|
BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN,
|
||||||
#endif
|
|
||||||
|
|
||||||
/*0x80~0x8f*/
|
/*0x80~0x8f*/
|
||||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||||
@@ -1072,10 +1072,9 @@ static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
|||||||
static BidiType iso8859_8_bidi_char_type (Achar32 chv)
|
static BidiType iso8859_8_bidi_char_type (Achar32 chv)
|
||||||
{
|
{
|
||||||
chv = REAL_ACHAR(chv);
|
chv = REAL_ACHAR(chv);
|
||||||
if (chv > 0x7F)
|
assert(chv < TABLESIZE(__mg_iso8859_8_bidi_char_type_map));
|
||||||
return (BidiType)__mg_iso8859_8_bidi_char_type_map[chv - 0x80];
|
|
||||||
else
|
return (BidiType)__mg_iso8859_8_bidi_char_type_map[chv];
|
||||||
return (BidiType)__mg_iso8859_1_bidi_char_type_map[chv];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const BIDICHAR_MIRROR_MAP __mg_iso8859_8_mirror_table [] =
|
static const BIDICHAR_MIRROR_MAP __mg_iso8859_8_mirror_table [] =
|
||||||
|
|||||||
+14
-7
@@ -703,21 +703,20 @@ void __mg_legacy_bidi_get_embeddlevels (const CHARSETOPS* charset_ops,
|
|||||||
print_hexstr(achars, len, TRUE);
|
print_hexstr(achars, len, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void bidi_map_reverse (void* context, int len, int pos)
|
static void bidi_map_reverse (void* context, int len, int pos)
|
||||||
{
|
{
|
||||||
GLYPHMAPINFO* str = (GLYPHMAPINFO*)context + pos;
|
ACHARMAPINFO* str = (ACHARMAPINFO*)context + pos;
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < len / 2; i++)
|
for (i = 0; i < len / 2; i++)
|
||||||
{
|
{
|
||||||
GLYPHMAPINFO tmp = str[i];
|
ACHARMAPINFO tmp = str[i];
|
||||||
str[i] = str[len - 1 - i];
|
str[i] = str[len - 1 - i];
|
||||||
str[len - 1 - i] = tmp;
|
str[len - 1 - i] = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||||
Achar32* achars, int len, GLYPHMAPINFO* map, int pel)
|
Achar32* achars, int len, int pel, ACHARMAPINFO* map)
|
||||||
{
|
{
|
||||||
BYTE max_level = 1;
|
BYTE max_level = 1;
|
||||||
TYPERUN *type_rl_list = NULL;
|
TYPERUN *type_rl_list = NULL;
|
||||||
@@ -725,6 +724,7 @@ Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
|||||||
int i;
|
int i;
|
||||||
int run_pos;
|
int run_pos;
|
||||||
int run_len;
|
int run_len;
|
||||||
|
REORDER_CONTEXT rc;
|
||||||
|
|
||||||
print_hexstr(achars, len, FALSE);
|
print_hexstr(achars, len, FALSE);
|
||||||
|
|
||||||
@@ -741,8 +741,10 @@ Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bidi_reorder_cb(map, len, &type_rl_list, max_level,
|
rc.achars = NULL;
|
||||||
bidi_map_reverse);
|
rc.extra = map;
|
||||||
|
rc.cb = bidi_map_reverse;
|
||||||
|
bidi_reorder(&rc, len, &type_rl_list, max_level);
|
||||||
|
|
||||||
/* free typerun list.*/
|
/* free typerun list.*/
|
||||||
free_typerun_list(type_rl_list);
|
free_typerun_list(type_rl_list);
|
||||||
@@ -752,18 +754,23 @@ Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
|||||||
return achars;
|
return achars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
Achar32* __mg_legacy_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
Achar32* __mg_legacy_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||||
Achar32* achars, int len, int* index_map, int pel)
|
Achar32* achars, int len, int* index_map, int pel)
|
||||||
{
|
{
|
||||||
BYTE max_level = 1;
|
BYTE max_level = 1;
|
||||||
TYPERUN *type_rl_list = NULL;
|
TYPERUN *type_rl_list = NULL;
|
||||||
|
REORDER_CONTEXT rc;
|
||||||
|
|
||||||
print_hexstr(achars, len, FALSE);
|
print_hexstr(achars, len, FALSE);
|
||||||
|
|
||||||
/* W1~W7, N1~N2, I1~I2, Get the Embedding Level. */
|
/* W1~W7, N1~N2, I1~I2, Get the Embedding Level. */
|
||||||
bidi_resolve_string (charset_ops, achars, len, pel, &type_rl_list, &max_level);
|
bidi_resolve_string (charset_ops, achars, len, pel, &type_rl_list, &max_level);
|
||||||
|
|
||||||
bidi_reorder_cb(index_map, len, &type_rl_list, max_level,
|
rc.achars = achars;
|
||||||
|
rc.extra = extra;
|
||||||
|
rc.cb = cb_reverse_extra;
|
||||||
|
bidi_reorder(index_map, len, &type_rl_list, max_level,
|
||||||
bidi_string_reverse);
|
bidi_string_reverse);
|
||||||
|
|
||||||
/* free typerun list.*/
|
/* free typerun list.*/
|
||||||
|
|||||||
+4
-1
@@ -155,7 +155,10 @@ BOOL mg_InitSysFont (void)
|
|||||||
goto error_load;
|
goto error_load;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sys_fonts[i] = CreateLogFont (type, family, charset,
|
/* VW 20221003: use CreateLogFontEx instead of CreateLogFont to
|
||||||
|
follow the new style convention of font name,
|
||||||
|
but the orientation is ignored for the system logfont. */
|
||||||
|
if ((sys_fonts[i] = CreateLogFontEx (type, family, charset,
|
||||||
style [0], style [1], style [2],
|
style [0], style [1], style [2],
|
||||||
style [3], style [4], style [5],
|
style [3], style [4], style [5],
|
||||||
height, 0)) == NULL) {
|
height, 0)) == NULL) {
|
||||||
|
|||||||
@@ -377,8 +377,8 @@ static _GBType resolve_gbt(struct break_ctxt* ctxt,
|
|||||||
uc == 0x8E2 || uc == 0xD4E || uc == 0x110BD ||
|
uc == 0x8E2 || uc == 0xD4E || uc == 0x110BD ||
|
||||||
(uc >= 0x111C2 && uc <= 0x111C3)) {
|
(uc >= 0x111C2 && uc <= 0x111C3)) {
|
||||||
gbt = GB_Prepend;
|
gbt = GB_Prepend;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case UCHAR_CATEGORY_CONTROL:
|
case UCHAR_CATEGORY_CONTROL:
|
||||||
case UCHAR_CATEGORY_LINE_SEPARATOR:
|
case UCHAR_CATEGORY_LINE_SEPARATOR:
|
||||||
@@ -393,8 +393,8 @@ static _GBType resolve_gbt(struct break_ctxt* ctxt,
|
|||||||
if ((uc >= 0xFFF0 && uc <= 0xFFF8) ||
|
if ((uc >= 0xFFF0 && uc <= 0xFFF8) ||
|
||||||
(uc >= 0xE0000 && uc <= 0xE0FFF)) {
|
(uc >= 0xE0000 && uc <= 0xE0FFF)) {
|
||||||
gbt = GB_ControlCRLF;
|
gbt = GB_ControlCRLF;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case UCHAR_CATEGORY_OTHER_LETTER:
|
case UCHAR_CATEGORY_OTHER_LETTER:
|
||||||
if (ctxt->makes_hangul_syllable)
|
if (ctxt->makes_hangul_syllable)
|
||||||
@@ -434,7 +434,6 @@ static _GBType resolve_gbt(struct break_ctxt* ctxt,
|
|||||||
gbt = GB_RI_Odd;
|
gbt = GB_RI_Odd;
|
||||||
else
|
else
|
||||||
gbt = GB_RI_Odd;
|
gbt = GB_RI_Odd;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,6 @@
|
|||||||
#include "cliprect.h"
|
#include "cliprect.h"
|
||||||
#include "gal.h"
|
#include "gal.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
#include "blockheap.h"
|
|
||||||
#include "accelkey.h"
|
#include "accelkey.h"
|
||||||
|
|
||||||
static BLOCKHEAP ACHeap;
|
static BLOCKHEAP ACHeap;
|
||||||
|
|||||||
+59
-18
@@ -59,17 +59,22 @@
|
|||||||
#include "cliprect.h"
|
#include "cliprect.h"
|
||||||
#include "gal.h"
|
#include "gal.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
|
#include "dc.h"
|
||||||
|
|
||||||
BOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight)
|
BOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight)
|
||||||
{
|
{
|
||||||
PMAINWIN pWin;
|
PMAINWIN pWin;
|
||||||
|
|
||||||
pWin = (PMAINWIN)hWnd;
|
pWin = (PMAINWIN)hWnd;
|
||||||
|
|
||||||
if (!pWin->pCaretInfo) {
|
if (!pWin->pCaretInfo) {
|
||||||
|
HDC hdc;
|
||||||
|
|
||||||
if (!(pWin->pCaretInfo = malloc (sizeof (CARETINFO))))
|
if (!(pWin->pCaretInfo = malloc (sizeof (CARETINFO))))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
/* Since 5.0.11: use client DC of the window instead of screen DC */
|
||||||
|
hdc = GetClientDC(hWnd);
|
||||||
|
|
||||||
pWin->pCaretInfo->pBitmap = pBitmap;
|
pWin->pCaretInfo->pBitmap = pBitmap;
|
||||||
if (pBitmap) {
|
if (pBitmap) {
|
||||||
nWidth = pBitmap->bmWidth;
|
nWidth = pBitmap->bmWidth;
|
||||||
@@ -78,18 +83,22 @@ BOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight)
|
|||||||
pWin->pCaretInfo->nWidth = nWidth;
|
pWin->pCaretInfo->nWidth = nWidth;
|
||||||
pWin->pCaretInfo->nHeight = nHeight;
|
pWin->pCaretInfo->nHeight = nHeight;
|
||||||
pWin->pCaretInfo->caret_bmp.bmType = BMP_TYPE_NORMAL;
|
pWin->pCaretInfo->caret_bmp.bmType = BMP_TYPE_NORMAL;
|
||||||
pWin->pCaretInfo->caret_bmp.bmBitsPerPixel = BITSPERPHYPIXEL;
|
pWin->pCaretInfo->caret_bmp.bmBitsPerPixel =
|
||||||
pWin->pCaretInfo->caret_bmp.bmBytesPerPixel = BYTESPERPHYPIXEL;
|
GetGDCapability(hdc, GDCAP_BITSPP);
|
||||||
|
pWin->pCaretInfo->caret_bmp.bmBytesPerPixel =
|
||||||
|
GetGDCapability(hdc, GDCAP_BPP);
|
||||||
pWin->pCaretInfo->caret_bmp.bmWidth = nWidth;
|
pWin->pCaretInfo->caret_bmp.bmWidth = nWidth;
|
||||||
pWin->pCaretInfo->caret_bmp.bmHeight = nHeight;
|
pWin->pCaretInfo->caret_bmp.bmHeight = nHeight;
|
||||||
pWin->pCaretInfo->caret_bmp.bmAlphaMask = NULL;
|
pWin->pCaretInfo->caret_bmp.bmAlphaMask = NULL;
|
||||||
pWin->pCaretInfo->caret_bmp.bmAlphaPitch = 0;
|
pWin->pCaretInfo->caret_bmp.bmAlphaPitch = 0;
|
||||||
|
|
||||||
pWin->pCaretInfo->nBytesNr = GAL_GetBoxSize (__gal_screen,
|
pWin->pCaretInfo->nBytesNr = GAL_GetBoxSize (dc_HDC2PDC(hdc)->surface,
|
||||||
nWidth, nHeight, &pWin->pCaretInfo->caret_bmp.bmPitch);
|
nWidth, nHeight, &pWin->pCaretInfo->caret_bmp.bmPitch);
|
||||||
pWin->pCaretInfo->pNormal = malloc (pWin->pCaretInfo->nBytesNr);
|
pWin->pCaretInfo->pNormal = malloc (pWin->pCaretInfo->nBytesNr);
|
||||||
pWin->pCaretInfo->pXored = malloc (pWin->pCaretInfo->nBytesNr);
|
pWin->pCaretInfo->pXored = malloc (pWin->pCaretInfo->nBytesNr);
|
||||||
|
|
||||||
|
ReleaseDC(hdc);
|
||||||
|
|
||||||
if (pWin->pCaretInfo->pNormal == NULL ||
|
if (pWin->pCaretInfo->pNormal == NULL ||
|
||||||
pWin->pCaretInfo->pXored == NULL) {
|
pWin->pCaretInfo->pXored == NULL) {
|
||||||
free (pWin->pCaretInfo);
|
free (pWin->pCaretInfo);
|
||||||
@@ -219,8 +228,8 @@ void GetCaretBitmaps (PCARETINFO pCaretInfo)
|
|||||||
int i;
|
int i;
|
||||||
int sx, sy;
|
int sx, sy;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
Uint32 amask;
|
||||||
|
|
||||||
// convert to screen coordinates
|
|
||||||
sx = pCaretInfo->x;
|
sx = pCaretInfo->x;
|
||||||
sy = pCaretInfo->y;
|
sy = pCaretInfo->y;
|
||||||
|
|
||||||
@@ -231,36 +240,68 @@ void GetCaretBitmaps (PCARETINFO pCaretInfo)
|
|||||||
pCaretInfo->caret_bmp.bmWidth,
|
pCaretInfo->caret_bmp.bmWidth,
|
||||||
pCaretInfo->caret_bmp.bmHeight,
|
pCaretInfo->caret_bmp.bmHeight,
|
||||||
&pCaretInfo->caret_bmp);
|
&pCaretInfo->caret_bmp);
|
||||||
|
amask = GetGDCapability(hdc, GDCAP_AMASK);
|
||||||
ReleaseDC (hdc);
|
ReleaseDC (hdc);
|
||||||
|
|
||||||
// generate XOR bitmap.
|
// generate XOR bitmap.
|
||||||
if (pCaretInfo->pBitmap) {
|
if (amask == 0) {
|
||||||
BYTE* normal;
|
BYTE* normal;
|
||||||
BYTE* bitmap;
|
BYTE* bitmap;
|
||||||
BYTE* xored;
|
BYTE* xored;
|
||||||
|
|
||||||
normal = pCaretInfo->pNormal;
|
normal = pCaretInfo->pNormal;
|
||||||
bitmap = pCaretInfo->pBitmap->bmBits;
|
|
||||||
xored = pCaretInfo->pXored;
|
xored = pCaretInfo->pXored;
|
||||||
|
|
||||||
for (i = 0; i < pCaretInfo->nBytesNr; i++)
|
if (pCaretInfo->pBitmap) {
|
||||||
xored[i] = normal[i] ^ bitmap[i];
|
bitmap = pCaretInfo->pBitmap->bmBits;
|
||||||
|
for (i = 0; i < pCaretInfo->nBytesNr; i++)
|
||||||
|
xored[i] = normal[i] ^ bitmap[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (i = 0; i < pCaretInfo->nBytesNr; i++)
|
||||||
|
xored[i] = normal[i] ^ 0xFF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// Since 5.0.11: restore the alpha component if having alpha component.
|
||||||
|
int x, y;
|
||||||
BYTE* normal;
|
BYTE* normal;
|
||||||
BYTE* xored;
|
BYTE* xored;
|
||||||
BYTE xor_byte;
|
BYTE* bitmap = NULL;
|
||||||
|
gal_pixel pix_normal, pix_bitmap, pix_xored, bits_alpha;
|
||||||
|
|
||||||
if (BITSPERPHYPIXEL < 8)
|
for (y = 0; y < pCaretInfo->caret_bmp.bmHeight; y++) {
|
||||||
xor_byte = 0x0F;
|
normal = pCaretInfo->pNormal + pCaretInfo->caret_bmp.bmPitch * y;
|
||||||
else
|
xored = pCaretInfo->pXored + pCaretInfo->caret_bmp.bmPitch * y;
|
||||||
xor_byte = 0xFF;
|
if (pCaretInfo->pBitmap)
|
||||||
|
bitmap = pCaretInfo->pBitmap->bmBits +
|
||||||
|
pCaretInfo->caret_bmp.bmPitch * y;
|
||||||
|
|
||||||
normal = pCaretInfo->pNormal;
|
for (x = 0; x < pCaretInfo->caret_bmp.bmWidth; x++) {
|
||||||
xored = pCaretInfo->pXored;
|
|
||||||
|
|
||||||
for (i = 0; i < pCaretInfo->nBytesNr; i++)
|
pix_normal = _mem_get_pixel(normal,
|
||||||
xored[i] = normal[i] ^ xor_byte;
|
pCaretInfo->caret_bmp.bmBytesPerPixel);
|
||||||
|
if (pCaretInfo->pBitmap) {
|
||||||
|
pix_bitmap = _mem_get_pixel(bitmap,
|
||||||
|
pCaretInfo->caret_bmp.bmBytesPerPixel);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pix_bitmap = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
bits_alpha = pix_normal & amask;
|
||||||
|
pix_xored = pix_normal ^ pix_bitmap;
|
||||||
|
pix_xored &= ~amask;
|
||||||
|
pix_xored |= bits_alpha;
|
||||||
|
_mem_set_pixel(xored,
|
||||||
|
pCaretInfo->caret_bmp.bmBytesPerPixel, pix_xored);
|
||||||
|
|
||||||
|
normal += pCaretInfo->caret_bmp.bmBytesPerPixel;
|
||||||
|
xored += pCaretInfo->caret_bmp.bmBytesPerPixel;
|
||||||
|
if (pCaretInfo->pBitmap)
|
||||||
|
bitmap += pCaretInfo->caret_bmp.bmBytesPerPixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -803,7 +803,7 @@ BOOL GUIAPI InitWindowElementAttrs (PWERENDERER rdr)
|
|||||||
char buff [20];
|
char buff [20];
|
||||||
DWORD rgba;
|
DWORD rgba;
|
||||||
|
|
||||||
if (!rdr || !rdr->name || rdr->name[0] == '\0')
|
if (!rdr || rdr->name[0] == '\0')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
_DBG_PRINTF ("GUI>InitWEA: Initialize %s renderer window element attributes.\n",
|
_DBG_PRINTF ("GUI>InitWEA: Initialize %s renderer window element attributes.\n",
|
||||||
|
|||||||
@@ -71,7 +71,6 @@
|
|||||||
#include "cliprect.h"
|
#include "cliprect.h"
|
||||||
#include "gal.h"
|
#include "gal.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
#include "blockheap.h"
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
|
|
||||||
#define SHORTEN 0
|
#define SHORTEN 0
|
||||||
|
|||||||
+82
-43
File diff suppressed because it is too large
Load Diff
@@ -319,6 +319,19 @@ static void flush_rec (void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void close_rec (void)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
/* TODO: */
|
||||||
|
#else
|
||||||
|
if (record_fd >= 0) {
|
||||||
|
close(record_fd);
|
||||||
|
record_fd = -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void do_record(AUTO_IAL_INPUT_EVENT *event)
|
static void do_record(AUTO_IAL_INPUT_EVENT *event)
|
||||||
{
|
{
|
||||||
@@ -744,6 +757,7 @@ void TermPCXVFBInput (void)
|
|||||||
remove("/tmp/.pcxvfb_tmp");
|
remove("/tmp/.pcxvfb_tmp");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
close_rec();
|
||||||
#endif /* WIN32 */
|
#endif /* WIN32 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ noinst_HEADERS = \
|
|||||||
cursor.h dc.h event.h list.h element.h \
|
cursor.h dc.h event.h list.h element.h \
|
||||||
ial.h inline.h internals.h zorder.h menu.h misc.h \
|
ial.h inline.h internals.h zorder.h menu.h misc.h \
|
||||||
msgstr.h sysfont.h timer.h devfont.h fontname.h \
|
msgstr.h sysfont.h timer.h devfont.h fontname.h \
|
||||||
readbmp.h icon.h blockheap.h rbtree.h \
|
readbmp.h icon.h rbtree.h \
|
||||||
ourhdr.h client.h server.h sharedres.h sockio.h drawsemop.h \
|
ourhdr.h client.h server.h sharedres.h sockio.h drawsemop.h \
|
||||||
gal.h newgal.h memops.h incoreres.h sysres.h clipboard.h \
|
gal.h newgal.h memops.h incoreres.h sysres.h clipboard.h \
|
||||||
glyph.h license.h mgsock.h unicode-ops.h \
|
glyph.h license.h mgsock.h unicode-ops.h \
|
||||||
|
|||||||
+3
-3
@@ -112,11 +112,11 @@ void __mg_legacy_bidi_get_embeddlevels (const CHARSETOPS* charset_ops,
|
|||||||
Uint32 __mg_legacy_bidi_str_base_dir (const CHARSETOPS* charset_ops,
|
Uint32 __mg_legacy_bidi_str_base_dir (const CHARSETOPS* charset_ops,
|
||||||
Achar32* achars, int len);
|
Achar32* achars, int len);
|
||||||
|
|
||||||
|
Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||||
|
Achar32* achars, int len, int pel, ACHARMAPINFO* map);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Deprecated
|
// Deprecated
|
||||||
Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
|
||||||
Achar32* achars, int len, GLYPHMAPINFO* map, int pel);
|
|
||||||
|
|
||||||
Achar32* __mg_legacy_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
Achar32* __mg_legacy_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||||
Achar32* achars, int len, int* index_map, int pel);
|
Achar32* achars, int len, int* index_map, int pel);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ struct _SCALER_INFO_FILLBMP
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
struct _SCALER_INFO_FILLBMP scaler_info;
|
struct _SCALER_INFO_FILLBMP scaler_info;
|
||||||
GAL_Rect dst_rect;
|
GAL_Rect dst_rect;
|
||||||
int old_bkmode;
|
|
||||||
|
|
||||||
BYTE* decoded_buff;
|
BYTE* decoded_buff;
|
||||||
BYTE* decoded_alpha_buff;
|
BYTE* decoded_alpha_buff;
|
||||||
|
|||||||
@@ -47,6 +47,8 @@
|
|||||||
** blockheap.h: the head file of heap for block data.
|
** blockheap.h: the head file of heap for block data.
|
||||||
**
|
**
|
||||||
** Create date: 2001/01/10
|
** Create date: 2001/01/10
|
||||||
|
**
|
||||||
|
** DEPRECATED, USE window.h INSTEAD.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GUI_BLOCKHEAP_H
|
#ifndef GUI_BLOCKHEAP_H
|
||||||
@@ -55,7 +57,7 @@
|
|||||||
#ifndef _MGUI_GDI_H /* included in include/gdi.h */
|
#ifndef _MGUI_GDI_H /* included in include/gdi.h */
|
||||||
|
|
||||||
struct _BLOCKHEAP {
|
struct _BLOCKHEAP {
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
#endif
|
#endif
|
||||||
/* Size of one block element. */
|
/* Size of one block element. */
|
||||||
+7
-2
@@ -93,7 +93,7 @@ typedef struct tagDC* PDC;
|
|||||||
# else /* not defined _MGSCHEMA_COMPOSITING */
|
# else /* not defined _MGSCHEMA_COMPOSITING */
|
||||||
void __mg_lock_recalc_gcrinfo (PDC pdc);
|
void __mg_lock_recalc_gcrinfo (PDC pdc);
|
||||||
void __mg_unlock_gcrinfo (PDC pdc);
|
void __mg_unlock_gcrinfo (PDC pdc);
|
||||||
#define LOCK_GCRINFO(pdc) __mg_lock_recalc_gcrinfo (pdc)
|
#define LOCK_GCRINFO(pdc) if (dc_IsGeneralDC(pdc)) __mg_lock_recalc_gcrinfo (pdc)
|
||||||
#define UNLOCK_GCRINFO(pdc) if (dc_IsGeneralDC(pdc)) __mg_unlock_gcrinfo (pdc)
|
#define UNLOCK_GCRINFO(pdc) if (dc_IsGeneralDC(pdc)) __mg_unlock_gcrinfo (pdc)
|
||||||
# endif /* not defined _MGSCHEMA_COMPOSITING */
|
# endif /* not defined _MGSCHEMA_COMPOSITING */
|
||||||
|
|
||||||
@@ -167,6 +167,8 @@ struct tagDC
|
|||||||
/* surface of this DC */
|
/* surface of this DC */
|
||||||
GAL_Surface* surface;
|
GAL_Surface* surface;
|
||||||
|
|
||||||
|
char __first_attr[0]; // just a zero-length field for the first attribute
|
||||||
|
|
||||||
/* background color */
|
/* background color */
|
||||||
gal_pixel bkcolor;
|
gal_pixel bkcolor;
|
||||||
|
|
||||||
@@ -179,7 +181,7 @@ struct tagDC
|
|||||||
/* text color */
|
/* text color */
|
||||||
gal_pixel textcolor;
|
gal_pixel textcolor;
|
||||||
|
|
||||||
int bkmode;
|
int bkmode_set; /* the background mode set by user (5.0.12, Issue #107) */
|
||||||
|
|
||||||
int tabstop;
|
int tabstop;
|
||||||
int cExtra; /* Character extra */
|
int cExtra; /* Character extra */
|
||||||
@@ -213,6 +215,8 @@ struct tagDC
|
|||||||
size_t dash_list_len;
|
size_t dash_list_len;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char __last_attr[0]; // just a zero-length field for the last attribute
|
||||||
|
|
||||||
PLOGFONT pLogFont;
|
PLOGFONT pLogFont;
|
||||||
|
|
||||||
POINT CurPenPos;
|
POINT CurPenPos;
|
||||||
@@ -247,6 +251,7 @@ struct tagDC
|
|||||||
gal_pixel skip_pixel;
|
gal_pixel skip_pixel;
|
||||||
gal_pixel cur_pixel;
|
gal_pixel cur_pixel;
|
||||||
int step;
|
int step;
|
||||||
|
int bkmode; /* the effective background mode */
|
||||||
/* ====================================================================== */
|
/* ====================================================================== */
|
||||||
|
|
||||||
CLIPRECT* cur_ban;
|
CLIPRECT* cur_ban;
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ typedef LWEVENT* PLWEVENT;
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
extern DWORD __mg_timeout_usec;
|
||||||
|
extern DWORD __mg_repeat_usec;
|
||||||
|
|
||||||
// The entrance of low level event handling thread
|
// The entrance of low level event handling thread
|
||||||
BOOL mg_InitLWEvent (void);
|
BOOL mg_InitLWEvent (void);
|
||||||
void mg_TerminateLWEvent (void);
|
void mg_TerminateLWEvent (void);
|
||||||
|
|||||||
+13
-6
@@ -84,15 +84,18 @@
|
|||||||
#define WS_EX_MODALDISABLED 0x10000000L
|
#define WS_EX_MODALDISABLED 0x10000000L
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \def WS_EX_CTRLASMAINWIN
|
* Internal extended style:
|
||||||
* \brief The control can be displayed out of the main window
|
* The control can be displayed out of the main window
|
||||||
* which contains the control.
|
* which contains the control.
|
||||||
*/
|
*/
|
||||||
#define WS_EX_CTRLASMAINWIN 0x20000000L
|
#define WS_EX_CTRLASMAINWIN 0x20000000L
|
||||||
|
|
||||||
/* Internal extended style. */
|
/* Internal extended style: dialog box. */
|
||||||
#define WS_EX_DIALOGBOX 0x40000000L
|
#define WS_EX_DIALOGBOX 0x40000000L
|
||||||
|
|
||||||
|
/* Internal extended style: activated. */
|
||||||
|
#define WS_EX_ACTIVATED 0x80000000L
|
||||||
|
|
||||||
/* Make sure the internal window extended styles above are ok */
|
/* Make sure the internal window extended styles above are ok */
|
||||||
#define MGUI_COMPILE_TIME_ASSERT(name, x) \
|
#define MGUI_COMPILE_TIME_ASSERT(name, x) \
|
||||||
typedef int MGUI_dummy_ ## name[((x)?1:0) * 2 - 1]
|
typedef int MGUI_dummy_ ## name[((x)?1:0) * 2 - 1]
|
||||||
@@ -101,6 +104,10 @@ MGUI_COMPILE_TIME_ASSERT(ws_ex_int_1,
|
|||||||
WS_EX_INTERNAL_MASK & WS_EX_MODALDISABLED);
|
WS_EX_INTERNAL_MASK & WS_EX_MODALDISABLED);
|
||||||
MGUI_COMPILE_TIME_ASSERT(ws_ex_int_2,
|
MGUI_COMPILE_TIME_ASSERT(ws_ex_int_2,
|
||||||
WS_EX_INTERNAL_MASK & WS_EX_CTRLASMAINWIN);
|
WS_EX_INTERNAL_MASK & WS_EX_CTRLASMAINWIN);
|
||||||
|
MGUI_COMPILE_TIME_ASSERT(ws_ex_int_3,
|
||||||
|
WS_EX_INTERNAL_MASK & WS_EX_DIALOGBOX);
|
||||||
|
MGUI_COMPILE_TIME_ASSERT(ws_ex_int_4,
|
||||||
|
WS_EX_INTERNAL_MASK & WS_EX_ACTIVATED);
|
||||||
|
|
||||||
#undef MGUI_COMPILE_TIME_ASSERT
|
#undef MGUI_COMPILE_TIME_ASSERT
|
||||||
|
|
||||||
@@ -772,8 +779,8 @@ static inline PMSGQUEUE getMsgQueue (HWND hWnd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MSGQUEUE* mg_AllocMsgQueueForThisThread (void);
|
MSGQUEUE* mg_AllocMsgQueueForThisThread (BOOL sign_in);
|
||||||
void mg_FreeMsgQueueForThisThread (void);
|
void mg_FreeMsgQueueForThisThread (BOOL sign_off);
|
||||||
|
|
||||||
/* Since 5.0.0 */
|
/* Since 5.0.0 */
|
||||||
int __mg_throw_away_messages (PMSGQUEUE pMsgQueue, HWND hWnd);
|
int __mg_throw_away_messages (PMSGQUEUE pMsgQueue, HWND hWnd);
|
||||||
|
|||||||
@@ -55,9 +55,9 @@
|
|||||||
#ifndef GUI_NEWGAL_H
|
#ifndef GUI_NEWGAL_H
|
||||||
#define GUI_NEWGAL_H
|
#define GUI_NEWGAL_H
|
||||||
|
|
||||||
|
#include "minigui.h"
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "blockheap.h"
|
|
||||||
|
|
||||||
#if IS_COMPOSITING_SCHEMA
|
#if IS_COMPOSITING_SCHEMA
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -735,10 +735,10 @@ GAL_bool GAL_IntersectRect (const GAL_Rect *A, const GAL_Rect *B,
|
|||||||
Bmin = B->x;
|
Bmin = B->x;
|
||||||
Bmax = Bmin + B->w;
|
Bmax = Bmin + B->w;
|
||||||
if (Bmin > Amin)
|
if (Bmin > Amin)
|
||||||
Amin = Bmin;
|
Amin = Bmin;
|
||||||
intersection->x = Amin;
|
intersection->x = Amin;
|
||||||
if (Bmax < Amax)
|
if (Bmax < Amax)
|
||||||
Amax = Bmax;
|
Amax = Bmax;
|
||||||
intersection->w = Amax - Amin > 0 ? Amax - Amin : 0;
|
intersection->w = Amax - Amin > 0 ? Amax - Amin : 0;
|
||||||
|
|
||||||
/* Vertical intersection */
|
/* Vertical intersection */
|
||||||
@@ -747,10 +747,10 @@ GAL_bool GAL_IntersectRect (const GAL_Rect *A, const GAL_Rect *B,
|
|||||||
Bmin = B->y;
|
Bmin = B->y;
|
||||||
Bmax = Bmin + B->h;
|
Bmax = Bmin + B->h;
|
||||||
if (Bmin > Amin)
|
if (Bmin > Amin)
|
||||||
Amin = Bmin;
|
Amin = Bmin;
|
||||||
intersection->y = Amin;
|
intersection->y = Amin;
|
||||||
if (Bmax < Amax)
|
if (Bmax < Amax)
|
||||||
Amax = Bmax;
|
Amax = Bmax;
|
||||||
intersection->h = Amax - Amin > 0 ? Amax - Amin : 0;
|
intersection->h = Amax - Amin > 0 ? Amax - Amin : 0;
|
||||||
|
|
||||||
return (intersection->w && intersection->h);
|
return (intersection->w && intersection->h);
|
||||||
@@ -1067,8 +1067,8 @@ GAL_Surface* __drm_create_surface_from_name (GHANDLE video,
|
|||||||
uint32_t name, uint32_t drm_format, uint32_t pixels_off,
|
uint32_t name, uint32_t drm_format, uint32_t pixels_off,
|
||||||
uint32_t width, uint32_t height, uint32_t pitch);
|
uint32_t width, uint32_t height, uint32_t pitch);
|
||||||
|
|
||||||
GAL_Surface* __drm_create_surface_from_handle (GHANDLE video,
|
GAL_Surface* __drm_create_surface_from_handle (GHANDLE video, uint32_t handle,
|
||||||
uint32_t handle, size_t size, uint32_t drm_format, uint32_t pixels_off,
|
size_t size, uint32_t drm_format, uint32_t pixels_off,
|
||||||
uint32_t width, uint32_t height, uint32_t pitch);
|
uint32_t width, uint32_t height, uint32_t pitch);
|
||||||
|
|
||||||
GAL_Surface* __drm_create_surface_from_prime_fd (GHANDLE video,
|
GAL_Surface* __drm_create_surface_from_prime_fd (GHANDLE video,
|
||||||
|
|||||||
@@ -141,11 +141,17 @@ typedef struct _ZORDERINFO {
|
|||||||
/* The size of usage bitmap for mask rect. */
|
/* The size of usage bitmap for mask rect. */
|
||||||
int size_maskrect_usage_bmp;
|
int size_maskrect_usage_bmp;
|
||||||
|
|
||||||
|
/* use read/write lock for Unix-like OS */
|
||||||
|
#ifndef __NOUNIX__
|
||||||
|
#define __ZI_USE_RWLOCK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGRM_THREADS
|
||||||
# ifndef __NOUNIX__
|
# ifdef __ZI_USE_RWLOCK
|
||||||
pthread_rwlock_t rwlock;
|
pthread_rwlock_t rwlock;
|
||||||
|
pthread_t rwlock_owner;
|
||||||
# else
|
# else
|
||||||
pthread_mutex_t rwlock;
|
pthread_mutex_t mutex;
|
||||||
# endif
|
# endif
|
||||||
#elif defined(_MGRM_PROCESSES)
|
#elif defined(_MGRM_PROCESSES)
|
||||||
int zi_semid;
|
int zi_semid;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# also for makefile.ng and makefile.msvc
|
# also for makefile.ng and makefile.msvc
|
||||||
AM_CPPFLAGS = -I$(abs_top_srcdir)/src/include -I$(abs_top_srcdir)/include
|
AM_CPPFLAGS = -I$(abs_top_srcdir)/src/include -I$(abs_top_srcdir)/include
|
||||||
|
AM_CFLAGS = -Wno-zero-length-bounds
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libkernel.la
|
noinst_LTLIBRARIES = libkernel.la
|
||||||
|
|
||||||
|
|||||||
@@ -59,13 +59,13 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "minigui.h"
|
#include "minigui.h"
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
|
#include "window.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "blockheap.h"
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
BOOL InitBlockDataHeap (PBLOCKHEAP heap, size_t sz_block, size_t sz_heap)
|
BOOL InitBlockDataHeap (PBLOCKHEAP heap, size_t sz_block, size_t sz_heap)
|
||||||
{
|
{
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_init (&heap->lock, NULL);
|
pthread_mutex_init (&heap->lock, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ void* BlockDataAlloc (PBLOCKHEAP heap)
|
|||||||
int free_slot;
|
int free_slot;
|
||||||
unsigned char* block_data = NULL;
|
unsigned char* block_data = NULL;
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_lock (&heap->lock);
|
pthread_mutex_lock (&heap->lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ void* BlockDataAlloc (PBLOCKHEAP heap)
|
|||||||
|
|
||||||
ret:
|
ret:
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_unlock (&heap->lock);
|
pthread_mutex_unlock (&heap->lock);
|
||||||
#endif
|
#endif
|
||||||
return block_data;
|
return block_data;
|
||||||
@@ -128,7 +128,7 @@ void BlockDataFree (PBLOCKHEAP heap, void* data)
|
|||||||
{
|
{
|
||||||
unsigned char* block_data = data;
|
unsigned char* block_data = data;
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_lock (&heap->lock);
|
pthread_mutex_lock (&heap->lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ void BlockDataFree (PBLOCKHEAP heap, void* data)
|
|||||||
heap, slot);
|
heap, slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_unlock (&heap->lock);
|
pthread_mutex_unlock (&heap->lock);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -193,7 +193,7 @@ void DestroyBlockDataHeap (PBLOCKHEAP heap)
|
|||||||
free (heap->usage_bmp);
|
free (heap->usage_bmp);
|
||||||
heap->usage_bmp = NULL;
|
heap->usage_bmp = NULL;
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_destroy (&heap->lock);
|
pthread_mutex_destroy (&heap->lock);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2021, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -489,7 +489,7 @@ const CompositorOps* GUIAPI ServerGetCompositorOps (const char* name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (i = 0; i < MAX_NR_COMPOSITORS; i++) {
|
for (i = 0; i < MAX_NR_COMPOSITORS; i++) {
|
||||||
if (compositors [i].name && strcmp (compositors [i].name, name) == 0) {
|
if (strcmp (compositors [i].name, name) == 0) {
|
||||||
return compositors [i].ops;
|
return compositors [i].ops;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ static int dskAddNewMainWindow (PMAINWIN pWin)
|
|||||||
|
|
||||||
if (pWin->secondaryDC == HDC_INVALID) {
|
if (pWin->secondaryDC == HDC_INVALID) {
|
||||||
/* remove the flag of WS_EX_AUTOSECONDARYDC */
|
/* remove the flag of WS_EX_AUTOSECONDARYDC */
|
||||||
pWin->dwExStyle = pWin->dwExStyle | WS_EX_AUTOSECONDARYDC;
|
pWin->dwExStyle &= ~WS_EX_AUTOSECONDARYDC;
|
||||||
pWin->secondaryDC = 0;
|
pWin->secondaryDC = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1403,7 +1403,7 @@ static LRESULT WindowMessageHandler(UINT message, PMAINWIN pWin, LPARAM lParam)
|
|||||||
else {
|
else {
|
||||||
from = 0;
|
from = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_zi_for_read (zi);
|
lock_zi_for_read (zi);
|
||||||
|
|
||||||
from = __kernel_get_next_znode (zi, from);
|
from = __kernel_get_next_znode (zi, from);
|
||||||
@@ -1429,6 +1429,8 @@ static LRESULT WindowMessageHandler(UINT message, PMAINWIN pWin, LPARAM lParam)
|
|||||||
/* Since 5.0.0 */
|
/* Since 5.0.0 */
|
||||||
case MSG_SETAUTOREPEAT:
|
case MSG_SETAUTOREPEAT:
|
||||||
sg_msgAutoRepeat = *(const MSG*)lParam;
|
sg_msgAutoRepeat = *(const MSG*)lParam;
|
||||||
|
/* start auto-repeat after 300ms */
|
||||||
|
sg_msgAutoRepeat.time = __mg_tick_counter + (__mg_timeout_usec/10000);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Since 5.0.0 */
|
/* Since 5.0.0 */
|
||||||
@@ -1743,11 +1745,6 @@ static int dskOnRemoveCtrlInstance (PCONTROL pParent, PCONTROL pCtrl)
|
|||||||
FreeZOrderNode (0, pCtrl->idx_znode, NULL);
|
FreeZOrderNode (0, pCtrl->idx_znode, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fFound) {
|
|
||||||
pCtrl->pcci->nUseCount --;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((HWND)pCtrl == __mg_captured_wnd) {
|
if ((HWND)pCtrl == __mg_captured_wnd) {
|
||||||
/* force release the capture */
|
/* force release the capture */
|
||||||
__mg_captured_wnd = 0;
|
__mg_captured_wnd = 0;
|
||||||
@@ -1762,6 +1759,11 @@ static int dskOnRemoveCtrlInstance (PCONTROL pParent, PCONTROL pCtrl)
|
|||||||
sg_msgAutoRepeat.hwnd = 0;
|
sg_msgAutoRepeat.hwnd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fFound) {
|
||||||
|
pCtrl->pcci->nUseCount--;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1821,7 +1823,7 @@ static void dskRefreshAllWindow (const RECT* invrc)
|
|||||||
info.is_empty_invrc = TRUE;
|
info.is_empty_invrc = TRUE;
|
||||||
|
|
||||||
#ifdef _MGHAVE_MENU
|
#ifdef _MGHAVE_MENU
|
||||||
dskForceCloseMenu ();
|
dskForceCloseMenu ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SendMessage (HWND_DESKTOP, MSG_ERASEDESKTOP, 0,
|
SendMessage (HWND_DESKTOP, MSG_ERASEDESKTOP, 0,
|
||||||
@@ -1873,9 +1875,12 @@ static void dskOnTimeout (void)
|
|||||||
static DWORD uCounter = 0;
|
static DWORD uCounter = 0;
|
||||||
static DWORD blink_counter = 0;
|
static DWORD blink_counter = 0;
|
||||||
|
|
||||||
if (sg_msgAutoRepeat.hwnd != 0) {
|
if (sg_msgAutoRepeat.hwnd != 0 &&
|
||||||
|
__mg_tick_counter >= sg_msgAutoRepeat.time) {
|
||||||
PostMessage (sg_msgAutoRepeat.hwnd, sg_msgAutoRepeat.message,
|
PostMessage (sg_msgAutoRepeat.hwnd, sg_msgAutoRepeat.message,
|
||||||
sg_msgAutoRepeat.wParam, sg_msgAutoRepeat.lParam);
|
sg_msgAutoRepeat.wParam, sg_msgAutoRepeat.lParam);
|
||||||
|
/* next auto-repeat msg after 50ms */
|
||||||
|
sg_msgAutoRepeat.time = __mg_tick_counter + (__mg_repeat_usec/10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__mg_tick_counter < (blink_counter + 10))
|
if (__mg_tick_counter < (blink_counter + 10))
|
||||||
|
|||||||
+13
-15
@@ -78,6 +78,7 @@
|
|||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "drawsemop.h"
|
#include "drawsemop.h"
|
||||||
#include "devfont.h"
|
#include "devfont.h"
|
||||||
|
#include "event.h"
|
||||||
|
|
||||||
/******************************* global data *********************************/
|
/******************************* global data *********************************/
|
||||||
PMSGQUEUE __mg_dsk_msg_queue;
|
PMSGQUEUE __mg_dsk_msg_queue;
|
||||||
@@ -231,14 +232,6 @@ static void init_desktop_win (void)
|
|||||||
|
|
||||||
BOOL mg_InitDesktop (void)
|
BOOL mg_InitDesktop (void)
|
||||||
{
|
{
|
||||||
#if 0 /* move to init-lite.c */
|
|
||||||
/* Since 5.0.0: allocate message queue for desktop thread */
|
|
||||||
if (!(__mg_dsk_msg_queue = mg_AllocMsgQueueForThisThread ()) ) {
|
|
||||||
_WRN_PRINTF ("failed to allocate message queue\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif /* moved code */
|
|
||||||
|
|
||||||
#ifndef _MGSCHEMA_COMPOSITING
|
#ifndef _MGSCHEMA_COMPOSITING
|
||||||
/* Init heap of clipping rects. */
|
/* Init heap of clipping rects. */
|
||||||
InitFreeClipRectList (&sg_FreeClipRectList, SIZE_CLIPRECTHEAP);
|
InitFreeClipRectList (&sg_FreeClipRectList, SIZE_CLIPRECTHEAP);
|
||||||
@@ -259,7 +252,7 @@ BOOL mg_InitDesktop (void)
|
|||||||
void mg_TerminateDesktop (void)
|
void mg_TerminateDesktop (void)
|
||||||
{
|
{
|
||||||
/* Since 5.0.0: message queue for desktop thread was dynamically allocated */
|
/* Since 5.0.0: message queue for desktop thread was dynamically allocated */
|
||||||
mg_FreeMsgQueueForThisThread ();
|
mg_FreeMsgQueueForThisThread (TRUE);
|
||||||
__mg_dsk_msg_queue = NULL;
|
__mg_dsk_msg_queue = NULL;
|
||||||
|
|
||||||
#ifndef _MGSCHEMA_COMPOSITING
|
#ifndef _MGSCHEMA_COMPOSITING
|
||||||
@@ -2756,6 +2749,8 @@ static LRESULT dskWindowMessageHandler (UINT message,
|
|||||||
/* Since 5.0.0 */
|
/* Since 5.0.0 */
|
||||||
case MSG_SETAUTOREPEAT:
|
case MSG_SETAUTOREPEAT:
|
||||||
sg_msgAutoRepeat = *(const MSG*)lParam;
|
sg_msgAutoRepeat = *(const MSG*)lParam;
|
||||||
|
/* start auto-repeat after 300ms */
|
||||||
|
sg_msgAutoRepeat.time = __mg_tick_counter + (__mg_timeout_usec/10000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3553,11 +3548,6 @@ static int dskOnRemoveCtrlInstance (PCONTROL pParent, PCONTROL pCtrl)
|
|||||||
cliFreeZOrderNode ((PMAINWIN)pCtrl);
|
cliFreeZOrderNode ((PMAINWIN)pCtrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fFound) {
|
|
||||||
pCtrl->pcci->nUseCount --;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((HWND)pCtrl == __mg_captured_wnd) {
|
if ((HWND)pCtrl == __mg_captured_wnd) {
|
||||||
/* force release the capture */
|
/* force release the capture */
|
||||||
__mg_captured_wnd = 0;
|
__mg_captured_wnd = 0;
|
||||||
@@ -3572,6 +3562,11 @@ static int dskOnRemoveCtrlInstance (PCONTROL pParent, PCONTROL pCtrl)
|
|||||||
sg_msgAutoRepeat.hwnd = 0;
|
sg_msgAutoRepeat.hwnd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fFound) {
|
||||||
|
pCtrl->pcci->nUseCount--;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4212,9 +4207,12 @@ static void dskOnTimeout (void)
|
|||||||
static UINT uCounter = 0;
|
static UINT uCounter = 0;
|
||||||
static UINT blink_counter = 0;
|
static UINT blink_counter = 0;
|
||||||
|
|
||||||
if (sg_msgAutoRepeat.hwnd != 0) {
|
if (sg_msgAutoRepeat.hwnd != 0 &&
|
||||||
|
__mg_tick_counter >= sg_msgAutoRepeat.time) {
|
||||||
PostMessage (sg_msgAutoRepeat.hwnd, sg_msgAutoRepeat.message,
|
PostMessage (sg_msgAutoRepeat.hwnd, sg_msgAutoRepeat.message,
|
||||||
sg_msgAutoRepeat.wParam, sg_msgAutoRepeat.lParam);
|
sg_msgAutoRepeat.wParam, sg_msgAutoRepeat.lParam);
|
||||||
|
/* next auto-repeat msg after 50ms */
|
||||||
|
sg_msgAutoRepeat.time = __mg_tick_counter + (__mg_repeat_usec/10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__mg_tick_counter < (blink_counter + 10))
|
if (__mg_tick_counter < (blink_counter + 10))
|
||||||
|
|||||||
@@ -74,6 +74,7 @@
|
|||||||
#include "dc.h"
|
#include "dc.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "devfont.h"
|
#include "devfont.h"
|
||||||
|
#include "event.h"
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include <sys/termios.h>
|
#include <sys/termios.h>
|
||||||
@@ -102,14 +103,6 @@ BOOL mg_InitDesktop (void)
|
|||||||
int ret;
|
int ret;
|
||||||
RECT rcScr = GetScreenRect();
|
RECT rcScr = GetScreenRect();
|
||||||
|
|
||||||
#if 0 /* move to init-lite.c */
|
|
||||||
/* Since 5.0.0: allocate message queue for desktop thread */
|
|
||||||
if (!(__mg_dsk_msg_queue = mg_AllocMsgQueueForThisThread ()) ) {
|
|
||||||
_WRN_PRINTF ("failed to allocate message queue\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif /* moved code */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init ZOrderInfo here.
|
* Init ZOrderInfo here.
|
||||||
*/
|
*/
|
||||||
@@ -153,7 +146,7 @@ BOOL mg_InitDesktop (void)
|
|||||||
void mg_TerminateDesktop (void)
|
void mg_TerminateDesktop (void)
|
||||||
{
|
{
|
||||||
if (__mg_dsk_msg_queue) {
|
if (__mg_dsk_msg_queue) {
|
||||||
mg_FreeMsgQueueForThisThread ();
|
mg_FreeMsgQueueForThisThread (TRUE);
|
||||||
__mg_dsk_msg_queue = NULL;
|
__mg_dsk_msg_queue = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@
|
|||||||
#include "dc.h"
|
#include "dc.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "devfont.h"
|
#include "devfont.h"
|
||||||
|
#include "event.h"
|
||||||
|
|
||||||
/******************************* global data *********************************/
|
/******************************* global data *********************************/
|
||||||
/* pointer to desktop message queue */
|
/* pointer to desktop message queue */
|
||||||
@@ -145,7 +146,7 @@ void* __kernel_desktop_main (void* data)
|
|||||||
MSG Msg;
|
MSG Msg;
|
||||||
|
|
||||||
/* init message queue of desktop thread */
|
/* init message queue of desktop thread */
|
||||||
if (!(__mg_dsk_msg_queue = mg_AllocMsgQueueForThisThread ()) ) {
|
if (!(__mg_dsk_msg_queue = mg_AllocMsgQueueForThisThread (TRUE)) ) {
|
||||||
_ERR_PRINTF ("failed to allocate message queue\n");
|
_ERR_PRINTF ("failed to allocate message queue\n");
|
||||||
sem_post ((sem_t*)data);
|
sem_post ((sem_t*)data);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -191,7 +192,7 @@ void* __kernel_desktop_main (void* data)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
mg_FreeMsgQueueForThisThread ();
|
mg_FreeMsgQueueForThisThread (TRUE);
|
||||||
__mg_dsk_msg_queue = NULL;
|
__mg_dsk_msg_queue = NULL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-29
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -597,55 +597,63 @@ static void reset_window (PMAINWIN pWin, RECT* rcWin)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGRM_THREADS
|
||||||
#ifndef __NOUNIX__
|
# ifdef __ZI_USE_RWLOCK
|
||||||
/*for unix system, using read/write lock*/
|
static inline void lock_zi_for_change (ZORDERINFO* zi)
|
||||||
static inline void lock_zi_for_change (const ZORDERINFO* zi)
|
|
||||||
{
|
{
|
||||||
pthread_rwlock_wrlock(&((ZORDERINFO*)zi)->rwlock);
|
pthread_rwlock_wrlock(&zi->rwlock);
|
||||||
|
zi->rwlock_owner = pthread_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void unlock_zi_for_change (const ZORDERINFO* zi)
|
static inline void unlock_zi_for_change (ZORDERINFO* zi)
|
||||||
{
|
{
|
||||||
pthread_rwlock_unlock(&((ZORDERINFO*)zi)->rwlock);
|
pthread_rwlock_unlock(&zi->rwlock);
|
||||||
|
zi->rwlock_owner = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void lock_zi_for_read (const ZORDERINFO* zi)
|
static inline void lock_zi_for_read (ZORDERINFO* zi)
|
||||||
{
|
{
|
||||||
pthread_rwlock_rdlock(&((ZORDERINFO*)zi)->rwlock);
|
if (zi->rwlock_owner == pthread_self()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_rwlock_rdlock(&zi->rwlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void unlock_zi_for_read (const ZORDERINFO* zi)
|
static inline void unlock_zi_for_read (ZORDERINFO* zi)
|
||||||
{
|
{
|
||||||
pthread_rwlock_unlock(&((ZORDERINFO*)zi)->rwlock);
|
if (zi->rwlock_owner == pthread_self()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_rwlock_unlock(&zi->rwlock);
|
||||||
}
|
}
|
||||||
#else /* __NOUNIX__ */
|
# else /* __ZI_USE_RWLOCK */
|
||||||
/*for non-unix system, using mutex*/
|
static inline void lock_zi_for_change (ZORDERINFO* zi)
|
||||||
static inline void lock_zi_for_change (const ZORDERINFO* zi)
|
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&((ZORDERINFO*)zi)->rwlock);
|
pthread_mutex_lock(&zi->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void unlock_zi_for_change (const ZORDERINFO* zi)
|
static inline void unlock_zi_for_change (ZORDERINFO* zi)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&((ZORDERINFO*)zi)->rwlock);
|
pthread_mutex_unlock(&zi->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void lock_zi_for_read (const ZORDERINFO* zi)
|
static inline void lock_zi_for_read (ZORDERINFO* zi)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&((ZORDERINFO*)zi)->rwlock);
|
pthread_mutex_lock(&zi->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void unlock_zi_for_read (const ZORDERINFO* zi)
|
static inline void unlock_zi_for_read (ZORDERINFO* zi)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&((ZORDERINFO*)zi)->rwlock);
|
pthread_mutex_unlock(&zi->mutex);
|
||||||
}
|
}
|
||||||
#endif /* __NOUNIX__ */
|
# endif /* notdef __ZI_USE_RWLOCK */
|
||||||
|
|
||||||
#elif defined(_MGRM_STANDALONE)
|
#elif defined(_MGRM_STANDALONE)
|
||||||
static inline void lock_zi_for_change (const ZORDERINFO* zi) { }
|
static inline void lock_zi_for_change (ZORDERINFO* zi) { }
|
||||||
static inline void unlock_zi_for_change (const ZORDERINFO* zi) { }
|
static inline void unlock_zi_for_change (ZORDERINFO* zi) { }
|
||||||
static inline void lock_zi_for_read (const ZORDERINFO* zi) { }
|
static inline void lock_zi_for_read (ZORDERINFO* zi) { }
|
||||||
static inline void unlock_zi_for_read (const ZORDERINFO* zi) { }
|
static inline void unlock_zi_for_read (ZORDERINFO* zi) { }
|
||||||
#else /* for procs */
|
#else /* for procs */
|
||||||
/* NULL. see desktop-procs.c */
|
/* NULL. see desktop-procs.c */
|
||||||
#endif /* _MGRM_THREADS */
|
#endif /* _MGRM_THREADS */
|
||||||
@@ -3641,6 +3649,9 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin)
|
|||||||
|
|
||||||
do_for_all_znodes (&rcOld, zi, _cb_update_znode, ZT_ALL);
|
do_for_all_znodes (&rcOld, zi, _cb_update_znode, ZT_ALL);
|
||||||
|
|
||||||
|
/* unlock zi for change ... */
|
||||||
|
unlock_zi_for_change (zi);
|
||||||
|
|
||||||
if (nodes [0].flags & ZOF_IF_REFERENCE) {
|
if (nodes [0].flags & ZOF_IF_REFERENCE) {
|
||||||
SendMessage (HWND_DESKTOP,
|
SendMessage (HWND_DESKTOP,
|
||||||
MSG_ERASEDESKTOP, 0, (LPARAM)&rcOld);
|
MSG_ERASEDESKTOP, 0, (LPARAM)&rcOld);
|
||||||
@@ -3680,9 +3691,6 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin)
|
|||||||
|
|
||||||
update_client_window_rgn (nodes [idx_znode].cli,
|
update_client_window_rgn (nodes [idx_znode].cli,
|
||||||
nodes [idx_znode].hwnd);
|
nodes [idx_znode].hwnd);
|
||||||
|
|
||||||
/* unlock zi for change ... */
|
|
||||||
unlock_zi_for_change (zi);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lock_zi_for_change (zi);
|
lock_zi_for_change (zi);
|
||||||
@@ -4499,7 +4507,9 @@ int __mg_join_all_message_threads (void)
|
|||||||
|
|
||||||
list_for_each (l, &msg_queue_list) {
|
list_for_each (l, &msg_queue_list) {
|
||||||
MSGQUEUE *msg_queue = (MSGQUEUE*)l;
|
MSGQUEUE *msg_queue = (MSGQUEUE*)l;
|
||||||
|
#ifndef NDEBUG
|
||||||
dump_message_queue (msg_queue, __func__);
|
dump_message_queue (msg_queue, __func__);
|
||||||
|
#endif
|
||||||
pthread_cancel (msg_queue->th);
|
pthread_cancel (msg_queue->th);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-13
@@ -89,8 +89,9 @@
|
|||||||
|
|
||||||
struct timeval __mg_event_timeout;
|
struct timeval __mg_event_timeout;
|
||||||
|
|
||||||
static DWORD timeoutusec;
|
DWORD __mg_timeout_usec;
|
||||||
static DWORD repeatusec;
|
DWORD __mg_repeat_usec;
|
||||||
|
|
||||||
static DWORD dblclicktime;
|
static DWORD dblclicktime;
|
||||||
|
|
||||||
#ifndef _MGRM_THREADS
|
#ifndef _MGRM_THREADS
|
||||||
@@ -121,8 +122,8 @@ static void GetTimeout (void)
|
|||||||
char szValue [11];
|
char szValue [11];
|
||||||
int mytimeoutusec, myrepeatusec;
|
int mytimeoutusec, myrepeatusec;
|
||||||
|
|
||||||
timeoutusec = DEF_USEC_TIMEOUT;
|
__mg_timeout_usec = DEF_USEC_TIMEOUT;
|
||||||
repeatusec = DEF_REPEAT_TIME;
|
__mg_repeat_usec = DEF_REPEAT_TIME;
|
||||||
|
|
||||||
if (GetMgEtcValue (EVENTPARA, EVENTPARA_REPEATUSEC, szValue, 10) < 0)
|
if (GetMgEtcValue (EVENTPARA, EVENTPARA_REPEATUSEC, szValue, 10) < 0)
|
||||||
return;
|
return;
|
||||||
@@ -133,8 +134,8 @@ static void GetTimeout (void)
|
|||||||
mytimeoutusec = atoi(szValue);
|
mytimeoutusec = atoi(szValue);
|
||||||
|
|
||||||
if (myrepeatusec >= 0 && mytimeoutusec > 0) {
|
if (myrepeatusec >= 0 && mytimeoutusec > 0) {
|
||||||
timeoutusec = mytimeoutusec;
|
__mg_timeout_usec = mytimeoutusec;
|
||||||
repeatusec = myrepeatusec;
|
__mg_repeat_usec = myrepeatusec;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,7 +209,7 @@ static void ResetKeyEvent(void)
|
|||||||
IAL_SetLeds (slock | (numlock << 1) | (capslock << 2));
|
IAL_SetLeds (slock | (numlock << 1) | (capslock << 2));
|
||||||
|
|
||||||
__mg_event_timeout.tv_sec = 0;
|
__mg_event_timeout.tv_sec = 0;
|
||||||
__mg_event_timeout.tv_usec = timeoutusec;
|
__mg_event_timeout.tv_usec = __mg_timeout_usec;
|
||||||
|
|
||||||
#ifndef _MGRM_THREADS
|
#ifndef _MGRM_THREADS
|
||||||
#ifdef _MGRM_PROCESSES
|
#ifdef _MGRM_PROCESSES
|
||||||
@@ -216,8 +217,8 @@ static void ResetKeyEvent(void)
|
|||||||
SHAREDRES_SHIFTSTATUS = status;
|
SHAREDRES_SHIFTSTATUS = status;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
timeout_threshold = timeoutusec / 10000;
|
timeout_threshold = __mg_timeout_usec / 10000;
|
||||||
repeat_threshold = repeatusec / 10000;
|
repeat_threshold = __mg_repeat_usec / 10000;
|
||||||
timeout_count = timeout_threshold;
|
timeout_count = timeout_threshold;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -631,7 +632,7 @@ BOOL kernel_GetLWEvent (int event, PLWEVENT lwe)
|
|||||||
|
|
||||||
// set repeat time
|
// set repeat time
|
||||||
__mg_event_timeout.tv_sec = 0;
|
__mg_event_timeout.tv_sec = 0;
|
||||||
__mg_event_timeout.tv_usec = repeatusec;
|
__mg_event_timeout.tv_usec = __mg_repeat_usec;
|
||||||
|
|
||||||
// repeat last event
|
// repeat last event
|
||||||
if (old_lwe.type == LWETYPE_KEY
|
if (old_lwe.type == LWETYPE_KEY
|
||||||
@@ -652,7 +653,7 @@ BOOL kernel_GetLWEvent (int event, PLWEVENT lwe)
|
|||||||
old_lwe.data.me.event == ME_MIDDLEDOWN))) {
|
old_lwe.data.me.event == ME_MIDDLEDOWN))) {
|
||||||
// reset delay time
|
// reset delay time
|
||||||
__mg_event_timeout.tv_sec = 0;
|
__mg_event_timeout.tv_sec = 0;
|
||||||
__mg_event_timeout.tv_usec = timeoutusec;
|
__mg_event_timeout.tv_usec = __mg_timeout_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
lwe->type = LWETYPE_TIMEOUT;
|
lwe->type = LWETYPE_TIMEOUT;
|
||||||
@@ -880,7 +881,7 @@ BOOL kernel_GetLWEvent (int event, PLWEVENT lwe)
|
|||||||
memcpy (oldkeystate, keystate, nr_keys);
|
memcpy (oldkeystate, keystate, nr_keys);
|
||||||
memcpy (&old_lwe, lwe, sizeof (LWEVENT));
|
memcpy (&old_lwe, lwe, sizeof (LWEVENT));
|
||||||
__mg_event_timeout.tv_sec = 0;
|
__mg_event_timeout.tv_sec = 0;
|
||||||
__mg_event_timeout.tv_usec = timeoutusec;
|
__mg_event_timeout.tv_usec = __mg_timeout_usec;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -899,7 +900,7 @@ mouseret:
|
|||||||
me->status = status;
|
me->status = status;
|
||||||
memcpy (&old_lwe, lwe, sizeof (LWEVENT));
|
memcpy (&old_lwe, lwe, sizeof (LWEVENT));
|
||||||
__mg_event_timeout.tv_sec = 0;
|
__mg_event_timeout.tv_sec = 0;
|
||||||
__mg_event_timeout.tv_usec = timeoutusec;
|
__mg_event_timeout.tv_usec = __mg_timeout_usec;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+8
-8
@@ -66,7 +66,7 @@ static struct FIXSTR {
|
|||||||
BYTE bitmap[LEN_BITMAP];
|
BYTE bitmap[LEN_BITMAP];
|
||||||
int offset[NR_HEAP];
|
int offset[NR_HEAP];
|
||||||
char* heap[NR_HEAP + 1];
|
char* heap[NR_HEAP + 1];
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
#endif
|
#endif
|
||||||
} FixStrHeap;
|
} FixStrHeap;
|
||||||
@@ -98,7 +98,7 @@ BOOL mg_InitFixStr (void)
|
|||||||
offset += 1<<i;
|
offset += 1<<i;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_init (&FixStrHeap.lock, NULL);
|
pthread_mutex_init (&FixStrHeap.lock, NULL);
|
||||||
#endif
|
#endif
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -106,7 +106,7 @@ BOOL mg_InitFixStr (void)
|
|||||||
|
|
||||||
void mg_TerminateFixStr (void)
|
void mg_TerminateFixStr (void)
|
||||||
{
|
{
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_destroy (&FixStrHeap.lock);
|
pthread_mutex_destroy (&FixStrHeap.lock);
|
||||||
#endif
|
#endif
|
||||||
free (FixStrHeap.heap[0]);
|
free (FixStrHeap.heap[0]);
|
||||||
@@ -154,7 +154,7 @@ char* GUIAPI FixStrAlloc (int len)
|
|||||||
// ..
|
// ..
|
||||||
// if i == 0; then bufflen = 512
|
// if i == 0; then bufflen = 512
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_lock (&FixStrHeap.lock);
|
pthread_mutex_lock (&FixStrHeap.lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ char* GUIAPI FixStrAlloc (int len)
|
|||||||
for(j = 0; j < 8; j++) {
|
for(j = 0; j < 8; j++) {
|
||||||
if (*bitmap & (0x80 >> j)) {
|
if (*bitmap & (0x80 >> j)) {
|
||||||
*bitmap &= (~(0x80 >> j));
|
*bitmap &= (~(0x80 >> j));
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_unlock (&FixStrHeap.lock);
|
pthread_mutex_unlock (&FixStrHeap.lock);
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
#if 0
|
||||||
@@ -181,7 +181,7 @@ char* GUIAPI FixStrAlloc (int len)
|
|||||||
bitmap++;
|
bitmap++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_unlock (&FixStrHeap.lock);
|
pthread_mutex_unlock (&FixStrHeap.lock);
|
||||||
#endif
|
#endif
|
||||||
return (char*)malloc (len + 1);
|
return (char*)malloc (len + 1);
|
||||||
@@ -216,7 +216,7 @@ void GUIAPI FreeFixStr (char* str)
|
|||||||
// if i == 0; then bufflen = 512
|
// if i == 0; then bufflen = 512
|
||||||
bufflen = 1 << (NR_HEAP + 1 - i);
|
bufflen = 1 << (NR_HEAP + 1 - i);
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_lock (&FixStrHeap.lock);
|
pthread_mutex_lock (&FixStrHeap.lock);
|
||||||
#endif
|
#endif
|
||||||
heap = FixStrHeap.heap[i];
|
heap = FixStrHeap.heap[i];
|
||||||
@@ -236,7 +236,7 @@ void GUIAPI FreeFixStr (char* str)
|
|||||||
bitmap = bitmap + (stroff>>3);
|
bitmap = bitmap + (stroff>>3);
|
||||||
*bitmap |= (0x80 >> (stroff%8));
|
*bitmap |= (0x80 >> (stroff%8));
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
||||||
pthread_mutex_unlock (&FixStrHeap.lock);
|
pthread_mutex_unlock (&FixStrHeap.lock);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -386,7 +386,7 @@ int InitGUI (int argc, const char* agr[])
|
|||||||
|
|
||||||
/* Since 5.0.0
|
/* Since 5.0.0
|
||||||
allocate message queue for desktop thread before starting client. */
|
allocate message queue for desktop thread before starting client. */
|
||||||
if (!(__mg_dsk_msg_queue = mg_AllocMsgQueueForThisThread ()) ) {
|
if (!(__mg_dsk_msg_queue = mg_AllocMsgQueueForThisThread (TRUE)) ) {
|
||||||
err_message (step, "Failed to allocate message queue!");
|
err_message (step, "Failed to allocate message queue!");
|
||||||
return step;
|
return step;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -578,7 +578,7 @@ int GUIAPI InitGUI (int args, const char *agr[])
|
|||||||
|
|
||||||
/* init message queue of main GUI thread */
|
/* init message queue of main GUI thread */
|
||||||
step++;
|
step++;
|
||||||
if (!(msg_queue = mg_AllocMsgQueueForThisThread ())) {
|
if (!(msg_queue = mg_AllocMsgQueueForThisThread (TRUE))) {
|
||||||
_ERR_PRINTF ("KERNEL>InitGUI: failed to allocate message queue!\n");
|
_ERR_PRINTF ("KERNEL>InitGUI: failed to allocate message queue!\n");
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
@@ -617,6 +617,8 @@ void GUIAPI TerminateGUI (int not_used)
|
|||||||
{
|
{
|
||||||
mg_TerminateTimer (FALSE);
|
mg_TerminateTimer (FALSE);
|
||||||
|
|
||||||
|
mg_FreeMsgQueueForThisThread (TRUE);
|
||||||
|
|
||||||
/* Since 5.0.0 */
|
/* Since 5.0.0 */
|
||||||
SendNotifyMessage (HWND_DESKTOP, MSG_ENDSESSION, 0, 0);
|
SendNotifyMessage (HWND_DESKTOP, MSG_ENDSESSION, 0, 0);
|
||||||
pthread_join (__mg_dsk_msg_queue->th, NULL);
|
pthread_join (__mg_dsk_msg_queue->th, NULL);
|
||||||
@@ -655,8 +657,6 @@ void GUIAPI TerminateGUI (int not_used)
|
|||||||
miFreeArcCache ();
|
miFreeArcCache ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mg_FreeMsgQueueForThisThread ();
|
|
||||||
|
|
||||||
deleteThreadInfoKey ();
|
deleteThreadInfoKey ();
|
||||||
|
|
||||||
mg_TerminateSliceAllocator();
|
mg_TerminateSliceAllocator();
|
||||||
|
|||||||
+16
-17
@@ -60,7 +60,6 @@
|
|||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
#include "blockheap.h"
|
|
||||||
#include "cliprect.h"
|
#include "cliprect.h"
|
||||||
#include "gal.h"
|
#include "gal.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
@@ -159,7 +158,7 @@ void mg_DestroyFreeQMSGList (void)
|
|||||||
pthread_key_t __mg_threadinfo_key;
|
pthread_key_t __mg_threadinfo_key;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MSGQUEUE* mg_AllocMsgQueueForThisThread (void)
|
MSGQUEUE* mg_AllocMsgQueueForThisThread (BOOL sign_in)
|
||||||
{
|
{
|
||||||
MSGQUEUE* pMsgQueue;
|
MSGQUEUE* pMsgQueue;
|
||||||
|
|
||||||
@@ -177,13 +176,14 @@ MSGQUEUE* mg_AllocMsgQueueForThisThread (void)
|
|||||||
pthread_setspecific (__mg_threadinfo_key, pMsgQueue);
|
pthread_setspecific (__mg_threadinfo_key, pMsgQueue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// register this new message queue
|
if (sign_in) {
|
||||||
SendMessage (HWND_DESKTOP, MSG_MANAGE_MSGTHREAD,
|
SendMessage (HWND_DESKTOP, MSG_MANAGE_MSGTHREAD,
|
||||||
MSGTHREAD_SIGNIN, (LPARAM)pMsgQueue);
|
MSGTHREAD_SIGNIN, (LPARAM)pMsgQueue);
|
||||||
|
}
|
||||||
return pMsgQueue;
|
return pMsgQueue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_FreeMsgQueueForThisThread (void)
|
void mg_FreeMsgQueueForThisThread (BOOL sign_off)
|
||||||
{
|
{
|
||||||
MSGQUEUE* pMsgQueue;
|
MSGQUEUE* pMsgQueue;
|
||||||
|
|
||||||
@@ -194,6 +194,11 @@ void mg_FreeMsgQueueForThisThread (void)
|
|||||||
_WRN_PRINTF ("there are still some windows not destroyed\n");
|
_WRN_PRINTF ("there are still some windows not destroyed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sign_off) {
|
||||||
|
SendMessage (HWND_DESKTOP, MSG_MANAGE_MSGTHREAD,
|
||||||
|
MSGTHREAD_SIGNOUT, (LPARAM)pMsgQueue);
|
||||||
|
}
|
||||||
|
|
||||||
mg_DestroyMsgQueue (pMsgQueue);
|
mg_DestroyMsgQueue (pMsgQueue);
|
||||||
free (pMsgQueue);
|
free (pMsgQueue);
|
||||||
|
|
||||||
@@ -823,8 +828,9 @@ checkagain:
|
|||||||
goto got_ret;
|
goto got_ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
pMsgQueue->dwState &= ~QS_POSTMSG;
|
pMsgQueue->dwState &= ~QS_POSTMSG;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1410,6 +1416,9 @@ LRESULT GUIAPI DispatchMessage (PMSG pMsg)
|
|||||||
to the controls of the main window will be thrown away as well. */
|
to the controls of the main window will be thrown away as well. */
|
||||||
int __mg_throw_away_messages (PMSGQUEUE pMsgQueue, HWND hWnd)
|
int __mg_throw_away_messages (PMSGQUEUE pMsgQueue, HWND hWnd)
|
||||||
{
|
{
|
||||||
|
/* For a main window, we use pMainWin to check whether we
|
||||||
|
should throw away a message for controls of the main window.
|
||||||
|
Note that checkAndGetMainWindowIfControl returns NULL for non control. */
|
||||||
PMAINWIN pMainWin = (PMAINWIN)hWnd;
|
PMAINWIN pMainWin = (PMAINWIN)hWnd;
|
||||||
PMSG pMsg;
|
PMSG pMsg;
|
||||||
PQMSG pQMsg;
|
PQMSG pQMsg;
|
||||||
@@ -1421,16 +1430,6 @@ int __mg_throw_away_messages (PMSGQUEUE pMsgQueue, HWND hWnd)
|
|||||||
|
|
||||||
LOCK_MSGQ (pMsgQueue);
|
LOCK_MSGQ (pMsgQueue);
|
||||||
|
|
||||||
/* for virtual window and main window, use pMainWin to check whether we
|
|
||||||
should throw away a message for controls of a main window.
|
|
||||||
checkAndGetMainWindowIfControl returns NULL for non control. */
|
|
||||||
if (pMainWin != HWND_NULL && pMainWin != HWND_INVALID &&
|
|
||||||
(pMainWin->WinType == TYPE_MAINWIN ||
|
|
||||||
pMainWin->WinType == TYPE_VIRTWIN))
|
|
||||||
pMainWin = (PMAINWIN)hWnd;
|
|
||||||
else
|
|
||||||
pMainWin = NULL;
|
|
||||||
|
|
||||||
if (pMsgQueue->pFirstNotifyMsg) {
|
if (pMsgQueue->pFirstNotifyMsg) {
|
||||||
PQMSG pPrev = NULL, pNext;
|
PQMSG pPrev = NULL, pNext;
|
||||||
pQMsg = pMsgQueue->pFirstNotifyMsg;
|
pQMsg = pMsgQueue->pFirstNotifyMsg;
|
||||||
|
|||||||
+20
-8
@@ -243,11 +243,23 @@ int __kernel_alloc_z_order_info (int nr_topmosts, int nr_normals, BOOL with_mask
|
|||||||
#endif /* deprecated code */
|
#endif /* deprecated code */
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGRM_THREADS
|
||||||
#ifndef __NOUNIX__
|
# ifdef __ZI_USE_RWLOCK
|
||||||
pthread_rwlock_init(&__mg_zorder_info->rwlock, NULL);
|
pthread_rwlock_init(&__mg_zorder_info->rwlock, NULL);
|
||||||
#else
|
__mg_zorder_info->rwlock_owner = 0;
|
||||||
pthread_mutex_init(&__mg_zorder_info->rwlock, NULL);
|
# else
|
||||||
#endif
|
do {
|
||||||
|
int ret;
|
||||||
|
pthread_mutexattr_t my_attr;
|
||||||
|
ret = pthread_mutexattr_init(&my_attr);
|
||||||
|
assert(ret == 0);
|
||||||
|
ret = pthread_mutexattr_settype(&my_attr, PTHREAD_MUTEX_RECURSIVE);
|
||||||
|
assert(ret == 0);
|
||||||
|
pthread_mutex_init(&__mg_zorder_info->mutex, &my_attr);
|
||||||
|
ret = pthread_mutexattr_destroy(&my_attr);
|
||||||
|
assert(ret == 0);
|
||||||
|
(void)ret;
|
||||||
|
} while (0);
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -261,11 +273,11 @@ void __kernel_free_z_order_info (ZORDERINFO* zi)
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
#ifdef _MGRM_THREADS
|
#ifdef _MGRM_THREADS
|
||||||
#ifndef __NOUNIX__
|
# ifdef __ZI_USE_RWLOCK
|
||||||
pthread_rwlock_destroy(&zi->rwlock);
|
pthread_rwlock_destroy(&zi->rwlock);
|
||||||
#else
|
# else
|
||||||
pthread_mutex_destroy(&zi->rwlock);
|
pthread_mutex_destroy(&zi->mutex);
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
free (zi);
|
free (zi);
|
||||||
__mg_zorder_info = NULL;
|
__mg_zorder_info = NULL;
|
||||||
|
|||||||
+5
-1
@@ -187,7 +187,8 @@ int __mg_bmp_compute_pitch(int bpp, Uint32 width, Uint32 *pitch, BOOL does_round
|
|||||||
return bytespp;
|
return bytespp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* GUIAPI InitMyBitmapSL (MG_RWops* area, const char* ext, MYBITMAP* my_bmp, RGB* pal)
|
void* GUIAPI
|
||||||
|
InitMyBitmapSL (MG_RWops* area, const char* ext, MYBITMAP* my_bmp, RGB* pal)
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
LOAD_MYBITMAP_INFO* load_info;
|
LOAD_MYBITMAP_INFO* load_info;
|
||||||
@@ -209,8 +210,11 @@ void* GUIAPI InitMyBitmapSL (MG_RWops* area, const char* ext, MYBITMAP* my_bmp,
|
|||||||
my_bmp->frames = 1;
|
my_bmp->frames = 1;
|
||||||
my_bmp->depth = GetGDCapability (HDC_SCREEN, GDCAP_BPP) << 3;
|
my_bmp->depth = GetGDCapability (HDC_SCREEN, GDCAP_BPP) << 3;
|
||||||
|
|
||||||
|
// initialize the palette with the screen palette.
|
||||||
if (my_bmp->depth <= 8)
|
if (my_bmp->depth <= 8)
|
||||||
GetPalette (HDC_SCREEN, 0, 256, (GAL_Color*)pal);
|
GetPalette (HDC_SCREEN, 0, 256, (GAL_Color*)pal);
|
||||||
|
else
|
||||||
|
memset (pal, 0, sizeof(RGB) * 256); // reset the palette.
|
||||||
|
|
||||||
/* This is just for gray screen. If your screen is gray,
|
/* This is just for gray screen. If your screen is gray,
|
||||||
* please define this macro _GRAY_SCREEN.
|
* please define this macro _GRAY_SCREEN.
|
||||||
|
|||||||
+5
-3
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2021, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -106,7 +106,8 @@ void* __mg_init_webp(MG_RWops *fp, MYBITMAP *mybmp, RGB *pal)
|
|||||||
else
|
else
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
sc = WebPGetFeatures(info->data, info->sz_data, &info->config.input);
|
sc = WebPGetFeatures((const uint8_t *)info->data, info->sz_data,
|
||||||
|
&info->config.input);
|
||||||
if (sc == VP8_STATUS_OK) {
|
if (sc == VP8_STATUS_OK) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -210,7 +211,8 @@ int __mg_load_webp(MG_RWops *fp, void *init_info, MYBITMAP *mybmp,
|
|||||||
while (1) {
|
while (1) {
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
VP8StatusCode status = WebPIAppend(idec, info->data, info->sz_data);
|
VP8StatusCode status = WebPIAppend(idec,
|
||||||
|
(const uint8_t *)info->data, info->sz_data);
|
||||||
if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
|
if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
|
||||||
_ERR_PRINTF ("__mg_load_webp: WebPIAppend failed: %d\n", status);
|
_ERR_PRINTF ("__mg_load_webp: WebPIAppend failed: %d\n", status);
|
||||||
rc = ERR_BMP_LOAD;
|
rc = ERR_BMP_LOAD;
|
||||||
|
|||||||
+5
-8
@@ -141,6 +141,7 @@ static void GAL_BlitCopyOverlap(GAL_BlitInfo *info)
|
|||||||
|
|
||||||
w = info->d_width*info->dst->BytesPerPixel;
|
w = info->d_width*info->dst->BytesPerPixel;
|
||||||
h = info->d_height;
|
h = info->d_height;
|
||||||
|
|
||||||
src = info->s_pixels;
|
src = info->s_pixels;
|
||||||
dst = info->d_pixels;
|
dst = info->d_pixels;
|
||||||
srcskip = w+info->s_skip;
|
srcskip = w+info->s_skip;
|
||||||
@@ -375,6 +376,8 @@ int GAL_CleanupBlitting (GAL_Surface *src, GAL_Surface *dst)
|
|||||||
src->msk_img = NULL;
|
src->msk_img = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pixman_image_set_clip_region32 (dst->pix_img, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,28 +387,22 @@ static int GAL_PixmanBlit (struct GAL_Surface *src, GAL_Rect *srcrect,
|
|||||||
pixman_image_t *src_img = src->pix_img, *dst_img = dst->pix_img;
|
pixman_image_t *src_img = src->pix_img, *dst_img = dst->pix_img;
|
||||||
pixman_image_t *msk_img;
|
pixman_image_t *msk_img;
|
||||||
pixman_op_t op;
|
pixman_op_t op;
|
||||||
|
|
||||||
msk_img = src->msk_img;
|
msk_img = src->msk_img;
|
||||||
op = (pixman_op_t)src->pix_op;
|
op = (pixman_op_t)src->pix_op;
|
||||||
|
|
||||||
_DBG_PRINTF ("srcrect: %d, %d, %dx%d; dstrect: %d, %d, %dx%d\n",
|
|
||||||
srcrect->x, srcrect->y, srcrect->w, srcrect->h,
|
|
||||||
dstrect->x, dstrect->y, dstrect->w, dstrect->h);
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
pixman_region32_t clip_region;
|
pixman_region32_t clip_region;
|
||||||
pixman_region32_init_rect (&clip_region,
|
pixman_region32_init_rect (&clip_region,
|
||||||
dst->clip_rect.x, dst->clip_rect.y, dst->clip_rect.w, dst->clip_rect.h);
|
dst->clip_rect.x, dst->clip_rect.y, dst->clip_rect.w, dst->clip_rect.h);
|
||||||
pixman_image_set_clip_region32 (dst_img, &clip_region);
|
pixman_image_set_clip_region32 (dst_img, &clip_region);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// pixman_blt does not work
|
// pixman_blt does not work
|
||||||
if (pixman_image_get_format (src_img) == pixman_image_get_format (dst_img) &&
|
if (pixman_image_get_format (src_img) == pixman_image_get_format (dst_img) &&
|
||||||
op == PIXMAN_OP_SRC && msk_img == NULL) {
|
op == PIXMAN_OP_SRC && msk_img == NULL) {
|
||||||
pixman_blt ((uint32_t *)((char*)src->pixels + src->pixels_off),
|
pixman_blt ((uint32_t *)((char*)src->pixels + src->pixels_off),
|
||||||
(uint32_t *)((char*)dst->pixels + dst->pixels_off),
|
(uint32_t *)((char*)dst->pixels + dst->pixels_off),
|
||||||
src->pitch, dst->pitch,
|
src->pitch, dst->pitch,
|
||||||
GAL_BytesPerPixel (src),
|
GAL_BytesPerPixel (src),
|
||||||
GAL_BytesPerPixel (dst),
|
GAL_BytesPerPixel (dst),
|
||||||
srcrect->x, srcrect->y,
|
srcrect->x, srcrect->y,
|
||||||
|
|||||||
@@ -3575,7 +3575,7 @@ GAL_Surface* __drm_create_surface_from_name (GHANDLE video,
|
|||||||
|
|
||||||
/* called by drmCreateDCFromHandle */
|
/* called by drmCreateDCFromHandle */
|
||||||
GAL_Surface* __drm_create_surface_from_handle (GHANDLE video, uint32_t handle,
|
GAL_Surface* __drm_create_surface_from_handle (GHANDLE video, uint32_t handle,
|
||||||
unsigned long size, uint32_t drm_format, uint32_t pixels_off,
|
size_t size, uint32_t drm_format, uint32_t pixels_off,
|
||||||
uint32_t width, uint32_t height, uint32_t pitch)
|
uint32_t width, uint32_t height, uint32_t pitch)
|
||||||
{
|
{
|
||||||
GAL_VideoDevice *this = (GAL_VideoDevice *)video;
|
GAL_VideoDevice *this = (GAL_VideoDevice *)video;
|
||||||
|
|||||||
@@ -323,11 +323,13 @@ static void DUMMY_VideoQuit(_THIS)
|
|||||||
if (mgIsServer) {
|
if (mgIsServer) {
|
||||||
shm_unlink (DUMMYVID_SHAREDMEM_NAME);
|
shm_unlink (DUMMYVID_SHAREDMEM_NAME);
|
||||||
}
|
}
|
||||||
#else
|
#elif !defined(_MGRM_PROCESSES)
|
||||||
if (this->screen->pixels != NULL) {
|
if (this->screen->pixels != NULL) {
|
||||||
free (this->screen->pixels);
|
free (this->screen->pixels);
|
||||||
this->screen->pixels = NULL;
|
this->screen->pixels = NULL;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// do nothing (COMPOSITING_SCHEMA)
|
||||||
#endif /* not (defined(_MGRM_PROCESSES) && defined (_MGSCHEMA_SHAREDFB)) */
|
#endif /* not (defined(_MGRM_PROCESSES) && defined (_MGSCHEMA_SHAREDFB)) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+34
-33
@@ -102,8 +102,6 @@ static void FB_FreeHWSurface(_THIS, GAL_Surface *surface);
|
|||||||
static void FB_WaitVBL(_THIS);
|
static void FB_WaitVBL(_THIS);
|
||||||
static void FB_WaitIdle(_THIS);
|
static void FB_WaitIdle(_THIS);
|
||||||
|
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
|
||||||
|
|
||||||
#include "../shadow-screen.h"
|
#include "../shadow-screen.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
@@ -133,13 +131,6 @@ static BOOL FB_SyncUpdate (_THIS)
|
|||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif /* _MGSCHEMA_COMPOSITING */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int FB_LockHWSurface(_THIS, GAL_Surface *surface);
|
|
||||||
static void FB_UnlockHWSurface(_THIS, GAL_Surface *surface);
|
|
||||||
static int FB_FlipHWSurface(_THIS, GAL_Surface *surface);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Internal palette functions */
|
/* Internal palette functions */
|
||||||
static void FB_SavePalette(_THIS, struct fb_fix_screeninfo *finfo,
|
static void FB_SavePalette(_THIS, struct fb_fix_screeninfo *finfo,
|
||||||
@@ -169,11 +160,9 @@ static int FB_Available(void)
|
|||||||
|
|
||||||
static void FB_DeleteDevice(GAL_VideoDevice *device)
|
static void FB_DeleteDevice(GAL_VideoDevice *device)
|
||||||
{
|
{
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
|
||||||
if (device->hidden->shadow_screen) {
|
if (device->hidden->shadow_screen) {
|
||||||
GAL_FreeSurface (device->hidden->real_screen);
|
GAL_FreeSurface (device->hidden->real_screen);
|
||||||
}
|
}
|
||||||
#endif /* _MGSCHEMA_COMPOSITING */
|
|
||||||
|
|
||||||
free(device->hidden);
|
free(device->hidden);
|
||||||
free(device);
|
free(device);
|
||||||
@@ -197,11 +186,8 @@ static GAL_VideoDevice *FB_CreateDevice(int devindex)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
memset(this->hidden, 0, (sizeof *this->hidden));
|
memset(this->hidden, 0, (sizeof *this->hidden));
|
||||||
/* For compositing schema, we force to use double buffering */
|
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
|
||||||
this->hidden->magic = MAGIC_SHADOW_SCREEN_HEADER;
|
this->hidden->magic = MAGIC_SHADOW_SCREEN_HEADER;
|
||||||
this->hidden->version = 0;
|
this->hidden->version = 0;
|
||||||
#endif
|
|
||||||
wait_vbl = FB_WaitVBL;
|
wait_vbl = FB_WaitVBL;
|
||||||
wait_idle = FB_WaitIdle;
|
wait_idle = FB_WaitIdle;
|
||||||
|
|
||||||
@@ -278,7 +264,7 @@ static int FB_EnterGraphicsMode (_THIS)
|
|||||||
if (ioctl (ttyfd, KDSETMODE, KD_GRAPHICS) == -1) {
|
if (ioctl (ttyfd, KDSETMODE, KD_GRAPHICS) == -1) {
|
||||||
_WRN_PRINTF ("Error when setting the terminal (%s) "
|
_WRN_PRINTF ("Error when setting the terminal (%s) "
|
||||||
"to graphics mode: %m\n", tty_dev);
|
"to graphics mode: %m\n", tty_dev);
|
||||||
_WRN_PRINTF ("It might is not a console.\n");
|
_WRN_PRINTF ("It might not be a console.\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
#ifdef _MGRM_PROCESSES
|
#ifdef _MGRM_PROCESSES
|
||||||
@@ -421,16 +407,6 @@ static int FB_VideoInit(_THIS, GAL_PixelFormat *vformat)
|
|||||||
(((long)finfo.smem_start)&~(getpagesize () - 1)));
|
(((long)finfo.smem_start)&~(getpagesize () - 1)));
|
||||||
mapped_memlen = finfo.smem_len+mapped_offset;
|
mapped_memlen = finfo.smem_len+mapped_offset;
|
||||||
|
|
||||||
#if defined(__TARGET_R818__) && defined(_MGSCHEMA_COMPOSITING)
|
|
||||||
if (mgIsServer) {
|
|
||||||
uintptr_t args[2] = { 1, 0 };
|
|
||||||
if (ioctl(console_fd, FBIO_ENABLE_CACHE, args) < 0) {
|
|
||||||
GAL_SetError("NEWGAL/FBCON: FBIO_ENABLE_CACHE failed\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __uClinux__
|
#ifdef __uClinux__
|
||||||
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||||
mapped_mem = mmap(NULL, mapped_memlen,
|
mapped_mem = mmap(NULL, mapped_memlen,
|
||||||
@@ -609,6 +585,7 @@ static GAL_Surface *FB_SetVideoMode(_THIS, GAL_Surface *current,
|
|||||||
Uint32 Amask;
|
Uint32 Amask;
|
||||||
char *surfaces_mem;
|
char *surfaces_mem;
|
||||||
int surfaces_len;
|
int surfaces_len;
|
||||||
|
BOOL dblbuff = FALSE;
|
||||||
|
|
||||||
#ifdef __TARGET_STB810__
|
#ifdef __TARGET_STB810__
|
||||||
bpp = 32;
|
bpp = 32;
|
||||||
@@ -793,6 +770,30 @@ static GAL_Surface *FB_SetVideoMode(_THIS, GAL_Surface *current,
|
|||||||
// allocate hardware surface first.
|
// allocate hardware surface first.
|
||||||
GAL_PublicSurface = current;
|
GAL_PublicSurface = current;
|
||||||
|
|
||||||
|
dblbuff = TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// client never call SetVideoMode
|
||||||
|
assert (0);
|
||||||
|
}
|
||||||
|
#elif !IS_SHAREDFB_SCHEMA_PROC
|
||||||
|
{
|
||||||
|
char tmp [8];
|
||||||
|
if (GetMgEtcValue ("fbcon", "double_buffering", tmp, 8) >= 0 &&
|
||||||
|
(strcasecmp (tmp, "true") == 0 || strcasecmp (tmp, "yes") == 0)) {
|
||||||
|
dblbuff = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* !IS_SHAREDFB_SCHEMA_PROC */
|
||||||
|
|
||||||
|
if (dblbuff) {
|
||||||
|
#if defined(__TARGET_R818__)
|
||||||
|
uintptr_t args[2] = { 1, 0 };
|
||||||
|
if (ioctl(console_fd, FBIO_ENABLE_CACHE, args) < 0) {
|
||||||
|
GAL_SetError("NEWGAL/FBCON: FBIO_ENABLE_CACHE failed\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* create shadow screen */
|
/* create shadow screen */
|
||||||
this->hidden->shadow_screen = GAL_CreateRGBSurface (GAL_HWSURFACE,
|
this->hidden->shadow_screen = GAL_CreateRGBSurface (GAL_HWSURFACE,
|
||||||
current->w, current->h,
|
current->w, current->h,
|
||||||
@@ -801,10 +802,12 @@ static GAL_Surface *FB_SetVideoMode(_THIS, GAL_Surface *current,
|
|||||||
current->format->Bmask, current->format->Amask);
|
current->format->Bmask, current->format->Amask);
|
||||||
|
|
||||||
if (this->hidden->shadow_screen) {
|
if (this->hidden->shadow_screen) {
|
||||||
|
#if IS_COMPOSITING_SCHEMA
|
||||||
this->info.hw_cursor = 1;
|
this->info.hw_cursor = 1;
|
||||||
this->hidden->cursor = NULL;
|
this->hidden->cursor = NULL;
|
||||||
this->SetCursor = shadowScreen_SetCursor;
|
this->SetCursor = shadowScreen_SetCursor;
|
||||||
this->MoveCursor = shadowScreen_MoveCursor;
|
this->MoveCursor = shadowScreen_MoveCursor;
|
||||||
|
#endif
|
||||||
this->UpdateRects = shadowScreen_UpdateRects;
|
this->UpdateRects = shadowScreen_UpdateRects;
|
||||||
this->SyncUpdate = FB_SyncUpdate;
|
this->SyncUpdate = FB_SyncUpdate;
|
||||||
|
|
||||||
@@ -814,6 +817,7 @@ static GAL_Surface *FB_SetVideoMode(_THIS, GAL_Surface *current,
|
|||||||
GAL_SetClipRect (this->hidden->real_screen, NULL);
|
GAL_SetClipRect (this->hidden->real_screen, NULL);
|
||||||
GAL_SetColorKey (this->hidden->shadow_screen, 0, 0);
|
GAL_SetColorKey (this->hidden->shadow_screen, 0, 0);
|
||||||
GAL_SetAlpha (this->hidden->shadow_screen, 0, 0);
|
GAL_SetAlpha (this->hidden->shadow_screen, 0, 0);
|
||||||
|
SetRectEmpty (&this->hidden->dirty_rc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this->hidden->real_screen = NULL;
|
this->hidden->real_screen = NULL;
|
||||||
@@ -821,10 +825,9 @@ static GAL_Surface *FB_SetVideoMode(_THIS, GAL_Surface *current,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// client never call SetVideoMode
|
this->hidden->real_screen = current;
|
||||||
assert (0);
|
this->hidden->shadow_screen = NULL;
|
||||||
}
|
}
|
||||||
#endif /* _MGSCHEMA_COMPOSITING */
|
|
||||||
|
|
||||||
/* We're done */
|
/* We're done */
|
||||||
return (current);
|
return (current);
|
||||||
@@ -1042,8 +1045,8 @@ static int FB_AllocHWSurface (_THIS, GAL_Surface *surface)
|
|||||||
REQUEST req;
|
REQUEST req;
|
||||||
|
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
#ifdef _MGSCHEMA_COMPOSITING
|
||||||
if (!mgIsServer)
|
if (!mgIsServer)
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
req.id = REQID_HWSURFACE;
|
req.id = REQID_HWSURFACE;
|
||||||
req.data = &request;
|
req.data = &request;
|
||||||
@@ -1296,11 +1299,9 @@ static void FB_VideoQuit(_THIS)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
if (this->hidden->shadow_screen) {
|
||||||
if (mgIsServer && this->hidden->shadow_screen) {
|
|
||||||
GAL_FreeSurface (this->hidden->shadow_screen);
|
GAL_FreeSurface (this->hidden->shadow_screen);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Clean up the memory bucket list */
|
/* Clean up the memory bucket list */
|
||||||
#ifdef _MGRM_PROCESSES
|
#ifdef _MGRM_PROCESSES
|
||||||
|
|||||||
+10
-10
@@ -68,19 +68,26 @@ typedef struct vidmem_bucket {
|
|||||||
|
|
||||||
/* Private display data */
|
/* Private display data */
|
||||||
struct GAL_PrivateVideoData {
|
struct GAL_PrivateVideoData {
|
||||||
/* For compositing schema, we force to use double buffering */
|
/* When double buffering supported, the real surface represents the ultimate
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
* scan-out frame buffer, and the shadow screen represents the rendering
|
||||||
|
* surface. When double buffering disabled, shadow_screen is NULL.
|
||||||
|
*
|
||||||
|
* For compositing schema, we force to use double buffering.
|
||||||
|
* For threads and standalone mode, controlled by `fbcon.double_buffering`
|
||||||
|
* run-time option. Not supported for processes mode.
|
||||||
|
*/
|
||||||
/* start of header for shadow screen */
|
/* start of header for shadow screen */
|
||||||
int magic, version;
|
int magic, version;
|
||||||
GAL_Surface *real_screen, *shadow_screen;
|
GAL_Surface *real_screen, *shadow_screen;
|
||||||
RECT dirty_rc;
|
RECT dirty_rc;
|
||||||
|
|
||||||
|
#ifdef _MGSCHEMA_COMPOSITING
|
||||||
/* Used to simulate the hardware cursor. */
|
/* Used to simulate the hardware cursor. */
|
||||||
GAL_Surface *cursor;
|
GAL_Surface *cursor;
|
||||||
int csr_x, csr_y;
|
int csr_x, csr_y;
|
||||||
int hot_x, hot_y;
|
int hot_x, hot_y;
|
||||||
|
#endif
|
||||||
/* end of header for shadow screen */
|
/* end of header for shadow screen */
|
||||||
#endif /* _MGSCHEMA_COMPOSITING */
|
|
||||||
|
|
||||||
int console_fd;
|
int console_fd;
|
||||||
struct fb_var_screeninfo cache_vinfo;
|
struct fb_var_screeninfo cache_vinfo;
|
||||||
@@ -104,13 +111,6 @@ struct GAL_PrivateVideoData {
|
|||||||
|
|
||||||
void (*wait_vbl)(_THIS);
|
void (*wait_vbl)(_THIS);
|
||||||
void (*wait_idle)(_THIS);
|
void (*wait_idle)(_THIS);
|
||||||
|
|
||||||
#if 0 /* deprecated code */
|
|
||||||
int flip_page;
|
|
||||||
char *flip_address[2];
|
|
||||||
#define flip_page (this->hidden->flip_page)
|
|
||||||
#define flip_address (this->hidden->flip_address)
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Old variable names */
|
/* Old variable names */
|
||||||
|
|||||||
@@ -76,6 +76,14 @@ GAL_PixelFormat *GAL_AllocFormat(int bpp,
|
|||||||
//memset(format, 0, sizeof(*format));
|
//memset(format, 0, sizeof(*format));
|
||||||
format->alpha = GAL_ALPHA_OPAQUE;
|
format->alpha = GAL_ALPHA_OPAQUE;
|
||||||
|
|
||||||
|
/* Give defaults for the special case */
|
||||||
|
if (bpp == 32 && Rmask == 0 && Gmask == 0 && Bmask == 0 && Amask == 0) {
|
||||||
|
Amask = 0xFF000000;
|
||||||
|
Rmask = 0x00FF0000;
|
||||||
|
Gmask = 0x0000FF00;
|
||||||
|
Bmask = 0x000000FF;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set up the format */
|
/* Set up the format */
|
||||||
format->BitsPerPixel = bpp;
|
format->BitsPerPixel = bpp;
|
||||||
format->BytesPerPixel = (bpp+7)/8;
|
format->BytesPerPixel = (bpp+7)/8;
|
||||||
|
|||||||
+133
-248
File diff suppressed because it is too large
Load Diff
+30
-39
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -57,64 +57,55 @@ extern "C" {
|
|||||||
#define _THIS GAL_VideoDevice *this
|
#define _THIS GAL_VideoDevice *this
|
||||||
|
|
||||||
typedef struct _ShadowFBHeader {
|
typedef struct _ShadowFBHeader {
|
||||||
unsigned int info_size;
|
unsigned int info_size;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
int depth;
|
int depth;
|
||||||
int pitch;
|
int pitch;
|
||||||
int dirty; /* true for dirty, and should reset to false after refreshing the dirty area */
|
int dirty; /* true for dirty, and should reset to false after refreshing the dirty area */
|
||||||
RECT dirty_rect;
|
RECT dirty_rect;
|
||||||
int palette_changed; /* true for changed, and should reset to false after reflecting the change */
|
int palette_changed; /* true for changed, and should reset to false after reflecting the change */
|
||||||
int palette_offset;
|
int palette_offset;
|
||||||
int fb_offset;
|
int fb_offset;
|
||||||
Uint32 Rmask;
|
Uint32 Rmask;
|
||||||
Uint32 Gmask;
|
Uint32 Gmask;
|
||||||
Uint32 Bmask;
|
Uint32 Bmask;
|
||||||
Uint32 Amask;
|
Uint32 Amask;
|
||||||
int firstcolor;
|
int firstcolor;
|
||||||
int ncolors;
|
int ncolors;
|
||||||
} ShadowFBHeader;
|
} ShadowFBHeader;
|
||||||
|
|
||||||
#define FLAG_REALFB_PREALLOC 0x01
|
#define FLAG_REALFB_PREALLOC 0x01
|
||||||
|
|
||||||
|
|
||||||
typedef struct _RealFBInfo {
|
typedef struct _RealFBInfo {
|
||||||
DWORD flags;
|
DWORD flags;
|
||||||
int height, width;
|
int height, width;
|
||||||
int depth;
|
int depth;
|
||||||
int pitch;
|
int pitch;
|
||||||
void* fb;
|
void* fb;
|
||||||
void * real_device;
|
void * real_device;
|
||||||
} RealFBInfo;
|
} RealFBInfo;
|
||||||
|
|
||||||
/* Private display data */
|
/* Private display data */
|
||||||
|
|
||||||
struct GAL_PrivateVideoData {
|
struct GAL_PrivateVideoData {
|
||||||
RealFBInfo * realfb_info;
|
RealFBInfo * realfb_info;
|
||||||
/*GAL_VideoDevice *_real_device ;
|
|
||||||
int w, h, pitch;
|
|
||||||
void *fb;
|
|
||||||
BOOL alloc_fb;
|
|
||||||
BOOL dirty;
|
|
||||||
RECT update;*/
|
|
||||||
pthread_t update_th;
|
pthread_t update_th;
|
||||||
#ifdef _MGRM_PROCESSES
|
#ifdef _MGRM_PROCESSES
|
||||||
int semid;
|
int semid;
|
||||||
#else
|
|
||||||
pthread_mutex_t update_lock;
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _ShadowFBOps {
|
typedef struct _ShadowFBOps {
|
||||||
int (*init) (void);
|
int (*init) (void);
|
||||||
int (*get_realfb_info) (RealFBInfo* realfb_info);
|
int (*get_realfb_info) (RealFBInfo* realfb_info);
|
||||||
int (*release) (RealFBInfo* realfb_info);
|
int (*release) (RealFBInfo* realfb_info);
|
||||||
int (*set_palette) (RealFBInfo* realfb_info, int firstcolor, int ncolors, void* colors);
|
int (*set_palette) (RealFBInfo* realfb_info, int firstcolor,
|
||||||
void (*sleep) (void);
|
int ncolors, void* colors);
|
||||||
void (*refresh) (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb_info, void* update);
|
void (*refresh) (ShadowFBHeader* shadowfb_header,
|
||||||
|
RealFBInfo* realfb_info, void* update);
|
||||||
} ShadowFBOps;
|
} ShadowFBOps;
|
||||||
|
|
||||||
ShadowFBOps * __mg_shadow_fb_ops;
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
+70
-70
@@ -541,31 +541,12 @@ int GAL_LowerBlit (GAL_Surface *src, GAL_Rect *srcrect,
|
|||||||
#ifdef MG_CONFIG_USE_OWN_OVERLAPPED_BITBLIT
|
#ifdef MG_CONFIG_USE_OWN_OVERLAPPED_BITBLIT
|
||||||
ret = own_overlapped_bitblit(do_blit, src, srcrect, dst, dstrect);
|
ret = own_overlapped_bitblit(do_blit, src, srcrect, dst, dstrect);
|
||||||
#else
|
#else
|
||||||
|
_DBG_PRINTF("calling do_blit: from (%d, %d, %d, %d) to (%d, %d)\n",
|
||||||
|
srcrect->x, srcrect->y, srcrect->w, srcrect->h,
|
||||||
|
dstrect->x, dstrect->y);
|
||||||
ret = do_blit(src, srcrect, dst, dstrect);
|
ret = do_blit(src, srcrect, dst, dstrect);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
static int n_sw=0, n_hw=0;
|
|
||||||
if ((src->flags & GAL_HWACCEL) == GAL_HWACCEL)
|
|
||||||
{
|
|
||||||
n_hw ++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
n_sw ++;
|
|
||||||
}
|
|
||||||
printf("[%06u] hw/blit=%d/%d %c size=%dX%d src=(%d %d),%p dst=(%d %d),%p\n",
|
|
||||||
times(NULL) % 1000000,
|
|
||||||
n_hw, n_hw+n_sw,
|
|
||||||
do_blit == src->map->sw_blit ? 'S':'H',
|
|
||||||
srcrect->w, srcrect->h,
|
|
||||||
srcrect->x, srcrect->y, src,
|
|
||||||
dstrect->x, dstrect->y, dst
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,8 +554,8 @@ int GAL_LowerBlit (GAL_Surface *src, GAL_Rect *srcrect,
|
|||||||
int GAL_UpperBlit (GAL_Surface *src, GAL_Rect *srcrect,
|
int GAL_UpperBlit (GAL_Surface *src, GAL_Rect *srcrect,
|
||||||
GAL_Surface *dst, GAL_Rect *dstrect, DWORD op)
|
GAL_Surface *dst, GAL_Rect *dstrect, DWORD op)
|
||||||
{
|
{
|
||||||
GAL_Rect fulldst;
|
GAL_Rect my_dst, my_src;
|
||||||
int srcx, srcy, w, h;
|
int w, h;
|
||||||
|
|
||||||
if (! src || ! dst) {
|
if (! src || ! dst) {
|
||||||
GAL_SetError("NEWGAL: GAL_UpperBlit: passed a NULL surface.\n");
|
GAL_SetError("NEWGAL: GAL_UpperBlit: passed a NULL surface.\n");
|
||||||
@@ -583,76 +564,95 @@ int GAL_UpperBlit (GAL_Surface *src, GAL_Rect *srcrect,
|
|||||||
|
|
||||||
/* If the destination rectangle is NULL, use the entire dest surface */
|
/* If the destination rectangle is NULL, use the entire dest surface */
|
||||||
if (dstrect == NULL) {
|
if (dstrect == NULL) {
|
||||||
fulldst.x = fulldst.y = 0;
|
my_dst.x = my_dst.y = 0;
|
||||||
dstrect = &fulldst;
|
dstrect = &my_dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clip the source rectangle to the source surface */
|
if (srcrect == NULL) {
|
||||||
if(srcrect) {
|
my_src.x = my_src.y = 0;
|
||||||
int maxw, maxh;
|
srcrect = &my_src;
|
||||||
|
|
||||||
srcx = srcrect->x;
|
srcrect->w = src->w;
|
||||||
w = srcrect->w;
|
srcrect->h = src->h;
|
||||||
if(srcx < 0) {
|
|
||||||
w += srcx;
|
|
||||||
dstrect->x -= srcx;
|
|
||||||
srcx = 0;
|
|
||||||
}
|
|
||||||
maxw = src->w - srcx;
|
|
||||||
if(maxw < w)
|
|
||||||
w = maxw;
|
|
||||||
|
|
||||||
srcy = srcrect->y;
|
|
||||||
h = srcrect->h;
|
|
||||||
if(srcy < 0) {
|
|
||||||
h += srcy;
|
|
||||||
dstrect->y -= srcy;
|
|
||||||
srcy = 0;
|
|
||||||
}
|
|
||||||
maxh = src->h - srcy;
|
|
||||||
if(maxh < h)
|
|
||||||
h = maxh;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
srcx = srcy = 0;
|
|
||||||
w = src->w;
|
|
||||||
h = src->h;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clip the destination rectangle against the clip rectangle */
|
/* make sure that two rectangles have the same size */
|
||||||
{
|
w = dstrect->w = srcrect->w;
|
||||||
|
h = dstrect->h = srcrect->h;
|
||||||
|
|
||||||
|
_DBG_PRINTF("before clipping: from (%d, %d, %d, %d) to (%d, %d)\n",
|
||||||
|
srcrect->x, srcrect->y, srcrect->w, srcrect->h,
|
||||||
|
dstrect->x, dstrect->y);
|
||||||
|
|
||||||
|
/* XXX: We must offset and clipping the source rectangle properly. */
|
||||||
|
int offx = dstrect->x - srcrect->x;
|
||||||
|
int offy = dstrect->y - srcrect->y;
|
||||||
|
|
||||||
|
/* clip the destination rectangle against the clip rectangle. */
|
||||||
|
if (TRUE) {
|
||||||
GAL_Rect *clip = &dst->clip_rect;
|
GAL_Rect *clip = &dst->clip_rect;
|
||||||
int dx, dy;
|
int dx, dy;
|
||||||
|
|
||||||
dx = clip->x - dstrect->x;
|
dx = clip->x - dstrect->x;
|
||||||
if(dx > 0) {
|
if (dx > 0) {
|
||||||
w -= dx;
|
w -= dx;
|
||||||
dstrect->x += dx;
|
dstrect->x += dx;
|
||||||
srcx += dx;
|
|
||||||
}
|
}
|
||||||
dx = dstrect->x + w - clip->x - clip->w;
|
dx = dstrect->x + w - clip->x - clip->w;
|
||||||
if(dx > 0)
|
if (dx > 0)
|
||||||
w -= dx;
|
w -= dx;
|
||||||
|
|
||||||
dy = clip->y - dstrect->y;
|
dy = clip->y - dstrect->y;
|
||||||
if(dy > 0) {
|
if (dy > 0) {
|
||||||
h -= dy;
|
h -= dy;
|
||||||
dstrect->y += dy;
|
dstrect->y += dy;
|
||||||
srcy += dy;
|
|
||||||
}
|
}
|
||||||
dy = dstrect->y + h - clip->y - clip->h;
|
dy = dstrect->y + h - clip->y - clip->h;
|
||||||
if(dy > 0)
|
if (dy > 0)
|
||||||
h -= dy;
|
h -= dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(w > 0 && h > 0) {
|
if (w <= 0 || h <= 0) {
|
||||||
GAL_Rect sr;
|
_DBG_PRINTF("destrect clipped\n");
|
||||||
sr.x = srcx;
|
goto done;
|
||||||
sr.y = srcy;
|
|
||||||
sr.w = dstrect->w = w;
|
|
||||||
sr.h = dstrect->h = h;
|
|
||||||
return GAL_LowerBlit(src, &sr, dst, dstrect, op);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* reset the size */
|
||||||
|
srcrect->w = dstrect->w = w;
|
||||||
|
srcrect->h = dstrect->h = h;
|
||||||
|
|
||||||
|
/* offset the source rectangle */
|
||||||
|
srcrect->x = dstrect->x - offx;
|
||||||
|
srcrect->y = dstrect->y - offy;
|
||||||
|
|
||||||
|
int old_src_x = srcrect->x;
|
||||||
|
int old_src_y = srcrect->y;
|
||||||
|
|
||||||
|
/* clip the source rectangle against the surface. */
|
||||||
|
if (TRUE) {
|
||||||
|
GAL_Rect surrect = { 0, 0, src->w, src->h };
|
||||||
|
if (!GAL_IntersectRect(srcrect, &surrect, srcrect)) {
|
||||||
|
_WRN_PRINTF("srcrect clipped\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* offset the destination rectangle propertly */
|
||||||
|
offx = srcrect->x - old_src_x;
|
||||||
|
offy = srcrect->y - old_src_y;
|
||||||
|
|
||||||
|
dstrect->x += offx;
|
||||||
|
dstrect->y += offy;
|
||||||
|
dstrect->w = srcrect->w;
|
||||||
|
dstrect->h = srcrect->h;
|
||||||
|
}
|
||||||
|
|
||||||
|
_DBG_PRINTF("After clipping: from (%d, %d, %d, %d) to (%d, %d)\n",
|
||||||
|
srcrect->x, srcrect->y, srcrect->w, srcrect->h,
|
||||||
|
dstrect->x, dstrect->y);
|
||||||
|
|
||||||
|
return GAL_LowerBlit(src, srcrect, dst, dstrect, op);
|
||||||
|
|
||||||
|
done:
|
||||||
dstrect->w = dstrect->h = 0;
|
dstrect->w = dstrect->h = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-1
@@ -173,7 +173,7 @@ BLOCKHEAP __mg_free_update_region_list;
|
|||||||
int GAL_VideoInit(const char *driver_name, Uint32 flags);
|
int GAL_VideoInit(const char *driver_name, Uint32 flags);
|
||||||
void GAL_VideoQuit(void);
|
void GAL_VideoQuit(void);
|
||||||
|
|
||||||
static GAL_VideoDevice *GAL_GetVideo(const char* driver_name)
|
GAL_VideoDevice *GAL_GetVideo(const char* driver_name)
|
||||||
{
|
{
|
||||||
GAL_VideoDevice *video;
|
GAL_VideoDevice *video;
|
||||||
int index;
|
int index;
|
||||||
@@ -905,9 +905,17 @@ BOOL GAL_SyncUpdate (GAL_Surface *surface)
|
|||||||
numrects = __mg_convert_region_to_rects (&surface->update_region,
|
numrects = __mg_convert_region_to_rects (&surface->update_region,
|
||||||
rects, NR_DIRTY_RECTS);
|
rects, NR_DIRTY_RECTS);
|
||||||
if (numrects <= 0) {
|
if (numrects <= 0) {
|
||||||
|
_DBG_PRINTF("empty update region\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
for (int i = 0; i < numrects; i++) {
|
||||||
|
_DBG_PRINTF("update rect %d: %d, %d, %d, %d\n",
|
||||||
|
i, rects[i].x, rects[i].y, rects[i].w, rects[i].h);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MGSCHEMA_COMPOSITING
|
#ifdef _MGSCHEMA_COMPOSITING
|
||||||
if (surface->shared_header) {
|
if (surface->shared_header) {
|
||||||
LOCK_SURFACE_SEM (surface->shared_header->sem_num);
|
LOCK_SURFACE_SEM (surface->shared_header->sem_num);
|
||||||
|
|||||||
+1
-1
@@ -120,7 +120,7 @@ static int make_alpha_pixel_format (PDC pdc)
|
|||||||
|
|
||||||
static void make_gray_pixels (PDC pdc)
|
static void make_gray_pixels (PDC pdc)
|
||||||
{
|
{
|
||||||
if (pdc->bkmode == BM_TRANSPARENT
|
if (pdc->bkmode_set == BM_TRANSPARENT
|
||||||
&& !make_alpha_pixel_format (pdc)) {
|
&& !make_alpha_pixel_format (pdc)) {
|
||||||
int i;
|
int i;
|
||||||
Uint8 r, g, b, a;
|
Uint8 r, g, b, a;
|
||||||
|
|||||||
+80
-28
File diff suppressed because it is too large
Load Diff
@@ -117,7 +117,6 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
|
|||||||
DRAWTEXTEX2_CTXT* ctxt = (DRAWTEXTEX2_CTXT*)context;
|
DRAWTEXTEX2_CTXT* ctxt = (DRAWTEXTEX2_CTXT*)context;
|
||||||
int adv_x = 0, adv_y = 0;
|
int adv_x = 0, adv_y = 0;
|
||||||
BBOX bbox;
|
BBOX bbox;
|
||||||
int bkmode;
|
|
||||||
|
|
||||||
switch (char_type & ACHARTYPE_BASIC_MASK) {
|
switch (char_type & ACHARTYPE_BASIC_MASK) {
|
||||||
case ACHAR_BASIC_ZEROWIDTH:
|
case ACHAR_BASIC_ZEROWIDTH:
|
||||||
@@ -145,8 +144,8 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
|
|||||||
|
|
||||||
case ACHAR_BASIC_VOWEL:
|
case ACHAR_BASIC_VOWEL:
|
||||||
if (!ctxt->only_extent) {
|
if (!ctxt->only_extent) {
|
||||||
bkmode = ctxt->pdc->bkmode;
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
//ctxt->pdc->bkmode = BM_TRANSPARENT;
|
ctxt->pdc->bkmode = BM_TRANSPARENT;
|
||||||
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
@@ -163,9 +162,12 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
|
|||||||
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
|
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
|
||||||
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-16
@@ -15,7 +15,7 @@
|
|||||||
* and Graphics User Interface (GUI) support system for embedded systems
|
* and Graphics User Interface (GUI) support system for embedded systems
|
||||||
* and smart IoT devices.
|
* and smart IoT devices.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002~2020, Beijing FMSoft Technologies Co., Ltd.
|
* Copyright (C) 2002~2022, Beijing FMSoft Technologies Co., Ltd.
|
||||||
* Copyright (C) 1998~2002, WEI Yongming
|
* Copyright (C) 1998~2002, WEI Yongming
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -691,6 +691,11 @@ int __mg_enter_drawing (PDC pdc)
|
|||||||
if (!dc_IsMemDC (pdc))
|
if (!dc_IsMemDC (pdc))
|
||||||
kernel_ShowCursorForGDI (FALSE, pdc);
|
kernel_ShowCursorForGDI (FALSE, pdc);
|
||||||
|
|
||||||
|
/* Since 5.0.12, to fix issue #107.
|
||||||
|
Always use the background mode set by user as the initial value of
|
||||||
|
the effective background mode, then override pdc->bkmode
|
||||||
|
after entering drawing if need. */
|
||||||
|
pdc->bkmode = pdc->bkmode_set;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@@ -1913,7 +1918,7 @@ static void dc_InitDC (PDC pdc, HWND hWnd, BOOL bIsClient)
|
|||||||
memset (pdc->filter_pixels, 0, sizeof (pdc->filter_pixels));
|
memset (pdc->filter_pixels, 0, sizeof (pdc->filter_pixels));
|
||||||
|
|
||||||
pdc->bkcolor = GAL_MapRGB (pdc->surface->format, 0xFF, 0xFF, 0xFF);
|
pdc->bkcolor = GAL_MapRGB (pdc->surface->format, 0xFF, 0xFF, 0xFF);
|
||||||
pdc->bkmode = 0;
|
pdc->bkmode_set = 0; /* Since 5.0.12 */
|
||||||
|
|
||||||
pdc->pencolor = GAL_MapRGB (pdc->surface->format, 0x00, 0x00, 0x00);
|
pdc->pencolor = GAL_MapRGB (pdc->surface->format, 0x00, 0x00, 0x00);
|
||||||
pdc->brushcolor = GAL_MapRGB (pdc->surface->format, 0xFF, 0xFF, 0xFF);
|
pdc->brushcolor = GAL_MapRGB (pdc->surface->format, 0xFF, 0xFF, 0xFF);
|
||||||
@@ -2067,12 +2072,18 @@ static void dc_InitDC (PDC pdc, HWND hWnd, BOOL bIsClient)
|
|||||||
* and copies the DC attributes from the refrence DC. */
|
* and copies the DC attributes from the refrence DC. */
|
||||||
static void dc_InitMemDCFrom (PDC pdc, const PDC pdc_ref)
|
static void dc_InitMemDCFrom (PDC pdc, const PDC pdc_ref)
|
||||||
{
|
{
|
||||||
|
unsigned nr_bytes = pdc->__last_attr - pdc->__first_attr;
|
||||||
|
|
||||||
memset (pdc->gray_pixels, 0, sizeof (pdc->gray_pixels));
|
memset (pdc->gray_pixels, 0, sizeof (pdc->gray_pixels));
|
||||||
memset (pdc->filter_pixels, 0, sizeof (pdc->filter_pixels));
|
memset (pdc->filter_pixels, 0, sizeof (pdc->filter_pixels));
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
memcpy (pdc->__first_attr, pdc_ref->__first_attr, nr_bytes);
|
||||||
|
#else
|
||||||
/* copy attributes from reference DC
|
/* copy attributes from reference DC
|
||||||
* gal_pixel bkcolor, pencolor, brushcolor, textcolor;
|
* gal_pixel bkcolor, pencolor, brushcolor, textcolor;
|
||||||
* int bkmode, tabstop, cExtra, wExtra, alExtra, blExtra, mapmode, ta_flags, bidi_flags;
|
* int bkmode, bkmode_set, tabstop, cExtra, wExtra, alExtra, blExtra,
|
||||||
|
* mapmode, ta_flags, bidi_flags;
|
||||||
*/
|
*/
|
||||||
memcpy (&pdc->bkcolor, &pdc_ref->bkcolor,
|
memcpy (&pdc->bkcolor, &pdc_ref->bkcolor,
|
||||||
sizeof (gal_pixel)*4 + sizeof (int)*9);
|
sizeof (gal_pixel)*4 + sizeof (int)*9);
|
||||||
@@ -2080,6 +2091,8 @@ static void dc_InitMemDCFrom (PDC pdc, const PDC pdc_ref)
|
|||||||
memcpy (&pdc->pen_type, &pdc_ref->pen_type,
|
memcpy (&pdc->pen_type, &pdc_ref->pen_type,
|
||||||
(sizeof(int)*7) + sizeof(POINT) + (sizeof (void*)*3));
|
(sizeof(int)*7) + sizeof(POINT) + (sizeof (void*)*3));
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
pdc->pLogFont = pdc_ref->pLogFont;
|
pdc->pLogFont = pdc_ref->pLogFont;
|
||||||
|
|
||||||
/* reset view point info. */
|
/* reset view point info. */
|
||||||
@@ -2127,7 +2140,7 @@ static void dc_InitScreenDC (PDC pdc, GAL_Surface *surface)
|
|||||||
pdc->surface = surface;
|
pdc->surface = surface;
|
||||||
|
|
||||||
pdc->bkcolor = PIXEL_lightwhite;
|
pdc->bkcolor = PIXEL_lightwhite;
|
||||||
pdc->bkmode = 0;
|
pdc->bkmode_set = 0;
|
||||||
|
|
||||||
pdc->brushcolor = PIXEL_lightwhite;
|
pdc->brushcolor = PIXEL_lightwhite;
|
||||||
|
|
||||||
@@ -2462,7 +2475,7 @@ void GUIAPI ReleaseDC (HDC hDC)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL InitSubDC (HDC hdcDest, HDC hdc, int off_x, int off_y,
|
static BOOL dc_InitSubDC (HDC hdcDest, HDC hdc, int off_x, int off_y,
|
||||||
int width, int height)
|
int width, int height)
|
||||||
{
|
{
|
||||||
int parent_width,parent_height;
|
int parent_width,parent_height;
|
||||||
@@ -2564,7 +2577,11 @@ HDC GUIAPI GetSubDC (HDC hdc, int off_x, int off_y, int width, int height)
|
|||||||
if (pdc == NULL)
|
if (pdc == NULL)
|
||||||
return HDC_INVALID;
|
return HDC_INVALID;
|
||||||
|
|
||||||
if (!InitSubDC((HDC)pdc, hdc, off_x, off_y, width, height)) {
|
InitClipRgn (&pdc->lcrgn, &__mg_FreeClipRectList);
|
||||||
|
MAKE_REGION_INFINITE(&pdc->lcrgn);
|
||||||
|
InitClipRgn (&pdc->ecrgn, &__mg_FreeClipRectList);
|
||||||
|
|
||||||
|
if (!dc_InitSubDC((HDC)pdc, hdc, off_x, off_y, width, height)) {
|
||||||
pdc->bInUse = FALSE;
|
pdc->bInUse = FALSE;
|
||||||
return HDC_INVALID;
|
return HDC_INVALID;
|
||||||
}
|
}
|
||||||
@@ -2654,16 +2671,16 @@ HDC GUIAPI CreatePrivateSubDC (HDC hdc, int off_x, int off_y,
|
|||||||
if (!(pdc = malloc(sizeof(DC))))
|
if (!(pdc = malloc(sizeof(DC))))
|
||||||
return HDC_INVALID;
|
return HDC_INVALID;
|
||||||
|
|
||||||
InitClipRgn (&pdc->lcrgn, &__mg_FreeClipRectList);
|
|
||||||
MAKE_REGION_INFINITE(&pdc->lcrgn);
|
|
||||||
InitClipRgn (&pdc->ecrgn, &__mg_FreeClipRectList);
|
|
||||||
|
|
||||||
pdc->bInUse = TRUE;
|
pdc->bInUse = TRUE;
|
||||||
pdc->DataType = TYPE_HDC;
|
pdc->DataType = TYPE_HDC;
|
||||||
/* XXX: use the parent's type */
|
/* XXX: use the parent's type */
|
||||||
pdc->DCType = pdc_parent->DCType;
|
pdc->DCType = pdc_parent->DCType;
|
||||||
|
|
||||||
if (!InitSubDC ((HDC)pdc, hdc, off_x, off_y, width, height)) {
|
InitClipRgn (&pdc->lcrgn, &__mg_FreeClipRectList);
|
||||||
|
MAKE_REGION_INFINITE(&pdc->lcrgn);
|
||||||
|
InitClipRgn (&pdc->ecrgn, &__mg_FreeClipRectList);
|
||||||
|
|
||||||
|
if (!dc_InitSubDC ((HDC)pdc, hdc, off_x, off_y, width, height)) {
|
||||||
free (pdc);
|
free (pdc);
|
||||||
return HDC_INVALID;
|
return HDC_INVALID;
|
||||||
}
|
}
|
||||||
@@ -3780,7 +3797,8 @@ HWND GUIAPI WindowFromDC (HDC hdc)
|
|||||||
typedef struct _DCSTATE
|
typedef struct _DCSTATE
|
||||||
{
|
{
|
||||||
GAL_Color bkcolor, pencolor, brushcolor, textcolor;
|
GAL_Color bkcolor, pencolor, brushcolor, textcolor;
|
||||||
/* bkmode, tabstop, cExtra, wExtra, alExtra, blExtra, mapmode, ta_flags, bidi_flags */
|
/* bkmode_set, tabstop, cExtra, wExtra, alExtra, blExtra,
|
||||||
|
mapmode, ta_flags, bidi_flags */
|
||||||
char attrs_g1 [sizeof(int)*9];
|
char attrs_g1 [sizeof(int)*9];
|
||||||
|
|
||||||
#ifdef _MGHAVE_ADV_2DAPI
|
#ifdef _MGHAVE_ADV_2DAPI
|
||||||
@@ -3868,7 +3886,7 @@ int GUIAPI SaveDC (HDC hdc)
|
|||||||
&dc_state->textcolor.r, &dc_state->textcolor.g,
|
&dc_state->textcolor.r, &dc_state->textcolor.g,
|
||||||
&dc_state->textcolor.b, &dc_state->textcolor.a);
|
&dc_state->textcolor.b, &dc_state->textcolor.a);
|
||||||
|
|
||||||
memcpy (dc_state->attrs_g1, &pdc->bkmode, sizeof (dc_state->attrs_g1));
|
memcpy (dc_state->attrs_g1, &pdc->bkmode_set, sizeof (dc_state->attrs_g1));
|
||||||
#ifdef _MGHAVE_ADV_2DAPI
|
#ifdef _MGHAVE_ADV_2DAPI
|
||||||
memcpy (dc_state->attrs_adv, &pdc->pen_type, sizeof (dc_state->attrs_adv));
|
memcpy (dc_state->attrs_adv, &pdc->pen_type, sizeof (dc_state->attrs_adv));
|
||||||
#endif
|
#endif
|
||||||
@@ -3972,7 +3990,7 @@ BOOL GUIAPI RestoreDC (HDC hdc, int saved_dc)
|
|||||||
dc_state->textcolor.r, dc_state->textcolor.g,
|
dc_state->textcolor.r, dc_state->textcolor.g,
|
||||||
dc_state->textcolor.b, dc_state->textcolor.a);
|
dc_state->textcolor.b, dc_state->textcolor.a);
|
||||||
|
|
||||||
memcpy (&pdc->bkmode, dc_state->attrs_g1, sizeof (dc_state->attrs_g1));
|
memcpy (&pdc->bkmode_set, dc_state->attrs_g1, sizeof (dc_state->attrs_g1));
|
||||||
#ifdef _MGHAVE_ADV_2DAPI
|
#ifdef _MGHAVE_ADV_2DAPI
|
||||||
memcpy (&pdc->pen_type, dc_state->attrs_adv, sizeof (dc_state->attrs_adv));
|
memcpy (&pdc->pen_type, dc_state->attrs_adv, sizeof (dc_state->attrs_adv));
|
||||||
#endif
|
#endif
|
||||||
@@ -4345,8 +4363,6 @@ static void on_surface_changed_for_control (struct _travel_context* ctxt,
|
|||||||
RECT rc_surface, rc_minimal;
|
RECT rc_surface, rc_minimal;
|
||||||
PDC pdc = dc_HDC2PDC (ctrl->privCDC);
|
PDC pdc = dc_HDC2PDC (ctrl->privCDC);
|
||||||
|
|
||||||
_WRN_PRINTF ("called\n");
|
|
||||||
|
|
||||||
pdc->surface = ctxt->surface;
|
pdc->surface = ctxt->surface;
|
||||||
|
|
||||||
if (pdc->surface != __gal_screen) {
|
if (pdc->surface != __gal_screen) {
|
||||||
|
|||||||
+13
-10
@@ -559,7 +559,6 @@ static void _glyph_draw_pixels (PDC pdc, int x, int y, gal_pixel pixel, int w)
|
|||||||
|
|
||||||
pdc->cur_pixel = old_color;
|
pdc->cur_pixel = old_color;
|
||||||
}
|
}
|
||||||
pdc->cur_pixel = old_color;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "../newgal/blit.h"
|
#include "../newgal/blit.h"
|
||||||
@@ -1151,8 +1150,7 @@ static void _dc_ft2subpixel_scan_line(PDC pdc, int xpos, int ypos,
|
|||||||
rgba_cur.g, rgba_cur.b);
|
rgba_cur.g, rgba_cur.b);
|
||||||
|
|
||||||
if (pdc->cur_pixel != pixel) {
|
if (pdc->cur_pixel != pixel) {
|
||||||
_glyph_draw_pixel (pdc,
|
_glyph_draw_pixel (pdc, x+xpos, ypos, pdc->cur_pixel);
|
||||||
x+xpos, ypos, pdc->cur_pixel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2691,15 +2689,14 @@ int _gdi_draw_null_glyph (PDC pdc, int advance, BOOL direction,
|
|||||||
|
|
||||||
if (WITHOUT_DRAWING (pdc)) goto end;
|
if (WITHOUT_DRAWING (pdc)) goto end;
|
||||||
|
|
||||||
pdc->cur_pixel = pdc->bkcolor;
|
if (!IntersectRect(&pdc->rc_output, &rc_back, &pdc->rc_output))
|
||||||
pdc->cur_ban = NULL;
|
|
||||||
pdc->step = 1;
|
|
||||||
|
|
||||||
if(!IntersectRect(&pdc->rc_output, &rc_back, &pdc->rc_output))
|
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
ENTER_DRAWING(pdc);
|
ENTER_DRAWING(pdc);
|
||||||
|
|
||||||
|
pdc->cur_pixel = pdc->bkcolor;
|
||||||
|
pdc->cur_ban = NULL;
|
||||||
|
pdc->step = 1;
|
||||||
draw_back_area (pdc, area, &gal_rc, 0, 0, flag);
|
draw_back_area (pdc, area, &gal_rc, 0, 0, flag);
|
||||||
|
|
||||||
LEAVE_DRAWING (pdc);
|
LEAVE_DRAWING (pdc);
|
||||||
@@ -2968,7 +2965,7 @@ int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
|
|||||||
int* adv_x, int* adv_y)
|
int* adv_x, int* adv_y)
|
||||||
{
|
{
|
||||||
int my_adv_x, my_adv_y;
|
int my_adv_x, my_adv_y;
|
||||||
int advance;
|
int advance, bkmode;
|
||||||
PDC pdc;
|
PDC pdc;
|
||||||
|
|
||||||
if (glyph_value == INV_GLYPH_VALUE)
|
if (glyph_value == INV_GLYPH_VALUE)
|
||||||
@@ -2982,9 +2979,12 @@ int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
|
|||||||
/* convert to the start point on baseline. */
|
/* convert to the start point on baseline. */
|
||||||
_gdi_get_baseline_point (pdc, &x, &y);
|
_gdi_get_baseline_point (pdc, &x, &y);
|
||||||
|
|
||||||
|
bkmode = pdc->bkmode;
|
||||||
|
pdc->bkmode = pdc->bkmode_set;
|
||||||
advance = _gdi_draw_one_glyph (pdc, glyph_value,
|
advance = _gdi_draw_one_glyph (pdc, glyph_value,
|
||||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
x, y, &my_adv_x, &my_adv_y);
|
x, y, &my_adv_x, &my_adv_y);
|
||||||
|
pdc->bkmode = bkmode;
|
||||||
|
|
||||||
if (adv_x) *adv_x = my_adv_x;
|
if (adv_x) *adv_x = my_adv_x;
|
||||||
if (adv_y) *adv_y = my_adv_y;
|
if (adv_y) *adv_y = my_adv_y;
|
||||||
@@ -2996,9 +2996,10 @@ int GUIAPI DrawGlyphStrings(HDC hdc, Glyph32* glyphs, int nr_glyphs,
|
|||||||
const POINT* pts)
|
const POINT* pts)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int i;
|
int i, bkmode;
|
||||||
PDC pdc = dc_HDC2PDC(hdc);
|
PDC pdc = dc_HDC2PDC(hdc);
|
||||||
|
|
||||||
|
bkmode = pdc->bkmode;
|
||||||
for (i = 0; i < nr_glyphs; i++) {
|
for (i = 0; i < nr_glyphs; i++) {
|
||||||
int x, y;
|
int x, y;
|
||||||
int my_adv_x, my_adv_y;
|
int my_adv_x, my_adv_y;
|
||||||
@@ -3019,10 +3020,12 @@ int GUIAPI DrawGlyphStrings(HDC hdc, Glyph32* glyphs, int nr_glyphs,
|
|||||||
/* convert to the start point on baseline. */
|
/* convert to the start point on baseline. */
|
||||||
_gdi_get_baseline_point (pdc, &x, &y);
|
_gdi_get_baseline_point (pdc, &x, &y);
|
||||||
|
|
||||||
|
pdc->bkmode = pdc->bkmode_set;
|
||||||
_gdi_draw_one_glyph (pdc, gv,
|
_gdi_draw_one_glyph (pdc, gv,
|
||||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
x, y, &my_adv_x, &my_adv_y);
|
x, y, &my_adv_x, &my_adv_y);
|
||||||
}
|
}
|
||||||
|
pdc->bkmode = bkmode;
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-5
@@ -625,12 +625,18 @@ void GUIAPI DrawIcon (HDC hdc, int x, int y, int w, int h, HICON hicon)
|
|||||||
HDC icon_dc;
|
HDC icon_dc;
|
||||||
PICON picon = (PICON)hicon;
|
PICON picon = (PICON)hicon;
|
||||||
|
|
||||||
icon_dc = __mg_get_common_rgba8888_dc();
|
MYBITMAP icon_bmp = { };
|
||||||
if (icon_dc == HDC_INVALID)
|
icon_bmp.flags = MYBMP_TYPE_RGBA | MYBMP_ALPHA;
|
||||||
return;
|
icon_bmp.frames = 1;
|
||||||
|
icon_bmp.depth = 32;
|
||||||
|
icon_bmp.w = picon->width;
|
||||||
|
icon_bmp.h = picon->height;
|
||||||
|
icon_bmp.pitch = picon->pitch;
|
||||||
|
icon_bmp.size =picon->pitch * picon->height;
|
||||||
|
icon_bmp.bits = picon->pixels;
|
||||||
|
|
||||||
if (!__mg_reset_common_rgba8888_dc (picon->width, picon->height,
|
icon_dc = CreateMemDCFromMyBitmap(&icon_bmp, NULL);
|
||||||
picon->pitch, picon->pixels))
|
if (icon_dc == HDC_INVALID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (w <= 0) w = picon->width;
|
if (w <= 0) w = picon->width;
|
||||||
@@ -645,5 +651,7 @@ void GUIAPI DrawIcon (HDC hdc, int x, int y, int w, int h, HICON hicon)
|
|||||||
BitBlt (icon_dc, 0, 0, picon->width, picon->height,
|
BitBlt (icon_dc, 0, 0, picon->width, picon->height,
|
||||||
hdc, x, y, 0);
|
hdc, x, y, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeleteMemDC(icon_dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -511,11 +511,11 @@ static void shape_space(const LAYOUT* layout, const LayoutRun* lrun,
|
|||||||
|
|
||||||
gstr->glyphs[i].is_cluster_start = 1;
|
gstr->glyphs[i].is_cluster_start = 1;
|
||||||
gstr->log_clusters[i] = i;
|
gstr->log_clusters[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
if (BIDI_LEVEL_IS_RTL(lrun->el) && gstr->nr_glyphs > 1) {
|
if (BIDI_LEVEL_IS_RTL(lrun->el) && gstr->nr_glyphs > 1) {
|
||||||
__mg_reverse_shaped_glyphs(gstr->glyphs, gstr->nr_glyphs);
|
__mg_reverse_shaped_glyphs(gstr->glyphs, gstr->nr_glyphs);
|
||||||
__mg_reverse_log_clusters(gstr->log_clusters, gstr->nr_glyphs);
|
__mg_reverse_log_clusters(gstr->log_clusters, gstr->nr_glyphs);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1429,6 +1429,7 @@ void GUIAPI BIDIGetTextRangesLog2Vis(LOGFONT* log_font,
|
|||||||
free(l_achars);
|
free(l_achars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void bidi_reverse_map (void* context, int len, int pos)
|
static void bidi_reverse_map (void* context, int len, int pos)
|
||||||
{
|
{
|
||||||
ACHARMAPINFO* str = (ACHARMAPINFO*)context + pos;
|
ACHARMAPINFO* str = (ACHARMAPINFO*)context + pos;
|
||||||
@@ -1440,6 +1441,7 @@ static void bidi_reverse_map (void* context, int len, int pos)
|
|||||||
str[len - 1 - i] = tmp;
|
str[len - 1 - i] = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int GUIAPI BIDIGetTextVisualAChars(LOGFONT* log_font,
|
int GUIAPI BIDIGetTextVisualAChars(LOGFONT* log_font,
|
||||||
const char* text, int text_len,
|
const char* text, int text_len,
|
||||||
@@ -1457,9 +1459,8 @@ int GUIAPI BIDIGetTextVisualAChars(LOGFONT* log_font,
|
|||||||
|
|
||||||
if (nr_achars > 0 && mbc_devfont
|
if (nr_achars > 0 && mbc_devfont
|
||||||
&& mbc_devfont->charset_ops->bidi_char_type) {
|
&& mbc_devfont->charset_ops->bidi_char_type) {
|
||||||
__mg_legacy_bidi_achars_reorder (mbc_devfont->charset_ops,
|
__mg_legacy_bidi_map_reorder (mbc_devfont->charset_ops,
|
||||||
*achs, nr_achars, -1,
|
*achs, nr_achars, -1, *achs_map);
|
||||||
*achs_map, bidi_reverse_map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nr_achars;
|
return nr_achars;
|
||||||
@@ -1472,9 +1473,8 @@ Achar32* GUIAPI BIDILogAChars2VisAChars(LOGFONT* log_font,
|
|||||||
|
|
||||||
if (nr_achars > 0 && mbc_devfont
|
if (nr_achars > 0 && mbc_devfont
|
||||||
&& mbc_devfont->charset_ops->bidi_char_type) {
|
&& mbc_devfont->charset_ops->bidi_char_type) {
|
||||||
__mg_legacy_bidi_achars_reorder (mbc_devfont->charset_ops,
|
__mg_legacy_bidi_map_reorder (mbc_devfont->charset_ops,
|
||||||
achs, nr_achars, -1,
|
achs, nr_achars, -1, achs_map);
|
||||||
achs_map, bidi_reverse_map);
|
|
||||||
|
|
||||||
return achs;
|
return achs;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-16
@@ -148,14 +148,15 @@ static BOOL find_color_key (GAL_PixelFormat* format, const MYBITMAP* my_bmp,
|
|||||||
goto free_and_ret;
|
goto free_and_ret;
|
||||||
|
|
||||||
color_num = 1 << my_bmp->depth;
|
color_num = 1 << my_bmp->depth;
|
||||||
pixels = malloc (color_num * sizeof (Uint32));
|
pixels = calloc (color_num, sizeof (Uint32));
|
||||||
for (i = 0; i < color_num; i++)
|
for (i = 0; i < color_num; i++) {
|
||||||
pixels[i] = GAL_MapRGB (format, pal[i].r, pal[i].g, pal[i].b);
|
pixels[i] = GAL_MapRGB (format, pal[i].r, pal[i].g, pal[i].b);
|
||||||
|
}
|
||||||
pixel_key = pixels [my_bmp->transparent];
|
pixel_key = pixels [my_bmp->transparent];
|
||||||
|
|
||||||
for (i = 0; i < color_num; i++) {
|
for (i = 0; i < color_num; i++) {
|
||||||
if (pixels[i] == pixel_key && i != my_bmp->transparent)
|
if (pixels[i] == pixel_key && i != my_bmp->transparent)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == color_num)
|
if (i == color_num)
|
||||||
@@ -1184,7 +1185,7 @@ static void cb_direct_paint_mybmp_sl (void* context, int stepx,
|
|||||||
|
|
||||||
int GUIAPI FillBoxWithMyBitmap (HDC hdc, int x, int y, MYBITMAP* mybmp, RGB* pal)
|
int GUIAPI FillBoxWithMyBitmap (HDC hdc, int x, int y, MYBITMAP* mybmp, RGB* pal)
|
||||||
{
|
{
|
||||||
int i = 0,right,bottom,w,h,oldbkmode,stepy,stepx;
|
int i = 0,right,bottom,w,h,stepy,stepx;
|
||||||
RECT rc_tmp;
|
RECT rc_tmp;
|
||||||
GAL_Rect dst_rect;
|
GAL_Rect dst_rect;
|
||||||
PCLIPRECT cliprect;
|
PCLIPRECT cliprect;
|
||||||
@@ -1313,20 +1314,17 @@ int GUIAPI FillBoxWithMyBitmap (HDC hdc, int x, int y, MYBITMAP* mybmp, RGB* pal
|
|||||||
w = RECTW (pdc->rc_output); h = RECTH (pdc->rc_output);
|
w = RECTW (pdc->rc_output); h = RECTH (pdc->rc_output);
|
||||||
dst_rect.x = x; dst_rect.y = y; dst_rect.w = w; dst_rect.h = h;
|
dst_rect.x = x; dst_rect.y = y; dst_rect.w = w; dst_rect.h = h;
|
||||||
|
|
||||||
pdc->step = 1;
|
|
||||||
pdc->cur_ban = NULL;
|
|
||||||
pdc->cur_pixel = pdc->brushcolor;
|
|
||||||
pdc->skip_pixel = colorKey;
|
|
||||||
//fill_info->old_bkmode = pdc->bkmode;
|
|
||||||
oldbkmode =pdc->bkmode;
|
|
||||||
if (mybmp->flags & MYBMP_TRANSPARENT) {
|
|
||||||
pdc->bkmode = BM_TRANSPARENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(__mg_enter_drawing (pdc) < 0) {
|
if(__mg_enter_drawing (pdc) < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
//bits = mybmp->bits;
|
|
||||||
|
pdc->step = 1;
|
||||||
|
pdc->cur_ban = NULL;
|
||||||
|
pdc->cur_pixel = pdc->brushcolor;
|
||||||
|
if (mybmp->flags & MYBMP_TRANSPARENT) {
|
||||||
|
pdc->bkmode = BM_TRANSPARENT;
|
||||||
|
pdc->skip_pixel = colorKey;
|
||||||
|
}
|
||||||
|
|
||||||
info.hdc = hdc;
|
info.hdc = hdc;
|
||||||
info.pdc = pdc;
|
info.pdc = pdc;
|
||||||
@@ -1349,7 +1347,6 @@ int GUIAPI FillBoxWithMyBitmap (HDC hdc, int x, int y, MYBITMAP* mybmp, RGB* pal
|
|||||||
cliprect = cliprect->next;
|
cliprect = cliprect->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdc->bkmode =oldbkmode;
|
|
||||||
__mg_leave_drawing (pdc);
|
__mg_leave_drawing (pdc);
|
||||||
pdc->rc_output = rc_tmp;
|
pdc->rc_output = rc_tmp;
|
||||||
UNLOCK_GCRINFO (pdc);
|
UNLOCK_GCRINFO (pdc);
|
||||||
|
|||||||
@@ -140,7 +140,6 @@ SOFTWARE.
|
|||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "cliprect.h"
|
#include "cliprect.h"
|
||||||
#include "gal.h"
|
#include "gal.h"
|
||||||
#include "blockheap.h"
|
|
||||||
|
|
||||||
typedef void (*voidProcp1)(CLIPRGN *region, const CLIPRECT *r1, const CLIPRECT *r1End,
|
typedef void (*voidProcp1)(CLIPRGN *region, const CLIPRECT *r1, const CLIPRECT *r1End,
|
||||||
const CLIPRECT *r2, const CLIPRECT *r2End, int top, int bottom);
|
const CLIPRECT *r2, const CLIPRECT *r2End, int top, int bottom);
|
||||||
|
|||||||
@@ -254,7 +254,6 @@ static BOOL shape_layout_run(SEInstance* inst,
|
|||||||
gs->log_clusters[j] = i;
|
gs->log_clusters[j] = i;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gs->nr_glyphs = j;
|
gs->nr_glyphs = j;
|
||||||
|
|||||||
+24
-31
@@ -133,7 +133,6 @@ static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
|
|||||||
TABBEDTEXTOUT_CTXT* ctxt = (TABBEDTEXTOUT_CTXT*)context;
|
TABBEDTEXTOUT_CTXT* ctxt = (TABBEDTEXTOUT_CTXT*)context;
|
||||||
int adv_x, adv_y;
|
int adv_x, adv_y;
|
||||||
BBOX bbox;
|
BBOX bbox;
|
||||||
int bkmode = ctxt->pdc->bkmode;
|
|
||||||
|
|
||||||
switch (char_type & ACHARTYPE_BASIC_MASK) {
|
switch (char_type & ACHARTYPE_BASIC_MASK) {
|
||||||
case ACHAR_BASIC_ZEROWIDTH:
|
case ACHAR_BASIC_ZEROWIDTH:
|
||||||
@@ -158,7 +157,8 @@ static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
|
|||||||
|
|
||||||
case ACHAR_BASIC_VOWEL:
|
case ACHAR_BASIC_VOWEL:
|
||||||
if (!ctxt->only_extent) {
|
if (!ctxt->only_extent) {
|
||||||
//ctxt->pdc->bkmode = BM_TRANSPARENT;
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = BM_TRANSPARENT;
|
||||||
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
@@ -175,9 +175,12 @@ static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
|
|||||||
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
|
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
|
||||||
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -224,11 +227,14 @@ static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
|
|||||||
/* use some tabs to move current x. */
|
/* use some tabs to move current x. */
|
||||||
if (ctxt->advance >= tab_pos) {
|
if (ctxt->advance >= tab_pos) {
|
||||||
while (ctxt->advance >= tab_pos)
|
while (ctxt->advance >= tab_pos)
|
||||||
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ? ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
|
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ?
|
||||||
|
ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ? ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
|
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ?
|
||||||
|
ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
|
||||||
}
|
}
|
||||||
|
|
||||||
_gdi_draw_null_glyph (ctxt->pdc, tab_pos - ctxt->advance,
|
_gdi_draw_null_glyph (ctxt->pdc, tab_pos - ctxt->advance,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
@@ -237,18 +243,26 @@ static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
|
|||||||
ctxt->nTabOrig = tab_pos;
|
ctxt->nTabOrig = tab_pos;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACHAR_BASIC_VOWEL:
|
case ACHAR_BASIC_VOWEL: {
|
||||||
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = BM_TRANSPARENT;
|
||||||
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
adv_x = adv_y = 0;
|
adv_x = adv_y = 0;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default: {
|
||||||
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
|
||||||
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxt->x += adv_x;
|
ctxt->x += adv_x;
|
||||||
@@ -403,20 +417,13 @@ int GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len,
|
|||||||
return advance;
|
return advance;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
|
static int _gdi_tabbedex_text_out (PDC pdc, int x, int y,
|
||||||
const unsigned char* text, int len, int tab_width,
|
const unsigned char* text, int len, int tab_width,
|
||||||
int nTabs, int *pTabPos, int nTabOrig, POINT* cur_pos)
|
int nTabs, int *pTabPos, int nTabOrig, POINT* cur_pos)
|
||||||
{
|
{
|
||||||
TABBEDTEXTOUTEX_CTXT ctxt;
|
TABBEDTEXTOUTEX_CTXT ctxt;
|
||||||
int nr_delim_newline = 0, line_len = 0;
|
int nr_delim_newline = 0, line_len = 0;
|
||||||
|
|
||||||
#if 0
|
|
||||||
DEVFONT* sbc_devfont;
|
|
||||||
DEVFONT* mbc_devfont;
|
|
||||||
sbc_devfont = pdc->pLogFont->devfonts[0];
|
|
||||||
mbc_devfont = pdc->pLogFont->devfonts[1];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ctxt.pdc = pdc;
|
ctxt.pdc = pdc;
|
||||||
ctxt.start_x = x;
|
ctxt.start_x = x;
|
||||||
ctxt.start_y = y;
|
ctxt.start_y = y;
|
||||||
@@ -585,25 +592,11 @@ int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text,
|
|||||||
ach = devfont->charset_ops->get_char_value
|
ach = devfont->charset_ops->get_char_value
|
||||||
(NULL, 0, (const unsigned char*)text, len_cur_char);
|
(NULL, 0, (const unsigned char*)text, len_cur_char);
|
||||||
char_type = devfont->charset_ops->char_type (ach);
|
char_type = devfont->charset_ops->char_type (ach);
|
||||||
|
|
||||||
|
if (devfont == mbc_devfont)
|
||||||
|
ach = SET_MBCHV(ach);
|
||||||
gv = GetGlyphValueAlt(log_font, ach);
|
gv = GetGlyphValueAlt(log_font, ach);
|
||||||
|
|
||||||
if (devfont == mbc_devfont) {
|
|
||||||
int i, dfi;
|
|
||||||
DEVFONT* df;
|
|
||||||
|
|
||||||
dfi = 1;
|
|
||||||
for (i = 1; i < MAXNR_DEVFONTS; i++) {
|
|
||||||
if ((df = log_font->devfonts[i])) {
|
|
||||||
if (df->font_ops->is_glyph_existed(log_font, df,
|
|
||||||
gv)) {
|
|
||||||
dfi = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gv = SET_GLYPH_DFI(gv, dfi);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (char_type & ACHARTYPE_BASIC_MASK) {
|
switch (char_type & ACHARTYPE_BASIC_MASK) {
|
||||||
case ACHAR_BASIC_ZEROWIDTH:
|
case ACHAR_BASIC_ZEROWIDTH:
|
||||||
case ACHAR_BASIC_VOWEL:
|
case ACHAR_BASIC_VOWEL:
|
||||||
|
|||||||
+15
-12
@@ -122,14 +122,13 @@ static BOOL cb_draw_glyph (void* context, Glyph32 glyph_value, unsigned int char
|
|||||||
{
|
{
|
||||||
DRAW_GLYPHS_CTXT* ctxt = (DRAW_GLYPHS_CTXT*)context;
|
DRAW_GLYPHS_CTXT* ctxt = (DRAW_GLYPHS_CTXT*)context;
|
||||||
int adv_x, adv_y;
|
int adv_x, adv_y;
|
||||||
int bkmode;
|
|
||||||
|
|
||||||
if (check_zero_width(char_type)) {
|
if (check_zero_width(char_type)) {
|
||||||
adv_x = adv_y = 0;
|
adv_x = adv_y = 0;
|
||||||
}
|
}
|
||||||
else if (check_vowel(char_type)) {
|
else if (check_vowel(char_type)) {
|
||||||
bkmode = GetBkMode (ctxt->hdc);
|
int bkmode = GetBkMode (ctxt->hdc);
|
||||||
//SetBkMode (ctxt->hdc, BM_TRANSPARENT);
|
SetBkMode (ctxt->hdc, BM_TRANSPARENT);
|
||||||
DrawGlyph (ctxt->hdc, ctxt->x, ctxt->y, glyph_value, &adv_x, &adv_y);
|
DrawGlyph (ctxt->hdc, ctxt->x, ctxt->y, glyph_value, &adv_x, &adv_y);
|
||||||
SetBkMode (ctxt->hdc, bkmode);
|
SetBkMode (ctxt->hdc, bkmode);
|
||||||
adv_x = 0;
|
adv_x = 0;
|
||||||
@@ -160,22 +159,19 @@ static BOOL cb_textout (void* context, Glyph32 glyph_value,
|
|||||||
{
|
{
|
||||||
TEXTOUT_CTXT* ctxt = (TEXTOUT_CTXT*)context;
|
TEXTOUT_CTXT* ctxt = (TEXTOUT_CTXT*)context;
|
||||||
int adv_x, adv_y;
|
int adv_x, adv_y;
|
||||||
int bkmode;
|
|
||||||
|
|
||||||
if (check_zero_width (char_type)) {
|
if (check_zero_width (char_type)) {
|
||||||
adv_x = adv_y = 0;
|
adv_x = adv_y = 0;
|
||||||
}
|
}
|
||||||
else if (check_vowel(char_type)) {
|
else if (check_vowel(char_type)) {
|
||||||
if (!ctxt->only_extent) {
|
if (!ctxt->only_extent) {
|
||||||
bkmode = ctxt->pdc->bkmode;
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
//ctxt->pdc->bkmode = BM_TRANSPARENT;
|
ctxt->pdc->bkmode = BM_TRANSPARENT;
|
||||||
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
ctxt->pdc->bkmode = bkmode;
|
ctxt->pdc->bkmode = bkmode;
|
||||||
|
|
||||||
}
|
}
|
||||||
//adv_x = adv_y = 0;
|
|
||||||
adv_x = 0;
|
adv_x = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -183,10 +179,14 @@ static BOOL cb_textout (void* context, Glyph32 glyph_value,
|
|||||||
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
|
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
0, 0, &adv_x, &adv_y, NULL);
|
0, 0, &adv_x, &adv_y, NULL);
|
||||||
else
|
else {
|
||||||
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
|
||||||
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxt->x += adv_x;
|
ctxt->x += adv_x;
|
||||||
@@ -324,14 +324,13 @@ static BOOL cb_textout_omitted (void* context, Glyph32 glyph_value, unsigned int
|
|||||||
TEXTOUTOMITTED_CTXT* ctxt = (TEXTOUTOMITTED_CTXT*)context;
|
TEXTOUTOMITTED_CTXT* ctxt = (TEXTOUTOMITTED_CTXT*)context;
|
||||||
int adv_x, adv_y;
|
int adv_x, adv_y;
|
||||||
int glyph_advance = 0;
|
int glyph_advance = 0;
|
||||||
//BBOX bbox;
|
|
||||||
int bkmode = ctxt->pdc->bkmode;
|
|
||||||
|
|
||||||
if (check_zero_width(char_type)) {
|
if (check_zero_width(char_type)) {
|
||||||
adv_x = adv_y = 0;
|
adv_x = adv_y = 0;
|
||||||
}
|
}
|
||||||
else if (check_vowel(char_type)) {
|
else if (check_vowel(char_type)) {
|
||||||
//ctxt->pdc->bkmode = BM_TRANSPARENT;
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = BM_TRANSPARENT;
|
||||||
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
@@ -347,9 +346,12 @@ static BOOL cb_textout_omitted (void* context, Glyph32 glyph_value, unsigned int
|
|||||||
if((ctxt->advance + glyph_advance) > ctxt->max_extent)
|
if((ctxt->advance + glyph_advance) > ctxt->max_extent)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
|
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
|
||||||
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxt->x += adv_x;
|
ctxt->x += adv_x;
|
||||||
@@ -476,6 +478,7 @@ int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len,
|
|||||||
|
|
||||||
chv = (*mbc_devfont->charset_ops->get_char_value)(NULL,
|
chv = (*mbc_devfont->charset_ops->get_char_value)(NULL,
|
||||||
0, (const unsigned char*)text, 0);
|
0, (const unsigned char*)text, 0);
|
||||||
|
chv = SET_MBCHV(chv);
|
||||||
|
|
||||||
gv = GetGlyphValueAlt(pdc->pLogFont, chv);
|
gv = GetGlyphValueAlt(pdc->pLogFont, chv);
|
||||||
advance_cur_char = _gdi_get_glyph_advance (pdc, gv,
|
advance_cur_char = _gdi_get_glyph_advance (pdc, gv,
|
||||||
|
|||||||
@@ -747,6 +747,8 @@ void GUIAPI UpdateTopmostLayer (const RECT* dirty_rc)
|
|||||||
SendMessage (HWND_DESKTOP, MSG_PAINT, 0, 0);
|
SendMessage (HWND_DESKTOP, MSG_PAINT, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wzero-length-bounds"
|
||||||
int GUIAPI ServerGetTopmostZNodeOfType (MG_Layer* layer, DWORD type, int* cli)
|
int GUIAPI ServerGetTopmostZNodeOfType (MG_Layer* layer, DWORD type, int* cli)
|
||||||
{
|
{
|
||||||
ZORDERINFO* zi;
|
ZORDERINFO* zi;
|
||||||
@@ -774,6 +776,7 @@ int GUIAPI ServerGetTopmostZNodeOfType (MG_Layer* layer, DWORD type, int* cli)
|
|||||||
|
|
||||||
return topmost;
|
return topmost;
|
||||||
}
|
}
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
int GUIAPI ServerGetNextZNode (MG_Layer* layer, int idx_znode, int* cli)
|
int GUIAPI ServerGetNextZNode (MG_Layer* layer, int idx_znode, int* cli)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -1001,7 +1001,7 @@ static inline MYBMP_WITH_PAL* new_mybmp_with_pal (void)
|
|||||||
MYBMP_WITH_PAL* mybmp_pal;
|
MYBMP_WITH_PAL* mybmp_pal;
|
||||||
|
|
||||||
mybmp_pal = NEW(MYBMP_WITH_PAL);
|
mybmp_pal = NEW(MYBMP_WITH_PAL);
|
||||||
mybmp_pal->pal = malloc (sizeof (RGB) * 256);
|
mybmp_pal->pal = calloc (256, sizeof (RGB));
|
||||||
return mybmp_pal;
|
return mybmp_pal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+71
-268
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user