mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-30 06:23:22 +08:00
Compare commits
102
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3643606a7f | ||
|
|
3ef2340749 | ||
|
|
a583dc1cbb | ||
|
|
f0bae4444c | ||
|
|
0a5ace7f82 | ||
|
|
5b27cc70fc | ||
|
|
43101379ed | ||
|
|
4c2b20c49f | ||
|
|
b7625c5726 | ||
|
|
872e299ad9 | ||
|
|
c60c19aad5 | ||
|
|
5d216dcc32 | ||
|
|
37c122a1de | ||
|
|
50ae4b9b44 | ||
|
|
695c55e464 | ||
|
|
a16903d570 | ||
|
|
3189931910 | ||
|
|
c3a8dc0798 | ||
|
|
848ed3fecc | ||
|
|
0d1f1f028a | ||
|
|
d4add19e6a | ||
|
|
bfaeae0023 | ||
|
|
70705c7db0 | ||
|
|
517d74a2d2 | ||
|
|
d68eee3c90 | ||
|
|
e575e7c69d | ||
|
|
d059fc8de2 | ||
|
|
5d9d787dac | ||
|
|
9696fbb3ba | ||
|
|
800329086e | ||
|
|
11be6af9d3 | ||
|
|
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 |
@@ -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~
|
||||||
|
|||||||
+94
-1
@@ -1,5 +1,13 @@
|
|||||||
# Release Notes
|
# Release Notes
|
||||||
|
|
||||||
|
- [Version 5.0.13](#version-5013)
|
||||||
|
+ [What's new in version 5.0.13](#whats-new-in-version-5013)
|
||||||
|
- [Version 5.0.12](#version-5012)
|
||||||
|
+ [What's new in version 5.0.12](#whats-new-in-version-5012)
|
||||||
|
- [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)
|
- [Version 5.0.9](#version-508)
|
||||||
+ [What's new in version 5.0.9](#whats-new-in-version-508)
|
+ [What's new in version 5.0.9](#whats-new-in-version-508)
|
||||||
- [Version 5.0.8](#version-508)
|
- [Version 5.0.8](#version-508)
|
||||||
@@ -24,9 +32,94 @@
|
|||||||
+ [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.13
|
||||||
|
|
||||||
|
On Aug. 31, 2023, FMSoft announces the availability of MiniGUI 5.0.13,
|
||||||
|
which is an enhancement release with some minor enhancements
|
||||||
|
of MiniGUI 5.0.x.
|
||||||
|
|
||||||
|
### What's new in version 5.0.13
|
||||||
|
|
||||||
|
In this version, we made some enhancements:
|
||||||
|
|
||||||
|
* ENHANCEMENTS:
|
||||||
|
- Disable BIDI for text in UTF-8 charset by default.
|
||||||
|
* CHANGES:
|
||||||
|
- Add `BIDI_FLAG_NONE` and `BIDI_FLAG_LEGACY`.
|
||||||
|
* BUGFIXING:
|
||||||
|
- Ignore C0CTRL characters when renerding text.
|
||||||
|
- Support for vowels.
|
||||||
|
|
||||||
|
## Version 5.0.12
|
||||||
|
|
||||||
|
On May 10, 2023, FMSoft announces the availability of MiniGUI 5.0.12,
|
||||||
|
which is an enhancement release with some minor enhancements
|
||||||
|
of MiniGUI 5.0.x.
|
||||||
|
|
||||||
|
### What's new in version 5.0.12
|
||||||
|
|
||||||
|
In this version, we made some enhancements:
|
||||||
|
|
||||||
|
* ENHANCEMENTS:
|
||||||
|
- Add new API `GetACharsExtentPointEx()`.
|
||||||
|
- Add new APIs `GetTabbedACharsExtent()`, `GetTabbedACharsExtentPoint()`,
|
||||||
|
and `GetTabbedACharsExtentPointEx()`.
|
||||||
|
- Enhance two APIs `GetTextExtentPoint()` and `GetTabbedTextExtentPoint()`
|
||||||
|
to support BIDI charsets.
|
||||||
|
- Tune management of tick count.
|
||||||
|
* BUGFIXING:
|
||||||
|
- Fix a typo: `Achar2UChar()` to `AChar2UChar()`.
|
||||||
|
|
||||||
|
## 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
|
## Version 5.0.9
|
||||||
|
|
||||||
On Jan. 14 2022, FMSoft announces the availability of MiniGUI 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.
|
which is a bug fixing release with minor enhancements of MiniGUI 5.0.x.
|
||||||
|
|
||||||
### What's new in version 5.0.9
|
### What's new in version 5.0.9
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
Version 5.0.9 (2022/01/14)
|
Version 5.0.13 (2023/08/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.
|
||||||
|
|
||||||
|
|||||||
+9
-5
@@ -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.9)
|
AC_INIT(libminigui, 5.0.13)
|
||||||
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,8 +16,8 @@ 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=9
|
MINIGUI_MICRO_VERSION=13
|
||||||
MINIGUI_INTERFACE_AGE=3
|
MINIGUI_INTERFACE_AGE=1
|
||||||
MINIGUI_BINARY_AGE=3
|
MINIGUI_BINARY_AGE=3
|
||||||
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
|
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_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")
|
||||||
|
|||||||
+1
-1
@@ -127,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
|
||||||
|
|||||||
+127
-4
@@ -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. */
|
||||||
@@ -10713,7 +10713,10 @@ MG_EXPORT int GUIAPI GetTabbedTextExtent (HDC hdc,
|
|||||||
SetDCAttr (hdc, DC_ATTR_TEXT_ALIGN, (DWORD)ta_flags)
|
SetDCAttr (hdc, DC_ATTR_TEXT_ALIGN, (DWORD)ta_flags)
|
||||||
|
|
||||||
#define BIDI_FLAG_LTR 0x00
|
#define BIDI_FLAG_LTR 0x00
|
||||||
#define BIDI_FLAG_RTL 0x10
|
#define BIDI_FLAG_RTL 0x01
|
||||||
|
|
||||||
|
#define BIDI_FLAG_NONE BIDI_FLAG_LTR
|
||||||
|
#define BIDI_FLAG_LEGACY 0x10
|
||||||
|
|
||||||
#define GetBIDIFlags(hdc) \
|
#define GetBIDIFlags(hdc) \
|
||||||
GetDCAttr (hdc, DC_ATTR_BIDI_FLAGS)
|
GetDCAttr (hdc, DC_ATTR_BIDI_FLAGS)
|
||||||
@@ -12632,7 +12635,7 @@ MG_EXPORT int GUIAPI BIDIGetTextVisualAChars (LOGFONT* log_font,
|
|||||||
* Achar32* achars, int nr_achars, int pel,
|
* Achar32* achars, int nr_achars, int pel,
|
||||||
* void* extra, CB_REVERSE_ARRAY cb_reverse_extra)
|
* void* extra, CB_REVERSE_ARRAY cb_reverse_extra)
|
||||||
* \brief Reorder the specified logical glyph string in visual order and
|
* \brief Reorder the specified logical glyph string in visual order and
|
||||||
* reorder an extra array to reflect the visule order of the achars.
|
* reorder an extra array to reflect the visual order of the achars.
|
||||||
*
|
*
|
||||||
* This function reorders the logical glyph string in place to visual order.
|
* This function reorders the logical glyph string in place to visual order.
|
||||||
* If \a extra and \a cb_reverse_extra are both not NULL, it also reorders
|
* If \a extra and \a cb_reverse_extra are both not NULL, it also reorders
|
||||||
@@ -12837,6 +12840,105 @@ MG_EXPORT int GUIAPI GetACharsExtent (HDC hdc, Achar32* achars, int nr_achars,
|
|||||||
MG_EXPORT int GUIAPI GetACharsExtentPoint (HDC hdc, Achar32* achars,
|
MG_EXPORT int GUIAPI GetACharsExtentPoint (HDC hdc, Achar32* achars,
|
||||||
int nr_achars, int max_extent, SIZE* size);
|
int nr_achars, int max_extent, SIZE* size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \fn int GUIAPI GetACharsExtentPointEx (HDC hdc, Achar32* achars, \
|
||||||
|
* int nr_achars, int max_extent, int* dx_chars, SIZE* size)
|
||||||
|
* \brief Get the visual extent value of an achar string.
|
||||||
|
*
|
||||||
|
* This function gets the visual extent value of a glpyh string.
|
||||||
|
* Note that this function ignore all breaks in the achar string.
|
||||||
|
*
|
||||||
|
* \param hdc The device context.
|
||||||
|
* \param achars The pointer to the achar string.
|
||||||
|
* \param nr_achars The length of the achar string len.
|
||||||
|
* \param max_extent The maximal output extent value.
|
||||||
|
* \param dx_achars The output positions of each character in the text will be
|
||||||
|
* returned through this pointer. It can be NULL.
|
||||||
|
* \param size The real extent of all visual achars in the achar string.
|
||||||
|
*
|
||||||
|
* \return The index of the last achar which can be fit to the extent.
|
||||||
|
*
|
||||||
|
* \sa GetACharsExtentPoint
|
||||||
|
*
|
||||||
|
* Since 5.0.12
|
||||||
|
*/
|
||||||
|
MG_EXPORT int GUIAPI GetACharsExtentPointEx (HDC hdc, Achar32* achars,
|
||||||
|
int nr_achars, int max_extent, int* dx_achars, SIZE* size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \fn int GUIAPI GetTabbedACharsExtent (HDC hdc, Achar32* achars,
|
||||||
|
* int nr_achars, SIZE* size)
|
||||||
|
* \brief Get visual extent value of an achar string.
|
||||||
|
*
|
||||||
|
* This function gets the extent value of an achar string on a DC. Note that
|
||||||
|
* this function will ignore all breaks in the achar string.
|
||||||
|
*
|
||||||
|
* \param hdc The device context.
|
||||||
|
* \param achars The pointer to the achar string.
|
||||||
|
* \param nr_achars The length of the achar string.
|
||||||
|
* \param size The buffer restoring the extents of the achar strings.
|
||||||
|
*
|
||||||
|
* \return The extent of the achar string.
|
||||||
|
*
|
||||||
|
* \sa GetTabbedACharsExtentPoint
|
||||||
|
*
|
||||||
|
* Since 5.0.12
|
||||||
|
*/
|
||||||
|
MG_EXPORT int GUIAPI GetTabbedACharsExtent (HDC hdc, Achar32* achars,
|
||||||
|
int nr_achars, SIZE* size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \fn int GUIAPI GetTabbedACharsExtentPoint (HDC hdc, Achar32* achars,
|
||||||
|
* int nr_achars, int max_extent, SIZE* size)
|
||||||
|
* \brief Get the visual extent value of an achar string.
|
||||||
|
*
|
||||||
|
* This function gets the visual extent value of a glpyh string.
|
||||||
|
* Note that this function ignore all breaks in the achar string.
|
||||||
|
*
|
||||||
|
* \param hdc The device context.
|
||||||
|
* \param achars The pointer to the achar string.
|
||||||
|
* \param nr_achars The length of the achar string len.
|
||||||
|
* \param max_extent The maximal output extent value.
|
||||||
|
* \param size The real extent of all visual achars in the achar string.
|
||||||
|
*
|
||||||
|
* \return The the index of the last achar which can be fit to the extent.
|
||||||
|
*
|
||||||
|
* \sa GetTabbedACharsExtentPointEx
|
||||||
|
*
|
||||||
|
* Since 5.0.12
|
||||||
|
*/
|
||||||
|
MG_EXPORT int GUIAPI GetTabbedACharsExtentPoint (HDC hdc, Achar32* achars,
|
||||||
|
int nr_achars, int max_extent, SIZE* size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \fn int GUIAPI GetTabbedACharsExtentPointEx (HDC hdc,
|
||||||
|
* Achar32* achars, int nr_achars, int max_extent,
|
||||||
|
* int* dx_chars, int* dy_chars, SIZE* size)
|
||||||
|
* \brief Get the visual extent value of an achar string.
|
||||||
|
*
|
||||||
|
* This function gets the visual extent value of a glpyh string.
|
||||||
|
* Note that this function ignore all breaks in the achar string.
|
||||||
|
*
|
||||||
|
* \param hdc The device context.
|
||||||
|
* \param achars The pointer to the achar string.
|
||||||
|
* \param nr_achars The length of the achar string len.
|
||||||
|
* \param max_extent The maximal output extent value.
|
||||||
|
* \param dx_achars The output x-positions of each character in the text
|
||||||
|
* will be returned through this pointer. It can be NULL.
|
||||||
|
* \param dy_achars The output y-positions of each character in the text
|
||||||
|
* will be returned through this pointer. It can be NULL.
|
||||||
|
* \param size The real extent of all visual achars in the achar string.
|
||||||
|
*
|
||||||
|
* \return The index of the last achar which can be fit to the extent.
|
||||||
|
*
|
||||||
|
* \sa GetTabbedACharsExtentPoint
|
||||||
|
*
|
||||||
|
* Since 5.0.12
|
||||||
|
*/
|
||||||
|
MG_EXPORT int GUIAPI GetTabbedACharsExtentPointEx (HDC hdc,
|
||||||
|
Achar32* achars, int nr_achars, int max_extent,
|
||||||
|
int* dx_achars, int* dy_achars, SIZE* size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \fn Glyph32 GUIAPI GetGlyphValue (LOGFONT* logfont, const char* mchar, \
|
* \fn Glyph32 GUIAPI GetGlyphValue (LOGFONT* logfont, const char* mchar, \
|
||||||
* int mchar_len, const char* pre_mchar, int pre_len)
|
* int mchar_len, const char* pre_mchar, int pre_len)
|
||||||
@@ -12870,7 +12972,7 @@ MG_EXPORT Glyph32 GUIAPI GetGlyphValueAlt(LOGFONT* logfont, Achar32 chv);
|
|||||||
* int* adv_x, int* adv_y)
|
* int* adv_x, int* adv_y)
|
||||||
* \brief Draw a glyph.
|
* \brief Draw a glyph.
|
||||||
*
|
*
|
||||||
* This function draws a glyph to the specific postion of a DC.
|
* This function draws a glyph to the specific position of a DC.
|
||||||
*
|
*
|
||||||
* \param hdc The device context.
|
* \param hdc The device context.
|
||||||
* \param x The output start x position.
|
* \param x The output start x position.
|
||||||
@@ -12886,6 +12988,27 @@ MG_EXPORT Glyph32 GUIAPI GetGlyphValueAlt(LOGFONT* logfont, Achar32 chv);
|
|||||||
MG_EXPORT int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
|
MG_EXPORT int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
|
||||||
int* adv_x, int* adv_y);
|
int* adv_x, int* adv_y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \fn int GUIAPI DrawVowel (HDC hdc, int x, int y, Glyph32 glyph_value, \
|
||||||
|
* int last_adv)
|
||||||
|
* \brief Draw a glyph as vowel.
|
||||||
|
*
|
||||||
|
* This function draws a glyph as a vowel of the last glyph to
|
||||||
|
* the specific position of a DC.
|
||||||
|
*
|
||||||
|
* \param hdc The device context.
|
||||||
|
* \param x The output start x position.
|
||||||
|
* \param y The output start y position.
|
||||||
|
* \param glyph_value The glyph value.
|
||||||
|
* \param last_adv The advance on the baseline of the last glyph.
|
||||||
|
*
|
||||||
|
* \return The advance on baseline of the vowel.
|
||||||
|
*
|
||||||
|
* Since 5.0.13
|
||||||
|
*/
|
||||||
|
MG_EXPORT int GUIAPI DrawVowel (HDC hdc, int x, int y, Glyph32 glyph_value,
|
||||||
|
int last_adv);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \fn int GUIAPI DrawGlyphString (HDC hdc, Glyph32* glyphs, int nr_glyphs,
|
* \fn int GUIAPI DrawGlyphString (HDC hdc, Glyph32* glyphs, int nr_glyphs,
|
||||||
* const POINT* pts);
|
* const POINT* pts);
|
||||||
|
|||||||
+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);
|
||||||
|
|||||||
@@ -404,7 +404,7 @@ void mglist_set_itemops (MgList *mglst, PMGITEMOPS iop)
|
|||||||
mglst->iop = *iop;
|
mglst->iop = *iop;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DefaultItemViewProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam,
|
LRESULT DefaultItemViewProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam,
|
||||||
PSCRDATA pscrdata, MgList *mglst)
|
PSCRDATA pscrdata, MgList *mglst)
|
||||||
{
|
{
|
||||||
switch (message) {
|
switch (message) {
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ struct _MgList
|
|||||||
|
|
||||||
/* ------------------------- external api -------------------------- */
|
/* ------------------------- external api -------------------------- */
|
||||||
|
|
||||||
MG_EXPORT int DefaultItemViewProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam,
|
MG_EXPORT LRESULT DefaultItemViewProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam,
|
||||||
PSCRDATA pscrdata, MgList *mglst);
|
PSCRDATA pscrdata, MgList *mglst);
|
||||||
|
|
||||||
MG_EXPORT SVITEM_DRAWFUNC mglist_set_itemdraw (MgList *mglst, SVITEM_DRAWFUNC draw_func);
|
MG_EXPORT SVITEM_DRAWFUNC mglist_set_itemdraw (MgList *mglst, SVITEM_DRAWFUNC draw_func);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -585,7 +589,7 @@ int scrolled_init (HWND hWnd, PSCRDATA pscrdata, int w, int h)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DefaultScrolledProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
|
LRESULT DefaultScrolledProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PSCRDATA pscrdata = NULL;
|
PSCRDATA pscrdata = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ typedef struct _scrdata
|
|||||||
typedef SCRDATA *PSCRDATA;
|
typedef SCRDATA *PSCRDATA;
|
||||||
|
|
||||||
|
|
||||||
MG_EXPORT int DefaultScrolledProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);
|
MG_EXPORT LRESULT DefaultScrolledProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);
|
||||||
MG_EXPORT int scrolled_init (HWND hWnd, PSCRDATA pscrdata, int w, int h);
|
MG_EXPORT int scrolled_init (HWND hWnd, PSCRDATA pscrdata, int w, int h);
|
||||||
MG_EXPORT void scrolled_destroy (PSCRDATA pscrdata);
|
MG_EXPORT void scrolled_destroy (PSCRDATA pscrdata);
|
||||||
MG_EXPORT void scrolled_hscroll (HWND hWnd, PSCRDATA pscrdata, WPARAM wParam, LPARAM lParam);
|
MG_EXPORT void scrolled_hscroll (HWND hWnd, PSCRDATA pscrdata, WPARAM wParam, LPARAM lParam);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -202,6 +202,17 @@ static void destroy (GLYPHTREENODE *root)
|
|||||||
|
|
||||||
/*** device font ops ***/
|
/*** device font ops ***/
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
return DEVFONTGLYPHTYPE_PRERDRBMP;
|
return DEVFONTGLYPHTYPE_PRERDRBMP;
|
||||||
@@ -380,6 +391,7 @@ static int get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
|
|||||||
|
|
||||||
/**************************** Global data ************************************/
|
/**************************** Global data ************************************/
|
||||||
FONTOPS __mg_bitmap_font_ops = {
|
FONTOPS __mg_bitmap_font_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
+13
-15
@@ -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~2023, 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
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -871,6 +868,7 @@ static CHARSETOPS CharsetOps_iso8859_6 = {
|
|||||||
3,
|
3,
|
||||||
FONT_CHARSET_ISO8859_6,
|
FONT_CHARSET_ISO8859_6,
|
||||||
0,
|
0,
|
||||||
|
1,
|
||||||
iso8859_6_len_first_char,
|
iso8859_6_len_first_char,
|
||||||
iso8859_6_get_char_value,
|
iso8859_6_get_char_value,
|
||||||
iso8859_6_get_shaped_char_value,
|
iso8859_6_get_shaped_char_value,
|
||||||
|
|||||||
@@ -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~2023, 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
|
||||||
@@ -210,6 +210,8 @@ static unsigned int unicode_char_type (Achar32 chv)
|
|||||||
mchar_type = ACHAR_BASIC_LF;
|
mchar_type = ACHAR_BASIC_LF;
|
||||||
else if (break_type == UCHAR_BREAK_SPACE)
|
else if (break_type == UCHAR_BREAK_SPACE)
|
||||||
mchar_type = ACHAR_BASIC_SPACE;
|
mchar_type = ACHAR_BASIC_SPACE;
|
||||||
|
else if (basic_type == UCHAR_CATEGORY_NON_SPACING_MARK)
|
||||||
|
mchar_type = ACHAR_BASIC_VOWEL;
|
||||||
else if (chv != 0x00AD && ISZEROWIDTHTYPE (basic_type))
|
else if (chv != 0x00AD && ISZEROWIDTHTYPE (basic_type))
|
||||||
mchar_type = ACHAR_BASIC_ZEROWIDTH;
|
mchar_type = ACHAR_BASIC_ZEROWIDTH;
|
||||||
else if ((chv >= 0x1160 && chv < 0x1200)
|
else if ((chv >= 0x1160 && chv < 0x1200)
|
||||||
@@ -239,10 +241,36 @@ static const BidiType linear_enum_to_bidi_type[] = {
|
|||||||
#undef _UNIBIDI_ADD_TYPE
|
#undef _UNIBIDI_ADD_TYPE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Since 5.0.13: this function only returns BidiType which
|
||||||
|
is recognizable by the legacy BIDI algorithm. */
|
||||||
static BidiType unicode_bidi_char_type(Achar32 ch)
|
static BidiType unicode_bidi_char_type(Achar32 ch)
|
||||||
{
|
{
|
||||||
ch = REAL_ACHAR(ch);
|
ch = REAL_ACHAR(ch);
|
||||||
return linear_enum_to_bidi_type[UNIBIDI_GET_BIDI_TYPE(ch)];
|
BidiType bt = linear_enum_to_bidi_type[UNIBIDI_GET_BIDI_TYPE(ch)];
|
||||||
|
|
||||||
|
switch (bt) {
|
||||||
|
case BIDI_TYPE_LTR:
|
||||||
|
case BIDI_TYPE_RTL:
|
||||||
|
case BIDI_TYPE_AL:
|
||||||
|
case BIDI_TYPE_EN:
|
||||||
|
case BIDI_TYPE_AN:
|
||||||
|
case BIDI_TYPE_ET:
|
||||||
|
case BIDI_TYPE_CS:
|
||||||
|
case BIDI_TYPE_NSM:
|
||||||
|
case BIDI_TYPE_BN:
|
||||||
|
case BIDI_TYPE_BS:
|
||||||
|
case BIDI_TYPE_SS:
|
||||||
|
case BIDI_TYPE_WS:
|
||||||
|
case BIDI_TYPE_ON:
|
||||||
|
case BIDI_TYPE_SOT:
|
||||||
|
case BIDI_TYPE_EOT:
|
||||||
|
return bt;
|
||||||
|
default:
|
||||||
|
_DBG_PRINTF("Not recognizable for char (0x%04x): %u\n", ch, bt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BIDI_TYPE_WS;
|
||||||
}
|
}
|
||||||
|
|
||||||
BidiType GUIAPI UCharGetBidiType(Uchar32 uc)
|
BidiType GUIAPI UCharGetBidiType(Uchar32 uc)
|
||||||
@@ -628,6 +656,7 @@ CHARSETOPS __mg_CharsetOps_utf8 = {
|
|||||||
6,
|
6,
|
||||||
FONT_CHARSET_UTF8,
|
FONT_CHARSET_UTF8,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
utf8_len_first_char,
|
utf8_len_first_char,
|
||||||
utf8_get_char_value,
|
utf8_get_char_value,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -854,6 +883,7 @@ CHARSETOPS __mg_CharsetOps_utf16le = {
|
|||||||
4,
|
4,
|
||||||
FONT_CHARSET_UTF16LE,
|
FONT_CHARSET_UTF16LE,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
utf16le_len_first_char,
|
utf16le_len_first_char,
|
||||||
utf16le_get_char_value,
|
utf16le_get_char_value,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -1080,6 +1110,7 @@ CHARSETOPS __mg_CharsetOps_utf16be = {
|
|||||||
4,
|
4,
|
||||||
FONT_CHARSET_UTF16BE,
|
FONT_CHARSET_UTF16BE,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
utf16be_len_first_char,
|
utf16be_len_first_char,
|
||||||
utf16be_get_char_value,
|
utf16be_get_char_value,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
+30
-7
File diff suppressed because it is too large
Load Diff
@@ -255,6 +255,17 @@ compute_kernval (TTFINSTANCEINFO* ttf_inst_info)
|
|||||||
return kernval;
|
return kernval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
if (logfont->style & FS_WEIGHT_BOOK)
|
if (logfont->style & FS_WEIGHT_BOOK)
|
||||||
@@ -792,6 +803,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
|||||||
}
|
}
|
||||||
/**************************** Global data ************************************/
|
/**************************** Global data ************************************/
|
||||||
FONTOPS __mg_ttf_ops = {
|
FONTOPS __mg_ttf_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
@@ -197,6 +197,17 @@ print_bitmap_grey (const BYTE* buffer, int width, int rows, int pitch)
|
|||||||
printf("*******************************************\n");
|
printf("*******************************************\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
switch (logfont->style & FS_RENDER_MASK) {
|
switch (logfont->style & FS_RENDER_MASK) {
|
||||||
@@ -1265,6 +1276,7 @@ void font_TermFreetypeLibrary (void)
|
|||||||
|
|
||||||
/**************************** Global data ************************************/
|
/**************************** Global data ************************************/
|
||||||
FONTOPS __mg_ttf_ops = {
|
FONTOPS __mg_ttf_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
+15
-9
@@ -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);
|
||||||
|
|
||||||
@@ -735,14 +735,15 @@ Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
|||||||
run_pos = node_p->pos;
|
run_pos = node_p->pos;
|
||||||
run_len = node_p->len;
|
run_len = node_p->len;
|
||||||
|
|
||||||
for (i=0; i<run_len; i++)
|
for (i=0; i<run_len; i++) {
|
||||||
{
|
|
||||||
(map+run_pos+i)->is_rtol = (node_p)->level & 1;
|
(map+run_pos+i)->is_rtol = (node_p)->level & 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 +753,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.*/
|
||||||
|
|||||||
@@ -66,6 +66,17 @@
|
|||||||
#define NUF_WIDTH 8
|
#define NUF_WIDTH 8
|
||||||
#define NUF_HEIGHT 1
|
#define NUF_HEIGHT 1
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
return DEVFONTGLYPHTYPE_MONOBMP;
|
return DEVFONTGLYPHTYPE_MONOBMP;
|
||||||
@@ -171,6 +182,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
FONTOPS __mg_null_font_ops = {
|
FONTOPS __mg_null_font_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
@@ -287,6 +287,17 @@ static unsigned char def_smooth_bitmap [] =
|
|||||||
static QPF_GLYPH def_glyph = {&def_metrics, def_bitmap};
|
static QPF_GLYPH def_glyph = {&def_metrics, def_bitmap};
|
||||||
static QPF_GLYPH def_smooth_glyph = {&def_smooth_metrics, def_smooth_bitmap};
|
static QPF_GLYPH def_smooth_glyph = {&def_smooth_metrics, def_smooth_bitmap};
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
if (QPFONT_INFO_P (devfont)->fm->flags & FLAG_MODE_SMOOTH)
|
if (QPFONT_INFO_P (devfont)->fm->flags & FLAG_MODE_SMOOTH)
|
||||||
@@ -541,6 +552,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
|||||||
|
|
||||||
/**************************** Global data ************************************/
|
/**************************** Global data ************************************/
|
||||||
FONTOPS __mg_qpf_ops = {
|
FONTOPS __mg_qpf_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
@@ -151,6 +151,17 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
|||||||
|
|
||||||
/*************** Raw bitmap font operations *********************************/
|
/*************** Raw bitmap font operations *********************************/
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
return DEVFONTGLYPHTYPE_MONOBMP;
|
return DEVFONTGLYPHTYPE_MONOBMP;
|
||||||
@@ -280,6 +291,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
|||||||
|
|
||||||
/**************************** Global data ************************************/
|
/**************************** Global data ************************************/
|
||||||
FONTOPS __mg_rbf_ops = {
|
FONTOPS __mg_rbf_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_ave_width, // max_width same as ave_width
|
get_ave_width, // max_width same as ave_width
|
||||||
|
|||||||
@@ -377,6 +377,17 @@ static int get_max_width (LOGFONT* logfont, DEVFONT* devfont)
|
|||||||
return logfont->size;
|
return logfont->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
if (logfont->style & FS_WEIGHT_BOOK)
|
if (logfont->style & FS_WEIGHT_BOOK)
|
||||||
@@ -598,6 +609,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
|||||||
|
|
||||||
/**************************** Global data ************************************/
|
/**************************** Global data ************************************/
|
||||||
static FONTOPS scripteasy_font_ops = {
|
static FONTOPS scripteasy_font_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
+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;
|
||||||
|
|
||||||
|
|||||||
@@ -148,6 +148,17 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
|||||||
free (((UPFINFO*) data));
|
free (((UPFINFO*) data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
Uint8* p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
|
Uint8* p_upf = (Uint8 *)UPFONT_INFO_P (devfont)->root_dir;
|
||||||
@@ -525,6 +536,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
|||||||
}
|
}
|
||||||
|
|
||||||
FONTOPS __mg_upf_ops = {
|
FONTOPS __mg_upf_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
@@ -109,6 +109,17 @@ typedef struct _FONT_PROPT {
|
|||||||
int def_glyph;
|
int def_glyph;
|
||||||
} FONT_PROPT;
|
} FONT_PROPT;
|
||||||
|
|
||||||
|
static DWORD get_feature (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature)
|
||||||
|
{
|
||||||
|
switch (feature) {
|
||||||
|
case DEVFONT_FEATURE_MARK_BBOX:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
static DWORD get_glyph_bmptype (LOGFONT* logfont, DEVFONT* devfont)
|
||||||
{
|
{
|
||||||
return DEVFONTGLYPHTYPE_MONOBMP;
|
return DEVFONTGLYPHTYPE_MONOBMP;
|
||||||
@@ -477,6 +488,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
FONTOPS __mg_vbf_ops = {
|
FONTOPS __mg_vbf_ops = {
|
||||||
|
get_feature,
|
||||||
get_glyph_bmptype,
|
get_glyph_bmptype,
|
||||||
get_ave_width,
|
get_ave_width,
|
||||||
get_max_width,
|
get_max_width,
|
||||||
|
|||||||
@@ -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. */
|
||||||
+6
-1
@@ -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;
|
||||||
|
|||||||
+12
-1
@@ -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~2023, 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
|
||||||
@@ -209,6 +209,9 @@ struct _CHARSETOPS
|
|||||||
/** Default character. */
|
/** Default character. */
|
||||||
Achar32 def_char_value;
|
Achar32 def_char_value;
|
||||||
|
|
||||||
|
/** Whether using legacy BIDI algorithm (Since 5.0.13). */
|
||||||
|
unsigned legacy_bidi:1;
|
||||||
|
|
||||||
/** The method to get the length of the first character. */
|
/** The method to get the length of the first character. */
|
||||||
int (*len_first_char) (const unsigned char* mstr, int mstrlen);
|
int (*len_first_char) (const unsigned char* mstr, int mstrlen);
|
||||||
|
|
||||||
@@ -263,9 +266,17 @@ struct _CHARSETOPS
|
|||||||
|
|
||||||
#define DEVFONTGLYPHTYPE_MASK_BMPTYPE 0x0F
|
#define DEVFONTGLYPHTYPE_MASK_BMPTYPE 0x0F
|
||||||
|
|
||||||
|
enum devfont_feature {
|
||||||
|
DEVFONT_FEATURE_MARK_BBOX = 0,
|
||||||
|
};
|
||||||
|
|
||||||
/** The font operation structure. */
|
/** The font operation structure. */
|
||||||
struct _FONTOPS
|
struct _FONTOPS
|
||||||
{
|
{
|
||||||
|
/** The method to get the feature value of the font (Since 5.0.13). */
|
||||||
|
DWORD (*get_feature) (LOGFONT* logfont, DEVFONT* devfont,
|
||||||
|
enum devfont_feature feature);
|
||||||
|
|
||||||
/** The method to get the glyph bitmap type . */
|
/** The method to get the glyph bitmap type . */
|
||||||
DWORD (*get_glyph_bmptype) (LOGFONT* logfont, DEVFONT* devfont);
|
DWORD (*get_glyph_bmptype) (LOGFONT* logfont, DEVFONT* devfont);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
+17
-41
@@ -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
|
||||||
|
|
||||||
@@ -251,7 +258,7 @@ struct _MSGQUEUE
|
|||||||
int loop_depth; // message loop depth, for dialog boxes
|
int loop_depth; // message loop depth, for dialog boxes
|
||||||
|
|
||||||
int idle_counter; // the idle connter for MSG_IDLE
|
int idle_counter; // the idle connter for MSG_IDLE
|
||||||
DWORD last_ticks_desktop; // the last tick count for desktop timer
|
DWORD last_ticks; // the last tick count saved; since 5.0.14
|
||||||
|
|
||||||
/* Since 5.0.0, MiniGUI provides support for timers per message thread */
|
/* Since 5.0.0, MiniGUI provides support for timers per message thread */
|
||||||
int nr_timers; // the number of active timers
|
int nr_timers; // the number of active timers
|
||||||
@@ -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);
|
||||||
@@ -904,40 +911,9 @@ static inline MSGQUEUE* getMsgQueueIfMainWindowInThisThread (PMAINWIN pMainWin)
|
|||||||
|
|
||||||
#endif /* defined _MGHAVE_VIRTUAL_WINDOW */
|
#endif /* defined _MGHAVE_VIRTUAL_WINDOW */
|
||||||
|
|
||||||
#if 0 /* deprecated code */
|
/* Since 5.0.14, remove arg use_sys_timer */
|
||||||
/* since 5.0.0, we always use QS_DESKTIMER for desktop timer */
|
BOOL mg_InitTimer (void);
|
||||||
/* since 5.0.0, we no longer use the timer thread */
|
void mg_TerminateTimer (void);
|
||||||
static inline void AlertDesktopTimerEvent (void)
|
|
||||||
{
|
|
||||||
if (__mg_dsk_msg_queue) {
|
|
||||||
__mg_dsk_msg_queue->expired_timer_mask = 1;
|
|
||||||
POST_MSGQ (__mg_dsk_msg_queue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void AlertDesktopTimerEvent (void)
|
|
||||||
{
|
|
||||||
__mg_dsk_msg_queue->dwState |= QS_DESKTIMER;
|
|
||||||
#ifdef _MGHAVE_VIRTUAL_WINDOW
|
|
||||||
if (getMsgQueueForThisThread() != __mg_dsk_msg_queue)
|
|
||||||
POST_MSGQ (__mg_dsk_msg_queue);
|
|
||||||
#endif /* defined _MGHAVE_VIRTUAL_WINDOW */
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void setMsgQueueTimerFlag (PMSGQUEUE pMsgQueue, int slot)
|
|
||||||
{
|
|
||||||
pMsgQueue->expired_timer_mask |= (0x01UL << slot);
|
|
||||||
POST_MSGQ (pMsgQueue);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void removeMsgQueueTimerFlag (PMSGQUEUE pMsgQueue, int slot)
|
|
||||||
{
|
|
||||||
pMsgQueue->expired_timer_mask &= ~(0x01UL << slot);
|
|
||||||
}
|
|
||||||
#endif /* deprecated code */
|
|
||||||
|
|
||||||
BOOL mg_InitTimer (BOOL use_sys_timer);
|
|
||||||
void mg_TerminateTimer (BOOL use_sys_timer);
|
|
||||||
|
|
||||||
/*window element renderer manager interface*/
|
/*window element renderer manager interface*/
|
||||||
extern WINDOW_ELEMENT_RENDERER * __mg_def_renderer;
|
extern WINDOW_ELEMENT_RENDERER * __mg_def_renderer;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -73,6 +73,8 @@
|
|||||||
|
|
||||||
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
|
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
|
||||||
/* union semun is defined by including <sys/sem.h> */
|
/* union semun is defined by including <sys/sem.h> */
|
||||||
|
#elif defined(__DARWIN__)
|
||||||
|
/* union semun is defined by including <sys/sem.h> */
|
||||||
#else
|
#else
|
||||||
/* according to X/OPEN we have to define it ourselves */
|
/* according to X/OPEN we have to define it ourselves */
|
||||||
union semun {
|
union semun {
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ typedef struct _MSGQUEUE MSGQUEUE;
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
void __mg_update_tick_count (void* data);
|
DWORD __mg_update_tick_count (MSGQUEUE* msg_queue);
|
||||||
int __mg_check_expired_timers (MSGQUEUE* msg_queue, DWORD inter);
|
int __mg_check_expired_timers (MSGQUEUE* msg_queue, DWORD inter);
|
||||||
void __mg_remove_timers_by_msg_queue (MSGQUEUE* msg_queue);
|
void __mg_remove_timers_by_msg_queue (MSGQUEUE* msg_queue);
|
||||||
void __mg_remove_timer (MSGQUEUE* msg_queue, int slot);
|
void __mg_remove_timer (MSGQUEUE* msg_queue, int slot);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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 */
|
||||||
@@ -140,19 +141,29 @@ BOOL mg_InitDesktop (void)
|
|||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
static IDLEHANDLER std_idle_handler;
|
||||||
|
|
||||||
|
static BOOL idle_handler_for_desktop_thread (MSGQUEUE *msg_queue, BOOL wait)
|
||||||
|
{
|
||||||
|
__mg_update_tick_count (msg_queue);
|
||||||
|
return std_idle_handler (msg_queue, wait);
|
||||||
|
}
|
||||||
|
|
||||||
void* __kernel_desktop_main (void* data)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for threads mode, the idle handler for desktop thread is NULL */
|
/* For bug reported in Issue #116, under threads mode, the idle handler
|
||||||
__mg_dsk_msg_queue->OnIdle = NULL;
|
for the desktop thread should call __mg_update_tick_count () */
|
||||||
|
std_idle_handler = __mg_dsk_msg_queue->OnIdle;
|
||||||
|
__mg_dsk_msg_queue->OnIdle = idle_handler_for_desktop_thread;
|
||||||
|
|
||||||
/* init desktop window */
|
/* init desktop window */
|
||||||
init_desktop_win ();
|
init_desktop_win ();
|
||||||
@@ -191,7 +202,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;
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-26
@@ -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 */
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-18
@@ -391,14 +391,6 @@ static BOOL InstallSEGVHandler (void)
|
|||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static IDLEHANDLER std_idle_handler;
|
|
||||||
|
|
||||||
static BOOL idle_handler_for_main_thread (MSGQUEUE *msg_queue, BOOL wait)
|
|
||||||
{
|
|
||||||
__mg_update_tick_count (NULL);
|
|
||||||
return std_idle_handler (msg_queue, wait);
|
|
||||||
}
|
|
||||||
|
|
||||||
int GUIAPI InitGUI (int args, const char *agr[])
|
int GUIAPI InitGUI (int args, const char *agr[])
|
||||||
{
|
{
|
||||||
char engine [LEN_ENGINE_NAME + 1];
|
char engine [LEN_ENGINE_NAME + 1];
|
||||||
@@ -578,19 +570,14 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for threads mode, the idle handler for the main threads should
|
|
||||||
call __mg_update_tick_count () */
|
|
||||||
std_idle_handler = msg_queue->OnIdle;
|
|
||||||
msg_queue->OnIdle = idle_handler_for_main_thread;
|
|
||||||
|
|
||||||
/* init timer for tick counter */
|
/* init timer for tick counter */
|
||||||
step++;
|
step++;
|
||||||
if (!mg_InitTimer (FALSE)) {
|
if (!mg_InitTimer()) {
|
||||||
_ERR_PRINTF ("KERNEL>InitGUI: failed to start time counter\n");
|
_ERR_PRINTF ("KERNEL>InitGUI: failed to start time counter\n");
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
@@ -615,7 +602,9 @@ failure1:
|
|||||||
|
|
||||||
void GUIAPI TerminateGUI (int not_used)
|
void GUIAPI TerminateGUI (int not_used)
|
||||||
{
|
{
|
||||||
mg_TerminateTimer (FALSE);
|
mg_TerminateTimer ();
|
||||||
|
|
||||||
|
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);
|
||||||
@@ -655,8 +644,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;
|
||||||
|
|||||||
+80
-306
File diff suppressed because it is too large
Load Diff
+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;
|
||||||
|
|||||||
+2
-7
@@ -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;
|
||||||
@@ -390,24 +391,18 @@ static int GAL_PixmanBlit (struct GAL_Surface *src, GAL_Rect *srcrect,
|
|||||||
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
|
|
||||||
|
|
||||||
// pixman_blt does not work
|
// pixman_blt does not work
|
||||||
#if 0
|
|
||||||
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,
|
||||||
|
|||||||
@@ -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)) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+124
-58
File diff suppressed because it is too large
Load Diff
@@ -90,11 +90,17 @@ struct GAL_PrivateVideoData {
|
|||||||
/* end of header for shadow screen */
|
/* end of header for shadow screen */
|
||||||
|
|
||||||
int console_fd;
|
int console_fd;
|
||||||
struct fb_var_screeninfo cache_vinfo;
|
struct fb_var_screeninfo currt_vinfo;
|
||||||
struct fb_var_screeninfo saved_vinfo;
|
struct fb_var_screeninfo saved_vinfo;
|
||||||
int saved_cmaplen;
|
int saved_cmaplen;
|
||||||
__u16 *saved_cmap;
|
__u16 *saved_cmap;
|
||||||
|
|
||||||
|
/* Since 5.0.13, use FBIOPAN_DISPLAY if possible */
|
||||||
|
int nr_buffers;
|
||||||
|
int idx_buffer;
|
||||||
|
unsigned len_buffer;
|
||||||
|
char *buffers[2];
|
||||||
|
|
||||||
#ifdef _MGHAVE_PCIACCESS
|
#ifdef _MGHAVE_PCIACCESS
|
||||||
int pci_accel_driver;
|
int pci_accel_driver;
|
||||||
#endif
|
#endif
|
||||||
@@ -115,13 +121,7 @@ struct GAL_PrivateVideoData {
|
|||||||
|
|
||||||
/* Old variable names */
|
/* Old variable names */
|
||||||
#define console_fd (this->hidden->console_fd)
|
#define console_fd (this->hidden->console_fd)
|
||||||
#define current_vt (this->hidden->current_vt)
|
#define currt_vinfo (this->hidden->currt_vinfo)
|
||||||
#define saved_vt (this->hidden->saved_vt)
|
|
||||||
#define keyboard_fd (this->hidden->keyboard_fd)
|
|
||||||
#define saved_kbd_mode (this->hidden->saved_kbd_mode)
|
|
||||||
#define saved_kbd_termios (this->hidden->saved_kbd_termios)
|
|
||||||
#define mouse_fd (this->hidden->mouse_fd)
|
|
||||||
#define cache_vinfo (this->hidden->cache_vinfo)
|
|
||||||
#define saved_vinfo (this->hidden->saved_vinfo)
|
#define saved_vinfo (this->hidden->saved_vinfo)
|
||||||
#define saved_cmaplen (this->hidden->saved_cmaplen)
|
#define saved_cmaplen (this->hidden->saved_cmaplen)
|
||||||
#define saved_cmap (this->hidden->saved_cmap)
|
#define saved_cmap (this->hidden->saved_cmap)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
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 \
|
||||||
-I$(abs_top_srcdir)/src/newgal/
|
-I$(abs_top_srcdir)/src/newgal/ $(PIXMAN_CFLAGS)
|
||||||
|
|
||||||
SRC_FILES = shadow.c shadow_refresh_msb_right.c shadow_refresh_msb_left.c
|
SRC_FILES = shadow.c shadow_refresh_msb_right.c shadow_refresh_msb_left.c
|
||||||
|
|
||||||
|
|||||||
+562
-261
File diff suppressed because it is too large
Load Diff
+64
-40
@@ -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~2023, 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
|
||||||
@@ -47,6 +47,16 @@
|
|||||||
#ifndef _GAL_SHADOW_H
|
#ifndef _GAL_SHADOW_H
|
||||||
#define _GAL_SHADOW_H
|
#define _GAL_SHADOW_H
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
|
||||||
|
#undef _MGUSE_PIXMAN
|
||||||
|
|
||||||
|
#ifdef _MGUSE_PIXMAN
|
||||||
|
#include <pixman.h>
|
||||||
|
#include <math.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
//#include "sysvideo.h"
|
//#include "sysvideo.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -56,65 +66,79 @@ extern "C" {
|
|||||||
/* Hidden "this" pointer for the video functions */
|
/* Hidden "this" pointer for the video functions */
|
||||||
#define _THIS GAL_VideoDevice *this
|
#define _THIS GAL_VideoDevice *this
|
||||||
|
|
||||||
|
#define MAX_NR_UPDATERS 6
|
||||||
|
#define MIN_PIXELS_USING_UPDATER 4096
|
||||||
|
|
||||||
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 */
|
|
||||||
RECT dirty_rect;
|
int dirty:1;
|
||||||
int palette_changed; /* true for changed, and should reset to false after reflecting the change */
|
int palette_changed:1;
|
||||||
int palette_offset;
|
|
||||||
int fb_offset;
|
RECT dirty_rect;
|
||||||
Uint32 Rmask;
|
|
||||||
Uint32 Gmask;
|
int palette_offset;
|
||||||
Uint32 Bmask;
|
int firstcolor;
|
||||||
Uint32 Amask;
|
int ncolors;
|
||||||
int firstcolor;
|
int fb_offset;
|
||||||
int ncolors;
|
|
||||||
|
Uint32 Rmask;
|
||||||
|
Uint32 Gmask;
|
||||||
|
Uint32 Bmask;
|
||||||
|
Uint32 Amask;
|
||||||
|
|
||||||
} 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;
|
|
||||||
|
GAL_VideoDevice *real_device;
|
||||||
|
|
||||||
|
#ifdef _MGUSE_PIXMAN
|
||||||
|
pixman_image_t *src_img;
|
||||||
|
pixman_image_t *dst_img;
|
||||||
|
pixman_transform_t transform;
|
||||||
|
#endif
|
||||||
|
|
||||||
} 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;
|
|
||||||
#ifdef _MGRM_PROCESSES
|
#ifdef _MGRM_PROCESSES
|
||||||
int semid;
|
int semid;
|
||||||
#else
|
|
||||||
pthread_mutex_t update_lock;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int nr_updaters;
|
||||||
|
|
||||||
|
/* only valid when nr_updaters > 0 */
|
||||||
|
RECT dirty_rcs[MAX_NR_UPDATERS];
|
||||||
|
sem_t update_sems[MAX_NR_UPDATERS];
|
||||||
|
pthread_t update_thds[MAX_NR_UPDATERS];
|
||||||
|
sem_t sync_sem;
|
||||||
};
|
};
|
||||||
|
|
||||||
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 */
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "shadow.h"
|
#include "shadow.h"
|
||||||
|
|
||||||
extern gal_uint8* __gal_a_line;
|
extern gal_uint8* line_pixels;
|
||||||
extern void round_rect (int depth, PRECT update_rect);
|
extern void round_rect (int depth, PRECT update_rect);
|
||||||
|
|
||||||
extern void _get_dst_rect_cw (RECT* dst_rect, const RECT* src_rect,
|
extern void _get_dst_rect_cw (RECT* dst_rect, const RECT* src_rect,
|
||||||
@@ -230,6 +230,7 @@ void refresh_cw_msb_left (ShadowFBHeader *shadowfb_header, RealFBInfo *realfb_in
|
|||||||
BYTE* dst_line;
|
BYTE* dst_line;
|
||||||
int dst_width, dst_height;
|
int dst_width, dst_height;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
BYTE line_pixels[realfb_info->pitch];
|
||||||
|
|
||||||
_get_dst_rect_cw (&dst_update, &src_update, realfb_info);
|
_get_dst_rect_cw (&dst_update, &src_update, realfb_info);
|
||||||
|
|
||||||
@@ -255,7 +256,7 @@ void refresh_cw_msb_left (ShadowFBHeader *shadowfb_header, RealFBInfo *realfb_in
|
|||||||
/* Copy the bits from vertical line to horizontal line */
|
/* Copy the bits from vertical line to horizontal line */
|
||||||
const BYTE* ver_bits = src_bits;
|
const BYTE* ver_bits = src_bits;
|
||||||
|
|
||||||
BYTE* hor_bits = __gal_a_line;
|
BYTE* hor_bits = line_pixels;
|
||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 32:
|
case 32:
|
||||||
@@ -296,25 +297,25 @@ void refresh_cw_msb_left (ShadowFBHeader *shadowfb_header, RealFBInfo *realfb_in
|
|||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 1:
|
case 1:
|
||||||
put_one_line_1bpp (__gal_a_line, dst_line, dst_update.left, dst_width);
|
put_one_line_1bpp (line_pixels, dst_line, dst_update.left, dst_width);
|
||||||
src_bits += 1;
|
src_bits += 1;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
put_one_line_2bpp (__gal_a_line, dst_line, dst_update.left, dst_width);
|
put_one_line_2bpp (line_pixels, dst_line, dst_update.left, dst_width);
|
||||||
src_bits +=1;
|
src_bits +=1;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
put_one_line_4bpp (__gal_a_line, dst_line, dst_update.left, dst_width);
|
put_one_line_4bpp (line_pixels, dst_line, dst_update.left, dst_width);
|
||||||
src_bits +=1;
|
src_bits +=1;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
put_one_line_8bpp (__gal_a_line, dst_line, dst_update.left, dst_width, realfb_info);
|
put_one_line_8bpp (line_pixels, dst_line, dst_update.left, dst_width, realfb_info);
|
||||||
src_bits += realfb_info->depth/8;
|
src_bits += realfb_info->depth/8;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
@@ -329,9 +330,9 @@ void refresh_ccw_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb_i
|
|||||||
RECT dst_update;
|
RECT dst_update;
|
||||||
const BYTE* src_bits;
|
const BYTE* src_bits;
|
||||||
BYTE* dst_line;
|
BYTE* dst_line;
|
||||||
|
|
||||||
int dst_width, dst_height;
|
int dst_width, dst_height;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
BYTE line_pixels[realfb_info->pitch];
|
||||||
|
|
||||||
_get_dst_rect_ccw (&dst_update, &src_update, realfb_info);
|
_get_dst_rect_ccw (&dst_update, &src_update, realfb_info);
|
||||||
|
|
||||||
@@ -356,7 +357,7 @@ void refresh_ccw_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb_i
|
|||||||
for (x = 0; x < dst_height; x++) {
|
for (x = 0; x < dst_height; x++) {
|
||||||
/* Copy the bits from vertical line to horizontal line */
|
/* Copy the bits from vertical line to horizontal line */
|
||||||
const BYTE* ver_bits = src_bits;
|
const BYTE* ver_bits = src_bits;
|
||||||
BYTE* hor_bits = __gal_a_line;
|
BYTE* hor_bits = line_pixels;
|
||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 32:
|
case 32:
|
||||||
@@ -398,25 +399,25 @@ void refresh_ccw_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb_i
|
|||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 1:
|
case 1:
|
||||||
put_one_line_1bpp (__gal_a_line, dst_line, dst_update.left, dst_width);
|
put_one_line_1bpp (line_pixels, dst_line, dst_update.left, dst_width);
|
||||||
src_bits += 1;
|
src_bits += 1;
|
||||||
dst_line -= realfb_info->pitch;
|
dst_line -= realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
put_one_line_2bpp (__gal_a_line, dst_line, dst_update.left, dst_width);
|
put_one_line_2bpp (line_pixels, dst_line, dst_update.left, dst_width);
|
||||||
src_bits += 1;
|
src_bits += 1;
|
||||||
dst_line -= realfb_info->pitch;
|
dst_line -= realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
put_one_line_4bpp (__gal_a_line, dst_line, dst_update.left, dst_width);
|
put_one_line_4bpp (line_pixels, dst_line, dst_update.left, dst_width);
|
||||||
src_bits += 1;
|
src_bits += 1;
|
||||||
dst_line -= realfb_info->pitch;
|
dst_line -= realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
put_one_line_8bpp (__gal_a_line, dst_line, dst_update.left, dst_width,\
|
put_one_line_8bpp (line_pixels, dst_line, dst_update.left, dst_width,\
|
||||||
realfb_info);
|
realfb_info);
|
||||||
src_bits += realfb_info->depth/8;
|
src_bits += realfb_info->depth/8;
|
||||||
dst_line -= realfb_info->pitch;
|
dst_line -= realfb_info->pitch;
|
||||||
@@ -432,6 +433,7 @@ void refresh_hflip_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb
|
|||||||
BYTE* dst_line;
|
BYTE* dst_line;
|
||||||
int src_width, src_height;
|
int src_width, src_height;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
BYTE line_pixels[realfb_info->pitch];
|
||||||
|
|
||||||
/* Round the update rectangle. */
|
/* Round the update rectangle. */
|
||||||
round_rect(realfb_info->depth, &src_update);
|
round_rect(realfb_info->depth, &src_update);
|
||||||
@@ -450,7 +452,7 @@ void refresh_hflip_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb
|
|||||||
for (x = 0; x < src_height; x++) {
|
for (x = 0; x < src_height; x++) {
|
||||||
/* Copy the bits from vertical line to horizontal line */
|
/* Copy the bits from vertical line to horizontal line */
|
||||||
const BYTE* ver_bits = src_bits;
|
const BYTE* ver_bits = src_bits;
|
||||||
BYTE* hor_bits = __gal_a_line;
|
BYTE* hor_bits = line_pixels;
|
||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 32:
|
case 32:
|
||||||
@@ -491,25 +493,25 @@ void refresh_hflip_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb
|
|||||||
}
|
}
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 1:
|
case 1:
|
||||||
put_one_line_1bpp (__gal_a_line, dst_line, realfb_info->width - src_update.right, src_width);
|
put_one_line_1bpp (line_pixels, dst_line, realfb_info->width - src_update.right, src_width);
|
||||||
src_bits += shadowfb_header->pitch;
|
src_bits += shadowfb_header->pitch;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
put_one_line_2bpp (__gal_a_line, dst_line, realfb_info->width - src_update.right, src_width);
|
put_one_line_2bpp (line_pixels, dst_line, realfb_info->width - src_update.right, src_width);
|
||||||
src_bits += shadowfb_header->pitch;
|
src_bits += shadowfb_header->pitch;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
put_one_line_4bpp (__gal_a_line, dst_line, realfb_info->width - src_update.right, src_width);
|
put_one_line_4bpp (line_pixels, dst_line, realfb_info->width - src_update.right, src_width);
|
||||||
src_bits += shadowfb_header->pitch;/* realfb_info->depth;*/
|
src_bits += shadowfb_header->pitch;/* realfb_info->depth;*/
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
put_one_line_8bpp (__gal_a_line, dst_line, realfb_info->width - src_update.right,
|
put_one_line_8bpp (line_pixels, dst_line, realfb_info->width - src_update.right,
|
||||||
src_width, realfb_info);
|
src_width, realfb_info);
|
||||||
src_bits += realfb_info->pitch;
|
src_bits += realfb_info->pitch;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
@@ -525,6 +527,7 @@ void refresh_vflip_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb
|
|||||||
BYTE* dst_line;
|
BYTE* dst_line;
|
||||||
int src_width, src_height;
|
int src_width, src_height;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
BYTE line_pixels[realfb_info->pitch];
|
||||||
|
|
||||||
/* Round the update rectangle. */
|
/* Round the update rectangle. */
|
||||||
round_rect (realfb_info->depth, &src_update);
|
round_rect (realfb_info->depth, &src_update);
|
||||||
@@ -543,7 +546,7 @@ void refresh_vflip_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb
|
|||||||
for (x = 0; x < src_height; x++) {
|
for (x = 0; x < src_height; x++) {
|
||||||
/* Copy the bits from vertical line to horizontal line */
|
/* Copy the bits from vertical line to horizontal line */
|
||||||
const BYTE* ver_bits = src_bits;
|
const BYTE* ver_bits = src_bits;
|
||||||
BYTE* hor_bits = __gal_a_line;
|
BYTE* hor_bits = line_pixels;
|
||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 32:
|
case 32:
|
||||||
@@ -585,25 +588,29 @@ void refresh_vflip_msb_left (ShadowFBHeader* shadowfb_header, RealFBInfo* realfb
|
|||||||
|
|
||||||
switch (realfb_info->depth) {
|
switch (realfb_info->depth) {
|
||||||
case 1:
|
case 1:
|
||||||
put_one_line_1bpp (__gal_a_line, dst_line, src_update.left, src_width);
|
put_one_line_1bpp(line_pixels, dst_line, src_update.left,
|
||||||
|
src_width);
|
||||||
src_bits -= shadowfb_header->pitch;
|
src_bits -= shadowfb_header->pitch;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
put_one_line_2bpp (__gal_a_line, dst_line, src_update.left, src_width);
|
put_one_line_2bpp(line_pixels, dst_line, src_update.left,
|
||||||
|
src_width);
|
||||||
src_bits -= shadowfb_header->pitch;
|
src_bits -= shadowfb_header->pitch;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
put_one_line_4bpp (__gal_a_line, dst_line, src_update.left, src_width);
|
put_one_line_4bpp(line_pixels, dst_line, src_update.left,
|
||||||
|
src_width);
|
||||||
src_bits -= shadowfb_header->pitch;/* realfb_info->depth;*/
|
src_bits -= shadowfb_header->pitch;/* realfb_info->depth;*/
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
put_one_line_8bpp (__gal_a_line, dst_line, src_update.left, src_width, realfb_info);
|
put_one_line_8bpp(line_pixels, dst_line, src_update.left,
|
||||||
|
src_width, realfb_info);
|
||||||
src_bits -= realfb_info->pitch;
|
src_bits -= realfb_info->pitch;
|
||||||
dst_line += realfb_info->pitch;
|
dst_line += realfb_info->pitch;
|
||||||
break;
|
break;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+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);
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ Uint16 GUIAPI GetACharBidiType (LOGFONT* log_font, Achar32 chv)
|
|||||||
|
|
||||||
#include "unicode-ops.h"
|
#include "unicode-ops.h"
|
||||||
|
|
||||||
Uchar32 GUIAPI Achar2UChar(LOGFONT* logfont, Achar32 chv)
|
Uchar32 GUIAPI AChar2UChar(LOGFONT* logfont, Achar32 chv)
|
||||||
{
|
{
|
||||||
Uchar32 uc;
|
Uchar32 uc;
|
||||||
DEVFONT* devfont = SELECT_DEVFONT_BY_ACHAR(logfont, chv);
|
DEVFONT* devfont = SELECT_DEVFONT_BY_ACHAR(logfont, chv);
|
||||||
|
|||||||
+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;
|
||||||
|
|||||||
+7
-16
@@ -467,19 +467,18 @@ PDC __mg_begin_fill_bitmap (HDC hdc, int x, int y, int w, int h,
|
|||||||
info->line_alpha_buff = NULL;
|
info->line_alpha_buff = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(__mg_enter_drawing (pdc) < 0) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
pdc->step = 1;
|
pdc->step = 1;
|
||||||
pdc->cur_ban = NULL;
|
pdc->cur_ban = NULL;
|
||||||
pdc->cur_pixel = pdc->brushcolor;
|
pdc->cur_pixel = pdc->brushcolor;
|
||||||
pdc->skip_pixel = bmp->bmColorKey;
|
pdc->skip_pixel = bmp->bmColorKey;
|
||||||
fill_info->old_bkmode = pdc->bkmode;
|
|
||||||
if (bmp->bmType & BMP_TYPE_COLORKEY) {
|
if (bmp->bmType & BMP_TYPE_COLORKEY) {
|
||||||
pdc->bkmode = BM_TRANSPARENT;
|
pdc->bkmode = BM_TRANSPARENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(__mg_enter_drawing (pdc) < 0) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
fill_info->dst_rect = rect;
|
fill_info->dst_rect = rect;
|
||||||
|
|
||||||
return pdc;
|
return pdc;
|
||||||
@@ -499,8 +498,6 @@ fail:
|
|||||||
|
|
||||||
void __mg_end_fill_bitmap (PDC pdc, const BITMAP* bmp, FILLINFO *fill_info)
|
void __mg_end_fill_bitmap (PDC pdc, const BITMAP* bmp, FILLINFO *fill_info)
|
||||||
{
|
{
|
||||||
pdc->bkmode = fill_info->old_bkmode;
|
|
||||||
|
|
||||||
__mg_leave_drawing (pdc);
|
__mg_leave_drawing (pdc);
|
||||||
|
|
||||||
if (fill_info->decoded_buff)
|
if (fill_info->decoded_buff)
|
||||||
@@ -966,7 +963,6 @@ BOOL GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h,
|
|||||||
{
|
{
|
||||||
PDC pdc;
|
PDC pdc;
|
||||||
GAL_Rect rect;
|
GAL_Rect rect;
|
||||||
int old_bkmode;
|
|
||||||
struct _SCALER_INFO_FILLBMPPART info;
|
struct _SCALER_INFO_FILLBMPPART info;
|
||||||
|
|
||||||
if (bmp->bmWidth == 0 || bmp->bmHeight == 0 || bmp->bmBits == NULL)
|
if (bmp->bmWidth == 0 || bmp->bmHeight == 0 || bmp->bmBits == NULL)
|
||||||
@@ -1019,17 +1015,16 @@ BOOL GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h,
|
|||||||
info.line_alpha_buff = NULL;
|
info.line_alpha_buff = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENTER_DRAWING (pdc);
|
||||||
|
|
||||||
pdc->step = 1;
|
pdc->step = 1;
|
||||||
pdc->cur_ban = NULL;
|
pdc->cur_ban = NULL;
|
||||||
pdc->cur_pixel = pdc->brushcolor;
|
pdc->cur_pixel = pdc->brushcolor;
|
||||||
pdc->skip_pixel = bmp->bmColorKey;
|
|
||||||
old_bkmode = pdc->bkmode;
|
|
||||||
if (bmp->bmType & BMP_TYPE_COLORKEY) {
|
if (bmp->bmType & BMP_TYPE_COLORKEY) {
|
||||||
pdc->bkmode = BM_TRANSPARENT;
|
pdc->bkmode = BM_TRANSPARENT;
|
||||||
|
pdc->skip_pixel = bmp->bmColorKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTER_DRAWING (pdc);
|
|
||||||
|
|
||||||
if (bw != bmp->bmWidth || bh != bmp->bmHeight) {
|
if (bw != bmp->bmWidth || bh != bmp->bmHeight) {
|
||||||
|
|
||||||
pdc->bitmap_scaler(&info, bmp, bw, bh,
|
pdc->bitmap_scaler(&info, bmp, bw, bh,
|
||||||
@@ -1049,8 +1044,6 @@ BOOL GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h,
|
|||||||
_dc_fillbox_bmp_clip (pdc, &rect, &part);
|
_dc_fillbox_bmp_clip (pdc, &rect, &part);
|
||||||
}
|
}
|
||||||
|
|
||||||
pdc->bkmode = old_bkmode;
|
|
||||||
|
|
||||||
LEAVE_DRAWING (pdc);
|
LEAVE_DRAWING (pdc);
|
||||||
|
|
||||||
if (info.line_buff)
|
if (info.line_buff)
|
||||||
@@ -1561,8 +1554,6 @@ BOOL GUIAPI StretchBltEx (HDC hsdc, int sx, int sy, int sw, int sh,
|
|||||||
#else
|
#else
|
||||||
if (sx < 0) sx = 0;
|
if (sx < 0) sx = 0;
|
||||||
if (sy < 0) sy = 0;
|
if (sy < 0) sy = 0;
|
||||||
if (dx < 0) dx = 0;
|
|
||||||
if (dy < 0) dy = 0;
|
|
||||||
|
|
||||||
if (sx >= RECTW(psdc->DevRC))
|
if (sx >= RECTW(psdc->DevRC))
|
||||||
goto error_ret;
|
goto error_ret;
|
||||||
|
|||||||
+30
-10
@@ -117,10 +117,11 @@ 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:
|
||||||
|
case ACHAR_BASIC_CTRL1:
|
||||||
|
case ACHAR_BASIC_CTRL2:
|
||||||
case ACHAR_BASIC_CR:
|
case ACHAR_BASIC_CR:
|
||||||
adv_x = adv_y = 0;
|
adv_x = adv_y = 0;
|
||||||
break;
|
break;
|
||||||
@@ -145,12 +146,19 @@ 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;
|
if (_gdi_if_mark_bbox_is_ok(ctxt->pdc, glyph_value)) {
|
||||||
//ctxt->pdc->bkmode = BM_TRANSPARENT;
|
int bkmode = ctxt->pdc->bkmode;
|
||||||
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
|
||||||
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
|
||||||
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
ctxt->pdc->bkmode = bkmode;
|
ctxt->x, ctxt->y, &adv_x, &adv_y);
|
||||||
|
ctxt->pdc->bkmode = bkmode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_gdi_draw_one_vowel (ctxt->pdc, glyph_value,
|
||||||
|
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
|
ctxt->last_x, ctxt->last_y, ctxt->last_adv);
|
||||||
|
}
|
||||||
adv_x = adv_y = 0;
|
adv_x = adv_y = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -163,13 +171,19 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctxt->last_x = ctxt->x;
|
||||||
|
ctxt->last_y = ctxt->y;
|
||||||
|
ctxt->last_adv = adv_x;
|
||||||
ctxt->x += adv_x;
|
ctxt->x += adv_x;
|
||||||
ctxt->y += adv_y;
|
ctxt->y += adv_y;
|
||||||
|
|
||||||
@@ -185,7 +199,10 @@ int _gdi_get_drawtext_extent (PDC pdc, const unsigned char* text, int len,
|
|||||||
ctxt.pdc = pdc;
|
ctxt.pdc = pdc;
|
||||||
ctxt.x = 0;
|
ctxt.x = 0;
|
||||||
ctxt.y = 0;
|
ctxt.y = 0;
|
||||||
|
ctxt.last_x = 0;
|
||||||
|
ctxt.last_y = 0;
|
||||||
ctxt.advance = 0;
|
ctxt.advance = 0;
|
||||||
|
ctxt.last_adv = 0;
|
||||||
ctxt.only_extent = TRUE;
|
ctxt.only_extent = TRUE;
|
||||||
ctxt.nFormat = _tmp->nFormat;
|
ctxt.nFormat = _tmp->nFormat;
|
||||||
ctxt.tab_width = _tmp->tab_width;
|
ctxt.tab_width = _tmp->tab_width;
|
||||||
@@ -302,6 +319,9 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
|
|||||||
ctxt.pdc = pdc;
|
ctxt.pdc = pdc;
|
||||||
ctxt.x = x;
|
ctxt.x = x;
|
||||||
ctxt.y = y;
|
ctxt.y = y;
|
||||||
|
ctxt.last_x = x;
|
||||||
|
ctxt.last_y = y;
|
||||||
|
ctxt.last_adv = 0;
|
||||||
|
|
||||||
while (nCount > 0) {
|
while (nCount > 0) {
|
||||||
int line_x, maxwidth;
|
int line_x, maxwidth;
|
||||||
@@ -310,7 +330,7 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
|
|||||||
pText, nCount, '\n', &nr_delim_newline);
|
pText, nCount, '\n', &nr_delim_newline);
|
||||||
|
|
||||||
/* line_len == 0 means the first char is '\n' */
|
/* line_len == 0 means the first char is '\n' */
|
||||||
if(nFormat & DT_SINGLELINE) {
|
if (nFormat & DT_SINGLELINE) {
|
||||||
line_len = nCount;
|
line_len = nCount;
|
||||||
}
|
}
|
||||||
else if (line_len == 0) {
|
else if (line_len == 0) {
|
||||||
@@ -322,7 +342,7 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
|
|||||||
nCount -= line_len + nr_delim_newline;
|
nCount -= line_len + nr_delim_newline;
|
||||||
pText = pText + line_len + nr_delim_newline;
|
pText = pText + line_len + nr_delim_newline;
|
||||||
|
|
||||||
while(line_len){
|
while (line_len){
|
||||||
if (nLines == 0) {
|
if (nLines == 0) {
|
||||||
line_x = indent;
|
line_x = indent;
|
||||||
maxwidth = rcDraw.right - rcDraw.left;
|
maxwidth = rcDraw.right - rcDraw.left;
|
||||||
@@ -367,7 +387,7 @@ int DrawTextEx2 (HDC hdc, const char* pText, int nCount,
|
|||||||
ctxt.x = x + line_x;
|
ctxt.x = x + line_x;
|
||||||
ctxt.advance = 0;
|
ctxt.advance = 0;
|
||||||
ctxt.only_extent = old_set;
|
ctxt.only_extent = old_set;
|
||||||
if((nFormat & DT_CALCRECT) && (pRect->left > ctxt.x))
|
if ((nFormat & DT_CALCRECT) && (pRect->left > ctxt.x))
|
||||||
pRect->left = ctxt.x;
|
pRect->left = ctxt.x;
|
||||||
_gdi_reorder_text_break (pdc, pline, line_len,
|
_gdi_reorder_text_break (pdc, pline, line_len,
|
||||||
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
|
||||||
|
|||||||
@@ -82,6 +82,11 @@ static inline int _gdi_get_glyph_advance (PDC pdc, Glyph32 glyph_value,
|
|||||||
direction, pdc->cExtra, x, y, adv_x, adv_y, bbox);
|
direction, pdc->cExtra, x, y, adv_x, adv_y, bbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL _gdi_if_mark_bbox_is_ok(PDC pdc, Glyph32 gv);
|
||||||
|
|
||||||
|
int _gdi_draw_one_vowel (PDC pdc, Glyph32 glyph_value, BOOL direction,
|
||||||
|
int x, int y, int last_adv);
|
||||||
|
|
||||||
int _gdi_draw_one_glyph (PDC pdc, Glyph32 glyph_value, BOOL direction,
|
int _gdi_draw_one_glyph (PDC pdc, Glyph32 glyph_value, BOOL direction,
|
||||||
int x, int y, int* adv_x, int* adv_y);
|
int x, int y, int* adv_x, int* adv_y);
|
||||||
|
|
||||||
@@ -131,7 +136,9 @@ typedef struct _DRAWTEXTEX2_CTXT
|
|||||||
int line_height;
|
int line_height;
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
int last_x, last_y;
|
||||||
int advance;
|
int advance;
|
||||||
|
int last_adv;
|
||||||
|
|
||||||
int nFormat;
|
int nFormat;
|
||||||
int nCount;
|
int nCount;
|
||||||
|
|||||||
+22
-8
@@ -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);
|
||||||
@@ -1927,7 +1932,7 @@ static void dc_InitDC (PDC pdc, HWND hWnd, BOOL bIsClient)
|
|||||||
|
|
||||||
pdc->mapmode = MM_TEXT;
|
pdc->mapmode = MM_TEXT;
|
||||||
pdc->ta_flags = TA_LEFT | TA_TOP | TA_NOUPDATECP;
|
pdc->ta_flags = TA_LEFT | TA_TOP | TA_NOUPDATECP;
|
||||||
pdc->bidi_flags = BIDI_FLAG_LTR;
|
pdc->bidi_flags = BIDI_FLAG_NONE;
|
||||||
|
|
||||||
pdc->ViewOrig.x = pdc->ViewOrig.y = 0;
|
pdc->ViewOrig.x = pdc->ViewOrig.y = 0;
|
||||||
pdc->ViewExtent.x = pdc->ViewExtent.y = 1;
|
pdc->ViewExtent.x = pdc->ViewExtent.y = 1;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -2142,7 +2155,7 @@ static void dc_InitScreenDC (PDC pdc, GAL_Surface *surface)
|
|||||||
|
|
||||||
pdc->mapmode = MM_TEXT;
|
pdc->mapmode = MM_TEXT;
|
||||||
pdc->ta_flags = TA_LEFT | TA_TOP | TA_NOUPDATECP;
|
pdc->ta_flags = TA_LEFT | TA_TOP | TA_NOUPDATECP;
|
||||||
pdc->bidi_flags = BIDI_FLAG_LTR;
|
pdc->bidi_flags = BIDI_FLAG_NONE;
|
||||||
|
|
||||||
pdc->ViewOrig.x = pdc->ViewOrig.y = 0;
|
pdc->ViewOrig.x = pdc->ViewOrig.y = 0;
|
||||||
pdc->ViewExtent.x = pdc->ViewExtent.y = 1;
|
pdc->ViewExtent.x = pdc->ViewExtent.y = 1;
|
||||||
@@ -3784,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
|
||||||
@@ -3872,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
|
||||||
@@ -3976,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
|
||||||
|
|||||||
+154
-14
File diff suppressed because it is too large
Load Diff
+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);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+18
-14
@@ -95,6 +95,7 @@ static Achar32* _gdi_get_achars_string(PDC pdc, const unsigned char* text,
|
|||||||
logical_achars[i++] = SET_MBCHV(chv);
|
logical_achars[i++] = SET_MBCHV(chv);
|
||||||
char_type = (*mbc_devfont->charset_ops->char_type)
|
char_type = (*mbc_devfont->charset_ops->char_type)
|
||||||
(chv);
|
(chv);
|
||||||
|
|
||||||
if (!(char_type & ACHAR_BASIC_NOSPACING_MARK)){
|
if (!(char_type & ACHAR_BASIC_NOSPACING_MARK)){
|
||||||
prev_mchar = text;
|
prev_mchar = text;
|
||||||
prev_len = len_cur_char;
|
prev_len = len_cur_char;
|
||||||
@@ -476,7 +477,7 @@ static int _gdi_output_achars_direct(PDC pdc, const unsigned char* text,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (left_bytes > 0){
|
while (left_bytes > 0) {
|
||||||
if (mbc_devfont) {
|
if (mbc_devfont) {
|
||||||
len_cur_char = mbc_devfont->charset_ops->len_first_char
|
len_cur_char = mbc_devfont->charset_ops->len_first_char
|
||||||
((const unsigned char*)text, left_bytes);
|
((const unsigned char*)text, left_bytes);
|
||||||
@@ -551,7 +552,9 @@ Achar32* _gdi_bidi_reorder (PDC pdc, const unsigned char* text, int text_len,
|
|||||||
DEVFONT* mbc_devfont = pdc->pLogFont->devfonts[1];
|
DEVFONT* mbc_devfont = pdc->pLogFont->devfonts[1];
|
||||||
Achar32 *logical_achars = NULL;
|
Achar32 *logical_achars = NULL;
|
||||||
|
|
||||||
if (mbc_devfont && mbc_devfont->charset_ops->bidi_char_type) {
|
if (mbc_devfont &&
|
||||||
|
(mbc_devfont->charset_ops->legacy_bidi || pdc->bidi_flags) &&
|
||||||
|
mbc_devfont->charset_ops->bidi_char_type) {
|
||||||
logical_achars = _gdi_get_achars_string (pdc, text, text_len, nr_achars);
|
logical_achars = _gdi_get_achars_string (pdc, text, text_len, nr_achars);
|
||||||
if (*nr_achars > 0)
|
if (*nr_achars > 0)
|
||||||
__mg_legacy_bidi_achars_reorder (mbc_devfont->charset_ops,
|
__mg_legacy_bidi_achars_reorder (mbc_devfont->charset_ops,
|
||||||
@@ -574,7 +577,8 @@ int _gdi_reorder_text (PDC pdc, const unsigned char* text, int text_len,
|
|||||||
int nr_achars = 0;
|
int nr_achars = 0;
|
||||||
Achar32 *logical_achars = NULL;
|
Achar32 *logical_achars = NULL;
|
||||||
|
|
||||||
if (mbc_devfont->charset_ops->bidi_char_type) {
|
if ((mbc_devfont->charset_ops->legacy_bidi || pdc->bidi_flags) &&
|
||||||
|
mbc_devfont->charset_ops->bidi_char_type) {
|
||||||
|
|
||||||
logical_achars = _gdi_bidi_reorder (pdc, text, text_len, &nr_achars);
|
logical_achars = _gdi_bidi_reorder (pdc, text, text_len, &nr_achars);
|
||||||
if (!logical_achars || nr_achars <= 0)
|
if (!logical_achars || nr_achars <= 0)
|
||||||
@@ -612,8 +616,7 @@ int _gdi_reorder_text (PDC pdc, const unsigned char* text, int text_len,
|
|||||||
(NULL, 0, text + i, 1)))
|
(NULL, 0, text + i, 1)))
|
||||||
return (text_len-i-1);
|
return (text_len-i-1);
|
||||||
|
|
||||||
char_type = sbc_devfont->charset_ops->char_type
|
char_type = sbc_devfont->charset_ops->char_type (chv);
|
||||||
(chv);
|
|
||||||
|
|
||||||
gv = GetGlyphValueAlt (pdc->pLogFont, chv);
|
gv = GetGlyphValueAlt (pdc->pLogFont, chv);
|
||||||
if (gv == INV_GLYPH_VALUE)
|
if (gv == INV_GLYPH_VALUE)
|
||||||
@@ -970,7 +973,8 @@ int _gdi_reorder_text_break (PDC pdc, const unsigned char* text,
|
|||||||
int nr_achars = text_len;
|
int nr_achars = text_len;
|
||||||
Achar32 *logical_achars = NULL;
|
Achar32 *logical_achars = NULL;
|
||||||
|
|
||||||
if (mbc_devfont->charset_ops->bidi_char_type){
|
if ((mbc_devfont->charset_ops->legacy_bidi || pdc->bidi_flags) &&
|
||||||
|
mbc_devfont->charset_ops->bidi_char_type){
|
||||||
|
|
||||||
logical_achars = _gdi_get_achars_string_break(pdc, text, text_len,
|
logical_achars = _gdi_get_achars_string_break(pdc, text, text_len,
|
||||||
&nr_achars, context);
|
&nr_achars, context);
|
||||||
@@ -1429,6 +1433,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 +1445,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,
|
||||||
@@ -1455,11 +1461,10 @@ int GUIAPI BIDIGetTextVisualAChars(LOGFONT* log_font,
|
|||||||
nr_achars = BIDIGetTextLogicalAChars(log_font, text, text_len,
|
nr_achars = BIDIGetTextLogicalAChars(log_font, text, text_len,
|
||||||
achs, achs_map);
|
achs, achs_map);
|
||||||
|
|
||||||
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 +1477,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;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user