mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-23 16:43:58 +08:00
Compare commits
155
Commits
ver-5-0-10
...
ver-5-0-15
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ad600d1bf | ||
|
|
3c233a4164 | ||
|
|
3643606a7f | ||
|
|
3ef2340749 | ||
|
|
a583dc1cbb | ||
|
|
0abaeef4c7 | ||
|
|
c2779cbf09 | ||
|
|
e118805eef | ||
|
|
7513d461bf | ||
|
|
b131f00a79 | ||
|
|
649fbf571e | ||
|
|
e38fd05cb4 | ||
|
|
ce53f2c703 | ||
|
|
fbebc94718 | ||
|
|
b4ce6f9f10 | ||
|
|
c04dde31e5 | ||
|
|
5a2b425012 | ||
|
|
fa18025350 | ||
|
|
890ab1db44 | ||
|
|
3d963b3d25 | ||
|
|
29ac6a4277 | ||
|
|
96ecf5e9b7 | ||
|
|
50aafa3faa | ||
|
|
d06ce0683b | ||
|
|
5a9b08fe94 | ||
|
|
c7569e9d32 | ||
|
|
06fcf2eaa0 | ||
|
|
33e5d62da8 | ||
|
|
f0bae4444c | ||
|
|
0a5ace7f82 | ||
|
|
5b27cc70fc | ||
|
|
cf3340c01d | ||
|
|
950f73716a | ||
|
|
295c993d50 | ||
|
|
95ab7dad2a | ||
|
|
3d42f72e21 | ||
|
|
59d9d08158 | ||
|
|
3a9cbfdd9b | ||
|
|
bc7d5f6ce0 | ||
|
|
1131973f7a | ||
|
|
a46804080e | ||
|
|
81b25968ca | ||
|
|
f1463f41de | ||
|
|
0a10b81499 | ||
|
|
fd07118939 | ||
|
|
a0a757a621 | ||
|
|
7cd7f954c6 | ||
|
|
e673452b7d | ||
|
|
e24490e92f | ||
|
|
0c2345aed1 | ||
|
|
95b9def0d5 | ||
|
|
563fe9232c | ||
|
|
5ad525c1d8 | ||
|
|
fcde9eb405 | ||
|
|
39d03be6d7 | ||
|
|
43101379ed | ||
|
|
bce5b73e1c | ||
|
|
0b4a5a1c17 | ||
|
|
c609e2e5b1 | ||
|
|
f6bf02aa5c | ||
|
|
d52aa4c1a4 | ||
|
|
d6a961aa6c | ||
|
|
2665200eee | ||
|
|
469eb1c05a | ||
|
|
6a83f2efbf | ||
|
|
6422cb8568 | ||
|
|
6be4b719c8 | ||
|
|
0f566d0342 | ||
|
|
1de19f9bee | ||
|
|
5f8a88c0a2 | ||
|
|
1611a56754 | ||
|
|
73fcb8d2c3 | ||
|
|
bc0efac21f | ||
|
|
26341b162e | ||
|
|
c6957bec23 | ||
|
|
56ddd87189 | ||
|
|
5cdd258046 | ||
|
|
8b4ab267b6 | ||
|
|
613a19c236 | ||
|
|
e242cbe32f | ||
|
|
5f921a2908 | ||
|
|
39493ef4dc | ||
|
|
fef311f0b2 | ||
|
|
e98aeab8dc | ||
|
|
2ff96ba383 | ||
|
|
03d90aec9f | ||
|
|
57293a2896 | ||
|
|
cfd3311f86 | ||
|
|
51b09bc2ed | ||
|
|
ff54c6ffe5 | ||
|
|
4c836603c1 | ||
|
|
311d2262d6 | ||
|
|
209a0c6ab0 | ||
|
|
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 |
@@ -72,7 +72,7 @@ It greatly reduces the size and resource consumption of the entire solution, imp
|
||||
[HybridOS] is another large open source project initiated by FMSoft.
|
||||
It is an open source operating system designed for embedded/AIoT devices and cloud computing environment.
|
||||
|
||||
HybridOS provides the complete software stack and the app framework based on HVML for embedded systems.
|
||||
HybridOS provides the complete software stack and the app framework based on [HVML] for embedded systems.
|
||||
You can easily develop your products which has rich functions and excellent expressiveness by using HybridOS.
|
||||
|
||||
In practice, MiniGUI and the software which are used to integrated with GPU constitute the graphics stack of HybridOS.
|
||||
@@ -85,13 +85,13 @@ The following chart shows the graphics stack of HybridOS:
|
||||
-----------------------------------------------
|
||||
| MiniGUI/HVML Apps |
|
||||
|-----------------------------------------------|
|
||||
| | (Graphics Stack) |
|
||||
| | ---------------------|
|
||||
| | | hiMesa |
|
||||
| | hiCairo | ------------------|
|
||||
| | MiniGUI | | EGL for MiniGUI |
|
||||
| C++ libs | hiDRMDrivers | | GL, GLES, VG |
|
||||
| C libs | libDRM | | GPU drivers |
|
||||
| | (Graphics Stack) |
|
||||
| | --------------------|
|
||||
| | | Mesa-HBD |
|
||||
| | Cairo-HBD | ------------------|
|
||||
| | MiniGUI | | EGL for MiniGUI |
|
||||
| C++ libs | HBDDRMDrivers | | GL, GLES, VG |
|
||||
| C libs | libDRM | | GPU drivers |
|
||||
|-----------------------------------------------|
|
||||
| Linux Kernel |
|
||||
| -----------------------------------|
|
||||
@@ -102,10 +102,10 @@ The following chart shows the graphics stack of HybridOS:
|
||||
As shown in the chart above, the HybridOS graphics stack consists of the following software:
|
||||
|
||||
- `libDRM` provides some user land APIs for Linux Direct Rendering Infrastructure.
|
||||
- `hiDRMDrivers` contains the drivers (user land drivers, not kernel drivers) for
|
||||
- `HBDDRMDrivers` contains the drivers (user land drivers, not kernel drivers) for
|
||||
MiniGUI DRM engine. The drivers implement the basic hardware accelerated
|
||||
2D graphics operations of various GPUs for MiniGUI.
|
||||
- `hiMesa` is the Mesa derivative for HybridOS, while Mesa is the open source
|
||||
- `Mesa-HBD` is the Mesa derivative for HybridOS, while Mesa is the open source
|
||||
implementation of OpenGL and other graphics APIs, including OpenGL ES
|
||||
(versions 1, 2, 3), OpenCL, OpenMAX, and Vulkan. It contains the following
|
||||
components:
|
||||
@@ -113,13 +113,17 @@ As shown in the chart above, the HybridOS graphics stack consists of the followi
|
||||
graphics APIs.
|
||||
+ The EGL implementation for MiniGUI platform.
|
||||
+ The graphics drivers for various GPUs and a software driver called `swrast`.
|
||||
- `hiCairo` is the Cairo derivative for HybridOS. Cairo is a 2D vector graphics
|
||||
- `Cairo-HBD` is the Cairo derivative for HybridOS. Cairo is a 2D vector graphics
|
||||
library for Gtk. We provide support for MiniGUI backend in `hiCairo`.
|
||||
|
||||
For more information about HybridOS, please refer to:
|
||||
|
||||
<https://hybridos.fmsoft.cn/>
|
||||
|
||||
For more information about HVML, please refer to:
|
||||
|
||||
<https://hvml.fmsoft.cn/> or <https://www.hvml.org>
|
||||
|
||||
### Source Code Repositories
|
||||
|
||||
FMSoft had created the public repositories for MiniGUI Core, MiniGUI
|
||||
@@ -456,7 +460,7 @@ for examples:
|
||||
|
||||
## HISTORY
|
||||
|
||||
21 years have pasted since MiniGUI was initially created at
|
||||
27 years have pasted since MiniGUI was initially created at
|
||||
the end of 1998, and now it becomes much reliable and stable.
|
||||
During the past years, many remarkable changes have taken place in
|
||||
the MiniGUI project.
|
||||
@@ -561,13 +565,15 @@ A brief history description of the development progress is listed as follow:
|
||||
1. May., 2021: FMSoft released MiniGUI version 5.0.6.
|
||||
1. Jan., 2022: FMSoft released MiniGUI version 5.0.9.
|
||||
1. Sep., 2022: FMSoft released MiniGUI version 5.0.10.
|
||||
1. Aug., 2023: FMSoft released MiniGUI version 5.0.13.
|
||||
1. May., 2025: FMSoft released MiniGUI version 5.0.15.
|
||||
|
||||
## AUTHORS AND COPYING
|
||||
|
||||
The original author of MiniGUI is Vincent Wei, and now MiniGUI is maintained by FMSoft.
|
||||
For more information, please refer to <http://www.fmsoft.cn>.
|
||||
|
||||
Copyright (C) 2002 ~ 2022, Beijing FMSoft Technologies Co., Ltd.
|
||||
Copyright (C) 2002 ~ 2025, Beijing FMSoft Technologies Co., Ltd.
|
||||
Copyright (C) 1998 ~ 2002, Vincent Wei
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@@ -645,13 +651,12 @@ A: Yes, FMSoft can provide you with guaranteed commercial technical
|
||||
[FMSoft Technologies]: https://www.fmsoft.cn
|
||||
[FMSoft]: https://www.fmsoft.cn
|
||||
[HybridOS Official Site]: https://hybridos.fmsoft.cn
|
||||
[MiniGUI Official Site]: https://hvml.fmsoft.cn
|
||||
[MiniGUI Official Site]: https://minigui.fmsoft.cn
|
||||
[HVML Official Site]: https://hvml.fmsoft.cn
|
||||
[Vincent Wei]: https://github.com/VincentWei
|
||||
|
||||
[MiniGUI]: https://github.com/VincentWei/MiniGUI
|
||||
[HybridOS]: https://github.com/FMSoftCN/HybridOS
|
||||
|
||||
[MiniGUI]: https://github.com/VincentWei
|
||||
[HybridOS]: https://github.com/HybridOS2
|
||||
[HVML]: https://github.com/HVML
|
||||
[PurC]: https://github.com/HVML/PurC
|
||||
[xGUI Pro]: https://github.com/HVML/xGUI-Pro
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# Release Notes
|
||||
|
||||
- [Version 5.0.15](#version-5015)
|
||||
+ [What's new in version 5.0.15](#whats-new-in-version-5015)
|
||||
- [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)
|
||||
@@ -26,6 +34,79 @@
|
||||
+ [Changes leading to incompatibility](#changes-leading-to-incompatibility)
|
||||
+ [Deprecated APIs](#deprecated-apis)
|
||||
|
||||
## Version 5.0.15
|
||||
|
||||
On May 09, 2025, FMSoft announces the availability of MiniGUI 5.0.15,
|
||||
which is an enhancement release with some minor enhancements
|
||||
of MiniGUI 5.0.x.
|
||||
|
||||
* ENHANCEMENTS:
|
||||
- Optimize NEWGAL engines: `shadow`, `drm`, and `fbcon` for large resolution.
|
||||
- New APIs: `GetWindowSharedSurfaceFD()` and `CreateMemDCFromSharedSurfaceFD()` for compositing schema.
|
||||
* CHANGES:
|
||||
- The operations for DRM userland driver changed.
|
||||
|
||||
## 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,
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Version 5.0.9 (2022/01/14)
|
||||
Version 5.0.15 (2025/05/09)
|
||||
|
||||
This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version.
|
||||
|
||||
|
||||
+9
-8
@@ -1,6 +1,6 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.60)
|
||||
AC_INIT(libminigui, 5.0.10)
|
||||
AC_INIT(libminigui, 5.0.15)
|
||||
AC_CONFIG_SRCDIR(src/main/main.c)
|
||||
|
||||
dnl Set various version strings - taken gratefully from the SDL sources
|
||||
@@ -16,7 +16,7 @@ dnl Set various version strings - taken gratefully from the SDL sources
|
||||
#
|
||||
MINIGUI_MAJOR_VERSION=5
|
||||
MINIGUI_MINOR_VERSION=0
|
||||
MINIGUI_MICRO_VERSION=10
|
||||
MINIGUI_MICRO_VERSION=15
|
||||
MINIGUI_INTERFACE_AGE=0
|
||||
MINIGUI_BINARY_AGE=0
|
||||
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
|
||||
@@ -62,7 +62,7 @@ dnl ========================================================================
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
AC_CHECK_HEADERS(limits.h math.h locale.h unistd.h termio.h sys/types.h sys/time.h sys/select.h sys/memfd.h)
|
||||
AC_CHECK_HEADERS(limits.h math.h stdatomic.h locale.h unistd.h termio.h sys/types.h sys/time.h sys/select.h sys/memfd.h)
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
@@ -95,7 +95,7 @@ message_string="no"
|
||||
osname="unspecified"
|
||||
runtime_mode="procs"
|
||||
compositing_schema="yes"
|
||||
virtual_window="no"
|
||||
virtual_window="yes"
|
||||
use_shmopen="no"
|
||||
mgslice_use_fallback="no"
|
||||
|
||||
@@ -1704,12 +1704,12 @@ fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS -D__MINIGUI_LIB__"
|
||||
|
||||
surface_schema="shared frame buffer"
|
||||
surface_schema="shared"
|
||||
case "$runtime_mode" in
|
||||
sa)
|
||||
AC_DEFINE(_MGRM_STANDALONE, 1,
|
||||
[Define if build MiniGUI-Standalone])
|
||||
MINIGUI_RUNMODE="sa"
|
||||
MINIGUI_RUNMODE="standalone"
|
||||
RUNMODE_LADD="standalone/libstandalone.la"
|
||||
RUNMODE_SUBDIRS="standalone"
|
||||
;;
|
||||
@@ -1717,13 +1717,13 @@ case "$runtime_mode" in
|
||||
AC_DEFINE(_MGRM_THREADS, 1,
|
||||
[Define if build MiniGUI-Threads])
|
||||
CPPFLAGS="$CPPFLAGS -D_REENTRANT"
|
||||
MINIGUI_RUNMODE="ths"
|
||||
MINIGUI_RUNMODE="threads"
|
||||
virtual_window="yes"
|
||||
;;
|
||||
*)
|
||||
AC_DEFINE(_MGRM_PROCESSES, 1,
|
||||
[Define if build MiniGUI-Processes])
|
||||
MINIGUI_RUNMODE="procs"
|
||||
MINIGUI_RUNMODE="processes"
|
||||
RUNMODE_LADD="server/libserver.la client/libclient.la"
|
||||
RUNMODE_SUBDIRS="server client"
|
||||
if test "x$compositing_schema" = "xyes"; then
|
||||
@@ -2664,6 +2664,7 @@ if test "x$no_math" = "xno"; then
|
||||
fi
|
||||
|
||||
DEP_LIBS="$DEP_LIBS -lpthread"
|
||||
MINIGUI_RUNMODE="$MINIGUI_RUNMODE-${surface_schema}"
|
||||
|
||||
AC_SUBST(VIDEO_SUBDIRS)
|
||||
AC_SUBST(VIDEO_DRIVERS)
|
||||
|
||||
+53
-8
@@ -55,6 +55,36 @@ wallpaper_pattern_size=full
|
||||
# def_compositor_so=
|
||||
#}}
|
||||
|
||||
#{{ifdef _MGGAL_SHADOW
|
||||
[shadow]
|
||||
real_engine=pc_xvfb
|
||||
defaultmode=800x600-16bpp
|
||||
|
||||
# `cw`: rotating screen clock-wise.
|
||||
# `ccw`: rotating screen counter clock-wise.
|
||||
# `hflip`: flipping screen horizontally.
|
||||
# `vflip`: flipping screen vertically.
|
||||
rotate_screen=ccw
|
||||
|
||||
# Whether the async. update is enabled.
|
||||
# Use `true` or `yes` for enabled, anything else for disabled.
|
||||
# Since 5.0.13.
|
||||
async_update=yes
|
||||
|
||||
# The synchronization interval for the asyn. updater (milli-seconds).
|
||||
# This setting is only valid when `async_update` is enabled and
|
||||
# the real engine does not provide WaitWBlank method.
|
||||
# Since 5.0.13.
|
||||
update_interval=15
|
||||
|
||||
# The minimal pixels to use the hardware accelerator.
|
||||
# If the number of pixels to copy is less than this value,
|
||||
# MiniGUI will use the software copy routine to update the real screen,
|
||||
# even if the real device provides a hardware accelerator.
|
||||
# Since 5.0.13.
|
||||
min_pixels_using_hwaccl=4096
|
||||
#}}
|
||||
|
||||
#{{ifdef _MGGAL_DRM
|
||||
[drm]
|
||||
defaultmode=1024x768-32bpp
|
||||
@@ -78,9 +108,21 @@ dpi=96
|
||||
# Since 5.0.0.
|
||||
double_buffering=true
|
||||
|
||||
# The update interval for the asyn. updater (milli-seconds).
|
||||
# This setting is only valid when drmWaitVBlank doesn't work correctly.
|
||||
# Since 5.0.13.
|
||||
update_interval=15
|
||||
|
||||
# The minimal pixels to use the hardware accelerator.
|
||||
# If the number of pixels to copy is less than this value,
|
||||
# MiniGUI will use the software copy routine to update the real screen,
|
||||
# even if the device provides a hardware accelerator.
|
||||
# Since 5.0.13.
|
||||
min_pixels_using_hwaccl=4096
|
||||
|
||||
# The filename of the shared library for the external driver.
|
||||
# The equivalent environment variable: MG_GAL_DRM_DRIVER
|
||||
exdriver=libhidrmdrivers-0.2.so.0
|
||||
exdriver=libdrmdrivers.so
|
||||
#}}
|
||||
|
||||
#{{ifdef _MGIAL_SINGLETOUCHKEY
|
||||
@@ -111,6 +153,16 @@ dpi=96
|
||||
# Note that under compositing schema, double buffering is always enabled.
|
||||
# Since 5.0.10.
|
||||
double_buffering=true
|
||||
|
||||
# Whether the async. update is enabled.
|
||||
# Use `true` or `yes` for enabled, anything else for disabled.
|
||||
# Since 5.0.13.
|
||||
async_update=yes
|
||||
|
||||
# The update interval for the asyn. updater (milli-seconds).
|
||||
# This setting is only valid when drmWaitVBlank doesn't work correctly.
|
||||
# Since 5.0.13.
|
||||
update_interval=15
|
||||
#}}
|
||||
|
||||
#{{ifdef _MGGAL_PCXVFB
|
||||
@@ -123,13 +175,6 @@ exec_file=/usr/local/bin/gvfb
|
||||
[rtos_xvfb]
|
||||
defaultmode=800x600-16bpp
|
||||
|
||||
#{{ifdef _MGGAL_SHADOW
|
||||
[shadow]
|
||||
real_engine=pc_xvfb
|
||||
defaultmode=800x600-16bpp
|
||||
rotate_screen=ccw
|
||||
#}}
|
||||
|
||||
#{{ifdef _MGGAL_MLSHADOW
|
||||
[mlshadow]
|
||||
real_engine=qvfb
|
||||
|
||||
@@ -268,6 +268,8 @@ MGUI_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
|
||||
#define MG_UNLIKELY(expr) (expr)
|
||||
#endif
|
||||
|
||||
#define HAVE(FEATURE) (defined HAVE_##FEATURE && HAVE_##FEATURE)
|
||||
|
||||
/**
|
||||
* \defgroup endian_info Endianness information
|
||||
* @{
|
||||
@@ -2347,6 +2349,7 @@ int init_minigui_printf (int (*output_char) (int ch),
|
||||
#define _ERR_PRINTF(fmt, ...) \
|
||||
do { \
|
||||
TCS_RED (stderr); \
|
||||
fprintf (stderr, "%s: ", __FUNCTION__); \
|
||||
fprintf (stderr, fmt, ##__VA_ARGS__); \
|
||||
TCS_NONE (stderr); \
|
||||
} while (0)
|
||||
|
||||
+57
-77
@@ -84,6 +84,14 @@ extern "C" {
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** The current version of DRM driver. */
|
||||
#define DRM_DRIVER_VERSION 2
|
||||
|
||||
#define DRM_SURBUF_TYPE_OFFSCREEN 0x0000
|
||||
#define DRM_SURBUF_TYPE_SHADOW 0x0001
|
||||
#define DRM_SURBUF_TYPE_SCANOUT 0x0002
|
||||
#define DRM_SURBUF_TYPE_MASK 0x000F
|
||||
|
||||
/**
|
||||
* The struct type represents the DRI sub driver.
|
||||
* The concrete struct should be defined by the driver.
|
||||
@@ -129,6 +137,8 @@ typedef struct _DrmSurfaceBuffer {
|
||||
uint32_t dumb:1;
|
||||
/** Is it a scanout buffer. Since 5.0.0. */
|
||||
uint32_t scanout:1;
|
||||
/** The buffer is also a dma-buf. Since 5.0.13. */
|
||||
uint32_t dma_buf:1;
|
||||
|
||||
/** The width of the buffer. */
|
||||
uint32_t width;
|
||||
@@ -154,11 +164,23 @@ typedef struct _DrmSurfaceBuffer {
|
||||
* The address of the pixel data:
|
||||
* uint8_t* pixels = this->buff + this->offset;
|
||||
*/
|
||||
uint8_t* buff;
|
||||
uint8_t* vaddr;
|
||||
} DrmSurfaceBuffer;
|
||||
|
||||
typedef struct _DrmBlitOperations {
|
||||
BlitCopyOperation cpy;
|
||||
BlitKeyOperation key;
|
||||
BlitAlphaOperation alf;
|
||||
ColorBlendMethod bld;
|
||||
ColorLogicalOp rop;
|
||||
ScalingFilter scl;
|
||||
|
||||
uint32_t key_min, key_max;
|
||||
uint8_t alpha;
|
||||
} DrmBlitOperations;
|
||||
|
||||
/**
|
||||
* The structure type defines the operations for a DRM driver.
|
||||
* The structure type defines the operations for a userland DRM driver.
|
||||
*/
|
||||
typedef struct _DrmDriverOps {
|
||||
/**
|
||||
@@ -176,12 +198,13 @@ typedef struct _DrmDriverOps {
|
||||
void (*destroy_driver) (DrmDriver *driver);
|
||||
|
||||
/**
|
||||
* This operation flushes the batch buffer of the driver or
|
||||
* the hardware cache.
|
||||
* This operation flushes the batch buffer of the driver and/or
|
||||
* the specified buffer.
|
||||
*
|
||||
* \note This operation can be NULL.
|
||||
*/
|
||||
void (* flush_driver) (DrmDriver *driver);
|
||||
void (* flush) (DrmDriver *driver, DrmSurfaceBuffer* buff,
|
||||
const GAL_Rect *dirty_rect);
|
||||
|
||||
/**
|
||||
* This operation creates a surface buffer with the specified pixel format,
|
||||
@@ -194,7 +217,7 @@ typedef struct _DrmDriverOps {
|
||||
*/
|
||||
DrmSurfaceBuffer* (* create_buffer) (DrmDriver *driver,
|
||||
uint32_t drm_format, uint32_t hdr_size,
|
||||
uint32_t width, uint32_t height);
|
||||
uint32_t width, uint32_t height, unsigned flags);
|
||||
|
||||
/**
|
||||
* This operation creates a buffer from a given and possibly foreign handle
|
||||
@@ -207,7 +230,9 @@ typedef struct _DrmDriverOps {
|
||||
* DrmSurfaceBuffer object.
|
||||
*/
|
||||
DrmSurfaceBuffer* (* create_buffer_from_handle) (DrmDriver *driver,
|
||||
uint32_t handle, size_t size);
|
||||
uint32_t handle, size_t size,
|
||||
uint32_t drm_format, uint32_t hdr_size,
|
||||
uint32_t width, uint32_t height, uint32_t pitch);
|
||||
|
||||
/**
|
||||
* This operation creates a buffer for the given system global name
|
||||
@@ -219,7 +244,9 @@ typedef struct _DrmDriverOps {
|
||||
* DrmSurfaceBuffer object.
|
||||
*/
|
||||
DrmSurfaceBuffer* (* create_buffer_from_name) (DrmDriver *driver,
|
||||
uint32_t name);
|
||||
uint32_t name,
|
||||
uint32_t drm_format, uint32_t hdr_size,
|
||||
uint32_t width, uint32_t height, uint32_t pitch);
|
||||
|
||||
/**
|
||||
* This operation creates a buffer for the given PRIME file descriptor
|
||||
@@ -231,21 +258,19 @@ typedef struct _DrmDriverOps {
|
||||
* DrmSurfaceBuffer object.
|
||||
*/
|
||||
DrmSurfaceBuffer* (* create_buffer_from_prime_fd) (DrmDriver *driver,
|
||||
int prime_fd, size_t size);
|
||||
int prime_fd, size_t size,
|
||||
uint32_t drm_format, uint32_t hdr_size,
|
||||
uint32_t width, uint32_t height, uint32_t pitch);
|
||||
|
||||
/**
|
||||
* This operation maps the buffer into the current process's virtual memory
|
||||
* space, and returns the virtual address. If failed, it returns NULL.
|
||||
*
|
||||
* When \a for_scanout is not zero, the buffer will be used for scan out
|
||||
* frame buffer.
|
||||
*
|
||||
* \note The driver must implement this operation. The driver must
|
||||
* set a valid value for buff field of the DrmSurfaceBuffer object
|
||||
* on success.
|
||||
*/
|
||||
uint8_t* (* map_buffer) (DrmDriver *driver, DrmSurfaceBuffer* buffer,
|
||||
int for_scanout);
|
||||
uint8_t* (* map_buffer) (DrmDriver *driver, DrmSurfaceBuffer* buffer);
|
||||
|
||||
/**
|
||||
* This operation un-maps a buffer.
|
||||
@@ -264,96 +289,51 @@ typedef struct _DrmDriverOps {
|
||||
void (* destroy_buffer) (DrmDriver *driver, DrmSurfaceBuffer* buffer);
|
||||
|
||||
/**
|
||||
* This operation clears the specific rectangle area of a buffer
|
||||
* This operation fills the specific rectangle area of a buffer
|
||||
* with the specific pixel value. If succeed, it returns 0.
|
||||
*
|
||||
* \note If this operation is set as NULL, the driver does not support
|
||||
* hardware accelerated clear operation.
|
||||
* hardware accelerated filling operation.
|
||||
*/
|
||||
int (* clear_buffer) (DrmDriver *driver,
|
||||
int (* fill_rect) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* dst_buf, const GAL_Rect* rc, uint32_t pixel_value);
|
||||
|
||||
/**
|
||||
* This operation checks whether a hardware accelerated blit
|
||||
* This operation checks whether a specified hardware accelerated blit
|
||||
* can be done between the source buffer and the destination buffer.
|
||||
* If succeed, it returns 0.
|
||||
* If succeed, it returns zero, otherwise for failure.
|
||||
* If succeed, it is safe to call do_blit operation.
|
||||
*
|
||||
* \note If this operation is set as NULL, it will be supposed that
|
||||
* the driver does not support any hardware accelerated blitting operation.
|
||||
*/
|
||||
int (* check_blit) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* src_buf, DrmSurfaceBuffer* dst_buf);
|
||||
|
||||
/**
|
||||
* This operation copies bits from a source buffer to a destination buffer.
|
||||
*
|
||||
* \note If this operation is set as NULL, the driver does not support
|
||||
* hardware accelerated copy blitting.
|
||||
*
|
||||
* \note Currently, the logical operation is ignored.
|
||||
*/
|
||||
int (* copy_blit) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* src_buf, const GAL_Rect* src_rc,
|
||||
DrmSurfaceBuffer* dst_buf, const GAL_Rect* dst_rc,
|
||||
ColorLogicalOp logic_op);
|
||||
const DrmBlitOperations *ops);
|
||||
|
||||
/**
|
||||
* This operation blits pixels from a source buffer with the source alpha
|
||||
* value specified to a destination buffer.
|
||||
*
|
||||
* \note If this operation is set as NULL, the driver does not support
|
||||
* hardware accelerated blitting with alpha.
|
||||
* This operation does the real blit. It should not be NULL if check_blit
|
||||
* is not NULL.
|
||||
*/
|
||||
int (* alpha_blit) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* src_buf, const GAL_Rect* src_rc,
|
||||
DrmSurfaceBuffer* dst_buf, const GAL_Rect* dst_rc,
|
||||
uint8_t alpha);
|
||||
int (* do_blit) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer *src_buf, const GAL_Rect *src_rc,
|
||||
DrmSurfaceBuffer *dst_buf, const GAL_Rect *dst_rc,
|
||||
const DrmBlitOperations *blit_ops);
|
||||
|
||||
/**
|
||||
* This operation blits pixels from a source buffer to a destination buffer,
|
||||
* but skipping the pixel value specified by \a color_key.
|
||||
* This operation copies the pixels from the source buffer to
|
||||
* the destination buffer, with or without scaling, rotation, and flip.
|
||||
*
|
||||
* \note If this operation is set as NULL, the driver does not support
|
||||
* hardware accelerated blitting with color key.
|
||||
* hardware accelerated copy operation between buffers.
|
||||
*/
|
||||
int (* key_blit) (DrmDriver *driver,
|
||||
int (* copy_buff) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* src_buf, const GAL_Rect* src_rc,
|
||||
DrmSurfaceBuffer* dst_buf, const GAL_Rect* dst_rc,
|
||||
uint32_t color_key);
|
||||
|
||||
/**
|
||||
* This operation blits pixels from a source buffer with the source alpha
|
||||
* value specified to a destination buffer, but skipping the pixel value
|
||||
* specified.
|
||||
*
|
||||
* \note If this operation is set as NULL, the driver does not support
|
||||
* hardware accelerated blitting with alpha and color key.
|
||||
*/
|
||||
int (* alpha_key_blit) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* src_buf, const GAL_Rect* src_rc,
|
||||
DrmSurfaceBuffer* dst_buf, const GAL_Rect* dst_rc,
|
||||
uint8_t alpha, uint32_t color_key);
|
||||
|
||||
/**
|
||||
* This operation blits pixels from a source buffer with the source alpha
|
||||
* value of pixels to the destination buffer, and with the specified color
|
||||
* compositing/blending method (\a ColorBlendMethod).
|
||||
*
|
||||
* \note If this operation is set as NULL, the driver does not support
|
||||
* hardware accelerated blitting with alpha on basis per pixel.
|
||||
*
|
||||
* \note Currently, the color compositing/blending method is ignored.
|
||||
*/
|
||||
int (* alpha_pixel_blit) (DrmDriver *driver,
|
||||
DrmSurfaceBuffer* src_buf, const GAL_Rect* src_rc,
|
||||
DrmSurfaceBuffer* dst_buf, const GAL_Rect* dst_rc,
|
||||
ColorBlendMethod blend_method);
|
||||
|
||||
BlitCopyOperation op);
|
||||
} DrmDriverOps;
|
||||
|
||||
/** The current version of DRM driver. */
|
||||
#define DRM_DRIVER_VERSION 1
|
||||
|
||||
/**
|
||||
* Implement this stub to return the DRI driver operations
|
||||
*
|
||||
|
||||
+486
-33
File diff suppressed because it is too large
Load Diff
+85
-4
@@ -456,6 +456,45 @@ MG_EXPORT void GUIAPI MiniGUIPanic (int exitcode);
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_id)
|
||||
* \brief Joins to a layer and returns the client identifier if success.
|
||||
*
|
||||
* This function should be called by clients before calling any other MiniGUI
|
||||
* functions. You can call \a GetLayerInfo to get the layer information.
|
||||
* If the layer to be joined does not exist, the server, i.e. \a mginit, will
|
||||
* try to create a new one. If you passed a NULL pointer or a null string for
|
||||
* \a layer_name, the client will join to the default layer.
|
||||
*
|
||||
* If the client want to create a new layer, you should specify the maximal
|
||||
* number of z-nodes in the higher level (max_nr_highers) and the maximal
|
||||
* number of z-nodes in the normal level (max_nr_normals) of the new layer.
|
||||
* Passing zero to \a max_nr_highers and max_nr_normals will use the default
|
||||
* values, and the default values are specified by ServerStartup.
|
||||
*
|
||||
* Note that the server will create a default layer named "mginit".
|
||||
*
|
||||
* \param layer_name The name of the layer. You can use NAME_TOPMOST_LAYER to
|
||||
* specify the current topmost layer.
|
||||
* \param client_name The name of the client.
|
||||
* \param max_nr_highers The maximal number of z-nodes in the higher level of
|
||||
* the new layer.
|
||||
* \param max_nr_normals The maximal number of z-nodes in the normal level of
|
||||
* the new layer.
|
||||
* \param cli_id The pointer to a buffer of int to return the client identifier.
|
||||
*
|
||||
* \return The handle to the layer on success, INV_LAYER_HANDLE on error.
|
||||
*
|
||||
* \note Only call this function in clients of MiniGUI-Processes.
|
||||
*
|
||||
* \sa GetLayerInfo, ServerStartup, ServerCreateLayer
|
||||
*/
|
||||
MG_EXPORT GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_id);
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name,
|
||||
@@ -490,9 +529,30 @@ MG_EXPORT void GUIAPI MiniGUIPanic (int exitcode);
|
||||
*
|
||||
* \sa GetLayerInfo, ServerStartup, ServerCreateLayer
|
||||
*/
|
||||
MG_EXPORT GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
static inline GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals);
|
||||
int max_nr_highers, int max_nr_normals)
|
||||
{
|
||||
return JoinLayerEx (layer_name, client_name,
|
||||
max_nr_highers, max_nr_normals, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int GUIAPI GetClientId (void)
|
||||
* \brief Gets the client identifier.
|
||||
*
|
||||
* You can get the information of a layer through this function.
|
||||
* The information will be returned through the pointer arguments
|
||||
* if the specific pointer is not NULL.
|
||||
*
|
||||
* \return Returns the client identifier of the current process.
|
||||
* Note that the server always returns 0.
|
||||
*
|
||||
* \sa JoinLayerEx
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT int GUIAPI GetClientId (void);
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
|
||||
@@ -2125,7 +2185,7 @@ MG_EXPORT int GUIAPI ServerSendReplyEx (int clifd,
|
||||
* \fn int GUIAPI ServerSendReply (int clifd, const void* reply, int len)
|
||||
* \brief Sends the reply to the client.
|
||||
*
|
||||
* This function sends a replay pointed to by \a reply which is
|
||||
* This function sends a reply pointed to by \a reply which is
|
||||
* \a len bytes long to the client.
|
||||
*
|
||||
* \note Only used by the server to send the reply to the client.
|
||||
@@ -2673,6 +2733,26 @@ MG_EXPORT void GUIAPI DesktopUpdateAllWindow (void);
|
||||
|
||||
#define DUMMY_LAYER_HANDLE (GHANDLE)(-1)
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_fd)
|
||||
* \brief The dummy replacement of the same function for MiniGUI-Processes.
|
||||
*
|
||||
* This function is a replacment of the same function for MiniGUI-Processes
|
||||
* runtime mode. We provide this function for MiniGUI-Threads and
|
||||
* MiniGUI-Standalone runtime modes, in order to avoid using the
|
||||
* conditional compilation instructions in your source code.
|
||||
*
|
||||
* \return Always returns DUMMY_LAYER_HANDLE to indicate success.
|
||||
*/
|
||||
static inline GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_fd)
|
||||
{
|
||||
return DUMMY_LAYER_HANDLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name,
|
||||
@@ -2687,7 +2767,8 @@ MG_EXPORT void GUIAPI DesktopUpdateAllWindow (void);
|
||||
* \return Always returns DUMMY_LAYER_HANDLE to indicate success.
|
||||
*/
|
||||
static inline GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name, int max_nr_highers, int max_nr_normals)
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals)
|
||||
{
|
||||
return DUMMY_LAYER_HANDLE;
|
||||
}
|
||||
|
||||
+32
-3
@@ -2990,18 +2990,22 @@ typedef struct _WINMASKINFO {
|
||||
if the client moved to a new layer */
|
||||
#define MSG_LAYERCHANGED 0x0149
|
||||
|
||||
/* Since 5.2.0; the server send this message to the client
|
||||
if a window has been composited to the screen. */
|
||||
#define MSG_WINCOMPOSITED 0x014A
|
||||
|
||||
#endif /* defined _MGRM_PROCESSES */
|
||||
|
||||
/* Since 5.0.0: for managing message thread */
|
||||
#define MSG_MANAGE_MSGTHREAD 0x014A
|
||||
#define MSG_MANAGE_MSGTHREAD 0x014B
|
||||
#define MSGTHREAD_SIGNIN 0x00
|
||||
#define MSGTHREAD_SIGNOUT 0x01
|
||||
|
||||
/* Since 5.0.0: for calculating the default position */
|
||||
#define MSG_CALC_POSITION 0x014B
|
||||
#define MSG_CALC_POSITION 0x014C
|
||||
|
||||
/* Since 5.0.6: for waking up the client */
|
||||
#define MSG_WAKEUP_CLIENT 0x014C
|
||||
#define MSG_WAKEUP_CLIENT 0x014D
|
||||
|
||||
/**
|
||||
* \def MSG_DOESNEEDIME
|
||||
@@ -7237,6 +7241,31 @@ MG_EXPORT BOOL GUIAPI SetMainWindowGestureFlags (HWND hWnd, DWORD dwFlags);
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
|
||||
/**
|
||||
* \fn int GUIAPI GetWindowSharedSurfaceFD (HWND hwnd, size_t *map_size,
|
||||
* DWORD *flags)
|
||||
* \brief Gets the file descriptor of the surface buffer for a window or
|
||||
* the main window it locates.
|
||||
*
|
||||
* This function gets the file descriptor of the surface buffer for
|
||||
* the specified window if it is a main window or the main window it locates.
|
||||
* Note that if the window is a control that has the style `WS_EX_CTRLASMAINWIN`,
|
||||
* the window will have a separate surface buffer.
|
||||
*
|
||||
* \param hwnd The handle to the window.
|
||||
*
|
||||
* \return An integer larger than or equal to 0 for a valid file descriptor,
|
||||
* otherwise a negative value.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
* \sa CreateMemDCFromSharedSurfaceFD
|
||||
*
|
||||
* Since 5.0.13
|
||||
*/
|
||||
MG_EXPORT int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd, size_t *map_size,
|
||||
DWORD *flags);
|
||||
|
||||
/**
|
||||
* \fn BOOL GUIAPI SetMainWindowCompositing (HWND hWnd,
|
||||
int type, DWORD arg)
|
||||
|
||||
+2
-1
@@ -2,11 +2,12 @@ prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
runmode=@MINIGUI_RUNMODE@
|
||||
libsuffix=@MGLIB_SUFFIX@
|
||||
|
||||
Name: MiniGUI
|
||||
Description: A mature cross-platform windowing and GUI system for embedded systems and IoT smart devices.
|
||||
Version: @MINIGUI_VERSION@
|
||||
Runmode: @MINIGUI_RUNMODE@
|
||||
Requires:
|
||||
Libs: -L${libdir} -lminigui_@MGLIB_SUFFIX@ @DEP_LIBS@
|
||||
Libs.private:
|
||||
|
||||
+32
-3
@@ -184,6 +184,23 @@ static void process_socket_message (MSG *msg)
|
||||
LOSWORD(msg->wParam), HISWORD(msg->wParam),
|
||||
LOSWORD(msg->lParam), HISWORD(msg->lParam));
|
||||
}
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
else if (msg->message == MSG_WINCOMPOSITED) {
|
||||
/* Since 5.2.0 */
|
||||
int slot = (int)msg->wParam;
|
||||
HWND hwnd = (HWND)msg->lParam;
|
||||
unsigned dirty_age = (unsigned)msg->time;
|
||||
if (__mg_client_check_znode_hwnd(slot, hwnd, __mg_client_id)) {
|
||||
GAL_Surface *ssurf = ((PMAINWIN)hwnd)->surf;
|
||||
assert(ssurf->shared_header);
|
||||
__mg_lock_file_for_write(ssurf->fd);
|
||||
if (ssurf->dirty_info->dirty_age == dirty_age) {
|
||||
ssurf->dirty_info->nr_dirty_rcs = 0;
|
||||
}
|
||||
__mg_unlock_file_for_write(ssurf->fd);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
if (msg->hwnd == HWND_NULL) {
|
||||
msg->hwnd = HWND_DESKTOP;
|
||||
@@ -518,8 +535,8 @@ BOOL client_IdleHandler4Client (PMSGQUEUE msg_queue, BOOL wait)
|
||||
return (n > 0);
|
||||
}
|
||||
|
||||
GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name,
|
||||
int max_nr_topmosts, int max_nr_normals)
|
||||
GHANDLE GUIAPI JoinLayerEx (const char* layer_name, const char* client_name,
|
||||
int max_nr_topmosts, int max_nr_normals, int *cli_id)
|
||||
{
|
||||
GHANDLE layer_handle = INV_LAYER_HANDLE;
|
||||
REQUEST req;
|
||||
@@ -529,8 +546,12 @@ GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name,
|
||||
if (mgIsServer)
|
||||
return layer_handle;
|
||||
|
||||
if (__mg_client_id != 0) /* Already joined, return the handle */
|
||||
if (__mg_client_id != 0) {
|
||||
/* Already joined, return the handle */
|
||||
if (cli_id)
|
||||
*cli_id = __mg_client_id;
|
||||
return GetLayerInfo (NAME_SELF_LAYER, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
if (layer_name) {
|
||||
strncpy (info.layer_name, layer_name, LEN_LAYER_NAME);
|
||||
@@ -593,10 +614,18 @@ GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name,
|
||||
|
||||
__mg_start_client_desktop ();
|
||||
|
||||
if (cli_id)
|
||||
*cli_id = __mg_client_id;
|
||||
|
||||
ret:
|
||||
return layer_handle;
|
||||
}
|
||||
|
||||
int GUIAPI GetClientId (void)
|
||||
{
|
||||
return __mg_client_id;
|
||||
}
|
||||
|
||||
GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
|
||||
int* nr_clients, BOOL* is_topmost, int* cli_active)
|
||||
{
|
||||
|
||||
+56
-46
@@ -210,6 +210,7 @@ static void setup_dc (HWND hWnd, BIDISLEDITDATA *sled, HDC hdc, BOOL bSel)
|
||||
DWORD dwStyle = GetWindowStyle (hWnd);
|
||||
|
||||
if (!bSel) {
|
||||
SetBkMode (hdc, BM_TRANSPARENT);
|
||||
|
||||
if (dwStyle & WS_DISABLED)
|
||||
SetTextColor (hdc,
|
||||
@@ -583,7 +584,7 @@ static void slePaint (HWND hWnd, HDC hdc, PBIDISLEDITDATA sled)
|
||||
|
||||
/* draw selected chars */
|
||||
setup_dc (hWnd, sled, hdc, TRUE);
|
||||
outw += DrawACharString (hdc, startx + outw, starty,
|
||||
outw += DrawACharString (hdc, startx + outw, starty,
|
||||
achar_string, sled->selEnd - sled->selStart, NULL, NULL);
|
||||
achar_string += sled->selEnd - sled->selStart;
|
||||
|
||||
@@ -1069,6 +1070,7 @@ static int ascii_bidi_type[] = {
|
||||
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_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON,
|
||||
|
||||
/*0x60~0x6f*/
|
||||
BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
||||
@@ -1085,21 +1087,23 @@ static int ascii_bidi_type[] = {
|
||||
static int inline get_char_bidi_type (LOGFONT* logfont, Achar32 chv)
|
||||
{
|
||||
DEVFONT* devfont;
|
||||
int bidi_type = BIDI_TYPE_LTR;
|
||||
|
||||
if (IS_MBCHV(chv)) {
|
||||
devfont = logfont->devfonts[1];
|
||||
|
||||
if (devfont->charset_ops->bidi_char_type) {
|
||||
return devfont->charset_ops->bidi_char_type (chv);
|
||||
}
|
||||
else {
|
||||
return BIDI_TYPE_LTR;
|
||||
bidi_type = devfont->charset_ops->bidi_char_type (chv);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return ascii_bidi_type[chv];
|
||||
assert(chv < 0x80);
|
||||
bidi_type = ascii_bidi_type[chv];
|
||||
}
|
||||
|
||||
_DBG_PRINTF("chv: %X: bidi_type: %x\n", chv, bidi_type);
|
||||
return bidi_type;
|
||||
|
||||
}
|
||||
static int get_text_rl_type (PLOGFONT logfont, char* newtext, int l_char_type,
|
||||
int r_char_type, int line_type)
|
||||
@@ -1108,53 +1112,60 @@ static int get_text_rl_type (PLOGFONT logfont, char* newtext, int l_char_type,
|
||||
Achar32 chv;
|
||||
chv = GetACharValue (logfont, newtext, strlen(newtext), NULL, 0);
|
||||
|
||||
if (chv == INV_ACHAR_VALUE)
|
||||
return -1;
|
||||
int type = CHAR_TYPE_UNKKOWN;
|
||||
|
||||
if (chv == INV_ACHAR_VALUE) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
bidi_type = get_char_bidi_type (logfont, chv);
|
||||
|
||||
if (BIDI_IS_STRONG(bidi_type))
|
||||
{
|
||||
if (BIDI_IS_RTL(bidi_type))
|
||||
{
|
||||
return CHAR_TYPE_RTL;
|
||||
if (BIDI_IS_STRONG(bidi_type)) {
|
||||
if (BIDI_IS_RTL(bidi_type)) {
|
||||
type = CHAR_TYPE_RTL;
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
{
|
||||
return CHAR_TYPE_LTR;
|
||||
else {
|
||||
type = CHAR_TYPE_LTR;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
if (BIDI_IS_NUMBER(bidi_type))
|
||||
{
|
||||
return CHAR_TYPE_LTR;
|
||||
if (BIDI_IS_NUMBER(bidi_type)) {
|
||||
type = CHAR_TYPE_LTR;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (l_char_type == r_char_type)
|
||||
{
|
||||
return l_char_type;
|
||||
if (l_char_type == r_char_type) {
|
||||
type = l_char_type;
|
||||
goto done;
|
||||
}
|
||||
/* no left char */
|
||||
else if (l_char_type == -1)
|
||||
{
|
||||
else if (l_char_type == CHAR_TYPE_UNKKOWN) {
|
||||
if (BIDI_IS_WEAK (bidi_type))
|
||||
return r_char_type;
|
||||
type = r_char_type;
|
||||
else
|
||||
return line_type;
|
||||
type = line_type;
|
||||
goto done;
|
||||
}
|
||||
/* no right char */
|
||||
else if (r_char_type == -1)
|
||||
{
|
||||
else if (r_char_type == CHAR_TYPE_UNKKOWN) {
|
||||
if (BIDI_IS_WEAK (bidi_type))
|
||||
return l_char_type;
|
||||
type = l_char_type;
|
||||
else
|
||||
return line_type;
|
||||
type = line_type;
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
{
|
||||
return line_type;
|
||||
else {
|
||||
type = line_type;
|
||||
}
|
||||
|
||||
_DBG_PRINTF("l_char_type: %d, r_char_type: %d, line_type: %d, "
|
||||
"type for %X: %d\n",
|
||||
l_char_type, r_char_type, line_type, chv, type);
|
||||
|
||||
done:
|
||||
return type;
|
||||
}
|
||||
|
||||
static int get_line_rl_type (ACHARMAPINFO* map, int len)
|
||||
@@ -2133,7 +2144,7 @@ esright_input_char_refresh (HWND hWnd,
|
||||
scroll_rc.right = cur_caret_x;
|
||||
|
||||
ScrollWindow(hWnd, -scroll_len, 0, &scroll_rc, NULL);
|
||||
UpdateWindow(hWnd, FALSE);
|
||||
UpdateInvalidClient(hWnd, TRUE);
|
||||
edtSetCaretPos (hWnd, sled);
|
||||
|
||||
sled->changed = TRUE;
|
||||
@@ -2504,8 +2515,6 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
unsigned char charBuffer [4];
|
||||
int chars;
|
||||
|
||||
_DBG_PRINTF("get char-----------------char----%p\n", (PVOID)wParam);
|
||||
|
||||
if (dwStyle & ES_READONLY)
|
||||
return 0;
|
||||
|
||||
@@ -2526,9 +2535,6 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
else {
|
||||
chars = 1;
|
||||
|
||||
if (charBuffer [0] == 127) // BS
|
||||
charBuffer [0] = '\b';
|
||||
|
||||
if (dwStyle & ES_UPPERCASE) {
|
||||
charBuffer [0] = toupper (charBuffer[0]);
|
||||
}
|
||||
@@ -2537,12 +2543,12 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
}
|
||||
|
||||
if (chars == 1) {
|
||||
if (charBuffer [0] < 0x20 && charBuffer[0] != '\b') //FIXME
|
||||
return 0;
|
||||
if (chars > 1) {
|
||||
_WRN_PRINTF("BIDISLEDIT only support ISO8859-6 charset\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (wParam == '\b') { // backspace
|
||||
else if (charBuffer [0] == '\b' || charBuffer [0] == 0x7F) {
|
||||
// BS or DEL
|
||||
int del = 1;
|
||||
|
||||
if (sled->editPos == 0 && sled->selStart == sled->selEnd)
|
||||
@@ -2564,9 +2570,12 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
sleBackspaceText (hWnd, sled, del, FALSE, FALSE);
|
||||
}
|
||||
}
|
||||
else{
|
||||
else if (charBuffer [0] < 0x20) {
|
||||
// ignore all other control characters.
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
if (dwStyle & ES_LEFT) {
|
||||
//if ((dwStyle&0xffff) == ES_LEFT) {
|
||||
esleft_input_char_refresh(hWnd, sled, (char*)charBuffer, chars);
|
||||
set_edit_caret_pos(hWnd, sled);
|
||||
|
||||
@@ -2586,6 +2595,7 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
sleInsertText (hWnd, sled, (char* )charBuffer, chars, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+8
-11
@@ -1678,7 +1678,7 @@ esright_input_char_refresh (HWND hWnd,
|
||||
scroll_rc.right = cur_caret_x;
|
||||
|
||||
ScrollWindow(hWnd, -scroll_len, 0, &scroll_rc, NULL);
|
||||
UpdateWindow(hWnd, FALSE);
|
||||
UpdateInvalidClient(hWnd, TRUE);
|
||||
edtSetCaretPos (hWnd, sled);
|
||||
|
||||
sled->changed = TRUE;
|
||||
@@ -2143,9 +2143,6 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
else {
|
||||
chars = 1;
|
||||
|
||||
if (charBuffer [0] == 127) // BS
|
||||
charBuffer [0] = '\b';
|
||||
|
||||
if (dwStyle & ES_UPPERCASE) {
|
||||
charBuffer [0] = toupper (charBuffer[0]);
|
||||
}
|
||||
@@ -2154,12 +2151,8 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
}
|
||||
|
||||
if (chars == 1) {
|
||||
if (charBuffer [0] < 0x20 && charBuffer[0] != '\b') //FIXME
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (charBuffer[0] == '\b') { //backspace
|
||||
if (chars == 1 && (charBuffer[0] == '\b' || charBuffer[0] == 0x7F)) {
|
||||
// ASCII BS or DEL
|
||||
int del;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
else{
|
||||
else if (chars == 1 && charBuffer [0] < 0x20) {
|
||||
// ignore all other ASCII control characters.
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
if (dwStyle & ES_LEFT) {
|
||||
esleft_input_char_refresh(hWnd, sled, (char*)charBuffer, chars);
|
||||
set_edit_caret_pos(hWnd, sled);
|
||||
|
||||
@@ -404,7 +404,7 @@ void mglist_set_itemops (MgList *mglst, PMGITEMOPS 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)
|
||||
{
|
||||
switch (message) {
|
||||
|
||||
@@ -140,7 +140,7 @@ struct _MgList
|
||||
|
||||
/* ------------------------- 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);
|
||||
|
||||
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);
|
||||
bChange = TRUE;
|
||||
}
|
||||
|
||||
if (bChange)
|
||||
UpdateInvalidClient(hWnd, FALSE);
|
||||
|
||||
return bChange;
|
||||
}
|
||||
|
||||
@@ -585,7 +589,7 @@ int scrolled_init (HWND hWnd, PSCRDATA pscrdata, int w, int h)
|
||||
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;
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ typedef struct _scrdata
|
||||
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 void scrolled_destroy (PSCRDATA pscrdata);
|
||||
MG_EXPORT void scrolled_hscroll (HWND hWnd, PSCRDATA pscrdata, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
@@ -2096,7 +2096,6 @@ static void teOnChar (HWND hWnd, PTEDATA ptedata, WPARAM wParam)
|
||||
rcInv.right = ptedata->svdata.scrdata.nContWidth;
|
||||
rcInv.bottom = rcInv.top + ptedata->nLineHeight - ptedata->nLineBaseH;
|
||||
REFRESH_NODE_EX(node, &rcInv);
|
||||
// UpdateWindow(hWnd, FALSE);
|
||||
|
||||
newlinenr = NODE_LINENR(node);
|
||||
rcInv.left = 0;
|
||||
@@ -2104,12 +2103,10 @@ static void teOnChar (HWND hWnd, PTEDATA ptedata, WPARAM wParam)
|
||||
rcInv.top += ptedata->nLineHeight;
|
||||
rcInv.bottom = rcInv.top + ptedata->nLineHeight - ptedata->nLineBaseH;
|
||||
REFRESH_NODE_EX(node, &rcInv);
|
||||
// UpdateWindow(hWnd, FALSE);
|
||||
}
|
||||
/* houhh 20090814, UpdataWindow will invalidate all edit area, but
|
||||
* erase area is not same with msg_paint area.*/
|
||||
UpdateWindow(hWnd, FALSE);
|
||||
//SendMessage(hWnd, MSG_PAINT, 0, 0);
|
||||
UpdateInvalidClient(hWnd, TRUE);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -80,17 +80,17 @@ static void update_viewport (gvGridViewData *view, int from, int to, int is_row)
|
||||
{
|
||||
RECT r;
|
||||
|
||||
GetClientRect (view->hCtrl, &r);
|
||||
GetClientRect(view->hCtrl, &r);
|
||||
|
||||
if (is_row) {
|
||||
r.top = from;
|
||||
ScrollWindow (view->hCtrl, 0, to, &r, NULL);
|
||||
ScrollWindow(view->hCtrl, 0, to, &r, NULL);
|
||||
}
|
||||
else {
|
||||
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 {{{
|
||||
|
||||
+10
-17
@@ -93,14 +93,15 @@ BOOL RegisterTreeViewControl (void)
|
||||
const WINDOW_ELEMENT_RENDERER * rdr =
|
||||
GetDefaultWindowElementRenderer();
|
||||
|
||||
|
||||
if (!(icon_fold = (HICON)RetrieveRes(gui_GetIconFile(rdr->name, SYSICON_FOLD, szValue)))) {
|
||||
if (!(icon_fold = (HICON)RetrieveRes(gui_GetIconFile(rdr->name,
|
||||
SYSICON_FOLD, szValue)))) {
|
||||
if (!(icon_fold = LoadSystemIcon (SYSICON_FOLD, 0))) {
|
||||
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))) {
|
||||
DestroyIcon (icon_fold);
|
||||
icon_fold = 0;
|
||||
@@ -180,6 +181,7 @@ static BOOL tvInitTVData (HWND hwnd, PTVDATA pData, DWORD dwStyle, PTVITEMINFO r
|
||||
tvRoot->hIconFold = root_ii->hIconFold;
|
||||
else
|
||||
tvRoot->hIconFold = ICON_FOLD;
|
||||
|
||||
if (root_ii && root_ii->hIconUnfold)
|
||||
tvRoot->hIconUnfold = root_ii->hIconUnfold;
|
||||
else
|
||||
@@ -632,22 +634,13 @@ static void tvDrawItem (HWND hWnd, HDC hdc, PTVDATA pData, int centerX, int cent
|
||||
centerX += (h>>1) + TV_BOXGAP;
|
||||
|
||||
if (pData->dwStyle & TVS_WITHICON) {
|
||||
if (!(pData->dwStyle & TVS_ICONFORSELECT)
|
||||
&& (!p->child || (p->dwFlags & TVIF_FOLD))) {
|
||||
if (p->child != NULL && (p->dwFlags & TVIF_FOLD)) {
|
||||
if ((p->hIconFold)) {
|
||||
DrawIcon (hdc, centerX, centerY - (h>>1),
|
||||
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);
|
||||
DrawIcon (hdc, centerX, centerY - (h>>1), h, h, p->hIconFold);
|
||||
}
|
||||
} else if ((p->hIconUnfold)) {
|
||||
DrawIcon (hdc, centerX, centerY - (h>>1), h, h, p->hIconUnfold);
|
||||
}
|
||||
centerX += h + TV_ICONGAP;
|
||||
}
|
||||
|
||||
|
||||
@@ -202,6 +202,17 @@ static void destroy (GLYPHTREENODE *root)
|
||||
|
||||
/*** 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)
|
||||
{
|
||||
return DEVFONTGLYPHTYPE_PRERDRBMP;
|
||||
@@ -380,6 +391,7 @@ static int get_glyph_bbox (LOGFONT* logfont, DEVFONT* devfont,
|
||||
|
||||
/**************************** Global data ************************************/
|
||||
FONTOPS __mg_bitmap_font_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_width,
|
||||
get_max_width,
|
||||
|
||||
+19
-16
@@ -15,7 +15,7 @@
|
||||
* and Graphics User Interface (GUI) support system for embedded systems
|
||||
* and smart IoT devices.
|
||||
*
|
||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 2002~2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 1998~2002, WEI Yongming
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
@@ -226,7 +226,7 @@ static int iso8859_6_conv_from_uc32 (Uchar32 wc, unsigned char* mchar)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* must attetion the para s is arabic chv value.*/
|
||||
#if 0
|
||||
static int is_arabic_char_vowel(Uint8 c)
|
||||
{
|
||||
|
||||
@@ -240,6 +240,7 @@ static int is_arabic_char_vowel(Uint8 c)
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ISO8859-6 charset vowel relative define and judge */
|
||||
#define ISARABIC_VOWEL(s) ((s >= FATHATAN) && (s <= SUKUN))
|
||||
@@ -461,15 +462,18 @@ static int iso8859_6_len_first_char (const unsigned char* mstr, int len)
|
||||
return 2;
|
||||
else if (ignore == 2)
|
||||
return 3;
|
||||
else
|
||||
return 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define ISARABIC_LIG_HALF(s) ((s == 0xa5) || (s == 0xa6))
|
||||
|
||||
static unsigned int iso8859_6_char_type (Achar32 chv)
|
||||
{
|
||||
chv = REAL_ACHAR(chv);
|
||||
#if 1
|
||||
return sb_char_type(chv);
|
||||
#else
|
||||
unsigned int ch_type = ACHAR_BASIC_UNKNOWN;
|
||||
|
||||
if (is_arabic_char_vowel (chv)) { /* is vowel */
|
||||
@@ -480,10 +484,10 @@ static unsigned int iso8859_6_char_type (Achar32 chv)
|
||||
}
|
||||
|
||||
return ch_type;
|
||||
#endif
|
||||
}
|
||||
|
||||
static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
|
||||
#if 0
|
||||
/*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,
|
||||
@@ -531,7 +535,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_ON,
|
||||
BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN,
|
||||
#endif
|
||||
|
||||
/*0x80~0x8f*/
|
||||
BIDI_TYPE_ON, BIDI_TYPE_AL, BIDI_TYPE_AL, BIDI_TYPE_AL,
|
||||
@@ -606,10 +609,9 @@ static BidiType __mg_iso8859_6_bidi_char_type_map[] = {
|
||||
static BidiType iso8859_6_bidi_char_type (Achar32 chv)
|
||||
{
|
||||
chv = REAL_ACHAR(chv);
|
||||
if (chv > 0x7F)
|
||||
return (BidiType)__mg_iso8859_6_bidi_char_type_map[chv - 0x80];
|
||||
else
|
||||
return (BidiType)__mg_iso8859_1_bidi_char_type_map[chv];
|
||||
assert(chv < TABLESIZE(__mg_iso8859_6_bidi_char_type_map));
|
||||
|
||||
return (BidiType)__mg_iso8859_6_bidi_char_type_map[chv];
|
||||
}
|
||||
|
||||
static int get_table_index(Uint8 c)
|
||||
@@ -796,7 +798,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,
|
||||
int cur_len, int shape_type)
|
||||
{
|
||||
Achar32 chv = -1;
|
||||
Achar32 chv = INV_ACHAR_VALUE;
|
||||
int ignore;
|
||||
int index;
|
||||
|
||||
@@ -811,15 +813,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)){
|
||||
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);
|
||||
if (index >=0)
|
||||
{
|
||||
if (index >=0 ) {
|
||||
switch (shape_type) {
|
||||
case ACHAR_ISOLATED:
|
||||
chv = shape_info[index].isolated;
|
||||
@@ -841,7 +842,7 @@ static Achar32 iso8859_6_get_shaped_char_value (const unsigned char* cur_mchar,
|
||||
}
|
||||
|
||||
if (chv == 0)
|
||||
chv =-1;
|
||||
chv = INV_ACHAR_VALUE;
|
||||
|
||||
return chv;
|
||||
}
|
||||
@@ -862,6 +863,7 @@ static const BIDICHAR_MIRROR_MAP __mg_iso8859_68x_mirror_table [] =
|
||||
|
||||
static BOOL iso8859_6_bidi_mirror_char (Achar32 chv, Achar32* mirrored)
|
||||
{
|
||||
chv = REAL_ACHAR(chv);
|
||||
return get_mirror_char (__mg_iso8859_68x_mirror_table,
|
||||
TABLESIZE (__mg_iso8859_68x_mirror_table), chv, mirrored);
|
||||
}
|
||||
@@ -871,6 +873,7 @@ static CHARSETOPS CharsetOps_iso8859_6 = {
|
||||
3,
|
||||
FONT_CHARSET_ISO8859_6,
|
||||
0,
|
||||
1,
|
||||
iso8859_6_len_first_char,
|
||||
iso8859_6_get_char_value,
|
||||
iso8859_6_get_shaped_char_value,
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* and Graphics User Interface (GUI) support system for embedded systems
|
||||
* and smart IoT devices.
|
||||
*
|
||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 2002~2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 1998~2002, WEI Yongming
|
||||
*
|
||||
* 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;
|
||||
else if (break_type == UCHAR_BREAK_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))
|
||||
mchar_type = ACHAR_BASIC_ZEROWIDTH;
|
||||
else if ((chv >= 0x1160 && chv < 0x1200)
|
||||
@@ -239,10 +241,36 @@ static const BidiType linear_enum_to_bidi_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)
|
||||
{
|
||||
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)
|
||||
@@ -628,6 +656,7 @@ CHARSETOPS __mg_CharsetOps_utf8 = {
|
||||
6,
|
||||
FONT_CHARSET_UTF8,
|
||||
0,
|
||||
0,
|
||||
utf8_len_first_char,
|
||||
utf8_get_char_value,
|
||||
NULL,
|
||||
@@ -854,6 +883,7 @@ CHARSETOPS __mg_CharsetOps_utf16le = {
|
||||
4,
|
||||
FONT_CHARSET_UTF16LE,
|
||||
0,
|
||||
0,
|
||||
utf16le_len_first_char,
|
||||
utf16le_get_char_value,
|
||||
NULL,
|
||||
@@ -1080,6 +1110,7 @@ CHARSETOPS __mg_CharsetOps_utf16be = {
|
||||
4,
|
||||
FONT_CHARSET_UTF16BE,
|
||||
0,
|
||||
0,
|
||||
utf16be_len_first_char,
|
||||
utf16be_get_char_value,
|
||||
NULL,
|
||||
|
||||
+30
-7
@@ -15,7 +15,7 @@
|
||||
* and Graphics User Interface (GUI) support system for embedded systems
|
||||
* and smart IoT devices.
|
||||
*
|
||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 2002~2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 1998~2002, WEI Yongming
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
@@ -49,6 +49,8 @@
|
||||
** Create date: 2000/06/13
|
||||
*/
|
||||
|
||||
#undef NDEBUG
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -233,6 +235,7 @@ static CHARSETOPS CharsetOps_ascii = {
|
||||
1,
|
||||
FONT_CHARSET_US_ASCII,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -296,6 +299,7 @@ static CHARSETOPS CharsetOps_iso8859_1 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_1,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -407,6 +411,7 @@ static CHARSETOPS CharsetOps_iso8859_2 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_2,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -519,6 +524,7 @@ static CHARSETOPS CharsetOps_iso8859_3 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_3,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -632,6 +638,7 @@ static CHARSETOPS CharsetOps_iso8859_4 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_4,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -726,6 +733,7 @@ static CHARSETOPS CharsetOps_iso8859_5 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_5,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -884,6 +892,7 @@ static CHARSETOPS CharsetOps_iso8859_7 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_7,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -969,7 +978,6 @@ static const unsigned char* iso8859_8_get_next_word (const unsigned char* mstr,
|
||||
}
|
||||
|
||||
static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
||||
#if 0
|
||||
/*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,
|
||||
@@ -1017,7 +1025,6 @@ static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR,
|
||||
BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON,
|
||||
BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN,
|
||||
#endif
|
||||
|
||||
/*0x80~0x8f*/
|
||||
BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN,
|
||||
@@ -1072,10 +1079,9 @@ static BidiType __mg_iso8859_8_bidi_char_type_map[] = {
|
||||
static BidiType iso8859_8_bidi_char_type (Achar32 chv)
|
||||
{
|
||||
chv = REAL_ACHAR(chv);
|
||||
if (chv > 0x7F)
|
||||
return (BidiType)__mg_iso8859_8_bidi_char_type_map[chv - 0x80];
|
||||
else
|
||||
return (BidiType)__mg_iso8859_1_bidi_char_type_map[chv];
|
||||
assert(chv < TABLESIZE(__mg_iso8859_8_bidi_char_type_map));
|
||||
|
||||
return (BidiType)__mg_iso8859_8_bidi_char_type_map[chv];
|
||||
}
|
||||
|
||||
static const BIDICHAR_MIRROR_MAP __mg_iso8859_8_mirror_table [] =
|
||||
@@ -1160,6 +1166,7 @@ static CHARSETOPS CharsetOps_iso8859_8 = {
|
||||
2, // This is a trick for bidi reorder only implemented for MBC.
|
||||
FONT_CHARSET_ISO8859_8,
|
||||
0,
|
||||
1,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1261,6 +1268,7 @@ static CHARSETOPS CharsetOps_iso8859_9 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_9,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1374,6 +1382,7 @@ static CHARSETOPS CharsetOps_iso8859_10 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_10,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1486,6 +1495,7 @@ static CHARSETOPS CharsetOps_iso8859_11 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_11,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1598,6 +1608,7 @@ static CHARSETOPS CharsetOps_iso8859_13 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_13,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1710,6 +1721,7 @@ static CHARSETOPS CharsetOps_iso8859_14 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_14,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1821,6 +1833,7 @@ static CHARSETOPS CharsetOps_iso8859_15 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_15,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -1971,6 +1984,7 @@ static CHARSETOPS CharsetOps_iso8859_16 = {
|
||||
1,
|
||||
FONT_CHARSET_ISO8859_16,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -2168,6 +2182,7 @@ static CHARSETOPS CharsetOps_gb2312_0 = {
|
||||
2,
|
||||
FONT_CHARSET_GB2312_0,
|
||||
0,
|
||||
0,
|
||||
gb2312_0_len_first_char,
|
||||
gb2312_0_get_char_value,
|
||||
NULL,
|
||||
@@ -2325,6 +2340,7 @@ static CHARSETOPS CharsetOps_gbk = {
|
||||
2,
|
||||
FONT_CHARSET_GBK,
|
||||
0,
|
||||
0,
|
||||
gbk_len_first_char,
|
||||
gbk_get_char_value,
|
||||
NULL,
|
||||
@@ -2593,6 +2609,7 @@ static CHARSETOPS CharsetOps_gb18030_0 = {
|
||||
4,
|
||||
FONT_CHARSET_GB18030_0,
|
||||
0,
|
||||
0,
|
||||
gb18030_0_len_first_char,
|
||||
gb18030_0_get_char_value,
|
||||
NULL,
|
||||
@@ -2750,6 +2767,7 @@ static CHARSETOPS CharsetOps_big5 = {
|
||||
2,
|
||||
FONT_CHARSET_BIG5,
|
||||
0,
|
||||
0,
|
||||
big5_len_first_char,
|
||||
big5_get_char_value,
|
||||
NULL,
|
||||
@@ -2896,6 +2914,7 @@ static CHARSETOPS CharsetOps_ksc5601_0 = {
|
||||
2,
|
||||
FONT_CHARSET_EUCKR,
|
||||
0,
|
||||
0,
|
||||
ksc5601_0_len_first_char,
|
||||
ksc5601_0_get_char_value,
|
||||
NULL,
|
||||
@@ -3020,6 +3039,7 @@ static CHARSETOPS CharsetOps_jisx0201_0 = {
|
||||
1,
|
||||
FONT_CHARSET_JISX0201_0,
|
||||
0,
|
||||
0,
|
||||
jisx0201_0_len_first_char,
|
||||
jisx0201_0_get_char_value,
|
||||
NULL,
|
||||
@@ -3163,6 +3183,7 @@ static CHARSETOPS CharsetOps_jisx0208_0 = {
|
||||
2,
|
||||
FONT_CHARSET_JISX0208_0,
|
||||
0,
|
||||
0,
|
||||
jisx0208_0_len_first_char,
|
||||
jisx0208_0_get_char_value,
|
||||
NULL,
|
||||
@@ -3248,6 +3269,7 @@ static CHARSETOPS CharsetOps_jisx0201_1 = {
|
||||
1,
|
||||
FONT_CHARSET_JISX0201_1,
|
||||
0,
|
||||
0,
|
||||
sb_len_first_char,
|
||||
sb_get_char_value,
|
||||
NULL,
|
||||
@@ -3419,6 +3441,7 @@ static CHARSETOPS CharsetOps_jisx0208_1 = {
|
||||
2,
|
||||
FONT_CHARSET_JISX0208_1,
|
||||
0,
|
||||
0,
|
||||
jisx0208_1_len_first_char,
|
||||
jisx0208_1_get_char_value,
|
||||
NULL,
|
||||
|
||||
@@ -255,6 +255,17 @@ compute_kernval (TTFINSTANCEINFO* ttf_inst_info)
|
||||
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)
|
||||
{
|
||||
if (logfont->style & FS_WEIGHT_BOOK)
|
||||
@@ -792,6 +803,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
||||
}
|
||||
/**************************** Global data ************************************/
|
||||
FONTOPS __mg_ttf_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_width,
|
||||
get_max_width,
|
||||
|
||||
@@ -197,6 +197,17 @@ print_bitmap_grey (const BYTE* buffer, int width, int rows, int pitch)
|
||||
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)
|
||||
{
|
||||
switch (logfont->style & FS_RENDER_MASK) {
|
||||
@@ -1265,6 +1276,7 @@ void font_TermFreetypeLibrary (void)
|
||||
|
||||
/**************************** Global data ************************************/
|
||||
FONTOPS __mg_ttf_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_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);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void bidi_map_reverse (void* context, int len, int pos)
|
||||
{
|
||||
GLYPHMAPINFO* str = (GLYPHMAPINFO*)context + pos;
|
||||
ACHARMAPINFO* str = (ACHARMAPINFO*)context + pos;
|
||||
int i;
|
||||
for (i = 0; i < len / 2; i++)
|
||||
{
|
||||
GLYPHMAPINFO tmp = str[i];
|
||||
ACHARMAPINFO tmp = str[i];
|
||||
str[i] = str[len - 1 - i];
|
||||
str[len - 1 - i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
@@ -725,6 +724,7 @@ Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
int i;
|
||||
int run_pos;
|
||||
int run_len;
|
||||
REORDER_CONTEXT rc;
|
||||
|
||||
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_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;
|
||||
}
|
||||
}
|
||||
|
||||
bidi_reorder_cb(map, len, &type_rl_list, max_level,
|
||||
bidi_map_reverse);
|
||||
rc.achars = NULL;
|
||||
rc.extra = map;
|
||||
rc.cb = bidi_map_reverse;
|
||||
bidi_reorder(&rc, len, &type_rl_list, max_level);
|
||||
|
||||
/* free typerun list.*/
|
||||
free_typerun_list(type_rl_list);
|
||||
@@ -752,18 +753,23 @@ Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
return achars;
|
||||
}
|
||||
|
||||
#if 0
|
||||
Achar32* __mg_legacy_bidi_index_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, int* index_map, int pel)
|
||||
{
|
||||
BYTE max_level = 1;
|
||||
TYPERUN *type_rl_list = NULL;
|
||||
REORDER_CONTEXT rc;
|
||||
|
||||
print_hexstr(achars, len, FALSE);
|
||||
|
||||
/* W1~W7, N1~N2, I1~I2, Get the Embedding 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);
|
||||
|
||||
/* free typerun list.*/
|
||||
|
||||
@@ -66,6 +66,17 @@
|
||||
#define NUF_WIDTH 8
|
||||
#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)
|
||||
{
|
||||
return DEVFONTGLYPHTYPE_MONOBMP;
|
||||
@@ -171,6 +182,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
||||
}
|
||||
|
||||
FONTOPS __mg_null_font_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_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_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)
|
||||
{
|
||||
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 ************************************/
|
||||
FONTOPS __mg_qpf_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_width,
|
||||
get_max_width,
|
||||
|
||||
@@ -151,6 +151,17 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
||||
|
||||
/*************** 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)
|
||||
{
|
||||
return DEVFONTGLYPHTYPE_MONOBMP;
|
||||
@@ -280,6 +291,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
||||
|
||||
/**************************** Global data ************************************/
|
||||
FONTOPS __mg_rbf_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (logfont->style & FS_WEIGHT_BOOK)
|
||||
@@ -598,6 +609,7 @@ static int is_rotatable (LOGFONT* logfont, DEVFONT* devfont, int rot_desired)
|
||||
|
||||
/**************************** Global data ************************************/
|
||||
static FONTOPS scripteasy_font_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_width,
|
||||
get_max_width,
|
||||
|
||||
+4
-1
@@ -155,7 +155,10 @@ BOOL mg_InitSysFont (void)
|
||||
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 [3], style [4], style [5],
|
||||
height, 0)) == NULL) {
|
||||
|
||||
@@ -377,8 +377,8 @@ static _GBType resolve_gbt(struct break_ctxt* ctxt,
|
||||
uc == 0x8E2 || uc == 0xD4E || uc == 0x110BD ||
|
||||
(uc >= 0x111C2 && uc <= 0x111C3)) {
|
||||
gbt = GB_Prepend;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case UCHAR_CATEGORY_CONTROL:
|
||||
case UCHAR_CATEGORY_LINE_SEPARATOR:
|
||||
@@ -393,8 +393,8 @@ static _GBType resolve_gbt(struct break_ctxt* ctxt,
|
||||
if ((uc >= 0xFFF0 && uc <= 0xFFF8) ||
|
||||
(uc >= 0xE0000 && uc <= 0xE0FFF)) {
|
||||
gbt = GB_ControlCRLF;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case UCHAR_CATEGORY_OTHER_LETTER:
|
||||
if (ctxt->makes_hangul_syllable)
|
||||
@@ -434,7 +434,6 @@ static _GBType resolve_gbt(struct break_ctxt* ctxt,
|
||||
gbt = GB_RI_Odd;
|
||||
else
|
||||
gbt = GB_RI_Odd;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -148,6 +148,17 @@ static void unload_font_data (DEVFONT* devfont, void* 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)
|
||||
{
|
||||
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 = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_width,
|
||||
get_max_width,
|
||||
|
||||
@@ -109,6 +109,17 @@ typedef struct _FONT_PROPT {
|
||||
int def_glyph;
|
||||
} 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)
|
||||
{
|
||||
return DEVFONTGLYPHTYPE_MONOBMP;
|
||||
@@ -477,6 +488,7 @@ static void unload_font_data (DEVFONT* devfont, void* data)
|
||||
}
|
||||
|
||||
FONTOPS __mg_vbf_ops = {
|
||||
get_feature,
|
||||
get_glyph_bmptype,
|
||||
get_ave_width,
|
||||
get_max_width,
|
||||
|
||||
+59
-18
@@ -59,17 +59,22 @@
|
||||
#include "cliprect.h"
|
||||
#include "gal.h"
|
||||
#include "internals.h"
|
||||
#include "dc.h"
|
||||
|
||||
BOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight)
|
||||
{
|
||||
PMAINWIN pWin;
|
||||
|
||||
pWin = (PMAINWIN)hWnd;
|
||||
|
||||
if (!pWin->pCaretInfo) {
|
||||
HDC hdc;
|
||||
|
||||
if (!(pWin->pCaretInfo = malloc (sizeof (CARETINFO))))
|
||||
return FALSE;
|
||||
|
||||
/* Since 5.0.11: use client DC of the window instead of screen DC */
|
||||
hdc = GetClientDC(hWnd);
|
||||
|
||||
pWin->pCaretInfo->pBitmap = pBitmap;
|
||||
if (pBitmap) {
|
||||
nWidth = pBitmap->bmWidth;
|
||||
@@ -78,18 +83,22 @@ BOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight)
|
||||
pWin->pCaretInfo->nWidth = nWidth;
|
||||
pWin->pCaretInfo->nHeight = nHeight;
|
||||
pWin->pCaretInfo->caret_bmp.bmType = BMP_TYPE_NORMAL;
|
||||
pWin->pCaretInfo->caret_bmp.bmBitsPerPixel = BITSPERPHYPIXEL;
|
||||
pWin->pCaretInfo->caret_bmp.bmBytesPerPixel = BYTESPERPHYPIXEL;
|
||||
pWin->pCaretInfo->caret_bmp.bmBitsPerPixel =
|
||||
GetGDCapability(hdc, GDCAP_BITSPP);
|
||||
pWin->pCaretInfo->caret_bmp.bmBytesPerPixel =
|
||||
GetGDCapability(hdc, GDCAP_BPP);
|
||||
pWin->pCaretInfo->caret_bmp.bmWidth = nWidth;
|
||||
pWin->pCaretInfo->caret_bmp.bmHeight = nHeight;
|
||||
pWin->pCaretInfo->caret_bmp.bmAlphaMask = NULL;
|
||||
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);
|
||||
pWin->pCaretInfo->pNormal = malloc (pWin->pCaretInfo->nBytesNr);
|
||||
pWin->pCaretInfo->pXored = malloc (pWin->pCaretInfo->nBytesNr);
|
||||
|
||||
ReleaseDC(hdc);
|
||||
|
||||
if (pWin->pCaretInfo->pNormal == NULL ||
|
||||
pWin->pCaretInfo->pXored == NULL) {
|
||||
free (pWin->pCaretInfo);
|
||||
@@ -219,8 +228,8 @@ void GetCaretBitmaps (PCARETINFO pCaretInfo)
|
||||
int i;
|
||||
int sx, sy;
|
||||
HDC hdc;
|
||||
Uint32 amask;
|
||||
|
||||
// convert to screen coordinates
|
||||
sx = pCaretInfo->x;
|
||||
sy = pCaretInfo->y;
|
||||
|
||||
@@ -231,36 +240,68 @@ void GetCaretBitmaps (PCARETINFO pCaretInfo)
|
||||
pCaretInfo->caret_bmp.bmWidth,
|
||||
pCaretInfo->caret_bmp.bmHeight,
|
||||
&pCaretInfo->caret_bmp);
|
||||
amask = GetGDCapability(hdc, GDCAP_AMASK);
|
||||
ReleaseDC (hdc);
|
||||
|
||||
// generate XOR bitmap.
|
||||
if (pCaretInfo->pBitmap) {
|
||||
if (amask == 0) {
|
||||
BYTE* normal;
|
||||
BYTE* bitmap;
|
||||
BYTE* xored;
|
||||
|
||||
normal = pCaretInfo->pNormal;
|
||||
bitmap = pCaretInfo->pBitmap->bmBits;
|
||||
xored = pCaretInfo->pXored;
|
||||
|
||||
for (i = 0; i < pCaretInfo->nBytesNr; i++)
|
||||
xored[i] = normal[i] ^ bitmap[i];
|
||||
if (pCaretInfo->pBitmap) {
|
||||
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 {
|
||||
// Since 5.0.11: restore the alpha component if having alpha component.
|
||||
int x, y;
|
||||
BYTE* normal;
|
||||
BYTE* xored;
|
||||
BYTE xor_byte;
|
||||
BYTE* bitmap = NULL;
|
||||
gal_pixel pix_normal, pix_bitmap, pix_xored, bits_alpha;
|
||||
|
||||
if (BITSPERPHYPIXEL < 8)
|
||||
xor_byte = 0x0F;
|
||||
else
|
||||
xor_byte = 0xFF;
|
||||
for (y = 0; y < pCaretInfo->caret_bmp.bmHeight; y++) {
|
||||
normal = pCaretInfo->pNormal + pCaretInfo->caret_bmp.bmPitch * y;
|
||||
xored = pCaretInfo->pXored + pCaretInfo->caret_bmp.bmPitch * y;
|
||||
if (pCaretInfo->pBitmap)
|
||||
bitmap = pCaretInfo->pBitmap->bmBits +
|
||||
pCaretInfo->caret_bmp.bmPitch * y;
|
||||
|
||||
normal = pCaretInfo->pNormal;
|
||||
xored = pCaretInfo->pXored;
|
||||
for (x = 0; x < pCaretInfo->caret_bmp.bmWidth; x++) {
|
||||
|
||||
for (i = 0; i < pCaretInfo->nBytesNr; i++)
|
||||
xored[i] = normal[i] ^ xor_byte;
|
||||
pix_normal = _mem_get_pixel(normal,
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -2185,7 +2185,7 @@ static int create_memdc_for_menu (TRACKMENUINFO* ptmi)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ptmi->dc = CreateMemDCFromSurface (surf);
|
||||
ptmi->dc = __mg_create_memdc_for_surface (surf);
|
||||
if (ptmi->dc == HDC_INVALID) {
|
||||
GAL_FreeSurface (surf);
|
||||
return -1;
|
||||
|
||||
+42
-20
@@ -93,9 +93,8 @@ void GUIAPI SetAutoRepeatMessage (HWND hWnd, UINT uMsg,
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
if (hWnd) {
|
||||
if (!MG_IS_NORMAL_WINDOW(hWnd))
|
||||
return;
|
||||
if (hWnd && !MG_IS_NORMAL_WINDOW(hWnd)) {
|
||||
return;
|
||||
}
|
||||
|
||||
msg.hwnd = hWnd;
|
||||
@@ -138,7 +137,7 @@ static void RecalcClientArea (HWND hWnd)
|
||||
|
||||
if (pWin->secondaryDC == HDC_INVALID) {
|
||||
/* remove the flag of WS_EX_AUTOSECONDARYDC */
|
||||
pWin->dwExStyle = pWin->dwExStyle | WS_EX_AUTOSECONDARYDC;
|
||||
pWin->dwExStyle &= ~WS_EX_AUTOSECONDARYDC;
|
||||
pWin->secondaryDC = 0;
|
||||
}
|
||||
|
||||
@@ -365,11 +364,6 @@ HWND GUIAPI ChildWindowFromPointEx (HWND hParent, POINT pt, UINT uFlags)
|
||||
return pRet;
|
||||
}
|
||||
|
||||
/* NOTE:
|
||||
** this function is CONTROL mouse messages handler,
|
||||
** can automaticly capture mouse depend on HITTEST code.
|
||||
*/
|
||||
|
||||
static PCONTROL __mgs_captured_ctrl = NULL;
|
||||
|
||||
void __mg_reset_mainwin_capture_info (PCONTROL ctrl)
|
||||
@@ -388,6 +382,11 @@ void __mg_reset_mainwin_capture_info (PCONTROL ctrl)
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE:
|
||||
** this function is CONTROL mouse messages handler,
|
||||
** can automaticly capture mouse depend on HITTEST code.
|
||||
*/
|
||||
|
||||
static LRESULT DefaultDTMouseMsgHandler (PMAINWIN pWin, UINT message,
|
||||
WPARAM flags, int x, int y)
|
||||
{
|
||||
@@ -3245,7 +3244,7 @@ int GUIAPI ScrollWindowEx (HWND hWnd, int dx, int dy,
|
||||
rcScroll = rcClient;
|
||||
|
||||
/*
|
||||
* BUGFIX: if we scrolled all area, the all area must
|
||||
* BUGFIX: if we scrolled all area, the whole area must
|
||||
* be set as invalidate (dongjunjie 2010/7/28)
|
||||
*/
|
||||
if ((dx != 0 && abs(dx) >= RECTW(rcScroll)) ||
|
||||
@@ -3281,7 +3280,6 @@ int GUIAPI ScrollWindowEx (HWND hWnd, int dx, int dy,
|
||||
}
|
||||
|
||||
SendMessage (HWND_DESKTOP, MSG_SCROLLMAINWIN, (WPARAM)hWnd, (LPARAM)(&swi));
|
||||
UpdateInvalidClient(hWnd, FALSE);
|
||||
|
||||
/* show caret */
|
||||
if (fCaret) ShowCaretEx (hWnd, FALSE);
|
||||
@@ -4478,10 +4476,10 @@ HWND GUIAPI CreateMainWindowEx2 (PMAINWINCREATE pCreateInfo, LINT id,
|
||||
#endif
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
// Close file descriptor to free kernel memory?
|
||||
if (pWin->surf->shared_header) {
|
||||
close (pWin->surf->shared_header->fd);
|
||||
pWin->surf->shared_header->fd = -1;
|
||||
/* Since 5.2.0: keep fd available. */
|
||||
if (0 && pWin->surf->shared_header) {
|
||||
close (pWin->surf->fd);
|
||||
pWin->surf->fd = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -5587,11 +5585,13 @@ BOOL GUIAPI ValidateRegion (HWND hWnd, const CLIPRGN* pRgn)
|
||||
BOOL GUIAPI GetUpdateRect (HWND hWnd, RECT* update_rect)
|
||||
{
|
||||
PMAINWIN pWin;
|
||||
RECT rcClient;
|
||||
|
||||
MG_CHECK_RET (MG_IS_NORMAL_WINDOW(hWnd), FALSE);
|
||||
pWin = MG_GET_WINDOW_PTR (hWnd);
|
||||
|
||||
*update_rect = pWin->InvRgn.rgn.rcBound;
|
||||
GetClientRect(hWnd, &rcClient);
|
||||
IntersectRect(update_rect, &pWin->InvRgn.rgn.rcBound, &rcClient);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -6038,10 +6038,10 @@ HWND GUIAPI CreateWindowEx2 (const char* spClassName,
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
// Close file descriptor to free kernel memory?
|
||||
if (dwExStyle & WS_EX_CTRLASMAINWIN && pNewCtrl->surf->shared_header) {
|
||||
close (pNewCtrl->surf->shared_header->fd);
|
||||
pNewCtrl->surf->shared_header->fd = -1;
|
||||
/* Since 5.2.0: keep fd available. */
|
||||
if (0 && dwExStyle & WS_EX_CTRLASMAINWIN && pNewCtrl->surf->shared_header) {
|
||||
close (pNewCtrl->surf->fd);
|
||||
pNewCtrl->surf->fd = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6068,6 +6068,28 @@ error:
|
||||
return HWND_INVALID;
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd, size_t *map_size, DWORD *flags)
|
||||
{
|
||||
MG_CHECK_RET (MG_IS_NORMAL_WINDOW (hWnd), -1);
|
||||
|
||||
PMAINWIN pWin = (PMAINWIN)hWnd;
|
||||
if (pWin->surf->shared_header) {
|
||||
if (map_size)
|
||||
*map_size = pWin->surf->shared_header->map_size;
|
||||
if (flags) {
|
||||
*flags = MEMDC_FLAG_SWSURFACE;
|
||||
if (pWin->surf->shared_header->byhw)
|
||||
*flags |= MEMDC_FLAG_HWSURFACE;
|
||||
}
|
||||
|
||||
return pWin->surf->fd;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
#endif /* _MGSCHEMA_COMPOSITING */
|
||||
|
||||
BOOL GUIAPI DestroyWindow (HWND hWnd)
|
||||
{
|
||||
PCONTROL pCtrl;
|
||||
|
||||
+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,
|
||||
Achar32* achars, int len);
|
||||
|
||||
Achar32* __mg_legacy_bidi_map_reorder (const CHARSETOPS* charset_ops,
|
||||
Achar32* achars, int len, int pel, ACHARMAPINFO* map);
|
||||
|
||||
#if 0
|
||||
// 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* achars, int len, int* index_map, int pel);
|
||||
#endif
|
||||
|
||||
@@ -70,7 +70,6 @@ struct _SCALER_INFO_FILLBMP
|
||||
typedef struct {
|
||||
struct _SCALER_INFO_FILLBMP scaler_info;
|
||||
GAL_Rect dst_rect;
|
||||
int old_bkmode;
|
||||
|
||||
BYTE* decoded_buff;
|
||||
BYTE* decoded_alpha_buff;
|
||||
|
||||
+27
-2
@@ -105,6 +105,10 @@
|
||||
#define REQID_GETSHAREDSURFACE 0x001C
|
||||
// for compositing schema
|
||||
#define SYSSF_WALLPAPER_PATTER "syssf-wallpaper-pattern"
|
||||
#define APPSF_NAME_PREFIX "appsf-name-"
|
||||
#define APPSF_NAME_PATTER "appsf-name-%s"
|
||||
#define APPSF_HWND_PREFIX "appsf-hwnd-"
|
||||
#define APPSF_HWND_PATTER "appsf-hwnd-%d-%p"
|
||||
// for sharedfb schema
|
||||
#define SYSSF_REAL_SCREEN "syssf-real-screen"
|
||||
#define SYSSF_SHADOW_SCREEN "syssf-shadow-screen"
|
||||
@@ -113,10 +117,22 @@
|
||||
#define REQID_LOADCURSOR_PNG 0x001D
|
||||
// Load cursor from in-memory PNG
|
||||
#define REQID_LOADCURSOR_PNG_MEM 0x001E
|
||||
|
||||
#if 0 // Deprecated since 5.2.0
|
||||
// allocate semaphore for shared surface
|
||||
#define REQID_ALLOC_SURF_SEM 0x001F
|
||||
// free semaphore of shared surface
|
||||
#define REQID_FREE_SURF_SEM 0x0020
|
||||
#endif
|
||||
|
||||
/* Since 5.2.0 */
|
||||
// Operate a shared surface to register/revoke the name and set the fd
|
||||
#define REQID_OPERATENAMEDSSURF 0x001F
|
||||
#define ID_NAMEDSSURFOP_REGISTER 1
|
||||
#define ID_NAMEDSSURFOP_SET 2
|
||||
#define ID_NAMEDSSURFOP_REVOKE 3
|
||||
|
||||
#define REQID_RESERVED 0x0020
|
||||
|
||||
// Move the current client to another layer
|
||||
#define REQID_MOVETOLAYER 0x0021
|
||||
@@ -142,15 +158,23 @@ MGUI_COMPILE_TIME_ASSERT(sys_request_id, MAX_SYS_REQID >= REQID_SYS_LAST);
|
||||
|
||||
#undef MGUI_COMPILE_TIME_ASSERT
|
||||
|
||||
/* Since 5.2.0 */
|
||||
typedef struct OperateNSSurfInfo
|
||||
{
|
||||
int id_op;
|
||||
char name[NAME_MAX + 1];
|
||||
size_t map_size;
|
||||
} OPERATENSSURFINFO;
|
||||
|
||||
/* Since 5.0.0 */
|
||||
typedef struct _SharedSurfInfo {
|
||||
size_t size; // whole size of the surface
|
||||
off_t offset; // offset of pixel data
|
||||
uint32_t flags; // the flags of the surface
|
||||
uint32_t width, height;
|
||||
uint32_t pitch;
|
||||
uint32_t name; // when use flink name
|
||||
uint32_t drm_format; // DRM pixel format
|
||||
size_t size; // whole size of the surface
|
||||
off_t offset; // offset of pixel data
|
||||
} SHAREDSURFINFO;
|
||||
|
||||
typedef struct JoinLayerInfo {
|
||||
@@ -359,6 +383,7 @@ void __mg_start_client_desktop (void);
|
||||
|
||||
void __mg_update_window (HWND hwnd, int left, int top, int right, int bottom);
|
||||
|
||||
BOOL __mg_client_check_znode_hwnd (int slot, HWND hwnd, int cli);
|
||||
BOOL __mg_client_check_hwnd (HWND hwnd, int cli);
|
||||
BOOL __mg_client_on_layer_changed (GHANDLE layer_handle, int zi_shmid);
|
||||
|
||||
|
||||
+12
-5
@@ -167,6 +167,8 @@ struct tagDC
|
||||
/* surface of this DC */
|
||||
GAL_Surface* surface;
|
||||
|
||||
char __first_attr[0]; // just a zero-length field for the first attribute
|
||||
|
||||
/* background color */
|
||||
gal_pixel bkcolor;
|
||||
|
||||
@@ -179,7 +181,7 @@ struct tagDC
|
||||
/* text color */
|
||||
gal_pixel textcolor;
|
||||
|
||||
int bkmode;
|
||||
int bkmode_set; /* the background mode set by user (5.0.12, Issue #107) */
|
||||
|
||||
int tabstop;
|
||||
int cExtra; /* Character extra */
|
||||
@@ -213,6 +215,8 @@ struct tagDC
|
||||
size_t dash_list_len;
|
||||
#endif
|
||||
|
||||
char __last_attr[0]; // just a zero-length field for the last attribute
|
||||
|
||||
PLOGFONT pLogFont;
|
||||
|
||||
POINT CurPenPos;
|
||||
@@ -247,6 +251,7 @@ struct tagDC
|
||||
gal_pixel skip_pixel;
|
||||
gal_pixel cur_pixel;
|
||||
int step;
|
||||
int bkmode; /* the effective background mode */
|
||||
/* ====================================================================== */
|
||||
|
||||
CLIPRECT* cur_ban;
|
||||
@@ -516,14 +521,16 @@ static inline void _dc_step_y (PDC pdc, int step)
|
||||
|
||||
# define BLOCK_DRAW_SEM(pdc) \
|
||||
do { \
|
||||
if (pdc->surface->shared_header) \
|
||||
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); \
|
||||
if (pdc->surface->shared_header) { \
|
||||
__mg_lock_file_for_write(pdc->surface->fd); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
# define UNBLOCK_DRAW_SEM(pdc) \
|
||||
do { \
|
||||
if (pdc->surface->shared_header) \
|
||||
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); \
|
||||
if (pdc->surface->shared_header) { \
|
||||
__mg_unlock_file_for_write(pdc->surface->fd); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
# define IS_SCREEN_SURFACE(pdc) \
|
||||
|
||||
+12
-1
@@ -15,7 +15,7 @@
|
||||
* and Graphics User Interface (GUI) support system for embedded systems
|
||||
* and smart IoT devices.
|
||||
*
|
||||
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 2002~2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
* Copyright (C) 1998~2002, WEI Yongming
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
@@ -209,6 +209,9 @@ struct _CHARSETOPS
|
||||
/** Default character. */
|
||||
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. */
|
||||
int (*len_first_char) (const unsigned char* mstr, int mstrlen);
|
||||
|
||||
@@ -263,9 +266,17 @@ struct _CHARSETOPS
|
||||
|
||||
#define DEVFONTGLYPHTYPE_MASK_BMPTYPE 0x0F
|
||||
|
||||
enum devfont_feature {
|
||||
DEVFONT_FEATURE_MARK_BBOX = 0,
|
||||
};
|
||||
|
||||
/** The font operation structure. */
|
||||
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 . */
|
||||
DWORD (*get_glyph_bmptype) (LOGFONT* logfont, DEVFONT* devfont);
|
||||
|
||||
|
||||
+10
-8
@@ -51,12 +51,10 @@
|
||||
#ifndef GUI_DRAWSEMOP_H
|
||||
#define GUI_DRAWSEMOP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
static inline void my_sem_op (int semid, int num, int op)
|
||||
{
|
||||
struct sembuf sb;
|
||||
@@ -70,6 +68,9 @@ again:
|
||||
if (errno == EINTR) {
|
||||
goto again;
|
||||
}
|
||||
else {
|
||||
_ERR_PRINTF("Failed semop: %m\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,10 +80,7 @@ again:
|
||||
#define LOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, -1)
|
||||
#define UNLOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, 1)
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
# define LOCK_SURFACE_SEM(num) my_sem_op(SHAREDRES_SEMID_SHARED_SURF, num, -1)
|
||||
# define UNLOCK_SURFACE_SEM(num) my_sem_op(SHAREDRES_SEMID_SHARED_SURF, num, 1)
|
||||
#endif
|
||||
extern int __mg_client_id;
|
||||
|
||||
#ifdef _MGHAVE_CURSOR
|
||||
|
||||
@@ -157,6 +155,10 @@ again:
|
||||
# define UNLOCK_MOUSEMOVE_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_MOUSEMOVE, 1)
|
||||
#endif /* _MGRM_PROCESSES */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
@@ -127,6 +127,9 @@ typedef LWEVENT* PLWEVENT;
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
extern DWORD __mg_timeout_usec;
|
||||
extern DWORD __mg_repeat_usec;
|
||||
|
||||
// The entrance of low level event handling thread
|
||||
BOOL mg_InitLWEvent (void);
|
||||
void mg_TerminateLWEvent (void);
|
||||
|
||||
+5
-38
@@ -258,7 +258,7 @@ struct _MSGQUEUE
|
||||
int loop_depth; // message loop depth, for dialog boxes
|
||||
|
||||
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 */
|
||||
int nr_timers; // the number of active timers
|
||||
@@ -911,40 +911,9 @@ static inline MSGQUEUE* getMsgQueueIfMainWindowInThisThread (PMAINWIN pMainWin)
|
||||
|
||||
#endif /* defined _MGHAVE_VIRTUAL_WINDOW */
|
||||
|
||||
#if 0 /* deprecated code */
|
||||
/* since 5.0.0, we always use QS_DESKTIMER for desktop timer */
|
||||
/* since 5.0.0, we no longer use the timer thread */
|
||||
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);
|
||||
/* Since 5.0.14, remove arg use_sys_timer */
|
||||
BOOL mg_InitTimer (void);
|
||||
void mg_TerminateTimer (void);
|
||||
|
||||
/*window element renderer manager interface*/
|
||||
extern WINDOW_ELEMENT_RENDERER * __mg_def_renderer;
|
||||
@@ -958,9 +927,7 @@ BOOL gui_LoadIconRes(HDC hdc, const char* rdr_name, char* file);
|
||||
void gui_WndRect(HWND hWnd, PRECT prc);
|
||||
void gui_WndClientRect(HWND hWnd, PRECT prc);
|
||||
|
||||
/* Undisclosed APIs */
|
||||
HDC CreateMemDCFromSurface (struct GAL_Surface* surface);
|
||||
struct GAL_Surface* GetSurfaceFromDC (HDC hdc);
|
||||
HDC __mg_create_memdc_for_surface (struct GAL_Surface* surface);
|
||||
|
||||
/* Since 5.0.0 */
|
||||
#ifdef _MGRM_PROCESSES
|
||||
|
||||
+14
-2
@@ -83,6 +83,11 @@ static inline int comp_key_string (const void *key1, const void *key2)
|
||||
return strcmp (key1, key2);
|
||||
}
|
||||
|
||||
static inline void free_val_alloc (void *val)
|
||||
{
|
||||
free (val);
|
||||
}
|
||||
|
||||
typedef struct _map_t map_t;
|
||||
typedef struct _map_entry_t {
|
||||
struct rb_node node;
|
||||
@@ -100,8 +105,15 @@ int __mg_map_get_size (map_t* map);
|
||||
|
||||
map_entry_t* __mg_map_find (map_t* map, const void* key);
|
||||
|
||||
int __mg_map_insert_ex (map_t* map, const void* key,
|
||||
map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt);
|
||||
|
||||
static int __mg_map_insert_ex (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt)
|
||||
{
|
||||
return __mg_map_insert_ex2(map, key, val, NULL) ? 0 : -1;
|
||||
}
|
||||
|
||||
static inline int __mg_map_insert (map_t* map, const void* key,
|
||||
const void* val)
|
||||
{
|
||||
@@ -114,7 +126,7 @@ int __mg_map_find_replace_or_insert (map_t* map, const void* key,
|
||||
int __mg_map_replace (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt);
|
||||
|
||||
int __mg_map_erase (map_t* map, void* key);
|
||||
int __mg_map_erase (map_t* map, const void* key);
|
||||
int __mg_map_get_size (map_t* map);
|
||||
|
||||
#if 0 /* deprecated code */
|
||||
|
||||
+7
-1
@@ -79,6 +79,11 @@ struct timezone {
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
void __mg_lock_file_for_read(int fd);
|
||||
void __mg_unlock_file_for_read(int fd);
|
||||
void __mg_lock_file_for_write(int fd);
|
||||
void __mg_unlock_file_for_write(int fd);
|
||||
|
||||
unsigned int __mg_os_get_random_seed (void);
|
||||
void __mg_os_time_delay (int ms);
|
||||
void __mg_os_start_time (void);
|
||||
@@ -115,10 +120,11 @@ void mg_TerminateMisc (void);
|
||||
BOOL mg_InitSystemRes (void);
|
||||
void mg_TerminateSystemRes (void);
|
||||
|
||||
/* Deprecated since 5.2.0
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
int __mg_alloc_sem_for_shared_surf (void);
|
||||
int __mg_free_sem_for_shared_surf (int sem_num);
|
||||
#endif /* _MGSCHEMA_COMPOSITING */
|
||||
#endif _MGSCHEMA_COMPOSITING */
|
||||
|
||||
size_t __mg_lookfor_unused_slot (unsigned char* bitmap, size_t len_bmp, int set);
|
||||
|
||||
|
||||
@@ -396,10 +396,10 @@ char * __mg_msgstr3 [] =
|
||||
"MSG_SRVNOTIFY", // 0x0147
|
||||
"MSG_UPDATECLIWIN", // 0x0148
|
||||
"MSG_LAYERCHANGED", // 0x0149
|
||||
"MSG_MANAGE_MSGTHREAD", // 0x014A
|
||||
"MSG_CALC_POSITION", // 0x014B
|
||||
"", // 0x014C
|
||||
"", // 0x014D
|
||||
"MSG_WINCOMPOSITED", // 0x014A
|
||||
"MSG_MANAGE_MSGTHREAD", // 0x014B
|
||||
"MSG_CALC_POSITION", // 0x014C
|
||||
"MSG_WAKEUP_CLIENT", // 0x014D
|
||||
"", // 0x014E
|
||||
"", // 0x014F
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user