Compare commits

...

172 Commits

Author SHA1 Message Date
Gabor Kiss-Vamosi
e30efb716f Release v7.1.0 2020-07-07 09:37:00 +02:00
Gabor Kiss-Vamosi
43f5e4d2e0 Run code formatter 2020-07-07 09:36:59 +02:00
Gabor Kiss-Vamosi
d8585d2ea3 update release.py 2020-07-07 09:32:21 +02:00
Amir Gonnen
9e56f750a7 Prevent compiler warning in lv_draw_rect.c (#1637) 2020-07-04 19:50:14 -04:00
guoweilkd
e6fe8436f4 Fix #1634: bug in lv_tileview_scrl_signal (#1636) 2020-07-04 07:30:07 -04:00
Gabor Kiss-Vamosi
e9d3001dbf img: improve hit test for transformed images 2020-07-03 14:48:54 +02:00
Gabor Kiss-Vamosi
fd186eeb15 roller: fix copy 2020-07-03 14:24:23 +02:00
Petri HARRI
4b2c3e560b lv_slider: add knob-only feature and fix bug with symmetrical slider (#1578) 2020-07-01 10:14:14 -04:00
Gabor Kiss-Vamosi
1051e3f5a4 roller: fix copy. Closes #1628 2020-07-01 15:15:12 +02:00
Gabor Kiss-Vamosi
0b68c21840 Merge pull request #1627 from xiaogangly/master
Fix a memory leak bug in function "lv_objmask_remove_mask" .
2020-07-01 15:09:10 +02:00
jbamaral
ac26442ca6 Fix lv_textarea_add_char on big endian (#1620) 2020-07-01 09:08:45 -04:00
Gabor Kiss-Vamosi
6b246b2fed fix default theme colors 2020-07-01 10:53:23 +02:00
xiaogangly
86f74e3da2 Fix a memory leak bug in function "lv_objmask_remove_mask" .
There is a little memory leak When you call function "lv_objmask_remove_mask" to remove a specified mask.
It's need free the memory of list's node.
2020-07-01 15:26:37 +08:00
Gabor Kiss-Vamosi
6d1da27b3c Create merge-to-dev.yml 2020-06-30 09:43:58 +02:00
Gabor Kiss-Vamosi
bae04005d3 update old function name in comment 2020-06-29 20:47:55 +02:00
Gabor Kiss-Vamosi
edeca8c01b Merge pull request #1619 from liangyongxiang/master
Add conditional macro LV_USE_GROUP to more GROUP related singles:
2020-06-29 14:52:18 +02:00
Gabor Kiss-Vamosi
069e24bdb2 add examples folder with arduio examples and move porting folder there 2020-06-28 20:37:32 +02:00
Gabor Kiss-Vamosi
d0db0bab5c add Arduino library files 2020-06-28 20:10:30 +02:00
Themba Dube
421f1b2c01 lv_gpu: fix #1617 by renaming internal macros
This avoids conflicts with STM32Cube.
2020-06-28 09:16:25 -04:00
Gabor Kiss-Vamosi
92027cc06f lv_hal_tick: revert using uint32_t as tick_irq_flag
uint8_t surely can be written in 1 instruction even on 16 bit MCUs
2020-06-28 13:32:40 +02:00
liangyongxiang
d055944ebb Add conditional macro LV_USE_GROUP to more GROUP related singles:
- LV_SIGNAL_CONTROL
- LV_SIGNAL_GET_EDITABLE
2020-06-28 12:48:37 +08:00
Gabor Kiss-Vamosi
3e8b39c404 Merge pull request #1613 from 3096/lv_win-style-fix
material theme: fix lv_win uninitialed styles
2020-06-27 10:35:18 +02:00
3096
e06201f042 material theme: fix lv_win uninitialed styles 2020-06-26 22:27:52 -07:00
Gabor Kiss-Vamosi
6056bc3b95 clraify the tricky loop in lv_tick_get 2020-06-26 14:35:30 +02:00
Gabor Kiss-Vamosi
274d0b522d Merge branch 'master' of https://github.com/littlevgl/lvgl 2020-06-26 09:39:29 +02:00
Gabor Kiss-Vamosi
ac7527fecf minor optimization in lv_obj_init_draw_img_dsc 2020-06-26 09:39:19 +02:00
Gabor Kiss-Vamosi
2ed6b4e2f5 Merge pull request #1607 from jbamaral/fix-img-big-endian-pr
fix image demos on big endian systems
2020-06-25 17:11:46 +02:00
embeddedt
3761db65e0 Fix spelling issue 2020-06-25 07:32:45 -04:00
Gabor Kiss-Vamosi
52cca1dd9b use void * as theme user data for backward compatibility 2020-06-25 06:38:17 +02:00
Gabor Kiss-Vamosi
859f72eb84 add user_data to themes 2020-06-25 06:25:40 +02:00
embeddedt
b77d484a27 Fix #1610: don't assert an expected null pointer 2020-06-24 12:25:16 -04:00
jbamaral
1733508e9a move bug logs to their right position in changelog 2020-06-24 10:01:42 -03:00
jbamaral
5f6c7743ad update internal configuration 2020-06-24 08:38:44 -03:00
jbamaral
2550368d30 fix image demos on big endian systems 2020-06-24 08:30:45 -03:00
Gabor Kiss-Vamosi
63aba1b3de lv_textarea fix cursor alignment with empty textarea when the text alignment is center or right 2020-06-24 11:36:35 +02:00
Gabor Kiss-Vamosi
42f79763e1 fix build error 2020-06-24 11:28:51 +02:00
Gabor Kiss-Vamosi
be19e91e91 fix focusing/defocusing for pages 2020-06-24 11:24:07 +02:00
Gabor Kiss-Vamosi
9561aa767d style: minor fix on getting style attributes + formatting 2020-06-24 10:45:32 +02:00
Gabor Kiss-Vamosi
4c629ec23f update changelog 2020-06-24 10:04:30 +02:00
Gabor Kiss-Vamosi
8864cd87ee lv_img: fix invalidation area when angle or zoom changes 2020-06-24 10:03:37 +02:00
jbamaral
916f5b343a Improve big endian support (#1599) 2020-06-23 08:30:33 -04:00
Gabor Kiss-Vamosi
c0223977d1 roller: fix misaligned option after setting new options 2020-06-23 11:44:06 +02:00
Gabor Kiss-Vamosi
e1c5d8950f Merge branch 'master' of https://github.com/littlevgl/lvgl 2020-06-23 11:11:57 +02:00
Gabor Kiss-Vamosi
20c46ca640 In lv_init test if the the strings are UTF-8 encoded 2020-06-23 11:11:45 +02:00
Gabor Kiss-Vamosi
188205399b Merge pull request #1598 from DeonMarais64/patch-1
Add missing lv_font_montserrat_34
2020-06-22 10:08:22 +02:00
Deon Marais
f9512f55cc Add missing lv_font_montserrat_34
if you do not mind me asking, and on matters of fonts why was Roboto changed to Montserrat when V7 was released ?
2020-06-20 09:08:59 +02:00
embeddedt
8dbd685a90 Fix #1596: typo in lv_api_map.h 2020-06-19 10:13:53 -04:00
Gabor Kiss-Vamosi
0f4aeede79 Update README.md 2020-06-18 16:29:18 +02:00
Gabor Kiss-Vamosi
5d4873aa95 Update README.md 2020-06-18 16:19:57 +02:00
Gabor Kiss-Vamosi
8ac337d515 Update README.md 2020-06-18 16:13:04 +02:00
Gabor Kiss-Vamosi
2678068a86 Update CONTRIBUTING.md 2020-06-18 16:09:07 +02:00
Gabor Kiss-Vamosi
64be5e2096 Update CONTRIBUTING.md 2020-06-18 16:08:17 +02:00
Gabor Kiss-Vamosi
1521d64784 _lv_img_buf_get_transformed_area: do not calculate trivial case 2020-06-18 15:17:03 +02:00
Amir Gonnen
25fbcea31a Ensure mem_max_size is only used on non custom mem (#1588) 2020-06-18 06:40:39 -04:00
Gabor Kiss-Vamosi
51e064d836 Update CHANGELOG.md 2020-06-18 12:37:02 +02:00
Gabor Kiss-Vamosi
295337ac7e Merge pull request #1590 from diegoherranz/lv_conf_checker
lv_conf_checker.py: change requirement of python 3.6 to >=3.6
2020-06-18 12:32:13 +02:00
Diego Herranz
d2d664a69b lv_conf_checker.py: change requirement of python 3.6 to >=3.6
Many current OSes ship newer versions (e.g. 3.8) and they work OK
for this, so I don't think 3.6 is required specifically.
Versions older than 3.6 wouldn't work, though, since f-strings
are used.
2020-06-17 21:04:46 +01:00
Gabor Kiss-Vamosi
7af64df008 upadte version numer to v7.1.0-dev 2020-06-16 13:57:20 +02:00
Gabor Kiss-Vamosi
975ab3f4cc Merge branch 'dev' 2020-06-16 13:56:42 +02:00
Gabor Kiss-Vamosi
122ef1d862 Merge branch 'master' of https://github.com/littlevgl/lvgl 2020-06-16 13:56:00 +02:00
Gabor Kiss-Vamosi
4174ad844c relase.py minor fixes 2020-06-16 13:55:45 +02:00
Gabor Kiss-Vamosi
41e65d9df1 Run code formatter 2020-06-16 13:47:04 +02:00
Gabor Kiss-Vamosi
2d0480c03d Release v7.0.2 2020-06-16 13:42:34 +02:00
Gabor Kiss-Vamosi
b0c9c8778d CHANGELOG set v7.0.2 released 2020-06-16 13:38:37 +02:00
Gabor Kiss-Vamosi
91c98f147f Merge pull request #1580 from DaPa/master
Code comments spelling fixes
2020-06-16 13:36:36 +02:00
DaPa
0bdeb00838 Resolve conflict with 4668bc0 2020-06-16 14:27:08 +03:00
DaPa
eee2184d10 Revert part of last commit to keep _xcb naming into lv_task_create 2020-06-16 14:10:51 +03:00
Gabor Kiss-Vamosi
df9801eac3 Merge pull request #1584 from BesitzeRuf/dev
Fixes drawing of the image border
2020-06-16 13:10:36 +02:00
Gabor Kiss-Vamosi
eacc9d8ce7 chart: fix memory leak 2020-06-16 13:03:54 +02:00
Gabor Kiss-Vamosi
d6e7187d01 fix crash when drawing gradient to the same color 2020-06-16 12:47:09 +02:00
Gabor Kiss-Vamosi
f61f045135 CHANGELOG: fix typo 2020-06-16 12:05:13 +02:00
Gabor Kiss-Vamosi
4668bc0ee3 fix typo in the API 2020-06-16 12:03:32 +02:00
besitzeruf
ae93ee067c Merge branch 'dev-fix-Asymmetric-border-thickness-on-image-objects' into dev 2020-06-16 11:22:30 +02:00
besitzeruf
59165f077e - Fix when border of the image (bottom and right sides) are drawn with different width ( decreased by 1) 2020-06-16 11:18:45 +02:00
Gabor Kiss-Vamosi
00f8af0fb5 minor fixes 2020-06-16 10:28:10 +02:00
Themba Dube
10ee9e5e99 Merge branch 'dev' of github.com:littlevgl/lvgl into dev 2020-06-15 17:06:39 -04:00
DaPa
33de1ffdc7 Fixed @embeddedt's review comments
- change the wording to say "message box" and not "button matrix"
 - parameter name should be cb and not xcb due MicroPython
 - also corrected comment for lv_async_call in lv_async.h
2020-06-15 19:48:44 +03:00
DaPa
585bc329e6 Code comments spelling fixes
Also 2 files have tracing strings affected (shorter with 1 character):
 - lv_obj.c, 1078: LV_LOG_WARN
 - lv_hal_indev.c, 76: LV_LOG_WARN
2020-06-15 17:12:48 +03:00
Gabor Kiss-Vamosi
c20e62d472 lv_gaguge: make lv_gauge_get_angle_offset() offset the labels and needles too
Fixes #1579
2020-06-15 14:16:06 +02:00
Gabor Kiss-Vamosi
9260f9e0aa lv_btnm: fix sending events for hidden buttons 2020-06-14 21:07:42 +02:00
Gabor Kiss-Vamosi
8532bf80df Update CHANGELOG.md 2020-06-14 12:40:49 +02:00
Gabor Kiss-Vamosi
a2bb4099e6 Merge branch 'master' of https://github.com/littlevgl/lvgl 2020-06-14 12:39:35 +02:00
Gabor Kiss-Vamosi
182cbb1aa4 Update LV_OPA_MIN and LV_OPA_MAX to widien the opacity processed range
https://forum.lvgl.io/t/blending-fading-of-body-shadow/2466
2020-06-14 12:36:57 +02:00
nchurly
ccff331e3d Fix #1570: uninitialized variable in lv_draw_img.c (#1574) 2020-06-13 12:28:47 -04:00
OH1BDF
43cc512e5a Added functions to set multiple paddings and margins at once (#1565) 2020-06-12 07:28:11 -04:00
Carlos Diaz
a265165038 Add lv_win_add_btn_left (#1566)
Closes #1535
2020-06-12 07:26:59 -04:00
Themba Dube
8117a70608 Merge branch 'master' into dev 2020-06-12 07:23:47 -04:00
Gabor Kiss-Vamosi
dca12fcd7a Update CHANGELOG.md 2020-06-10 10:14:12 +02:00
Gabor Kiss-Vamosi
e2dabe167d Merge pull request #1562 from arturv2000/MaxMemUsed
Added max_used propriety to lv_mem_monitor_t struct
2020-06-10 10:13:34 +02:00
Gabor Kiss-Vamosi
14a359679a Update CHANGELOG.md 2020-06-09 13:41:24 +02:00
Gabor Kiss-Vamosi
3b111c794c Merge pull request #1561 from microwavesafe/master
Remove dependency on ST CubeMX Hal
2020-06-09 13:40:41 +02:00
Gabor Kiss-Vamosi
1ca1934dbe Merge pull request #1563 from C47D/update_spinner
lv_spinner: Replace remaining pre loader references with spinner
2020-06-09 13:28:53 +02:00
arturv2000
ce8d333407 Update src/lv_misc/lv_mem.c
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2020-06-09 09:46:42 +01:00
microwavesafe
71e23c4e13 Added example include defines 2020-06-09 09:45:12 +01:00
C47D
84776ca5f7 lv_spinner: Replace remaining pre loader references with spinner 2020-06-08 18:12:21 -05:00
arturv2000
91acf877c6 Attempt to correct error in tests 2020-06-08 21:00:12 +01:00
artur.vieira
0ebcf7e266 Added Max Used propriety to lv_mem_monitor_t struct 2020-06-08 20:22:06 +01:00
andrew
3c70a1b5a2 Fixed typo in include define
Added help in lv_conf_template.h
2020-06-08 18:36:30 +01:00
Gabor Kiss-Vamosi
4effebb3ea Update README.md 2020-06-08 16:41:06 +02:00
Gabor Kiss-Vamosi
9eff0d1cd8 Update CHANGELOG.md 2020-06-08 16:36:16 +02:00
Gabor Kiss-Vamosi
07ddc9bf8a Update CONTRIBUTING.md 2020-06-08 16:14:33 +02:00
Gabor Kiss-Vamosi
9048bcc6a0 Update README.md 2020-06-08 15:51:18 +02:00
Gabor Kiss-Vamosi
94b2e0f1a3 Update CHANGELOG.md 2020-06-08 14:16:25 +02:00
Gabor Kiss-Vamosi
a62b03743d Merge pull request #1560 from DeonMarais64/master
Add lv_btnmatrix_set/get_align capability
2020-06-08 14:15:49 +02:00
Gabor Kiss-Vamosi
4754935038 Update CHANGELOG.md 2020-06-08 14:15:14 +02:00
Gabor Kiss-Vamosi
ee44433f86 Merge pull request #1522 from fhorinek/encoder-buttons
Encoder input proc support for buttons
2020-06-08 14:14:32 +02:00
Gabor Kiss-Vamosi
9c8c8aee72 update CHANGLEOG 2020-06-08 14:13:33 +02:00
Gabor Kiss-Vamosi
2739753f20 Merge pull request #1509 from fhorinek/master
Added focus parent for v7
2020-06-08 14:11:40 +02:00
Gabor Kiss-Vamosi
14de809fa5 fix warings 2020-06-08 14:10:30 +02:00
Gabor Kiss-Vamosi
06fa5b3b8f fix conflicts 2020-06-08 14:02:04 +02:00
Gabor Kiss-Vamosi
1b9ccf9cc6 add the dev branch to CI 2020-06-08 13:56:45 +02:00
Gabor Kiss-Vamosi
36e825f093 Update README.md 2020-06-08 13:51:19 +02:00
Gabor Kiss-Vamosi
13a53d077d lv_textarea: fix character delete in password mode 2020-06-08 13:23:41 +02:00
Gabor Kiss-Vamosi
479851e968 : restructure to allow asserting in from too 2020-06-08 13:10:56 +02:00
andrew
0867f72cb9 Rename attribute define to match existing options style
Moved static array declaration to top of file
Added attribute define to template and checker headers
2020-06-08 08:40:50 +01:00
embeddedt
df08d0bd54 Fix old documentation link in lv_conf_template.h
https://forum.lvgl.io/t/lv-conf-template-h-font-usage-points-to-wrong-domain/2424
2020-06-05 17:08:00 -04:00
andrew
bb5c6437ff Added GPU init to lv_init
Changed blend buffer attr to more general LV_DMA_ATTR
Added define for CMSIS header
Fixed bug with turning on peripheral clock
2020-06-05 14:04:52 +01:00
Gabor Kiss-Vamosi
e1af20997d : fix if not the {0;0} tile is created first 2020-06-05 12:31:02 +02:00
andrew
cd9f34076e Modified DMA2D fill, copy and blend functions to use direct
register writes
2020-06-05 11:10:51 +01:00
andrew
0d897136c9 Added LV_BLEND_BUF_ATTR as blend_buf MUST be in DMA accessible RAM 2020-06-05 11:10:11 +01:00
Deon Marais
0e1b02e328 Add lv_btnmatrix_set/gett_align capability 2020-06-05 12:05:34 +02:00
Deon Marais
e3b5a14275 Add align-member and set/get functions 2020-06-05 11:58:33 +02:00
Gabor Kiss-Vamosi
643bc92958 fix warning 2020-06-05 11:06:32 +02:00
Gabor Kiss-Vamosi
1c88c1e8d4 lv_dropdown: fix missing event when used with encoder 2020-06-05 10:54:13 +02:00
Gabor Kiss-Vamosi
c3f051ac52 Add log in true double buffering mode with 2020-06-05 10:43:26 +02:00
Gabor Kiss-Vamosi
673c493694 include the version number in lv_conf_template.h
https://forum.lvgl.io/t/add-lvgl-version-to-lv-conf-h/2396/3
2020-06-05 10:36:16 +02:00
embeddedt
4f3dac6477 Fix #1557: use of uninitialized linked list 2020-06-04 09:51:26 -04:00
Gabor Kiss-Vamosi
d667e9d221 Update CHANGELOG.md 2020-06-04 11:58:32 +02:00
Gabor Kiss-Vamosi
21e4427e57 theme material: fix list button focus. 2020-06-04 11:56:57 +02:00
Gabor Kiss-Vamosi
7d29b40425 fix crash when text area cleared. Fixes #1556 2020-06-04 11:47:53 +02:00
Gabor Kiss-Vamosi
93055bc57c Do not call for transparent pixel 2020-06-04 11:47:53 +02:00
Gabor Kiss-Vamosi
d5a3b81737 fix gestures 2020-06-04 11:47:53 +02:00
Gabor Kiss-Vamosi
950ac3b993 Merge pull request #1553 from MiSimon/issue_deinit_log
Write to logfile before setting the log callback to NULL
2020-06-03 15:34:35 +02:00
MiSimon
beb496e3ed Write to logfile before setting the log callback to NULL 2020-06-03 12:37:43 +02:00
Pete Bone
822435748a Fix compiler waring in lv_ll.c (#1550) 2020-06-02 07:27:36 -04:00
Gabor Kiss-Vamosi
140904e201 fix build error 2020-06-02 11:03:00 +02:00
Gabor Kiss-Vamosi
25b4d9c34d Update README.md 2020-06-02 08:54:58 +02:00
Gabor Kiss-Vamosi
a49e7e8295 improve size rounding to 4 or 8 in lv_mem, and lv_ll 2020-06-02 08:51:22 +02:00
Gabor Kiss-Vamosi
542fa7e76d linked list: simplify settings next/prev node
https://forum.lvgl.io/t/data-abort-at-start-lvgl-v7-0-compiled-with-full-speed-optimisation-only/2286/25
2020-06-02 08:44:04 +02:00
Gabor Kiss-Vamosi
28f4092247 label: fix lv_label_get_letter_on if BIDI enabled 2020-06-02 07:13:41 +02:00
Gabor Kiss-Vamosi
6adcdda06a fix minor warings 2020-06-01 22:56:10 +02:00
Gabor Kiss-Vamosi
d953d2b9fe Update CHANGELOG.md 2020-06-01 22:44:46 +02:00
Gabor Kiss-Vamosi
7040084fbd Merge pull request #1545 from pete-pjb/32bit_idx
Change all text related indices from 16-bit to 32-bit integers throughout whole library.
2020-06-01 22:44:30 +02:00
Gabor Kiss-Vamosi
6921d872a3 remove debig code 2020-06-01 22:31:30 +02:00
Gabor Kiss-Vamosi
1544bd7b07 relase script: fix wontg file name (lv_version.h instead of lvgl.h) 2020-06-01 22:28:59 +02:00
Gabor Kiss-Vamosi
d28ac991ec update version number in lvgl.h 2020-06-01 22:25:28 +02:00
Gabor Kiss-Vamosi
9c90130fb3 Update CHANGELOG.md 2020-06-01 22:23:53 +02:00
Mike Fellows
765a97383a Fix visual studio compile errors in lv_anim code
unary negation operator was being applied to an usigned int in three
places.  I'm not sure what the other compilers are doing to accept
the current code , but I have cast the unsigned ints to a signed one
before applying the unary operator.
2020-06-01 22:23:53 +02:00
Gabor Kiss-Vamosi
5cb287c3c7 Update CHANGELOG.md 2020-06-01 22:23:53 +02:00
Gabor Kiss-Vamosi
32eebbbc0c Update CHANGELOG.md 2020-06-01 22:23:53 +02:00
Gabor Kiss-Vamosi
a535b43290 Release v7.0.1 2020-06-01 22:23:53 +02:00
Gabor Kiss-Vamosi
63b1f6805a lv_ta: fix wrong cursor positon when clicked after the last character 2020-06-01 22:23:53 +02:00
Gabor Kiss-Vamosi
884e00ee8f rename release_patch.py to release.py 2020-06-01 21:12:29 +02:00
Gabor Kiss-Vamosi
f3d8d98807 extend the release script with lv_examples and lv_drivers handling 2020-06-01 21:11:46 +02:00
Gabor Kiss-Vamosi
4d8ae98621 Merge pull request #1542 from MCF/vs-compile-error-fixes
Fix visual studio compile errors in lv_anim code
2020-06-01 21:06:36 +02:00
Gabor Kiss-Vamosi
e8a0413ad5 Update CHANGELOG.md 2020-06-01 20:39:59 +02:00
Gabor Kiss-Vamosi
ff7e8ea315 Update CHANGELOG.md 2020-06-01 20:39:03 +02:00
PeterB
3561d9e063 Changed all text related indices from 16 bit to 32 bit integers. 2020-06-01 17:51:47 +01:00
PeterB
a0583f6feb Merge remote-tracking branch 'origin/master' into 32bit_idx 2020-06-01 12:31:14 +01:00
Themba Dube
0673dd0b12 Change dropdown to use 32-bit indexes 2020-06-01 07:18:31 -04:00
Mike Fellows
09fb1e60e3 Fix visual studio compile errors in lv_anim code
unary negation operator was being applied to an usigned int in three
places.  I'm not sure what the other compilers are doing to accept
the current code , but I have cast the unsigned ints to a signed one
before applying the unary operator.
2020-05-30 13:05:25 -07:00
Gabor Kiss-Vamosi
2be22d3bef list: leaving edit mode with encoder 2020-05-27 11:22:01 +02:00
Gabor Kiss-Vamosi
6a35a384b8 Merge branch 'encoder-buttons' of https://github.com/fhorinek/lvgl into fhorinek-encoder-buttons 2020-05-27 10:35:58 +02:00
František Horínek
691ce77800 Modified version for encoder input proc.
Now you can also pass buttons LEFT/RIGHT to emulate the encoder, good for joysticks or small keypads.
All other keys are passed trought.
2020-05-25 15:51:20 +02:00
Gabor Kiss-Vamosi
7e4e5b7271 Merge branch 'master' of https://github.com/fhorinek/lvgl into fhorinek-master 2020-05-23 14:54:18 +02:00
Gabor Kiss-Vamosi
1666c8cb4f handle focus_parent in pointer indevs 2020-05-23 14:53:23 +02:00
František Horínek
8f19010b17 Update src/lv_core/lv_obj.c
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2020-05-21 17:27:37 +02:00
Gabor Kiss-Vamosi
4fade082e5 Merge branch 'master' of https://github.com/fhorinek/lvgl into fhorinek-master 2020-05-21 15:17:19 +02:00
František Horínek
b23d945ed4 changed behavior to focus_parent flag 2020-05-21 14:09:56 +02:00
František Horínek
10ca6d4215 replaced #ifdef to #if 2020-05-19 15:45:09 +02:00
František Horínek
2712f0aeaa Added macro LV_USE_GROUP_FOCUS_PARENT to automatic tests 2020-05-19 15:31:34 +02:00
František Horínek
aaa78ba949 Added focus parent for v7 2020-05-19 15:22:38 +02:00
131 changed files with 2480 additions and 1521 deletions

View File

@@ -2,9 +2,9 @@ name: C/C++ CI
on: on:
push: push:
branches: [ master ] branches: [ master, dev ]
pull_request: pull_request:
branches: [master ] branches: [master, dev ]
jobs: jobs:
build: build:

17
.github/workflows/merge-to-dev.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: Merge master branch to dev
on:
push:
branches:
- 'master'
jobs:
merge-branch:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Merge to dev branch
uses: devmasx/merge-branch@v1.1.0
with:
type: now
target_branch: 'dev'
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

View File

@@ -1,10 +1,54 @@
# Changelog # Changelog
## v7.0.1 (under development) ## v7.1.0 (planned on 07.07.2020)
*Available in the `master` branch* *Available in the `master` branch*
### New features
- Add `focus_parent` attribute to `lv_obj`
- Allow using buttons in encoder input device
- Add lv_btnmatrix_set/get_align capability
- DMA2D: Remove dependency on ST CubeMX HAL
- Added `max_used` propriety to `lv_mem_monitor_t` struct
- In `lv_init` test if the the strings are UTF-8 encoded.
- Add `user_data` to themes
### Bugfixes
- `lv_img` fix invalidation area when angle or zoom changes
- Update the style handling to support Big endian MCUs
- Change some methods to support big endian hardware.
- Add LV_BIG_ENDIAN_SYSTEM flag to lv_conf.h in order to fix displaying images on big endian systems.
- Fix inserting chars in text area in big endian hardware.
## v7.0.2 (16.06.2020)
### Bugfixes
- `lv_textarea` fix wrong cursor position when clicked after the last character
- Change all text related indices from 16-bit to 32-bit integers throughout whole library. #1545
- Fix gestures
- Do not call `set_px_cb` for transparent pixel
- Fix list button focus in material theme
- Fix crash when the a text area is cleared with the backspace of a keyboard
- Add version number to `lv_conf_template.h`
- Add log in true double buffering mode with `set_px_cb`
- `lv_dropdown`: fix missing `LV_EVENT_VALUE_CHANGED` event when used with encoder
- `lv_tileview`: fix if not the {0;0} tile is created first
- `lv_debug`: restructure to allow asserting in from `lv_misc` too
- add assert if `_lv_mem_buf_get()` fails
- `lv_textarea`: fix character delete in password mode
- Update `LV_OPA_MIN` and `LV_OPA_MAX` to widen the opacity processed range
- `lv_btnm` fix sending events for hidden buttons
- `lv_gaguge` make `lv_gauge_set_angle_offset` offset the labels and needles too
- Fix typo in the API `scrllable` -> `scrollable`
- `tabview` by default allow auto expanding the page only to right and bottom (#1573)
- fix crash when drawing gradient to the same color
- chart: fix memory leak
- `img`: improve hit test for transformed images
## v7.0.1 (01.06.2020)
### Bugfixes ### Bugfixes
- Make the Microptyhon working by adding the required variables as GC_ROOT - Make the Microptyhon working by adding the required variables as GC_ROOT
- Prefix some internal API functions with `_` to reduce the API of LVGL
- Fix built-in SimSun CJK font - Fix built-in SimSun CJK font
- Fix UTF-8 encoding when `LV_USE_ARABIC_PERSIAN_CHARS` is enabled - Fix UTF-8 encoding when `LV_USE_ARABIC_PERSIAN_CHARS` is enabled
- Fix DMA2D usage when 32 bit images directly blended - Fix DMA2D usage when 32 bit images directly blended
@@ -14,8 +58,8 @@
- Improve DMA2D blending - Improve DMA2D blending
- Remove memcpy from `lv_ll` (caused issues with some optimization settings) - Remove memcpy from `lv_ll` (caused issues with some optimization settings)
- `lv_chart` fix X tick drawing - `lv_chart` fix X tick drawing
- fix vertical dashed line drawing - Fix vertical dashed line drawing
- some additonal minor fixes and formattings - Some additonal minor fixes and formattings
## v7.0.0 (18.05.2020) ## v7.0.0 (18.05.2020)

239
README.md
View File

@@ -1,4 +1,4 @@
<h1 align="center"> LVGL - Little and Versatile Graphics Library</h1> <h1 align="center"> LVGL - Light and Versatile Graphics Library</h1>
<p align="center"> <p align="center">
<a href="https://github.com/lvgl/lvgl/blob/master/LICENCE.txt"><img src="https://img.shields.io/badge/licence-MIT-blue.svg"></a> <a href="https://github.com/lvgl/lvgl/blob/master/LICENCE.txt"><img src="https://img.shields.io/badge/licence-MIT-blue.svg"></a>
<a href="https://github.com/lvgl/lvgl/releases/tag/v7.0.0"><img src="https://img.shields.io/badge/version-7.0.0-blue.svg"></a> <a href="https://github.com/lvgl/lvgl/releases/tag/v7.0.0"><img src="https://img.shields.io/badge/version-7.0.0-blue.svg"></a>
@@ -14,42 +14,32 @@ LVGL provides everything you need to create embedded GUI with easy-to-use graphi
<h4 align="center"> <h4 align="center">
<a href="https://lvgl.io">Website </a> &middot; <a href="https://lvgl.io">Website </a> &middot;
<a href="https://lvgl.io/demos">Live demo</a> &middot; <a href="https://lvgl.io/demos">Online demo</a> &middot;
<a href="https://docs.lvgl.io/">Docs</a> &middot; <a href="https://docs.lvgl.io/">Docs</a> &middot;
<a href="https://forum.lvgl.io">Forum</a> &middot; <a href="https://forum.lvgl.io">Forum</a> &middot;
<a href="https://blog.lvgl.io/">Blog</a>
</h4> </h4>
--- ---
- [Features](#features)
- [Supported devices](#supported-devices)
- [Quick start in a simulator](#quick-start-in-a-simulator)
- [Add LVGL to your project](#add-lvgl-to-your-project)
- [Learn the basics](#learn-the-basics)
- [Examples](#examples)
- [Contributing](#contributing)
## Features ## Features
* **Powerful building blocks** buttons, charts, lists, sliders, images, etc. * Powerful building blocks: buttons, charts, lists, sliders, images, etc.
* **Advanced graphics** with animations, anti-aliasing, opacity, smooth scrolling * Advanced graphics: animations, anti-aliasing, opacity, smooth scrolling
* **Simultaneously use various input devices** touchscreen, mouse, keyboard, encoder, buttons, etc. * Simultaneously use various input devices: touchscreen, mouse, keyboard, encoder, buttons, etc.
* **Simultaneously use multiple displays** i.e. monochrome and color display * Simultaneously use multiple displays: e.g. monochrome and color display
* **Multi-language support** with UTF-8 encoding, Bidirectional support, and Arabic text handling * Multi-language support with UTF-8 encoding, Bidirectional support, and Arabic text handling
* **Fully customizable** graphical elements * Fully customizable graphical elements via CSS-like styles
* **Hardware independent** to use with any microcontroller or display * Hardware independent to use with any microcontroller or display
* **Scalable** to operate with little memory (64 kB Flash, 10 kB RAM) * Scalable to operate with little memory (64 kB Flash, 10 kB RAM)
* **OS, External memory and GPU** supported but not required * OS, External memory and GPU are supported but not required
* **Single frame buffer** operation even with advances graphical effects * Single frame buffer operation even with advances graphical effects
* **Written in C** for maximal compatibility (C++ compatible) * Written in C for maximal compatibility (C++ compatible)
* **Micropython Binding** exposes [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings) * Micropython Binding exposes [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings)
* **Simulator** to develop on PC without embedded hardware * Simulator to develop on PC without embedded hardware
* **Tutorials, examples, themes** for rapid development * Tutorials, examples, themes for rapid development
* **Documentation** and API references * Documentation and API references
## Supported devices ## Supported devices
Basically, every modern controller (which is able to drive a display( is suitable to run LVGL. The minimal requirements are: Basically, every modern controller (which is able to drive a display) is suitable to run LVGL. The minimal requirements are:
- 16, 32 or 64 bit microcontroller or processor - 16, 32 or 64 bit microcontroller or processor
- &gt; 16 MHz clock speed is recommended - &gt; 16 MHz clock speed is recommended
- Flash/ROM: &gt; 64 kB for the very essential components (&gt; 180 kB is recommended) - Flash/ROM: &gt; 64 kB for the very essential components (&gt; 180 kB is recommended)
@@ -63,170 +53,34 @@ Basically, every modern controller (which is able to drive a display( is suitab
*Note that the memory usage might vary depending on the architecture, compiler and build options.* *Note that the memory usage might vary depending on the architecture, compiler and build options.*
Just to mention some **platforms**: Just to mention some platforms:
- STM32F1, STM32F3, [STM32F4](https://blog.lvgl.io/2017-07-15/stm32f429_disco_port), [STM32F7](https://github.com/lvgl/lv_port_stm32f746_disco_sw4stm32) - STM32F1, STM32F3, [STM32F4](https://blog.lvgl.io/2017-07-15/stm32f429_disco_port), [STM32F7](https://github.com/lvgl/lv_port_stm32f746_disco_sw4stm32), STM32L4
- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ - Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ
- NXP Kinetis, LPC, iMX - NXP: Kinetis, LPC, iMX, iMX RT
- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb) - [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb)
- [Raspberry PI](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl) - [Raspberry PI](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl)
- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32) - [Espressif ESP32](https://github.com/lvgl/lv_port_esp32)
- Nordic nrf52 - [Infineon aurix](https://github.com/lvgl/lv_port_aurix)
- Nordic NRF52
- Quectell M66 - Quectell M66
## Quick start in a simulator ## Get started
The easiest way to get started with LVGL is to run it in a simulator on your PC without any embedded hardware. his list shows the recommended way of learning the library:
1. Check the [Online demos](https://lvgl.io/demos) to see LVGL in action (3 minutes)
Choose a project with your favourite IDE: 2. Read the [Introduction](https://docs.lvgl.io/latest/en/html/intro/index.html) page of the documentation (5 minutes)
3. Read the [Quick overview](https://docs.lvgl.io/latest/en/html/get-started/quick-overview.html) page of the documentation (15 minutes)
| Eclipse | CodeBlocks | Visual Studio | PlatformIO | Qt Creator | 4. Set up a [Simulator](https://docs.lvgl.io/latest/en/html/get-started/pc-simulator.html) (10 minutes)
|-------------|-------------|---------------|-----------|------------| 5. Try out some [Examples](https://github.com/lvgl/lv_examples/)
| [![Eclipse](https://raw.githubusercontent.com/lvgl/docs/master/v7/misc//eclipse.jpg)](https://github.com/lvgl/lv_sim_eclipse_sdl) | [![CodeBlocks](https://raw.githubusercontent.com/lvgl/docs/master/v7/misc//codeblocks.jpg)](https://github.com/lvgl/lv_sim_codeblocks_win) | [![VisualStudio](https://raw.githubusercontent.com/lvgl/docs/master/v7/misc//visualstudio.jpg)](https://github.com/lvgl/lv_sim_visual_studio_sdl) | [![PlatformIO](https://raw.githubusercontent.com/lvgl/docs/master/v7/misc//platformio.jpg)](https://github.com/lvgl/lv_platformio) | [![QtCreator](https://raw.githubusercontent.com/lvgl/docs/master/v7/misc//qtcreator.jpg)](https://blog.lvgl.io/2019-01-03/qt-creator) | 6. Port LVGL to a board. See the [Porting](https://docs.lvgl.io/latest/en/html/porting/index.html) guide or check the ready to use [Projects](https://github.com/lvgl?q=lv_port_&type=&language=)
| Cross-platform<br>with SDL<br>(Recommended on<br>Linux and Mac) | Native Windows | Windows<br>with SDL | Cross-platform<br>with SDL | Cross-platform<br>with SDL | 7. Read the [Overview](https://docs.lvgl.io/latest/en/html/overview/index.html) page to get a better understanding of the library. (2-3 hours)
8. Check the documentation of the [Widgets](https://docs.lvgl.io/latest/en/html/widgets/index.html) to see their features and usage
9. If you have questions got to the [Forum](http://forum.lvgl.io/)
## Add LVGL to your project 10. Read the [Contributing](https://docs.lvgl.io/latest/en/html/contributing/index.html) guide to see how you can help to improve LVGL (15 minutes)
The steps below show how to setup LVGL on an embedded system with a display and a touchpad.
You can use the [Simulators](https://docs.lvgl.io/v7/en/html/get-started/pc-simulator) to get ready to use projects which can be run on your PC.
1. [Download](https://lvgl.com/developers) or [Clone](https://github.com/lvgl/lvgl) the library
2. Copy the `lvgl` folder into your project
3. Copy `lvgl/lv_conf_template.h` as `lv_conf.h` next to the `lvgl` folder and set at least `LV_HOR_RES_MAX`, `LV_VER_RES_MAX` and `LV_COLOR_DEPTH`. Don't forget to **change the `#if 0` statement near the top of the file to `#if 1`**, otherwise you will get compilation errors.
4. Include `lvgl/lvgl.h` where you need to use LVGL related functions.
5. Call `lv_tick_inc(x)` every `x` milliseconds **in a Timer or Task** (`x` should be between 1 and 10). It is required for the internal timing of LVGL.
6. Call `lv_init()`
7. Create a display buffer for LVGL
```c
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10]; /*Declare a buffer for 10 lines*/
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/
```
8. Implement and register a function which can **copy a pixel array** to an area of your display:
```c
lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/
disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/
lv_disp_drv_register(&disp_drv); /*Finally register the driver*/
void my_disp_flush(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p)
{
int32_t x, y;
for(y = area->y1; y <= area->y2; y++) {
for(x = area->x1; x <= area->x2; x++) {
set_pixel(x, y, *color_p); /* Put a pixel to the display.*/
color_p++;
}
}
lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/
}
```
9. Implement and register a function which can **read an input device**. E.g. for a touch pad:
```c
lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/
indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/
lv_indev_drv_register(&indev_drv); /*Finally register the driver*/
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
{
static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0;
/*Save the state and save the pressed coordinate*/
data->state = touchpad_is_pressed() ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
if(data->state == LV_INDEV_STATE_PR) touchpad_get_xy(&last_x, &last_y);
/*Set the coordinates (if released use the last pressed coordinates)*/
data->point.x = last_x;
data->point.y = last_y;
return false; /*Return `false` because we are not buffering and no more data to read*/
}
```
10. Call `lv_task_handler()` periodically every few milliseconds in the main `while(1)` loop, in Timer interrupt or in an Operation system task.
It will redraw the screen if required, handle input devices etc.
## Learn the basics
In this section you can ready the very basics. For a more detailed guide check the [Quick overview](https://docs.lvgl.io/v7/en/html/get-started/quick-overview.html#learn-the-basics) in the documentation.
### Widgets (Objects)
The graphical elements like Buttons, Labels, Sliders, Charts etc are called objects in LittelvGL. Go to [Object types](https://docs.lvgl.io/v7/en/html/widgets/index) to see the full list of available types.
Every object has a parent object. The child object moves with the parent and if you delete the parent the children will be deleted too. Children can be visible only on their parent.
The *screen* are the "root" parents. To get the current screen call `lv_scr_act()`.
You can create a new object with `lv_<type>_create(parent, obj_to_copy)`. It will return an `lv_obj_t *` variable which should be used as a reference to the object to set its parameters.
The first parameter is the desired *parent*, the second parameters can be an object to copy (`NULL` if unused).
For example:
```c
lv_obj_t * slider1 = lv_slider_create(lv_scr_act(), NULL);
```
To set some basic attribute `lv_obj_set_<paramters_name>(obj, <value>)` function can be used. For example:
```c
lv_obj_set_x(btn1, 30);
lv_obj_set_y(btn1, 10);
lv_obj_set_size(btn1, 200, 50);
```
The objects has type specific parameters too which can be set by `lv_<type>_set_<paramters_name>(obj, <value>)` functions. For example:
```c
lv_slider_set_value(slider1, 70, LV_ANIM_ON);
```
To see the full API visit the documentation of the object types or the related header file (e.g. `lvgl/src/lv_objx/lv_slider.h`).
### Styles
Widgets are created with a default appearance but it can be changed by adding new styles to the object. A new style can be created like this:
```c
static lv_style_t style1; /*Should be static, global or dynamically allocated*/
lv_style_init(&style1);
lv_style_set_bg_color(&style1, LV_STATE_DEFAULT, LV_COLOR_RED); /*Default background color*/
lv_style_set_bg_color(&style1, LV_STATE_PRESSED, LV_COLOR_BLUE); /*Pressed background color*/
```
The wigedt have *parts* which can be referenced via `LV_<TYPE>_PART_<PART_NAME>`. E.g. `LV_BRN_PART_MAIN` or `LV_SLIDER_PART_KNOB`. See the documentation of the widgets to see the exisitng parts.
To add the style to a button:
```
lv_obj_add_style(btn1, LV_BTN_PART_MAIN, &style1);
```
To remove all styles from an object use:
```c
lv_obj_reset_style_list(obj, LV_OBJ_PART_MAIN);
```
Learn more in [Style overview](https://docs.lvgl.io/v7/en/html/overview/style) section.
### Events
Events are used to inform the user if something has happened with an object. You can assign a callback to an object which will be called if the object is clicked, released, dragged, being deleted etc. It should look like this:
```c
lv_obj_set_event_cb(btn, btn_event_cb); /*Assign a callback to the button*/
...
void btn_event_cb(lv_obj_t * btn, lv_event_t event)
{
if(event == LV_EVENT_CLICKED) {
printf("Clicked\n");
}
}
```
Learn more about the events in the [Event overview](https://docs.lvgl.io/v7/en/html/overview/event) section.
## Examples ## Examples
For more examples see the [lv_examples](https://github.com/lvgl/lv_examples) repository.
### Button with label ### Button with label
```c ```c
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); /*Add a button the current screen*/ lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); /*Add a button the current screen*/
@@ -246,9 +100,9 @@ void btn_event_cb(lv_obj_t * btn, lv_event_t event)
} }
} }
``` ```
![LVGL button with label example](https://docs.lvgl.io/v7/en/misc/simple_button_example.gif) ![LVGL button with label example](https://raw.githubusercontent.com/lvgl/docs/latest/misc/simple_button_example.gif)
### Use LVGL from Micropython ### LVGL from Micropython
Learn more about [Micropython](https://docs.lvgl.io/en/html/get-started/micropython). Learn more about [Micropython](https://docs.lvgl.io/en/html/get-started/micropython).
```python ```python
# Create a Button and a Label # Create a Button and a Label
@@ -263,17 +117,4 @@ lv.scr_load(scr)
``` ```
## Contributing ## Contributing
To ask questions please use the [Forum](https://forum.lvgl.io). For a detailed description of contribution opportunities visit the [Contributing](https://docs.lvgl.io/latest/en/html/contributing/index.html) section of the documentation.
For development-related things (bug reports, feature suggestions) use [GitHub's Issue tracker](https://github.com/lvgl/lvgl/issues).
If you are interested in contributing to LVGL you can
- **Help others** in the [Forum](https://forum.lvgl.io).
- **Inspire people** by speaking about your project in [My project](https://forum.lvgl.io/c/my-projects) category in the Forum.
- **Improve and/or translate the documentation.** Go to the [Documentation](https://github.com/lvgl/docs) repository to learn more
- **Write a blog post** about your experiences. See how to do it in the [Blog](https://github.com/lvgl/blog) repository
- **Report and/or fix bugs** in [GitHub's issue tracker](https://github.com/lvgl/lvgl/issues)
- **Help in the developement**. Check the [Open issues](https://github.com/lvgl/lvgl/issues) especially the ones with [Help wanted](https://github.com/lvgl/lvgl/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label and tell your ideas about a topic or implement a feature.
Before sending Pull requests, please read the following guides:
- [Contributing guide](https://github.com/lvgl/lvgl/blob/master/docs/CONTRIBUTING.md)
- [Coding style guide](https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md)

View File

@@ -1,117 +1,5 @@
# Contributing to LVGL # Contributing to LVGL
**Do you have some free time to spend with programming? Thank you for considering contributing to LVGL.
Are you working on an embedded GUI project with LVGL?
See how can you help to improve the graphics library and help others!**
For a detailed description of contribution opportunities, please visit the [Contributing](https://docs.lvgl.io/latest/en/html/contributing/index.html) section of the documentation.
- [Overview](#overview)
- [How to send a pull request?](#how-to-send-a-pull-request)
- [Help others in the Forum](help-others-in-the-forum)
- [Improve or translate the documentation](#improve-or-translate-the-documentation)
- [Write a blog post](#write-a-blog-post)
- [Report or fix bugs](#report-or-fix-bugs)
- [Suggest or implement new features](#suggest-or-implement-new-features)
- [Summary](#summary)
## Overview
There are many ways to join the community. If you have some time to work with us you will surely find something that fits you! You can:
- **Help others** in the [Forum](https://forum.lvgl.io).
- **Inspire people** by speaking about your project in [My project](https://forum.lvgl.io/c/my-projects) category in the Forum.
- **Improve and/or translate the documentation.** Go to the [Documentation](https://github.com/lvgl/docs) repository to learn more
- **Write a blog post** about your experiences. See how to do it in the [Blog](https://github.com/lvgl/blog) repository
- **Report and/or fix bugs** in [GitHub's issue tracker](https://github.com/lvgl/lvgl/issues)
- **Help the development**. Check the [Open issues](https://github.com/lvgl/lvgl/issues) especially the ones with [Help wanted](https://github.com/lvgl/lvgl/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label and tell your ideas about a topic or implement a feature.
We have some simple rules:
- Be kind and friendly.
- Speak about one thing in one issue/topic.
- Give feedback and close the issue or mark the topic as solved if your question is answered.
- Tell what you experience or expect. _"The button is not working"_ is not enough info to get help.
- Use [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) to format your post.
- We use the [Forum](https://forum.lvgl.io/) to ask and answer questions and [GitHub's issue tracker](https://github.com/lvgl/lvgl/issues) for development-related discussion.
- If possible send an absolute minimal code example in order to reproduce the issue
## How to send a pull request?
Merging new code into LVGL, documentation, blog, and examples happens via *Pull requests*. If you are still not familiar with Pull Requests (PR for short) here is a short guide. It's about the `lvgl` repository but it works the same way for other repositories too.
1. **Fork** the [lvgl repository](https://github.com/lvgl/lvgl). To do this click the "Fork" button in the top right corner. It will "copy" the `lvgl` repository to your GitHub account (`https://github.com/your_name?tab=repositories`)
2. **Clone** the forked repository and add your changes
3. **Create a PR** on GitHub from the page of your `lvgl` repository (`https://github.com/your_name/lvgl`) by hitting the "New pull request" button
4. **Set the base branch**. It means where you want to merge your update. Fixes go to `master`, new features to feature branch.
5. **Describe** what is in the update. An example code is welcome if applicable.
6. **Update** your `lvgl` branch with new commits. They will appear in the PR too.
Some advice:
- For non-trivial fixes and features it's better open an issue first to discuss the details.
- Maybe your fix or update won't be perfect at first. Don't be afraid, just improve it and push the new commits. The PR will be updated accordingly.
- If your update needs some extra work it's okay to say: _"I'm busy now and I will improve it soon"_ or _"Sorry, I don't have time to improve it, I hope it helps in this form too"_.
So it's better to say don't have time to continue than saying nothing.
- Please read and follow this [guide about the coding style](https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md)
## Help others in the Forum
It's a great way to contribute to the library if you already use it.
Just go to [https://forum.lvgl.io/](https://forum.lvgl.io/) a register (Google and GitHub login also works).
Log in, read the titles and if you are already familiar with a topic, don't be shy, and write your suggestion.
## Improve or translate the documentation
If you would like to contribute to LVGL the documentation is the best place to start.
### Fix typos, add missing parts
If you find a typo, an obscure sentence or something which is not explained well enough in the [English documentation](https://docs.lvgl.io/en/html/index.html)
click the *"Edit on GitHub"* button in the top right corner and fix the issue by sending a Pull Request.
### Translate the documentation
If you have time and interest you can translate the documentation to your native language or any language you speak well.
You can join others to work on an already existing language or you can start a new one.
To translate the documentation we use [Zanata](https://zanata.org) which is an online translation platform.
You will find the LVGL project here: [LVGL on Zanata](https://translate.zanata.org/iteration/view/littlevgl-docs/v6.0-doc1?dswid=3430)
To get started you need to:
- register at [Zanata](https://zanata.org) which is an online translation platform.
- comment to [this post](https://forum.lvgl.io/t/translate-the-documentation/238?u=kisvegabor)
- tell your username at *Zanata* and your selected language(s) to get permission the edit the translations
Note that a translation will be added to the documentation only if the following parts are translated:
- [Home page](https://docs.lvgl.io/en/v7/)
- [Porting section](https://docs.lvgl.io/en/v7/html/porting/index.html)
- [Quick overview](https://docs.lvgl.io/v7/en/html/get-started/quick-overview.html)
## Write a blog post
Have you ported LVGL to a new platform or created a fancy GUI? Do you know a great trick?
You can share your knowledge on LVGL's blog! It's super easy to add your own post:
- Fork and clone the [blog repository](https://github.com/lvgl/blog)
- Add your post in Markdown to the `_posts` folder.
- Store the images and other resources in a dedicated folder in `assets`
- Create a Pull Request
The blog uses [Jekyll](https://jekyllrb.com/) to convert the `.md` files to a webpage. You can easily [run Jekyll offline](https://jekyllrb.com/docs/) to check your post before creating the Pull request
## Report or fix bugs
For simple bugfixes (typos, missing error handling, fixing a warning) it's fine to send a Pull request directly. However, for more complex bugs it's better to open an issue first. In the issue, you should describe how to reproduce the bug and add the minimal code snippet.
## Suggest or implement new features
If you have a good idea don't hesitate to share with us. It's even better if you have time to deal with its implementation. Don't be afraid if you still don't know LVGL well enough. We will help you to get started.
To share your ideas use [Feature request](https://forum.lvgl.io/c/feature-request/9) category of the forum.
If you are ready to get involved into the development of this faetures feel free to pen a [new issue](https://github.com/lvgl/lvgl/issues) for it on GitHub.
During the implementation don't forget the [Code style guide](https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md).
If you implemented a new feature it's important to record it in the documentation and if applicable create an example for it:
- Go to the [docs](https://github.com/lvgl/docs/tree/master/v7/en) repository and update the relevant part of the English documentation.
- Go to the [examples](https://github.com/lvgl/lv_examples) repository and add a new file about the new feature in the related directory.
## Summary
I hope you have taken a liking to contribute to LVGL. A helpful and friendly community is waiting for you! :)

View File

@@ -0,0 +1,119 @@
#include <lvgl.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(); /* TFT instance */
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];
#if USE_LV_LOG != 0
/* Serial debugging */
void my_print(lv_log_level_t level, const char * file, uint32_t line, const char * dsc)
{
Serial.printf("%s@%d->%s\r\n", file, line, dsc);
Serial.flush();
}
#endif
/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint32_t w = (area->x2 - area->x1 + 1);
uint32_t h = (area->y2 - area->y1 + 1);
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.pushColors(&color_p->full, w * h, true);
tft.endWrite();
lv_disp_flush_ready(disp);
}
/*Read the touchpad*/
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
{
uint16_t touchX, touchY;
bool touched = tft.getTouch(&touchX, &touchY, 600);
if(!touched)
{
data->state = LV_INDEV_STATE_REL;
return false;
}
else
{
data->state = LV_INDEV_STATE_PR;
}
if(touchX>screenWidth || touchY > screenHeight)
{
Serial.println("Y or y outside of expected parameters..");
Serial.print("y:");
Serial.print(touchX);
Serial.print(" x:");
Serial.print(touchY);
}
else
{
/*Set the coordinates*/
data->point.x = touchX;
data->point.y = touchY;
Serial.print("Data x");
Serial.println(touchX);
Serial.print("Data y");
Serial.println(touchY);
}
return false; /*Return `false` because we are not buffering and no more data to read*/
}
void setup()
{
Serial.begin(115200); /* prepare for possible serial debug */
lv_init();
#if USE_LV_LOG != 0
lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif
tft.begin(); /* TFT init */
tft.setRotation(1); /* Landscape orientation */
uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
tft.setTouch(calData);
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);
/*Initialize the display*/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = 320;
disp_drv.ver_res = 240;
disp_drv.flush_cb = my_disp_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);
/*Initialize the (dummy) input device driver*/
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = my_touchpad_read;
lv_indev_drv_register(&indev_drv);
/* Try an example from the lv_examples repository
* https://github.com/lvgl/lv_examples*/
lv_ex_btn_1();
}
void loop()
{
lv_task_handler(); /* let the GUI do its work */
delay(5);
}

View File

@@ -0,0 +1,44 @@
# Example for lv_arduino using a slider
This example has the screen set to 320x480 (ILI9488), change this by altering the following lines in the main ino file:
```C
int screenWidth = 480;
int screenHeight = 320;
```
## Backlight
Change pin 32 to your preferred backlight pin using a PNP transistor (2N3906) or remove the following code and connect directly to +ve:
```C
ledcSetup(10, 5000/*freq*/, 10 /*resolution*/);
ledcAttachPin(32, 10);
analogReadResolution(10);
ledcWrite(10,768);
```
## Theme selection
Change the following to change the theme:
```C
lv_theme_t * th = lv_theme_night_init(210, NULL); //Set a HUE value and a Font for the Night Theme
lv_theme_set_current(th);
```
## Calibration
This is using the bodmer tft_espi driver for touch. To correctly set the calibration load the calibration sketch and replace the following with your values:
```C
uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
```
## Screen rotation
Check the following if you need to alter your screen rotation:
```C
tft.setRotation(3);
```

View File

@@ -0,0 +1,37 @@
# LVGL Arduino examples
LVGL can be installed via Arduino IDE Library Manager or as an .ZIP library.
It will install [lv_exmaples](https://github.com/lvgl/lv_examples) which contains a lot of examples and demos to try LVGL.
## Example
There are simple examples which use the [TFT_eSPI](https://github.com/Bodmer/TFT_eSPI) library as a TFT driver to simplify testing.
To get all this to work you have to setup TFT_eSPI to work with your TFT display type via editing the `User_Setup.h` file in TFT_eSPI library folder, or by selecting your own configurtion in the `User_Setup_Select.h` file in TFT_eSPI library folder.
LVGL library has its own configuration file called `lv_conf.h`. When LVGL is installed to followings needs to be done to configure it:
1. Go to directory of the installed Arduno libraries
2. Go to `lvgl` and copy `lv_conf_template.h` as `lvgl.h` next to the `lvgl` folder.
3. Open `lv_conf.h` and change the first `#if 0` to `#if 1`
4. Set the resolution of your display in `LV_HOR_RES_MAX` and `LV_VER_RES_MAX`
5. Set the color depth of you display in `LV_COLOR_DEPTH`
6. Set `LV_TICK_CUSTOM 1`
## Debugging
In case of trouble there are debug informations inside LVGL. In the `ESP32_TFT_eSPI` example there is `my_print` method, which allow to send this debug informations to the serial interface. To enable this feature you have to edit `lv_conf.h` file and enable logging in section `log settings`:
```c
/*Log settings*/
#define USE_LV_LOG 1 /*Enable/disable the log module*/
#if LV_USE_LOG
/* How important log should be added:
* LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
* LV_LOG_LEVEL_INFO Log important events
* LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
* LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
* LV_LOG_LEVEL_NONE Do not log anything
*/
# define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
```
After enabling log module and setting LV_LOG_LEVEL accordingly the output log is sent to the `Serial` port @ 115200 Bd.

View File

@@ -1,6 +1,6 @@
{ {
"name": "lvgl", "name": "lvgl",
"version": "v7.0.1", "version": "v7.1.0",
"keywords": "graphics, gui, embedded, littlevgl", "keywords": "graphics, gui, embedded, littlevgl",
"description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.",
"repository": "repository":

View File

@@ -1,6 +1,6 @@
/** /**
* @file lv_conf.h * @file lv_conf.h
* * Configuration file for LVGL v7.1.0
*/ */
/* /*
@@ -178,6 +178,9 @@ typedef void * lv_group_user_data_t;
/* 1: Enable GPU interface*/ /* 1: Enable GPU interface*/
#define LV_USE_GPU 1 /*Only enables `gpu_fill_cb` and `gpu_blend_cb` in the disp. drv- */ #define LV_USE_GPU 1 /*Only enables `gpu_fill_cb` and `gpu_blend_cb` in the disp. drv- */
#define LV_USE_GPU_STM32_DMA2D 0 #define LV_USE_GPU_STM32_DMA2D 0
/*If enabling LV_USE_GPU_STM32_DMA2D, LV_GPU_DMA2D_CMSIS_INCLUDE must be defined to include path of CMSIS header of target processor
e.g. "stm32f769xx.h" or "stm32f429xx.h" */
#define LV_GPU_DMA2D_CMSIS_INCLUDE
/* 1: Enable file system (might be required for images */ /* 1: Enable file system (might be required for images */
#define LV_USE_FILESYSTEM 1 #define LV_USE_FILESYSTEM 1
@@ -219,6 +222,10 @@ typedef void * lv_img_decoder_user_data_t;
/*===================== /*=====================
* Compiler settings * Compiler settings
*====================*/ *====================*/
/* For big endian systems set to 1 */
#define LV_BIG_ENDIAN_SYSTEM 0
/* Define a custom attribute to `lv_tick_inc` function */ /* Define a custom attribute to `lv_tick_inc` function */
#define LV_ATTRIBUTE_TICK_INC #define LV_ATTRIBUTE_TICK_INC
@@ -249,6 +256,10 @@ typedef void * lv_img_decoder_user_data_t;
*/ */
#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning
/* Prefix variables that are used in GPU accelerated operations, often these need to be
* placed in RAM sections that are DMA accessible */
#define LV_ATTRIBUTE_DMA
/*=================== /*===================
* HAL settings * HAL settings
*==================*/ *==================*/
@@ -257,8 +268,8 @@ typedef void * lv_img_decoder_user_data_t;
* It removes the need to manually update the tick with `lv_tick_inc`) */ * It removes the need to manually update the tick with `lv_tick_inc`) */
#define LV_TICK_CUSTOM 0 #define LV_TICK_CUSTOM 0
#if LV_TICK_CUSTOM == 1 #if LV_TICK_CUSTOM == 1
#define LV_TICK_CUSTOM_INCLUDE "something.h" /*Header for the sys time function*/ #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current systime in ms*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
#endif /*LV_TICK_CUSTOM*/ #endif /*LV_TICK_CUSTOM*/
typedef void * lv_disp_drv_user_data_t; /*Type of user data in the display driver*/ typedef void * lv_disp_drv_user_data_t; /*Type of user data in the display driver*/
@@ -330,7 +341,7 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in the i
/* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel. /* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel.
* The symbols are available via `LV_SYMBOL_...` defines * The symbols are available via `LV_SYMBOL_...` defines
* More info about fonts: https://docs.lvgl.com/#Fonts * More info about fonts: https://docs.lvgl.io/v7/en/html/overview/font.html
* To create a new font go to: https://lvgl.com/ttf-font-to-c-array * To create a new font go to: https://lvgl.com/ttf-font-to-c-array
*/ */
@@ -417,8 +428,8 @@ typedef void * lv_font_user_data_t;
#define LV_THEME_DEFAULT_INCLUDE <stdint.h> /*Include a header for the init. function*/ #define LV_THEME_DEFAULT_INCLUDE <stdint.h> /*Include a header for the init. function*/
#define LV_THEME_DEFAULT_INIT lv_theme_material_init #define LV_THEME_DEFAULT_INIT lv_theme_material_init
#define LV_THEME_DEFAULT_COLOR_PRIMARY LV_COLOR_RED #define LV_THEME_DEFAULT_COLOR_PRIMARY lv_color_hex(0x01a2b1)
#define LV_THEME_DEFAULT_COLOR_SECONDARY LV_COLOR_BLUE #define LV_THEME_DEFAULT_COLOR_SECONDARY lv_color_hex(0x44d1b6)
#define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_LIGHT #define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_LIGHT
#define LV_THEME_DEFAULT_FONT_SMALL &lv_font_montserrat_16 #define LV_THEME_DEFAULT_FONT_SMALL &lv_font_montserrat_16
#define LV_THEME_DEFAULT_FONT_NORMAL &lv_font_montserrat_16 #define LV_THEME_DEFAULT_FONT_NORMAL &lv_font_montserrat_16
@@ -498,7 +509,7 @@ typedef void * lv_obj_user_data_t;
#endif #endif
#endif #endif
/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ /*1: enable `lv_obj_realign()` based on `lv_obj_align()` parameters*/
#define LV_USE_OBJ_REALIGN 1 #define LV_USE_OBJ_REALIGN 1
/* Enable to make the object clickable on a larger area. /* Enable to make the object clickable on a larger area.

6
lvgl.h
View File

@@ -77,9 +77,9 @@ extern "C" {
*********************/ *********************/
/*Current version of LVGL*/ /*Current version of LVGL*/
#define LVGL_VERSION_MAJOR 7 #define LVGL_VERSION_MAJOR 7
#define LVGL_VERSION_MINOR 0 #define LVGL_VERSION_MINOR 1
#define LVGL_VERSION_PATCH 1 #define LVGL_VERSION_PATCH 0
#define LVGL_VERSION_INFO "dev" #define LVGL_VERSION_INFO ""
/********************** /**********************
* TYPEDEFS * TYPEDEFS

View File

@@ -1,12 +1,17 @@
#!/usr/bin/env python3.6 #!/usr/bin/env python3
''' '''
Generates a checker file for lv_conf.h from lv_conf_templ.h define all the not defined values Generates a checker file for lv_conf.h from lv_conf_templ.h define all the not defined values
''' '''
import sys
import re import re
if sys.version_info < (3,6,0):
print("Python >=3.6 is required", file=sys.stderr)
exit(1)
fin = open("../lv_conf_template.h", "r") fin = open("../lv_conf_template.h", "r")
fout = open("../src/lv_conf_internal.h", "w") fout = open("../src/lv_conf_internal.h", "w")

View File

@@ -11,18 +11,10 @@ def title(t):
def cmd(c): def cmd(c):
print("\n" + c) print("\n" + c)
os.system(c) r = os.system(c)
if r:
print("Exit due to previous error")
def increment(s): exit(r)
""" look for the last sequence of number(s) in a string and increment """
m = lastNum.search(s)
if m:
next = str(int(m.group(1))+1)
start, end = m.span(1)
s = s[:max(end-len(next), start)] + next + s[end:]
return s, str(next)
def lvgl_clone(): def lvgl_clone():
title("lvgl: Clone") title("lvgl: Clone")
@@ -30,10 +22,17 @@ def lvgl_clone():
os.chdir("./lvgl") os.chdir("./lvgl")
cmd("git co master") cmd("git co master")
def lvgl_format():
title("lvgl: Run code formatter")
os.chdir("./scripts")
cmd("./code-format.sh")
cmd("git ci -am 'Run code formatter'")
os.chdir("..")
def lvgl_update_version(): def lvgl_update_version():
title("lvgl: Update version number") title("lvgl: Update version number")
f = open("./src/lv_version.h", "r") f = open("./lvgl.h", "r")
outbuf = "" outbuf = ""
major_ver = -1 major_ver = -1
@@ -65,7 +64,7 @@ def lvgl_update_version():
f.close() f.close()
f = open("./src/lv_version.h", "w") f = open("./lvgl.h", "w")
f.write(outbuf) f.write(outbuf)
f.close() f.close()
@@ -97,6 +96,11 @@ def lvgl_update_library_json(v):
f.write(outbuf) f.write(outbuf)
f.close() f.close()
def lvgl_update_lv_conf_templ(ver_str):
title("lvgl: Update version number in lv_conf_template.h")
cmd("sed -i -r 's/v[0-9]+\.[0-9]+\.[0-9]+/"+ ver_str +"/' lv_conf_template.h ")
def lvgl_commit_push(v): def lvgl_commit_push(v):
title("lvgl: commit and push release") title("lvgl: commit and push release")
@@ -104,6 +108,15 @@ def lvgl_commit_push(v):
cmd('git tag -a ' + v + ' -m "Release ' + v +'"') cmd('git tag -a ' + v + ' -m "Release ' + v +'"')
cmd('git push origin master') cmd('git push origin master')
cmd('git push origin ' + v) cmd('git push origin ' + v)
def lvgl_merge_to_release_branch(v):
title("lvgl: merge to release branch")
cmd('git co release/v7')
cmd('git merge master')
cmd('git push origin release/v7')
os.chdir("../")
def lvgl_update_api_docs(): def lvgl_update_api_docs():
title("lvgl: Update API with Doxygen") title("lvgl: Update API with Doxygen")
@@ -111,19 +124,63 @@ def lvgl_update_api_docs():
cmd("cd scripts; doxygen"); cmd("cd scripts; doxygen");
def examples_clone():
title("examples: Clone")
cmd("git clone https://github.com/lvgl/lv_examples.git")
os.chdir("./lv_examples")
cmd("git co master")
def examples_commit_push(v):
title("examples: commit and push release")
cmd('git ci -am "Release ' + v + '"')
cmd('git tag -a ' + v + ' -m "Release ' + v +'"')
cmd('git push origin master')
cmd('git push origin ' + v)
def examples_merge_to_release_branch(v):
title("examples: merge to release branch")
cmd('git co release/v7')
cmd('git merge master')
cmd('git push origin release/v7')
os.chdir("../")
def drivers_clone():
title("drivers: Clone")
cmd("git clone https://github.com/lvgl/lv_drivers.git")
os.chdir("./lv_drivers")
cmd("git co master")
def drivers_commit_push(v):
title("drivers: commit and push release")
cmd('git ci -am "Release ' + v + '"')
cmd('git tag -a ' + v + ' -m "Release ' + v +'"')
cmd('git push origin master')
cmd('git push origin ' + v)
def drivers_merge_to_release_branch(v):
title("drivers: merge to release branch")
cmd('git co release/v7')
cmd('git merge master')
cmd('git push origin release/v7')
os.chdir("../")
def docs_clone(): def docs_clone():
title("docs: Clone") title("docs: Clone")
os.chdir("../")
cmd("git clone --recursive https://github.com/lvgl/docs.git") cmd("git clone --recursive https://github.com/lvgl/docs.git")
os.chdir("./docs/v7") os.chdir("./docs")
cmd("git co master")
def docs_get_api(): def docs_get_api():
title("docs: Get API files") title("docs: Get API files")
cmd("git co latest")
cmd("rm -rf xml"); cmd("rm -rf xml");
cmd("cp -r ../lvgl/docs/api_doc/xml ."); cmd("cp -r ../../lvgl/docs/api_doc/xml .");
cmd("git add xml");
cmd('git commit -m "update API"')
def docs_update_version(v): def docs_update_version(v):
title("docs: Update version number") title("docs: Update version number")
@@ -149,6 +206,8 @@ def docs_update_version(v):
f.write(outbuf) f.write(outbuf)
f.close() f.close()
cmd("git add conf.py")
cmd('git ci -m "update conf.py to ' + v '"')
def docs_update_trans(): def docs_update_trans():
title("docs: Update translations") title("docs: Update translations")
@@ -156,34 +215,35 @@ def docs_update_trans():
def docs_build(): def docs_build():
title("docs: Build") title("docs: Build")
cmd("./build.py clean") cmd("git checkout master")
cmd("./update.py latest")
def docs_commit_push(v):
title("docs: Commit release")
cmd('git add .')
cmd('git ci -am "Release ' + v + '"')
cmd('git tag -a ' + v + ' -m "Release ' + v +'"')
cmd('git push origin master')
cmd('git push origin ' + v)
def clean_up(): def clean_up():
title("Clean up repos") title("Clean up repos")
os.chdir("..") os.chdir("../..")
cmd("rm -rf lvgl docs") cmd("rm -rf lvgl docs lv_examples lv_drivers")
lvgl_clone() lvgl_clone()
lvgl_format()
lvgl_update_api_docs() lvgl_update_api_docs()
ver_str = lvgl_update_version() ver_str = lvgl_update_version()
lvgl_update_library_json(ver_str) lvgl_update_library_json(ver_str)
lvgl_update_lv_conf_templ(ver_str)
lvgl_commit_push(ver_str) lvgl_commit_push(ver_str)
lvgl_merge_to_release_branch(ver_str)
examples_clone()
examples_commit_push(ver_str)
examples_merge_to_release_branch(ver_str)
drivers_clone()
drivers_commit_push(ver_str)
drivers_merge_to_release_branch(ver_str)
docs_clone() docs_clone()
docs_get_api() docs_get_api()
docs_update_version(ver_str) docs_update_version(ver_str)
#docs_update_trans() # Zanata is not working now #docs_update_trans() # Zanata is not working now
docs_build() docs_build()
docs_commit_push(ver_str)
clean_up() clean_up()

View File

@@ -153,7 +153,7 @@ static inline void lv_roller_set_fix_width(lv_obj_t * roller, lv_coord_t w)
#define lv_scrlbar_mode_t lv_scrollbar_mode_t #define lv_scrlbar_mode_t lv_scrollbar_mode_t
#define LV_SCRLBAR_MODE_OFF LV_SCROLLBAR_MODE_OFF #define LV_SCRLBAR_MODE_OFF LV_SCROLLBAR_MODE_OFF
#define LV_SCRLBAR_MODE_ON LV_SCRILLBAR_MODE_ON #define LV_SCRLBAR_MODE_ON LV_SCROLLBAR_MODE_ON
#define LV_SCRLBAR_MODE_DRAG LV_SCROLLBAR_MODE_DRAG #define LV_SCRLBAR_MODE_DRAG LV_SCROLLBAR_MODE_DRAG
#define LV_SCRLBAR_MODE_AUTO LV_SCROLLBAR_MODE_AUTO #define LV_SCRLBAR_MODE_AUTO LV_SCROLLBAR_MODE_AUTO
#define LV_SCRLBAR_MODE_HIDE LV_SCROLLBAR_MODE_HIDE #define LV_SCRLBAR_MODE_HIDE LV_SCROLLBAR_MODE_HIDE
@@ -172,10 +172,19 @@ static inline lv_scrollbar_mode_t lv_page_get_scrlbar_mode(lv_obj_t * page)
static inline lv_obj_t * lv_page_get_scrl(lv_obj_t * page) static inline lv_obj_t * lv_page_get_scrl(lv_obj_t * page)
{ {
return lv_page_get_scrllable(page); return lv_page_get_scrollable(page);
} }
#endif #endif
#if LV_USE_WIN
static inline lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * img_src)
{
return lv_win_add_btn_right(win, img_src);
}
#endif
#endif /*LV_USE_API_EXTENSION_V6*/ #endif /*LV_USE_API_EXTENSION_V6*/
/********************** /**********************

View File

@@ -266,6 +266,11 @@
#ifndef LV_USE_GPU_STM32_DMA2D #ifndef LV_USE_GPU_STM32_DMA2D
#define LV_USE_GPU_STM32_DMA2D 0 #define LV_USE_GPU_STM32_DMA2D 0
#endif #endif
/*If enabling LV_USE_GPU_STM32_DMA2D, LV_GPU_DMA2D_CMSIS_INCLUDE must be defined to include path of CMSIS header of target processor
e.g. "stm32f769xx.h" or "stm32f429xx.h" */
#ifndef LV_GPU_DMA2D_CMSIS_INCLUDE
#define LV_GPU_DMA2D_CMSIS_INCLUDE
#endif
/* 1: Enable file system (might be required for images */ /* 1: Enable file system (might be required for images */
#ifndef LV_USE_FILESYSTEM #ifndef LV_USE_FILESYSTEM
@@ -319,6 +324,12 @@
/*===================== /*=====================
* Compiler settings * Compiler settings
*====================*/ *====================*/
/* For big endian systems set to 1 */
#ifndef LV_BIG_ENDIAN_SYSTEM
#define LV_BIG_ENDIAN_SYSTEM 0
#endif
/* Define a custom attribute to `lv_tick_inc` function */ /* Define a custom attribute to `lv_tick_inc` function */
#ifndef LV_ATTRIBUTE_TICK_INC #ifndef LV_ATTRIBUTE_TICK_INC
#define LV_ATTRIBUTE_TICK_INC #define LV_ATTRIBUTE_TICK_INC
@@ -363,6 +374,12 @@
#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning
#endif #endif
/* Prefix variables that are used in GPU accelerated operations, often these need to be
* placed in RAM sections that are DMA accessible */
#ifndef LV_ATTRIBUTE_DMA
#define LV_ATTRIBUTE_DMA
#endif
/*=================== /*===================
* HAL settings * HAL settings
*==================*/ *==================*/
@@ -374,10 +391,10 @@
#endif #endif
#if LV_TICK_CUSTOM == 1 #if LV_TICK_CUSTOM == 1
#ifndef LV_TICK_CUSTOM_INCLUDE #ifndef LV_TICK_CUSTOM_INCLUDE
#define LV_TICK_CUSTOM_INCLUDE "something.h" /*Header for the sys time function*/ #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
#endif #endif
#ifndef LV_TICK_CUSTOM_SYS_TIME_EXPR #ifndef LV_TICK_CUSTOM_SYS_TIME_EXPR
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current systime in ms*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
#endif #endif
#endif /*LV_TICK_CUSTOM*/ #endif /*LV_TICK_CUSTOM*/
@@ -468,7 +485,7 @@
/* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel. /* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel.
* The symbols are available via `LV_SYMBOL_...` defines * The symbols are available via `LV_SYMBOL_...` defines
* More info about fonts: https://docs.lvgl.com/#Fonts * More info about fonts: https://docs.lvgl.io/v7/en/html/overview/font.html
* To create a new font go to: https://lvgl.com/ttf-font-to-c-array * To create a new font go to: https://lvgl.com/ttf-font-to-c-array
*/ */
@@ -621,10 +638,10 @@
#define LV_THEME_DEFAULT_INIT lv_theme_material_init #define LV_THEME_DEFAULT_INIT lv_theme_material_init
#endif #endif
#ifndef LV_THEME_DEFAULT_COLOR_PRIMARY #ifndef LV_THEME_DEFAULT_COLOR_PRIMARY
#define LV_THEME_DEFAULT_COLOR_PRIMARY LV_COLOR_RED #define LV_THEME_DEFAULT_COLOR_PRIMARY lv_color_hex(0x01a2b1)
#endif #endif
#ifndef LV_THEME_DEFAULT_COLOR_SECONDARY #ifndef LV_THEME_DEFAULT_COLOR_SECONDARY
#define LV_THEME_DEFAULT_COLOR_SECONDARY LV_COLOR_BLUE #define LV_THEME_DEFAULT_COLOR_SECONDARY lv_color_hex(0x44d1b6)
#endif #endif
#ifndef LV_THEME_DEFAULT_FLAG #ifndef LV_THEME_DEFAULT_FLAG
#define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_LIGHT #define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_LIGHT
@@ -748,7 +765,7 @@
#endif #endif
#endif #endif
/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ /*1: enable `lv_obj_realign()` based on `lv_obj_align()` parameters*/
#ifndef LV_USE_OBJ_REALIGN #ifndef LV_USE_OBJ_REALIGN
#define LV_USE_OBJ_REALIGN 1 #define LV_USE_OBJ_REALIGN 1
#endif #endif

View File

@@ -4,7 +4,6 @@ CSRCS += lv_disp.c
CSRCS += lv_obj.c CSRCS += lv_obj.c
CSRCS += lv_refr.c CSRCS += lv_refr.c
CSRCS += lv_style.c CSRCS += lv_style.c
CSRCS += lv_debug.c
DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_core DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_core
VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_core VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_core

View File

@@ -9,7 +9,7 @@
#include "lv_group.h" #include "lv_group.h"
#if LV_USE_GROUP != 0 #if LV_USE_GROUP != 0
#include <stddef.h> #include <stddef.h>
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_misc/lv_gc.h" #include "../lv_misc/lv_gc.h"
@@ -242,7 +242,7 @@ void lv_group_focus_obj(lv_obj_t * obj)
if(res != LV_RES_OK) return; if(res != LV_RES_OK) return;
lv_obj_invalidate(*g->obj_focus); lv_obj_invalidate(*g->obj_focus);
/*If the object or its parent has `top == true` bring it to the foregorund*/ /*If the object or its parent has `top == true` bring it to the foreground*/
obj_to_foreground(*g->obj_focus); obj_to_foreground(*g->obj_focus);
} }
break; break;
@@ -508,7 +508,7 @@ static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *)
lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, NULL); lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, NULL);
if(res != LV_RES_OK) return; if(res != LV_RES_OK) return;
/*If the object or its parent has `top == true` bring it to the foregorund*/ /*If the object or its parent has `top == true` bring it to the foreground*/
obj_to_foreground(*group->obj_focus); obj_to_foreground(*group->obj_focus);
lv_obj_invalidate(*group->obj_focus); lv_obj_invalidate(*group->obj_focus);

View File

@@ -155,7 +155,7 @@ lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c);
void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb);
/** /**
* Set whether the next or previous item in a group is focused if the currently focussed obj is * Set whether the next or previous item in a group is focused if the currently focused obj is
* deleted. * deleted.
* @param group pointer to a group * @param group pointer to a group
* @param new refocus policy enum * @param new refocus policy enum

View File

@@ -607,8 +607,163 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
indev_obj_act = lv_group_get_focused(g); indev_obj_act = lv_group_get_focused(g);
if(indev_obj_act == NULL) return; if(indev_obj_act == NULL) return;
/*Process the steps first. They are valid only with released button*/ /*Process the steps they are valid only with released button*/
if(data->state == LV_INDEV_STATE_REL) { if(data->state != LV_INDEV_STATE_REL) {
data->enc_diff = 0;
}
/*Refresh the focused object. It might change due to lv_group_focus_prev/next*/
indev_obj_act = lv_group_get_focused(g);
if(indev_obj_act == NULL) return;
/*Button press happened*/
if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_REL) {
i->proc.pr_timestamp = lv_tick_get();
if(data->key == LV_KEY_ENTER) {
bool editable = false;
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable);
if(lv_group_get_editing(g) == true || editable == false) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL);
if(indev_reset_check(&i->proc)) return;
}
}
else if(data->key == LV_KEY_LEFT) {
/*emulate encoder left*/
data->enc_diff--;
}
else if(data->key == LV_KEY_RIGHT) {
/*emulate encoder right*/
data->enc_diff++;
}
else if(data->key == LV_KEY_ESC) {
/*Send the ESC as a normal KEY*/
lv_group_send_data(g, LV_KEY_ESC);
lv_event_send(indev_obj_act, LV_EVENT_CANCEL, NULL);
if(indev_reset_check(&i->proc)) return;
}
/*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/
else {
lv_group_send_data(g, data->key);
}
}
/*Pressing*/
else if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_PR) {
/* Long press*/
if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver.long_press_time) {
i->proc.long_pr_sent = 1;
i->proc.longpr_rep_timestamp = lv_tick_get();
if(data->key == LV_KEY_ENTER) {
bool editable = false;
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable);
/*On enter long press toggle edit mode.*/
if(editable) {
/*Don't leave edit mode if there is only one object (nowhere to navigate)*/
if(_lv_ll_is_empty(&g->obj_ll) == false) {
lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/
}
}
/*If not editable then just send a long press signal*/
else {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL);
if(indev_reset_check(&i->proc)) return;
}
}
i->proc.long_pr_sent = 1;
}
/*Long press repeated time has elapsed?*/
else if(i->proc.long_pr_sent != 0 && lv_tick_elaps(i->proc.longpr_rep_timestamp) > i->driver.long_press_rep_time) {
i->proc.longpr_rep_timestamp = lv_tick_get();
if(data->key == LV_KEY_ENTER) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS_REP, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, NULL);
if(indev_reset_check(&i->proc)) return;
}
else if(data->key == LV_KEY_LEFT) {
/*emulate encoder left*/
data->enc_diff--;
}
else if(data->key == LV_KEY_RIGHT) {
/*emulate encoder right*/
data->enc_diff++;
}
else {
lv_group_send_data(g, data->key);
if(indev_reset_check(&i->proc)) return;
}
}
}
/*Release happened*/
else if(data->state == LV_INDEV_STATE_REL && last_state == LV_INDEV_STATE_PR) {
if(data->key == LV_KEY_ENTER) {
bool editable = false;
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable);
/*The button was released on a non-editable object. Just send enter*/
if(editable == false) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
if(i->proc.long_pr_sent == 0) lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
}
/*An object is being edited and the button is released. */
else if(g->editing) {
/*Ignore long pressed enter release because it comes from mode switch*/
if(!i->proc.long_pr_sent || _lv_ll_is_empty(&g->obj_ll)) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_group_send_data(g, LV_KEY_ENTER);
}
}
/*If the focused object is editable and now in navigate mode then on enter switch edit
mode*/
else if(editable && !g->editing && !i->proc.long_pr_sent) {
lv_group_set_editing(g, true); /*Set edit mode*/
}
}
i->proc.pr_timestamp = 0;
i->proc.long_pr_sent = 0;
}
indev_obj_act = NULL;
/*if encoder steps or simulated steps via left/right keys*/
if(data->enc_diff != 0) {
/*In edit mode send LEFT/RIGHT keys*/ /*In edit mode send LEFT/RIGHT keys*/
if(lv_group_get_editing(g)) { if(lv_group_get_editing(g)) {
int32_t s; int32_t s;
@@ -631,96 +786,6 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
} }
} }
/*Refresh the focused object. It might change due to lv_group_focus_prev/next*/
indev_obj_act = lv_group_get_focused(g);
if(indev_obj_act == NULL) return;
/*Button press happened*/
if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_REL) {
bool editable = false;
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable);
i->proc.pr_timestamp = lv_tick_get();
if(lv_group_get_editing(g) == true || editable == false) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL);
if(indev_reset_check(&i->proc)) return;
}
}
/*Pressing*/
else if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_PR) {
if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver.long_press_time) {
bool editable = false;
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable);
/*On enter long press toggle edit mode.*/
if(editable) {
/*Don't leave edit mode if there is only one object (nowhere to navigate)*/
if(_lv_ll_is_empty(&g->obj_ll) == false) {
lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/
}
}
/*If not editable then just send a long press signal*/
else {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL);
if(indev_reset_check(&i->proc)) return;
}
i->proc.long_pr_sent = 1;
}
}
/*Release happened*/
else if(data->state == LV_INDEV_STATE_REL && last_state == LV_INDEV_STATE_PR) {
bool editable = false;
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable);
/*The button was released on a non-editable object. Just send enter*/
if(editable == false) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
if(i->proc.long_pr_sent == 0) lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
}
/*An object is being edited and the button is released. */
else if(g->editing) {
/*Ignore long pressed enter release because it comes from mode switch*/
if(!i->proc.long_pr_sent || _lv_ll_is_empty(&g->obj_ll)) {
indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL);
if(indev_reset_check(&i->proc)) return;
lv_group_send_data(g, LV_KEY_ENTER);
}
}
/*If the focused object is editable and now in navigate mode then on enter switch edit
mode*/
else if(editable && !g->editing && !i->proc.long_pr_sent) {
lv_group_set_editing(g, true); /*Set edit mode*/
}
i->proc.pr_timestamp = 0;
i->proc.long_pr_sent = 0;
}
indev_obj_act = NULL;
#else #else
(void)data; /*Unused*/ (void)data; /*Unused*/
(void)i; /*Unused*/ (void)i; /*Unused*/
@@ -791,7 +856,7 @@ static void indev_proc_press(lv_indev_proc_t * proc)
&proc->types.pointer.act_point); &proc->types.pointer.act_point);
new_obj_searched = true; new_obj_searched = true;
} }
/*If a dragable or a protected object was the last then keep it*/ /*If a draggable or a protected object was the last then keep it*/
else { else {
} }
@@ -1049,7 +1114,7 @@ static void indev_proc_reset_query_handler(lv_indev_t * indev)
/** /**
* Search the most top, clickable object by a point * Search the most top, clickable object by a point
* @param obj pointer to a start object, typically the screen * @param obj pointer to a start object, typically the screen
* @param point pointer to a point for searhing the most top child * @param point pointer to a point for searching the most top child
* @return pointer to the found object or NULL if there was no suitable object * @return pointer to the found object or NULL if there was no suitable object
*/ */
lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point)
@@ -1086,14 +1151,15 @@ lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point)
} }
/** /**
* Handle focus/defocus on click for POINTER inpt devices * Handle focus/defocus on click for POINTER input devices
* @param proc pointer to the state of the indev * @param proc pointer to the state of the indev
*/ */
static void indev_click_focus(lv_indev_proc_t * proc) static void indev_click_focus(lv_indev_proc_t * proc)
{ {
/*Handle click focus*/ /*Handle click focus*/
lv_obj_t * obj_to_focus = lv_obj_get_focused_obj(indev_obj_act);
if(lv_obj_is_protected(indev_obj_act, LV_PROTECT_CLICK_FOCUS) == false && if(lv_obj_is_protected(indev_obj_act, LV_PROTECT_CLICK_FOCUS) == false &&
proc->types.pointer.last_pressed != indev_obj_act) { proc->types.pointer.last_pressed != obj_to_focus) {
#if LV_USE_GROUP #if LV_USE_GROUP
lv_group_t * g_act = lv_obj_get_group(indev_obj_act); lv_group_t * g_act = lv_obj_get_group(indev_obj_act);
lv_group_t * g_prev = proc->types.pointer.last_pressed ? lv_obj_get_group(proc->types.pointer.last_pressed) : NULL; lv_group_t * g_prev = proc->types.pointer.last_pressed ? lv_obj_get_group(proc->types.pointer.last_pressed) : NULL;
@@ -1122,11 +1188,6 @@ static void indev_click_focus(lv_indev_proc_t * proc)
} }
/*The object are not in the same group (in different group or one in not a group)*/ /*The object are not in the same group (in different group or one in not a group)*/
else { else {
/*Focus to the act. its group*/
if(g_act) {
lv_group_focus_obj(indev_obj_act);
if(indev_reset_check(proc)) return;
}
/*If the prev. obj. is not in a group then defocus it.*/ /*If the prev. obj. is not in a group then defocus it.*/
if(g_prev == NULL && proc->types.pointer.last_pressed) { if(g_prev == NULL && proc->types.pointer.last_pressed) {
lv_signal_send(proc->types.pointer.last_pressed, LV_SIGNAL_DEFOCUS, NULL); lv_signal_send(proc->types.pointer.last_pressed, LV_SIGNAL_DEFOCUS, NULL);
@@ -1152,7 +1213,14 @@ static void indev_click_focus(lv_indev_proc_t * proc)
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
} }
} }
}
/*Focus to the act. in its group*/
if(g_act) {
lv_group_focus_obj(indev_obj_act);
if(indev_reset_check(proc)) return;
}
else {
lv_signal_send(indev_obj_act, LV_SIGNAL_FOCUS, NULL); lv_signal_send(indev_obj_act, LV_SIGNAL_FOCUS, NULL);
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
lv_event_send(indev_obj_act, LV_EVENT_FOCUSED, NULL); lv_event_send(indev_obj_act, LV_EVENT_FOCUSED, NULL);
@@ -1172,7 +1240,7 @@ static void indev_click_focus(lv_indev_proc_t * proc)
lv_event_send(indev_obj_act, LV_EVENT_FOCUSED, NULL); lv_event_send(indev_obj_act, LV_EVENT_FOCUSED, NULL);
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
#endif #endif
proc->types.pointer.last_pressed = indev_obj_act; proc->types.pointer.last_pressed = obj_to_focus;
} }
} }
@@ -1399,7 +1467,7 @@ static void indev_drag_throw(lv_indev_proc_t * proc)
/** /**
* Get the really dragged object by taking `drag_parent` into account. * Get the really dragged object by taking `drag_parent` into account.
* @param obj the start obejct * @param obj the start object
* @return the object to really drag * @return the object to really drag
*/ */
static lv_obj_t * get_dragged_obj(lv_obj_t * obj) static lv_obj_t * get_dragged_obj(lv_obj_t * obj)
@@ -1426,13 +1494,14 @@ static void indev_gesture(lv_indev_proc_t * proc)
lv_obj_t * gesture_obj = proc->types.pointer.act_obj; lv_obj_t * gesture_obj = proc->types.pointer.act_obj;
/*If gesture parent is active check recursively the drag_parent attribute*/ /*If gesture parent is active check recursively the gesture attribute*/
while(gesture_obj && lv_obj_get_gesture_parent(gesture_obj)) { while(gesture_obj && lv_obj_get_gesture_parent(gesture_obj)) {
gesture_obj = lv_obj_get_parent(gesture_obj); gesture_obj = lv_obj_get_parent(gesture_obj);
} }
if(gesture_obj == NULL) return; if(gesture_obj == NULL) return;
if((LV_MATH_ABS(proc->types.pointer.vect.x) < indev_act->driver.gesture_min_velocity) && if((LV_MATH_ABS(proc->types.pointer.vect.x) < indev_act->driver.gesture_min_velocity) &&
(LV_MATH_ABS(proc->types.pointer.vect.y) < indev_act->driver.gesture_min_velocity)) { (LV_MATH_ABS(proc->types.pointer.vect.y) < indev_act->driver.gesture_min_velocity)) {
proc->types.pointer.gesture_sum.x = 0; proc->types.pointer.gesture_sum.x = 0;

View File

@@ -160,7 +160,7 @@ lv_obj_t * lv_indev_get_obj_act(void);
/** /**
* Search the most top, clickable object by a point * Search the most top, clickable object by a point
* @param obj pointer to a start object, typically the screen * @param obj pointer to a start object, typically the screen
* @param point pointer to a point for searhing the most top child * @param point pointer to a point for searching the most top child
* @return pointer to the found object or NULL if there was no suitable object * @return pointer to the found object or NULL if there was no suitable object
*/ */
lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point); lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point);

View File

@@ -11,7 +11,7 @@
#include "lv_refr.h" #include "lv_refr.h"
#include "lv_group.h" #include "lv_group.h"
#include "lv_disp.h" #include "lv_disp.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_misc/lv_anim.h" #include "../lv_misc/lv_anim.h"
@@ -38,6 +38,10 @@
#include LV_THEME_DEFAULT_INCLUDE #include LV_THEME_DEFAULT_INCLUDE
#if LV_USE_GPU_STM32_DMA2D
#include "../lv_gpu/lv_gpu_stm32_dma2d.h"
#endif
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
@@ -92,6 +96,7 @@ static void opa_scale_anim(lv_obj_t * obj, lv_anim_value_t v);
static void fade_in_anim_ready(lv_anim_t * a); static void fade_in_anim_ready(lv_anim_t * a);
#endif #endif
static void lv_event_mark_deleted(lv_obj_t * obj); static void lv_event_mark_deleted(lv_obj_t * obj);
static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find);
static void lv_obj_del_async_cb(void * obj); static void lv_obj_del_async_cb(void * obj);
static void obj_del_core(lv_obj_t * obj); static void obj_del_core(lv_obj_t * obj);
@@ -139,8 +144,16 @@ void lv_init(void)
_lv_group_init(); _lv_group_init();
#endif #endif
#if LV_USE_GPU_STM32_DMA2D
/*Initialize DMA2D GPU*/
lv_gpu_stm32_dma2d_init();
#endif
_lv_ll_init(&LV_GC_ROOT(_lv_obj_style_trans_ll), sizeof(lv_style_trans_t)); _lv_ll_init(&LV_GC_ROOT(_lv_obj_style_trans_ll), sizeof(lv_style_trans_t));
_lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t));
_lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t));
lv_theme_t * th = LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY, lv_theme_t * th = LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
LV_THEME_DEFAULT_FLAG, LV_THEME_DEFAULT_FLAG,
LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL, LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE); LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL, LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
@@ -149,15 +162,20 @@ void lv_init(void)
/*Initialize the screen refresh system*/ /*Initialize the screen refresh system*/
_lv_refr_init(); _lv_refr_init();
_lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t));
_lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t));
/*Init the input device handling*/ /*Init the input device handling*/
_lv_indev_init(); _lv_indev_init();
_lv_img_decoder_init(); _lv_img_decoder_init();
lv_img_cache_set_size(LV_IMG_CACHE_DEF_SIZE); lv_img_cache_set_size(LV_IMG_CACHE_DEF_SIZE);
/*Test if the IDE has UTF-8 encoding*/
char * txt = "Á";
uint8_t * txt_u8 = (uint8_t *) txt;
if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) {
LV_LOG_WARN("The strings has no UTF-8 encoding. Some characters won't be displayed.")
}
lv_initialized = true; lv_initialized = true;
LV_LOG_INFO("lv_init ready"); LV_LOG_INFO("lv_init ready");
} }
@@ -171,16 +189,16 @@ void lv_init(void)
void lv_deinit(void) void lv_deinit(void)
{ {
_lv_gc_clear_roots(); _lv_gc_clear_roots();
#if LV_USE_LOG
lv_log_register_print_cb(NULL);
#endif
lv_disp_set_default(NULL); lv_disp_set_default(NULL);
_lv_mem_deinit(); _lv_mem_deinit();
lv_initialized = false; lv_initialized = false;
LV_LOG_INFO("lv_deinit done");
#if LV_USE_LOG #if LV_USE_LOG
lv_log_register_print_cb(NULL); lv_log_register_print_cb(NULL);
#endif #endif
LV_LOG_INFO("lv_deinit done");
} }
#endif #endif
@@ -297,6 +315,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
#if LV_USE_GROUP #if LV_USE_GROUP
new_obj->group_p = NULL; new_obj->group_p = NULL;
#endif #endif
/*Set attributes*/ /*Set attributes*/
@@ -310,7 +329,8 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
new_obj->top = 0; new_obj->top = 0;
new_obj->protect = LV_PROTECT_NONE; new_obj->protect = LV_PROTECT_NONE;
new_obj->parent_event = 0; new_obj->parent_event = 0;
new_obj->gesture_parent = 1; new_obj->gesture_parent = parent ? 1 : 0;
new_obj->focus_parent = 0;
new_obj->state = LV_STATE_DEFAULT; new_obj->state = LV_STATE_DEFAULT;
new_obj->ext_attr = NULL; new_obj->ext_attr = NULL;
@@ -837,7 +857,7 @@ void lv_obj_set_height_fit(lv_obj_t * obj, lv_coord_t h)
/** /**
* Set the width of an object by taking the left and right margin into account. * Set the width of an object by taking the left and right margin into account.
* The object width will be `obj_w = w - margon_left - margin_right` * The object width will be `obj_w = w - margin_left - margin_right`
* @param obj pointer to an object * @param obj pointer to an object
* @param w new height including margins * @param w new height including margins
*/ */
@@ -851,7 +871,7 @@ void lv_obj_set_width_margin(lv_obj_t * obj, lv_coord_t w)
/** /**
* Set the height of an object by taking the top and bottom margin into account. * Set the height of an object by taking the top and bottom margin into account.
* The object height will be `obj_h = h - margon_top - margin_bottom` * The object height will be `obj_h = h - margin_top - margin_bottom`
* @param obj pointer to an object * @param obj pointer to an object
* @param h new height including margins * @param h new height including margins
*/ */
@@ -1072,7 +1092,7 @@ void lv_obj_realign(lv_obj_t * obj)
lv_obj_align(obj, obj->realign.base, obj->realign.align, obj->realign.xofs, obj->realign.yofs); lv_obj_align(obj, obj->realign.base, obj->realign.align, obj->realign.xofs, obj->realign.yofs);
#else #else
(void)obj; (void)obj;
LV_LOG_WARN("lv_obj_realaign: no effect because LV_USE_OBJ_REALIGN = 0"); LV_LOG_WARN("lv_obj_realign: no effect because LV_USE_OBJ_REALIGN = 0");
#endif #endif
} }
@@ -1313,7 +1333,7 @@ void _lv_obj_set_style_local_ptr(lv_obj_t * obj, uint8_t part, lv_style_property
* E.g. `LV_STYLE_TEXT_FONT | (LV_STATE_PRESSED << LV_STYLE_STATE_POS)` * E.g. `LV_STYLE_TEXT_FONT | (LV_STATE_PRESSED << LV_STYLE_STATE_POS)`
* @note shouldn't be used directly. Use the specific property remove functions instead. * @note shouldn't be used directly. Use the specific property remove functions instead.
* For example: `lv_obj_style_remove_border_opa()` * For example: `lv_obj_style_remove_border_opa()`
* @return true: the property was found and removed; false: teh property was not found * @return true: the property was found and removed; false: the property was not found
*/ */
bool lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_property_t prop) bool lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_property_t prop)
{ {
@@ -1482,7 +1502,7 @@ void lv_obj_set_top(lv_obj_t * obj, bool en)
/** /**
* Enable the dragging of an object * Enable the dragging of an object
* @param obj pointer to an object * @param obj pointer to an object
* @param en true: make the object dragable * @param en true: make the object draggable
*/ */
void lv_obj_set_drag(lv_obj_t * obj, bool en) void lv_obj_set_drag(lv_obj_t * obj, bool en)
{ {
@@ -1542,6 +1562,31 @@ void lv_obj_set_gesture_parent(lv_obj_t * obj, bool en)
obj->gesture_parent = (en == true ? 1 : 0); obj->gesture_parent = (en == true ? 1 : 0);
} }
/**
* Enable to use parent for focus state.
* When object is focused the parent will get the state instead (visual only)
* @param obj pointer to an object
* @param en true: enable the 'focus parent' for the object
*/
void lv_obj_set_focus_parent(lv_obj_t * obj, bool en)
{
if(lv_obj_is_focused(obj)) {
if(en) {
obj->focus_parent = 1;
lv_obj_clear_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED);
lv_obj_set_state(lv_obj_get_focused_obj(obj), LV_STATE_FOCUSED);
}
else {
lv_obj_clear_state(lv_obj_get_focused_obj(obj), LV_STATE_FOCUSED | LV_STATE_EDITED);
lv_obj_set_state(obj, LV_STATE_FOCUSED);
obj->focus_parent = 0;
}
}
else {
obj->focus_parent = (en == true ? 1 : 0);
}
}
/** /**
* Propagate the events to the parent too * Propagate the events to the parent too
* @param obj pointer to an object * @param obj pointer to an object
@@ -2192,7 +2237,7 @@ lv_coord_t lv_obj_get_height_fit(const lv_obj_t * obj)
/** /**
* Get the height of an object by taking the top and bottom margin into account. * Get the height of an object by taking the top and bottom margin into account.
* The returned height will be `obj_h + margon_top + margin_bottom` * The returned height will be `obj_h + margin_top + margin_bottom`
* @param obj pointer to an object * @param obj pointer to an object
* @return the height including thee margins * @return the height including thee margins
*/ */
@@ -2206,7 +2251,7 @@ lv_coord_t lv_obj_get_height_margin(lv_obj_t * obj)
/** /**
* Get the width of an object by taking the left and right margin into account. * Get the width of an object by taking the left and right margin into account.
* The returned width will be `obj_w + margon_left + margin_right` * The returned width will be `obj_w + margin_left + margin_right`
* @param obj pointer to an object * @param obj pointer to an object
* @return the height including thee margins * @return the height including thee margins
*/ */
@@ -2404,7 +2449,7 @@ lv_style_int_t _lv_obj_get_style_int(const lv_obj_t * obj, uint8_t part, lv_styl
lv_style_property_t prop_ori = prop; lv_style_property_t prop_ori = prop;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop_ori >> 8; attr = prop_ori >> 8;
lv_style_int_t value_act; lv_style_int_t value_act;
lv_res_t res = LV_RES_INV; lv_res_t res = LV_RES_INV;
@@ -2418,7 +2463,7 @@ lv_style_int_t _lv_obj_get_style_int(const lv_obj_t * obj, uint8_t part, lv_styl
res = _lv_style_list_get_int(dsc, prop, &value_act); res = _lv_style_list_get_int(dsc, prop, &value_act);
if(res == LV_RES_OK) return value_act; if(res == LV_RES_OK) return value_act;
if(attr.bits.inherit == 0) break; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break;
/*If not found, check the `MAIN` style first*/ /*If not found, check the `MAIN` style first*/
if(part != LV_OBJ_PART_MAIN) { if(part != LV_OBJ_PART_MAIN) {
@@ -2467,7 +2512,7 @@ lv_color_t _lv_obj_get_style_color(const lv_obj_t * obj, uint8_t part, lv_style_
lv_style_property_t prop_ori = prop; lv_style_property_t prop_ori = prop;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop_ori >> 8; attr = prop_ori >> 8;
lv_color_t value_act; lv_color_t value_act;
lv_res_t res = LV_RES_INV; lv_res_t res = LV_RES_INV;
@@ -2481,7 +2526,7 @@ lv_color_t _lv_obj_get_style_color(const lv_obj_t * obj, uint8_t part, lv_style_
res = _lv_style_list_get_color(dsc, prop, &value_act); res = _lv_style_list_get_color(dsc, prop, &value_act);
if(res == LV_RES_OK) return value_act; if(res == LV_RES_OK) return value_act;
if(attr.bits.inherit == 0) break; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break;
/*If not found, check the `MAIN` style first*/ /*If not found, check the `MAIN` style first*/
if(part != LV_OBJ_PART_MAIN) { if(part != LV_OBJ_PART_MAIN) {
@@ -2523,7 +2568,7 @@ lv_opa_t _lv_obj_get_style_opa(const lv_obj_t * obj, uint8_t part, lv_style_prop
lv_style_property_t prop_ori = prop; lv_style_property_t prop_ori = prop;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop_ori >> 8; attr = prop_ori >> 8;
lv_opa_t value_act; lv_opa_t value_act;
lv_res_t res = LV_RES_INV; lv_res_t res = LV_RES_INV;
@@ -2537,7 +2582,7 @@ lv_opa_t _lv_obj_get_style_opa(const lv_obj_t * obj, uint8_t part, lv_style_prop
res = _lv_style_list_get_opa(dsc, prop, &value_act); res = _lv_style_list_get_opa(dsc, prop, &value_act);
if(res == LV_RES_OK) return value_act; if(res == LV_RES_OK) return value_act;
if(attr.bits.inherit == 0) break; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break;
/*If not found, check the `MAIN` style first*/ /*If not found, check the `MAIN` style first*/
if(part != LV_OBJ_PART_MAIN) { if(part != LV_OBJ_PART_MAIN) {
@@ -2580,7 +2625,7 @@ const void * _lv_obj_get_style_ptr(const lv_obj_t * obj, uint8_t part, lv_style_
lv_style_property_t prop_ori = prop; lv_style_property_t prop_ori = prop;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop_ori >> 8; attr = prop_ori >> 8;
const void * value_act; const void * value_act;
lv_res_t res = LV_RES_INV; lv_res_t res = LV_RES_INV;
@@ -2594,7 +2639,7 @@ const void * _lv_obj_get_style_ptr(const lv_obj_t * obj, uint8_t part, lv_style_
res = _lv_style_list_get_ptr(dsc, prop, &value_act); res = _lv_style_list_get_ptr(dsc, prop, &value_act);
if(res == LV_RES_OK) return value_act; if(res == LV_RES_OK) return value_act;
if(attr.bits.inherit == 0) break; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break;
/*If not found, check the `MAIN` style first*/ /*If not found, check the `MAIN` style first*/
if(part != LV_OBJ_PART_MAIN) { if(part != LV_OBJ_PART_MAIN) {
@@ -2678,7 +2723,7 @@ bool lv_obj_get_click(const lv_obj_t * obj)
/** /**
* Get the top enable attribute of an object * Get the top enable attribute of an object
* @param obj pointer to an object * @param obj pointer to an object
* @return true: the auto top feture is enabled * @return true: the auto top feature is enabled
*/ */
bool lv_obj_get_top(const lv_obj_t * obj) bool lv_obj_get_top(const lv_obj_t * obj)
{ {
@@ -2690,7 +2735,7 @@ bool lv_obj_get_top(const lv_obj_t * obj)
/** /**
* Get the drag enable attribute of an object * Get the drag enable attribute of an object
* @param obj pointer to an object * @param obj pointer to an object
* @return true: the object is dragable * @return true: the object is draggable
*/ */
bool lv_obj_get_drag(const lv_obj_t * obj) bool lv_obj_get_drag(const lv_obj_t * obj)
{ {
@@ -2743,6 +2788,16 @@ bool lv_obj_get_gesture_parent(const lv_obj_t * obj)
return obj->gesture_parent == 0 ? false : true; return obj->gesture_parent == 0 ? false : true;
} }
/**
* Get the focus parent attribute of an object
* @param obj pointer to an object
* @return true: focus parent is enabled
*/
bool lv_obj_get_focus_parent(const lv_obj_t * obj)
{
return obj->focus_parent == 0 ? false : true;
}
/** /**
* Get the drag parent attribute of an object * Get the drag parent attribute of an object
* @param obj pointer to an object * @param obj pointer to an object
@@ -2809,7 +2864,7 @@ lv_state_t lv_obj_get_state(const lv_obj_t * obj, uint8_t part)
/*If a real part is asked, then use the object's signal to get its state. /*If a real part is asked, then use the object's signal to get its state.
* A real object can be in different state then the main part * A real object can be in different state then the main part
* and only the object itseld knows who to get it's state. */ * and only the object itself knows who to get it's state. */
lv_get_state_info_t info; lv_get_state_info_t info;
info.part = part; info.part = part;
info.result = LV_STATE_DEFAULT; info.result = LV_STATE_DEFAULT;
@@ -3243,8 +3298,9 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint8_t part, lv_draw_img_dsc_t *
draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2; draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2;
draw_dsc->recolor_opa = lv_obj_get_style_image_recolor_opa(obj, part); draw_dsc->recolor_opa = lv_obj_get_style_image_recolor_opa(obj, part);
draw_dsc->recolor = lv_obj_get_style_image_recolor(obj, part); if(draw_dsc->recolor_opa > 0) {
draw_dsc->recolor = lv_obj_get_style_image_recolor(obj, part);
}
#if LV_USE_BLEND_MODES #if LV_USE_BLEND_MODES
draw_dsc->blend_mode = lv_obj_get_style_image_blend_mode(obj, part); draw_dsc->blend_mode = lv_obj_get_style_image_blend_mode(obj, part);
#endif #endif
@@ -3283,7 +3339,7 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint8_t part, lv_draw_line_dsc_t
/** /**
* Get the required extra size (around the object's part) to draw shadow, outline, value etc. * Get the required extra size (around the object's part) to draw shadow, outline, value etc.
* @param obj poinr to an object * @param obj pointer to an object
* @param part part of the object * @param part part of the object
*/ */
lv_coord_t lv_obj_get_draw_rect_ext_pad_size(lv_obj_t * obj, uint8_t part) lv_coord_t lv_obj_get_draw_rect_ext_pad_size(lv_obj_t * obj, uint8_t part)
@@ -3405,6 +3461,52 @@ void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay)
#endif #endif
} }
/**
* Check if any object has a given type
* @param obj pointer to an object
* @param obj_type type of the object. (e.g. "lv_btn")
* @return true: valid
*/
bool lv_debug_check_obj_type(const lv_obj_t * obj, const char * obj_type)
{
if(obj_type[0] == '\0') return true;
lv_obj_type_t types;
lv_obj_get_type((lv_obj_t *)obj, &types);
uint8_t i;
for(i = 0; i < LV_MAX_ANCESTOR_NUM; i++) {
if(types.type[i] == NULL) break;
if(strcmp(types.type[i], obj_type) == 0) return true;
}
return false;
}
/**
* Check if any object is still "alive", and part of the hierarchy
* @param obj pointer to an object
* @param obj_type type of the object. (e.g. "lv_btn")
* @return true: valid
*/
bool lv_debug_check_obj_valid(const lv_obj_t * obj)
{
lv_disp_t * disp = lv_disp_get_next(NULL);
while(disp) {
lv_obj_t * scr;
_LV_LL_READ(disp->scr_ll, scr) {
if(scr == obj) return true;
bool found = obj_valid_child(scr, obj);
if(found) return true;
}
disp = lv_disp_get_next(disp);
}
return false;
}
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
@@ -3591,6 +3693,23 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area
return LV_DESIGN_RES_OK; return LV_DESIGN_RES_OK;
} }
/**
* Get the really focused object by taking `focus_parent` into account.
* @param obj the start object
* @return the object to really focus
*/
lv_obj_t * lv_obj_get_focused_obj(const lv_obj_t * obj)
{
if(obj == NULL) return NULL;
const lv_obj_t * focus_obj = obj;
while(lv_obj_get_focus_parent(focus_obj) != false && focus_obj != NULL) {
focus_obj = lv_obj_get_parent(focus_obj);
}
return (lv_obj_t *)focus_obj;
}
/** /**
* Signal function of the basic object * Signal function of the basic object
* @param obj pointer to an object * @param obj pointer to an object
@@ -3634,22 +3753,36 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) {
lv_obj_clear_state(obj, LV_STATE_PRESSED); lv_obj_clear_state(obj, LV_STATE_PRESSED);
} }
#if LV_USE_GROUP
else if(sign == LV_SIGNAL_FOCUS) { else if(sign == LV_SIGNAL_FOCUS) {
if(lv_group_get_editing(lv_obj_get_group(obj))) { bool editing = false;
#if LV_USE_GROUP
editing = lv_group_get_editing(lv_obj_get_group(obj));
#endif
if(editing) {
uint8_t state = LV_STATE_FOCUSED; uint8_t state = LV_STATE_FOCUSED;
state |= LV_STATE_EDITED; state |= LV_STATE_EDITED;
/*if using focus mode, change target to parent*/
obj = lv_obj_get_focused_obj(obj);
lv_obj_add_state(obj, state); lv_obj_add_state(obj, state);
} }
else { else {
/*if using focus mode, change target to parent*/
obj = lv_obj_get_focused_obj(obj);
lv_obj_add_state(obj, LV_STATE_FOCUSED); lv_obj_add_state(obj, LV_STATE_FOCUSED);
lv_obj_clear_state(obj, LV_STATE_EDITED); lv_obj_clear_state(obj, LV_STATE_EDITED);
} }
} }
else if(sign == LV_SIGNAL_DEFOCUS) { else if(sign == LV_SIGNAL_DEFOCUS) {
/*if using focus mode, change target to parent*/
obj = lv_obj_get_focused_obj(obj);
lv_obj_clear_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED); lv_obj_clear_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED);
} }
#endif
else if(sign == LV_SIGNAL_CLEANUP) { else if(sign == LV_SIGNAL_CLEANUP) {
lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN);
} }
@@ -3749,7 +3882,7 @@ static void base_dir_refr_children(lv_obj_t * obj)
* @param part the part of the object to apply the transaction * @param part the part of the object to apply the transaction
* @param prev_state the previous state of the objects * @param prev_state the previous state of the objects
* @param new_state the new state of the object * @param new_state the new state of the object
* @return pointer to the allocated `the transaction` variable or `NULL` if no transtion created * @return pointer to the allocated `the transaction` variable or `NULL` if no transition created
*/ */
static lv_style_trans_t * trans_create(lv_obj_t * obj, lv_style_property_t prop, uint8_t part, lv_state_t prev_state, static lv_style_trans_t * trans_create(lv_obj_t * obj, lv_style_property_t prop, uint8_t part, lv_state_t prev_state,
lv_state_t new_state) lv_state_t new_state)
@@ -3854,12 +3987,12 @@ static lv_style_trans_t * trans_create(lv_obj_t * obj, lv_style_property_t prop,
} }
/** /**
* Remove the transition from objectt's part's property. * Remove the transition from object's part's property.
* - Remove the transition from `_lv_obj_style_trans_ll` and free it * - Remove the transition from `_lv_obj_style_trans_ll` and free it
* - Delete pending transitions * - Delete pending transitions
* @param obj pointer to an object which transition(s) should be removed * @param obj pointer to an object which transition(s) should be removed
* @param part a part of object or 0xFF to remove from all parts * @param part a part of object or 0xFF to remove from all parts
* @param prop a property or 0xFF to remove all porpeties * @param prop a property or 0xFF to remove all properties
* @param tr_limit delete transitions only "older" then this. `NULL` is not used * @param tr_limit delete transitions only "older" then this. `NULL` is not used
*/ */
static void trans_del(lv_obj_t * obj, uint8_t part, lv_style_property_t prop, lv_style_trans_t * tr_limit) static void trans_del(lv_obj_t * obj, uint8_t part, lv_style_property_t prop, lv_style_trans_t * tr_limit)
@@ -4001,4 +4134,17 @@ static void lv_event_mark_deleted(lv_obj_t * obj)
} }
} }
static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find)
{
/*Check all children of `parent`*/
lv_obj_t * child;
_LV_LL_READ(parent->child_ll, child) {
if(child == obj_to_find) return true;
/*Check the children*/
bool found = obj_valid_child(child, obj_to_find);
if(found) return true;
}
return false;
}

View File

@@ -21,6 +21,7 @@ extern "C" {
#include "../lv_misc/lv_types.h" #include "../lv_misc/lv_types.h"
#include "../lv_misc/lv_area.h" #include "../lv_misc/lv_area.h"
#include "../lv_misc/lv_color.h" #include "../lv_misc/lv_color.h"
#include "../lv_misc/lv_debug.h"
#include "../lv_hal/lv_hal.h" #include "../lv_hal/lv_hal.h"
#include "../lv_draw/lv_draw_rect.h" #include "../lv_draw/lv_draw_rect.h"
#include "../lv_draw/lv_draw_label.h" #include "../lv_draw/lv_draw_label.h"
@@ -90,7 +91,7 @@ enum {
LV_EVENT_DRAG_BEGIN, LV_EVENT_DRAG_BEGIN,
LV_EVENT_DRAG_END, LV_EVENT_DRAG_END,
LV_EVENT_DRAG_THROW_BEGIN, LV_EVENT_DRAG_THROW_BEGIN,
LV_EVENT_GESTURE, /**< The object has been getture*/ LV_EVENT_GESTURE, /**< The object has been gesture*/
LV_EVENT_KEY, LV_EVENT_KEY,
LV_EVENT_FOCUSED, LV_EVENT_FOCUSED,
LV_EVENT_DEFOCUSED, LV_EVENT_DEFOCUSED,
@@ -209,7 +210,7 @@ typedef struct _lv_obj_t {
lv_area_t ext_click_pad; /**< Extra click padding area. */ lv_area_t ext_click_pad; /**< Extra click padding area. */
#endif #endif
lv_coord_t ext_draw_pad; /**< EXTtend the size in every direction for drawing. */ lv_coord_t ext_draw_pad; /**< EXTend the size in every direction for drawing. */
/*Attributes and states*/ /*Attributes and states*/
uint8_t click : 1; /**< 1: Can be pressed by an input device*/ uint8_t click : 1; /**< 1: Can be pressed by an input device*/
@@ -220,7 +221,8 @@ typedef struct _lv_obj_t {
uint8_t top : 1; /**< 1: If the object or its children is clicked it goes to the foreground*/ uint8_t top : 1; /**< 1: If the object or its children is clicked it goes to the foreground*/
uint8_t parent_event : 1; /**< 1: Send the object's events to the parent too. */ uint8_t parent_event : 1; /**< 1: Send the object's events to the parent too. */
uint8_t adv_hittest : 1; /**< 1: Use advanced hit-testing (slower) */ uint8_t adv_hittest : 1; /**< 1: Use advanced hit-testing (slower) */
uint8_t gesture_parent : 1; /**< 1: Parent will be gesture instead*/ uint8_t gesture_parent : 1; /**< 1: Parent will be gesture instead*/
uint8_t focus_parent : 1; /**< 1: Parent will be focused instead*/
lv_drag_dir_t drag_dir : 3; /**< Which directions the object can be dragged in */ lv_drag_dir_t drag_dir : 3; /**< Which directions the object can be dragged in */
lv_bidi_dir_t base_dir : 2; /**< Base direction of texts related to this object */ lv_bidi_dir_t base_dir : 2; /**< Base direction of texts related to this object */
@@ -439,7 +441,7 @@ void lv_obj_set_height_fit(lv_obj_t * obj, lv_coord_t h);
/** /**
* Set the width of an object by taking the left and right margin into account. * Set the width of an object by taking the left and right margin into account.
* The object width will be `obj_w = w - margon_left - margin_right` * The object width will be `obj_w = w - margin_left - margin_right`
* @param obj pointer to an object * @param obj pointer to an object
* @param w new height including margins * @param w new height including margins
*/ */
@@ -447,7 +449,7 @@ void lv_obj_set_width_margin(lv_obj_t * obj, lv_coord_t w);
/** /**
* Set the height of an object by taking the top and bottom margin into account. * Set the height of an object by taking the top and bottom margin into account.
* The object height will be `obj_h = h - margon_top - margin_bottom` * The object height will be `obj_h = h - margin_top - margin_bottom`
* @param obj pointer to an object * @param obj pointer to an object
* @param h new height including margins * @param h new height including margins
*/ */
@@ -618,7 +620,7 @@ void _lv_obj_set_style_local_ptr(lv_obj_t * obj, uint8_t type, lv_style_property
* E.g. `LV_STYLE_TEXT_FONT | (LV_STATE_PRESSED << LV_STYLE_STATE_POS)` * E.g. `LV_STYLE_TEXT_FONT | (LV_STATE_PRESSED << LV_STYLE_STATE_POS)`
* @note shouldn't be used directly. Use the specific property remove functions instead. * @note shouldn't be used directly. Use the specific property remove functions instead.
* For example: `lv_obj_style_remove_border_opa()` * For example: `lv_obj_style_remove_border_opa()`
* @return true: the property was found and removed; false: teh property was not found * @return true: the property was found and removed; false: the property was not found
*/ */
bool lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_property_t prop); bool lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_property_t prop);
@@ -658,7 +660,7 @@ void lv_obj_set_top(lv_obj_t * obj, bool en);
/** /**
* Enable the dragging of an object * Enable the dragging of an object
* @param obj pointer to an object * @param obj pointer to an object
* @param en true: make the object dragable * @param en true: make the object draggable
*/ */
void lv_obj_set_drag(lv_obj_t * obj, bool en); void lv_obj_set_drag(lv_obj_t * obj, bool en);
@@ -684,6 +686,14 @@ void lv_obj_set_drag_throw(lv_obj_t * obj, bool en);
*/ */
void lv_obj_set_drag_parent(lv_obj_t * obj, bool en); void lv_obj_set_drag_parent(lv_obj_t * obj, bool en);
/**
* Enable to use parent for focus state.
* When object is focused the parent will get the state instead (visual only)
* @param obj pointer to an object
* @param en true: enable the 'focus parent' for the object
*/
void lv_obj_set_focus_parent(lv_obj_t * obj, bool en);
/** /**
* Enable to use parent for gesture related operations. * Enable to use parent for gesture related operations.
* If trying to gesture the object the parent will be moved instead * If trying to gesture the object the parent will be moved instead
@@ -847,7 +857,6 @@ lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj);
/** /**
* Get the display of an object * Get the display of an object
* @param scr pointer to an object
* @return pointer the object's display * @return pointer the object's display
*/ */
lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj); lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj);
@@ -956,7 +965,7 @@ lv_coord_t lv_obj_get_height_fit(const lv_obj_t * obj);
/** /**
* Get the height of an object by taking the top and bottom margin into account. * Get the height of an object by taking the top and bottom margin into account.
* The returned height will be `obj_h + margon_top + margin_bottom` * The returned height will be `obj_h + margin_top + margin_bottom`
* @param obj pointer to an object * @param obj pointer to an object
* @return the height including thee margins * @return the height including thee margins
*/ */
@@ -964,7 +973,7 @@ lv_coord_t lv_obj_get_height_margin(lv_obj_t * obj);
/** /**
* Get the width of an object by taking the left and right margin into account. * Get the width of an object by taking the left and right margin into account.
* The returned width will be `obj_w + margon_left + margin_right` * The returned width will be `obj_w + margin_left + margin_right`
* @param obj pointer to an object * @param obj pointer to an object
* @return the height including thee margins * @return the height including thee margins
*/ */
@@ -1043,7 +1052,7 @@ lv_coord_t lv_obj_get_ext_draw_pad(const lv_obj_t * obj);
*---------------*/ *---------------*/
/** /**
* Get the style list of an obejct's part. * Get the style list of an object's part.
* @param obj pointer to an object. * @param obj pointer to an object.
* @param part part the part of the object which style list should be get. * @param part part the part of the object which style list should be get.
* E.g. `LV_OBJ_PART_MAIN`, `LV_BTN_PART_MAIN`, `LV_SLIDER_PART_KNOB` * E.g. `LV_OBJ_PART_MAIN`, `LV_BTN_PART_MAIN`, `LV_SLIDER_PART_KNOB`
@@ -1162,7 +1171,7 @@ bool lv_obj_get_top(const lv_obj_t * obj);
/** /**
* Get the drag enable attribute of an object * Get the drag enable attribute of an object
* @param obj pointer to an object * @param obj pointer to an object
* @return true: the object is dragable * @return true: the object is draggable
*/ */
bool lv_obj_get_drag(const lv_obj_t * obj); bool lv_obj_get_drag(const lv_obj_t * obj);
@@ -1187,6 +1196,15 @@ bool lv_obj_get_drag_throw(const lv_obj_t * obj);
*/ */
bool lv_obj_get_drag_parent(const lv_obj_t * obj); bool lv_obj_get_drag_parent(const lv_obj_t * obj);
/**
* Get the focus parent attribute of an object
* @param obj pointer to an object
* @return true: focus parent is enabled
*/
bool lv_obj_get_focus_parent(const lv_obj_t * obj);
/** /**
* Get the drag parent attribute of an object * Get the drag parent attribute of an object
* @param obj pointer to an object * @param obj pointer to an object
@@ -1318,6 +1336,13 @@ void * lv_obj_get_group(const lv_obj_t * obj);
*/ */
bool lv_obj_is_focused(const lv_obj_t * obj); bool lv_obj_is_focused(const lv_obj_t * obj);
/**
* Get the really focused object by taking `focus_parent` into account.
* @param obj the start object
* @return the object to really focus
*/
lv_obj_t * lv_obj_get_focused_obj(const lv_obj_t * obj);
/*------------------- /*-------------------
* OTHER FUNCTIONS * OTHER FUNCTIONS
*------------------*/ *------------------*/
@@ -1348,7 +1373,7 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint8_t part, lv_draw_line_dsc_t
/** /**
* Get the required extra size (around the object's part) to draw shadow, outline, value etc. * Get the required extra size (around the object's part) to draw shadow, outline, value etc.
* @param obj poinr to an object * @param obj pointer to an object
* @param part part of the object * @param part part of the object
*/ */
lv_coord_t lv_obj_get_draw_rect_ext_pad_size(lv_obj_t * obj, uint8_t part); lv_coord_t lv_obj_get_draw_rect_ext_pad_size(lv_obj_t * obj, uint8_t part);
@@ -1369,6 +1394,23 @@ void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay);
*/ */
void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay); void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay);
/**
* Check if any object has a given type
* @param obj pointer to an object
* @param obj_type type of the object. (e.g. "lv_btn")
* @return true: valid
*/
bool lv_debug_check_obj_type(const lv_obj_t * obj, const char * obj_type);
/**
* Check if any object is still "alive", and part of the hierarchy
* @param obj pointer to an object
* @param obj_type type of the object. (e.g. "lv_btn")
* @return true: valid
*/
bool lv_debug_check_obj_valid(const lv_obj_t * obj);
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/
@@ -1378,7 +1420,7 @@ void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay);
* Will be expanded to: `static void <name> (lv_obj_t * obj, lv_event_t e)` * Will be expanded to: `static void <name> (lv_obj_t * obj, lv_event_t e)`
* *
* Examples: * Examples:
* LV_EVENT_CB_DECLARE(my_event1); //Protoype declaration * LV_EVENT_CB_DECLARE(my_event1); //Prototype declaration
* *
* LV_EVENT_CB_DECLARE(my_event1) * LV_EVENT_CB_DECLARE(my_event1)
* { * {
@@ -1389,6 +1431,32 @@ void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay);
*/ */
#define LV_EVENT_CB_DECLARE(name) static void name(lv_obj_t * obj, lv_event_t e) #define LV_EVENT_CB_DECLARE(name) static void name(lv_obj_t * obj, lv_event_t e)
#if LV_USE_DEBUG
# ifndef LV_DEBUG_IS_OBJ
# define LV_DEBUG_IS_OBJ(obj_p, obj_type) (lv_debug_check_null(obj_p) && \
lv_debug_check_obj_valid(obj_p) && \
lv_debug_check_obj_type(obj_p, obj_type))
# endif
# if LV_USE_ASSERT_OBJ
# ifndef LV_ASSERT_OBJ
# define LV_ASSERT_OBJ(obj_p, obj_type) LV_DEBUG_ASSERT(LV_DEBUG_IS_OBJ(obj_p, obj_type), "Invalid object", obj_p);
# endif
# else /* LV_USE_ASSERT_OBJ == 0 */
# if LV_USE_ASSERT_NULL /*Use at least LV_ASSERT_NULL if enabled*/
# define LV_ASSERT_OBJ(obj_p, obj_type) LV_ASSERT_NULL(obj_p)
# else
# define LV_ASSERT_OBJ(obj_p, obj_type) true
# endif
# endif
#else
# define LV_ASSERT_OBJ(obj, obj_type) true
#endif
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -199,6 +199,102 @@ _LV_OBJ_STYLE_SET_GET_DECLARE(SCALE_END_COLOR, scale_end_color, lv_color_t, _col
#undef _LV_OBJ_STYLE_SET_GET_DECLARE #undef _LV_OBJ_STYLE_SET_GET_DECLARE
static inline void lv_obj_set_style_local_pad_all(lv_obj_t * obj, uint8_t part, lv_state_t state, lv_style_int_t value)
{
lv_obj_set_style_local_pad_top(obj, part, state, value);
lv_obj_set_style_local_pad_bottom(obj, part, state, value);
lv_obj_set_style_local_pad_left(obj, part, state, value);
lv_obj_set_style_local_pad_right(obj, part, state, value);
}
static inline void lv_style_set_pad_all(lv_style_t * style, lv_state_t state, lv_style_int_t value)
{
lv_style_set_pad_top(style, state, value);
lv_style_set_pad_bottom(style, state, value);
lv_style_set_pad_left(style, state, value);
lv_style_set_pad_right(style, state, value);
}
static inline void lv_obj_set_style_local_pad_hor(lv_obj_t * obj, uint8_t part, lv_state_t state, lv_style_int_t value)
{
lv_obj_set_style_local_pad_left(obj, part, state, value);
lv_obj_set_style_local_pad_right(obj, part, state, value);
}
static inline void lv_style_set_pad_hor(lv_style_t * style, lv_state_t state, lv_style_int_t value)
{
lv_style_set_pad_left(style, state, value);
lv_style_set_pad_right(style, state, value);
}
static inline void lv_obj_set_style_local_pad_ver(lv_obj_t * obj, uint8_t part, lv_state_t state, lv_style_int_t value)
{
lv_obj_set_style_local_pad_top(obj, part, state, value);
lv_obj_set_style_local_pad_bottom(obj, part, state, value);
}
static inline void lv_style_set_pad_ver(lv_style_t * style, lv_state_t state, lv_style_int_t value)
{
lv_style_set_pad_top(style, state, value);
lv_style_set_pad_bottom(style, state, value);
}
static inline void lv_obj_set_style_local_margin_all(lv_obj_t * obj, uint8_t part, lv_state_t state,
lv_style_int_t value)
{
lv_obj_set_style_local_margin_top(obj, part, state, value);
lv_obj_set_style_local_margin_bottom(obj, part, state, value);
lv_obj_set_style_local_margin_left(obj, part, state, value);
lv_obj_set_style_local_margin_right(obj, part, state, value);
}
static inline void lv_style_set_margin_all(lv_style_t * style, lv_state_t state, lv_style_int_t value)
{
lv_style_set_margin_top(style, state, value);
lv_style_set_margin_bottom(style, state, value);
lv_style_set_margin_left(style, state, value);
lv_style_set_margin_right(style, state, value);
}
static inline void lv_obj_set_style_local_margin_hor(lv_obj_t * obj, uint8_t part, lv_state_t state,
lv_style_int_t value)
{
lv_obj_set_style_local_margin_left(obj, part, state, value);
lv_obj_set_style_local_margin_right(obj, part, state, value);
}
static inline void lv_style_set_margin_hor(lv_style_t * style, lv_state_t state, lv_style_int_t value)
{
lv_style_set_margin_left(style, state, value);
lv_style_set_margin_right(style, state, value);
}
static inline void lv_obj_set_style_local_margin_ver(lv_obj_t * obj, uint8_t part, lv_state_t state,
lv_style_int_t value)
{
lv_obj_set_style_local_margin_top(obj, part, state, value);
lv_obj_set_style_local_margin_bottom(obj, part, state, value);
}
static inline void lv_style_set_margin_ver(lv_style_t * style, lv_state_t state, lv_style_int_t value)
{
lv_style_set_margin_top(style, state, value);
lv_style_set_margin_bottom(style, state, value);
}
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -159,7 +159,7 @@ lv_disp_t * _lv_refr_get_disp_refreshing(void)
/** /**
* Set the display which is being refreshed. * Set the display which is being refreshed.
* It shouldn1t be used directly by the user. * It shouldn't be used directly by the user.
* It can be used to trick the drawing functions about there is an active display. * It can be used to trick the drawing functions about there is an active display.
* @param the display being refreshed * @param the display being refreshed
*/ */
@@ -202,55 +202,60 @@ void _lv_disp_refr_task(lv_task_t * task)
if(disp_refr->inv_p != 0) { if(disp_refr->inv_p != 0) {
/* In true double buffered mode copy the refreshed areas to the new VDB to keep it up to date. /* In true double buffered mode copy the refreshed areas to the new VDB to keep it up to date.
* With set_px_cb we don't know anything about the buffer (even it's size) so skip copying.*/ * With set_px_cb we don't know anything about the buffer (even it's size) so skip copying.*/
if(lv_disp_is_true_double_buf(disp_refr) && disp_refr->driver.set_px_cb == NULL) { if(lv_disp_is_true_double_buf(disp_refr)) {
lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr); if(disp_refr->driver.set_px_cb) {
LV_LOG_WARN("Can't handle 2 screen sized buffers with set_px_cb. Display is not refreshed.");
/*Flush the content of the VDB*/
lv_refr_vdb_flush();
/* With true double buffering the flushing should be only the address change of the
* current frame buffer. Wait until the address change is ready and copy the changed
* content to the other frame buffer (new active VDB) to keep the buffers synchronized*/
while(vdb->flushing);
lv_color_t * copy_buf = NULL;
#if LV_USE_GPU_STM32_DMA2D
LV_UNUSED(copy_buf);
#else
copy_buf = _lv_mem_buf_get(disp_refr->driver.hor_res * sizeof(lv_color_t));
#endif
uint8_t * buf_act = (uint8_t *)vdb->buf_act;
uint8_t * buf_ina = (uint8_t *)vdb->buf_act == vdb->buf1 ? vdb->buf2 : vdb->buf1;
lv_coord_t hres = lv_disp_get_hor_res(disp_refr);
uint16_t a;
for(a = 0; a < disp_refr->inv_p; a++) {
if(disp_refr->inv_area_joined[a] == 0) {
uint32_t start_offs =
(hres * disp_refr->inv_areas[a].y1 + disp_refr->inv_areas[a].x1) * sizeof(lv_color_t);
#if LV_USE_GPU_STM32_DMA2D
lv_gpu_stm32_dma2d_copy((lv_color_t *)(buf_act + start_offs), disp_refr->driver.hor_res,
(lv_color_t *)(buf_ina + start_offs), disp_refr->driver.hor_res,
lv_area_get_width(&disp_refr->inv_areas[a]),
lv_area_get_height(&disp_refr->inv_areas[a]));
#else
lv_coord_t y;
uint32_t line_length = lv_area_get_width(&disp_refr->inv_areas[a]) * sizeof(lv_color_t);
for(y = disp_refr->inv_areas[a].y1; y <= disp_refr->inv_areas[a].y2; y++) {
/* The frame buffer is probably in an external RAM where sequential access is much faster.
* So first copy a line into a buffer and write it back the ext. RAM */
_lv_memcpy(copy_buf, buf_ina + start_offs, line_length);
_lv_memcpy(buf_act + start_offs, copy_buf, line_length);
start_offs += hres * sizeof(lv_color_t);
}
#endif
}
} }
else {
lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr);
if(copy_buf) _lv_mem_buf_release(copy_buf); /*Flush the content of the VDB*/
lv_refr_vdb_flush();
/* With true double buffering the flushing should be only the address change of the
* current frame buffer. Wait until the address change is ready and copy the changed
* content to the other frame buffer (new active VDB) to keep the buffers synchronized*/
while(vdb->flushing);
lv_color_t * copy_buf = NULL;
#if LV_USE_GPU_STM32_DMA2D
LV_UNUSED(copy_buf);
#else
copy_buf = _lv_mem_buf_get(disp_refr->driver.hor_res * sizeof(lv_color_t));
#endif
uint8_t * buf_act = (uint8_t *)vdb->buf_act;
uint8_t * buf_ina = (uint8_t *)vdb->buf_act == vdb->buf1 ? vdb->buf2 : vdb->buf1;
lv_coord_t hres = lv_disp_get_hor_res(disp_refr);
uint16_t a;
for(a = 0; a < disp_refr->inv_p; a++) {
if(disp_refr->inv_area_joined[a] == 0) {
uint32_t start_offs =
(hres * disp_refr->inv_areas[a].y1 + disp_refr->inv_areas[a].x1) * sizeof(lv_color_t);
#if LV_USE_GPU_STM32_DMA2D
lv_gpu_stm32_dma2d_copy((lv_color_t *)(buf_act + start_offs), disp_refr->driver.hor_res,
(lv_color_t *)(buf_ina + start_offs), disp_refr->driver.hor_res,
lv_area_get_width(&disp_refr->inv_areas[a]),
lv_area_get_height(&disp_refr->inv_areas[a]));
#else
lv_coord_t y;
uint32_t line_length = lv_area_get_width(&disp_refr->inv_areas[a]) * sizeof(lv_color_t);
for(y = disp_refr->inv_areas[a].y1; y <= disp_refr->inv_areas[a].y2; y++) {
/* The frame buffer is probably in an external RAM where sequential access is much faster.
* So first copy a line into a buffer and write it back the ext. RAM */
_lv_memcpy(copy_buf, buf_ina + start_offs, line_length);
_lv_memcpy(buf_act + start_offs, copy_buf, line_length);
start_offs += hres * sizeof(lv_color_t);
}
#endif
}
}
if(copy_buf) _lv_mem_buf_release(copy_buf);
}
} /*End of true double buffer handling*/ } /*End of true double buffer handling*/
/*Clean up*/ /*Clean up*/

View File

@@ -72,7 +72,7 @@ lv_disp_t * _lv_refr_get_disp_refreshing(void);
/** /**
* Set the display which is being refreshed. * Set the display which is being refreshed.
* It shouldn1t be used directly by the user. * It shouldn't be used directly by the user.
* It can be used to trick the drawing functions about there is an active display. * It can be used to trick the drawing functions about there is an active display.
* @param the display being refreshed * @param the display being refreshed
*/ */

View File

@@ -7,7 +7,6 @@
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_obj.h" #include "lv_obj.h"
#include "../lv_core/lv_debug.h"
#include "../lv_misc/lv_mem.h" #include "../lv_misc/lv_mem.h"
#include "../lv_misc/lv_anim.h" #include "../lv_misc/lv_anim.h"
@@ -37,6 +36,12 @@
**********************/ **********************/
LV_ATTRIBUTE_FAST_MEM static inline int32_t get_property_index(const lv_style_t * style, lv_style_property_t prop); LV_ATTRIBUTE_FAST_MEM static inline int32_t get_property_index(const lv_style_t * style, lv_style_property_t prop);
static lv_style_t * get_alloc_local_style(lv_style_list_t * list); static lv_style_t * get_alloc_local_style(lv_style_list_t * list);
static inline void style_resize(lv_style_t * style, size_t sz);
static inline lv_style_property_t get_style_prop(const lv_style_t * style, size_t idx);
static inline uint8_t get_style_prop_id(const lv_style_t * style, size_t idx);
static inline uint8_t get_style_prop_attr(const lv_style_t * style, size_t idx);
static inline size_t get_prop_size(uint8_t prop_id);
static inline size_t get_next_prop_index(uint8_t prop_id, size_t id);
/********************** /**********************
* GLOABAL VARIABLES * GLOABAL VARIABLES
@@ -103,16 +108,12 @@ bool lv_style_remove_prop(lv_style_t * style, lv_style_property_t prop)
lv_style_attr_t attr_found; lv_style_attr_t attr_found;
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_found.full = *(style->map + id + 1); attr_found = get_style_prop_attr(style, id);
attr_goal.full = (prop >> 8) & 0xFFU; attr_goal = (prop >> 8) & 0xFFU;
if(attr_found.bits.state == attr_goal.bits.state) { if(LV_STYLE_ATTR_GET_STATE(attr_found) == LV_STYLE_ATTR_GET_STATE(attr_goal)) {
uint32_t map_size = _lv_style_get_mem_size(style); uint32_t map_size = _lv_style_get_mem_size(style);
uint8_t prop_size = sizeof(lv_style_property_t); uint8_t prop_size = get_prop_size(prop);
if((prop & 0xF) < LV_STYLE_ID_COLOR) prop_size += sizeof(lv_style_int_t);
else if((prop & 0xF) < LV_STYLE_ID_OPA) prop_size += sizeof(lv_color_t);
else if((prop & 0xF) < LV_STYLE_ID_PTR) prop_size += sizeof(lv_opa_t);
else prop_size += sizeof(const void *);
/*Move the props to fill the space of the property to delete*/ /*Move the props to fill the space of the property to delete*/
uint32_t i; uint32_t i;
@@ -120,7 +121,7 @@ bool lv_style_remove_prop(lv_style_t * style, lv_style_property_t prop)
style->map[i] = style->map[i + prop_size]; style->map[i] = style->map[i + prop_size];
} }
style->map = lv_mem_realloc(style->map, map_size - prop_size); style_resize(style, map_size - prop_size);
return true; return true;
} }
@@ -336,14 +337,9 @@ uint16_t _lv_style_get_mem_size(const lv_style_t * style)
if(style->map == NULL) return 0; if(style->map == NULL) return 0;
size_t i = 0; size_t i = 0;
while(style->map[i] != _LV_STYLE_CLOSEING_PROP) { uint8_t prop_id;
/*Go to the next property*/ while((prop_id = get_style_prop_id(style, i)) != _LV_STYLE_CLOSEING_PROP) {
if((style->map[i] & 0xF) < LV_STYLE_ID_COLOR) i += sizeof(lv_style_int_t); i = get_next_prop_index(prop_id, i);
else if((style->map[i] & 0xF) < LV_STYLE_ID_OPA) i += sizeof(lv_color_t);
else if((style->map[i] & 0xF) < LV_STYLE_ID_PTR) i += sizeof(lv_opa_t);
else i += sizeof(const void *);
i += sizeof(lv_style_property_t);
} }
return i + sizeof(lv_style_property_t); return i + sizeof(lv_style_property_t);
@@ -369,10 +365,10 @@ void _lv_style_set_int(lv_style_t * style, lv_style_property_t prop, lv_style_in
lv_style_attr_t attr_found; lv_style_attr_t attr_found;
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_found.full = *(style->map + id + 1); attr_found = get_style_prop_attr(style, id);
attr_goal.full = (prop >> 8) & 0xFFU; attr_goal = (prop >> 8) & 0xFFU;
if(attr_found.bits.state == attr_goal.bits.state) { if(LV_STYLE_ATTR_GET_STATE(attr_found) == LV_STYLE_ATTR_GET_STATE(attr_goal)) {
_lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &value, sizeof(lv_style_int_t)); _lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &value, sizeof(lv_style_int_t));
return; return;
} }
@@ -386,7 +382,7 @@ void _lv_style_set_int(lv_style_t * style, lv_style_property_t prop, lv_style_in
uint16_t size = _lv_style_get_mem_size(style); uint16_t size = _lv_style_get_mem_size(style);
if(size == 0) size += end_mark_size; if(size == 0) size += end_mark_size;
size += sizeof(lv_style_property_t) + sizeof(lv_style_int_t); size += sizeof(lv_style_property_t) + sizeof(lv_style_int_t);
style->map = lv_mem_realloc(style->map, size); style_resize(style, size);
LV_ASSERT_MEM(style->map); LV_ASSERT_MEM(style->map);
if(style == NULL) return; if(style == NULL) return;
@@ -415,10 +411,10 @@ void _lv_style_set_color(lv_style_t * style, lv_style_property_t prop, lv_color_
lv_style_attr_t attr_found; lv_style_attr_t attr_found;
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_found.full = *(style->map + id + 1); attr_found = get_style_prop_attr(style, id);
attr_goal.full = (prop >> 8) & 0xFFU; attr_goal = (prop >> 8) & 0xFFU;
if(attr_found.bits.state == attr_goal.bits.state) { if(LV_STYLE_ATTR_GET_STATE(attr_found) == LV_STYLE_ATTR_GET_STATE(attr_goal)) {
_lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &color, sizeof(lv_color_t)); _lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &color, sizeof(lv_color_t));
return; return;
} }
@@ -433,7 +429,7 @@ void _lv_style_set_color(lv_style_t * style, lv_style_property_t prop, lv_color_
if(size == 0) size += end_mark_size; if(size == 0) size += end_mark_size;
size += sizeof(lv_style_property_t) + sizeof(lv_color_t); size += sizeof(lv_style_property_t) + sizeof(lv_color_t);
style->map = lv_mem_realloc(style->map, size); style_resize(style, size);
LV_ASSERT_MEM(style->map); LV_ASSERT_MEM(style->map);
if(style == NULL) return; if(style == NULL) return;
@@ -462,10 +458,10 @@ void _lv_style_set_opa(lv_style_t * style, lv_style_property_t prop, lv_opa_t op
lv_style_attr_t attr_found; lv_style_attr_t attr_found;
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_found.full = *(style->map + id + 1); attr_found = get_style_prop_attr(style, id);
attr_goal.full = (prop >> 8) & 0xFFU; attr_goal = (prop >> 8) & 0xFFU;
if(attr_found.bits.state == attr_goal.bits.state) { if(LV_STYLE_ATTR_GET_STATE(attr_found) == LV_STYLE_ATTR_GET_STATE(attr_goal)) {
_lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &opa, sizeof(lv_opa_t)); _lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &opa, sizeof(lv_opa_t));
return; return;
} }
@@ -480,7 +476,7 @@ void _lv_style_set_opa(lv_style_t * style, lv_style_property_t prop, lv_opa_t op
if(size == 0) size += end_mark_size; if(size == 0) size += end_mark_size;
size += sizeof(lv_style_property_t) + sizeof(lv_opa_t); size += sizeof(lv_style_property_t) + sizeof(lv_opa_t);
style->map = lv_mem_realloc(style->map, size); style_resize(style, size);
LV_ASSERT_MEM(style->map); LV_ASSERT_MEM(style->map);
if(style == NULL) return; if(style == NULL) return;
@@ -509,10 +505,10 @@ void _lv_style_set_ptr(lv_style_t * style, lv_style_property_t prop, const void
lv_style_attr_t attr_found; lv_style_attr_t attr_found;
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_found.full = *(style->map + id + 1); attr_found = get_style_prop_attr(style, id);
attr_goal.full = (prop >> 8) & 0xFFU; attr_goal = (prop >> 8) & 0xFFU;
if(attr_found.bits.state == attr_goal.bits.state) { if(LV_STYLE_ATTR_GET_STATE(attr_found) == LV_STYLE_ATTR_GET_STATE(attr_goal)) {
_lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &p, sizeof(const void *)); _lv_memcpy_small(style->map + id + sizeof(lv_style_property_t), &p, sizeof(const void *));
return; return;
} }
@@ -527,7 +523,7 @@ void _lv_style_set_ptr(lv_style_t * style, lv_style_property_t prop, const void
if(size == 0) size += end_mark_size; if(size == 0) size += end_mark_size;
size += sizeof(lv_style_property_t) + sizeof(const void *); size += sizeof(lv_style_property_t) + sizeof(const void *);
style->map = lv_mem_realloc(style->map, size); style_resize(style, size);
LV_ASSERT_MEM(style->map); LV_ASSERT_MEM(style->map);
if(style == NULL) return; if(style == NULL) return;
@@ -561,12 +557,12 @@ int16_t _lv_style_get_int(const lv_style_t * style, lv_style_property_t prop, vo
else { else {
_lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(lv_style_int_t)); _lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(lv_style_int_t));
lv_style_attr_t attr_act; lv_style_attr_t attr_act;
attr_act.full = style->map[id + 1]; attr_act = get_style_prop_attr(style, id);
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_goal.full = (prop >> 8) & 0xFF; attr_goal = (prop >> 8) & 0xFF;
return attr_act.bits.state & attr_goal.bits.state; return LV_STYLE_ATTR_GET_STATE(attr_act) & LV_STYLE_ATTR_GET_STATE(attr_goal);
} }
} }
@@ -598,12 +594,12 @@ int16_t _lv_style_get_opa(const lv_style_t * style, lv_style_property_t prop, vo
else { else {
_lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(lv_opa_t)); _lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(lv_opa_t));
lv_style_attr_t attr_act; lv_style_attr_t attr_act;
attr_act.full = style->map[id + 1]; attr_act = get_style_prop_attr(style, id);
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_goal.full = (prop >> 8) & 0xFF; attr_goal = (prop >> 8) & 0xFF;
return attr_act.bits.state & attr_goal.bits.state; return LV_STYLE_ATTR_GET_STATE(attr_act) & LV_STYLE_ATTR_GET_STATE(attr_goal);
} }
} }
@@ -632,12 +628,12 @@ int16_t _lv_style_get_color(const lv_style_t * style, lv_style_property_t prop,
else { else {
_lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(lv_color_t)); _lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(lv_color_t));
lv_style_attr_t attr_act; lv_style_attr_t attr_act;
attr_act.full = style->map[id + 1]; attr_act = get_style_prop_attr(style, id);
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_goal.full = (prop >> 8) & 0xFF; attr_goal = (prop >> 8) & 0xFF;
return attr_act.bits.state & attr_goal.bits.state; return LV_STYLE_ATTR_GET_STATE(attr_act) & LV_STYLE_ATTR_GET_STATE(attr_goal);
} }
} }
@@ -667,12 +663,12 @@ int16_t _lv_style_get_ptr(const lv_style_t * style, lv_style_property_t prop, vo
else { else {
_lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(const void *)); _lv_memcpy_small(res, &style->map[id + sizeof(lv_style_property_t)], sizeof(const void *));
lv_style_attr_t attr_act; lv_style_attr_t attr_act;
attr_act.full = style->map[id + 1]; attr_act = get_style_prop_attr(style, id);
lv_style_attr_t attr_goal; lv_style_attr_t attr_goal;
attr_goal.full = (prop >> 8) & 0xFF; attr_goal = (prop >> 8) & 0xFF;
return attr_act.bits.state & attr_goal.bits.state; return LV_STYLE_ATTR_GET_STATE(attr_act) & LV_STYLE_ATTR_GET_STATE(attr_goal);
} }
} }
@@ -820,8 +816,8 @@ lv_res_t _lv_style_list_get_int(lv_style_list_t * list, lv_style_property_t prop
if(list->style_list == NULL) return LV_RES_INV; if(list->style_list == NULL) return LV_RES_INV;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop >> 8; attr = prop >> 8;
int16_t weight_goal = attr.full; int16_t weight_goal = attr;
int16_t weight = -1; int16_t weight = -1;
@@ -872,8 +868,8 @@ lv_res_t _lv_style_list_get_color(lv_style_list_t * list, lv_style_property_t pr
if(list->style_list == NULL) return LV_RES_INV; if(list->style_list == NULL) return LV_RES_INV;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop >> 8; attr = prop >> 8;
int16_t weight_goal = attr.full; int16_t weight_goal = attr;
int16_t weight = -1; int16_t weight = -1;
@@ -922,8 +918,8 @@ lv_res_t _lv_style_list_get_opa(lv_style_list_t * list, lv_style_property_t prop
if(list->style_list == NULL) return LV_RES_INV; if(list->style_list == NULL) return LV_RES_INV;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop >> 8; attr = prop >> 8;
int16_t weight_goal = attr.full; int16_t weight_goal = attr;
int16_t weight = -1; int16_t weight = -1;
@@ -972,8 +968,8 @@ lv_res_t _lv_style_list_get_ptr(lv_style_list_t * list, lv_style_property_t prop
if(list->style_list == NULL) return LV_RES_INV; if(list->style_list == NULL) return LV_RES_INV;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = prop >> 8; attr = prop >> 8;
int16_t weight_goal = attr.full; int16_t weight_goal = attr;
int16_t weight = -1; int16_t weight = -1;
@@ -1003,6 +999,45 @@ lv_res_t _lv_style_list_get_ptr(lv_style_list_t * list, lv_style_property_t prop
else return LV_RES_INV; else return LV_RES_INV;
} }
/**
* Check whether a style is valid (initialized correctly)
* @param style pointer to a style
* @return true: valid
*/
bool lv_debug_check_style(const lv_style_t * style)
{
if(style == NULL) return true; /*NULL style is still valid*/
#if LV_USE_ASSERT_STYLE
if(style->sentinel != LV_DEBUG_STYLE_SENTINEL_VALUE) {
LV_LOG_WARN("Invalid style (local variable or not initialized?)");
return false;
}
#endif
return true;
}
/**
* Check whether a style list is valid (initialized correctly)
* @param style pointer to a style
* @return true: valid
*/
bool lv_debug_check_style_list(const lv_style_list_t * list)
{
if(list == NULL) return true; /*NULL list is still valid*/
#if LV_USE_ASSERT_STYLE
if(list->sentinel != LV_DEBUG_STYLE_LIST_SENTINEL_VALUE) {
LV_LOG_WARN("Invalid style (local variable or not initialized?)");
return false;
}
#endif
return true;
}
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
@@ -1023,40 +1058,36 @@ LV_ATTRIBUTE_FAST_MEM static inline int32_t get_property_index(const lv_style_t
uint8_t id_to_find = prop & 0xFF; uint8_t id_to_find = prop & 0xFF;
lv_style_attr_t attr; lv_style_attr_t attr;
attr.full = (prop >> 8) & 0xFF; attr = (prop >> 8) & 0xFF;
int16_t weight = -1; int16_t weight = -1;
int16_t id_guess = -1; int16_t id_guess = -1;
size_t i = 0; size_t i = 0;
while(style->map[i] != _LV_STYLE_CLOSEING_PROP) {
if(style->map[i] == id_to_find) { uint8_t prop_id;
while((prop_id = get_style_prop_id(style, i)) != _LV_STYLE_CLOSEING_PROP) {
if(prop_id == id_to_find) {
lv_style_attr_t attr_i; lv_style_attr_t attr_i;
attr_i.full = style->map[i + 1]; attr_i = get_style_prop_attr(style, i);
/*If the state perfectly matches return this property*/ /*If the state perfectly matches return this property*/
if(attr_i.bits.state == attr.bits.state) { if(LV_STYLE_ATTR_GET_STATE(attr_i) == LV_STYLE_ATTR_GET_STATE(attr)) {
return i; return i;
} }
/* Be sure the property not specifies other state than the requested. /* Be sure the property not specifies other state than the requested.
* E.g. For HOVER+PRESS, HOVER only is OK, but HOVER+FOCUS not*/ * E.g. For HOVER+PRESS, HOVER only is OK, but HOVER+FOCUS not*/
else if((attr_i.bits.state & (~attr.bits.state)) == 0) { else if((LV_STYLE_ATTR_GET_STATE(attr_i) & (~LV_STYLE_ATTR_GET_STATE(attr))) == 0) {
/* Use this property if it describes better the requested state than the current candidate. /* Use this property if it describes better the requested state than the current candidate.
* E.g. for HOVER+FOCUS+PRESS prefer HOVER+FOCUS over FOCUS*/ * E.g. for HOVER+FOCUS+PRESS prefer HOVER+FOCUS over FOCUS*/
if(attr_i.bits.state > weight) { if(LV_STYLE_ATTR_GET_STATE(attr_i) > weight) {
weight = attr_i.bits.state; weight = LV_STYLE_ATTR_GET_STATE(attr_i);
id_guess = i; id_guess = i;
} }
} }
} }
/*Go to the next property*/ i = get_next_prop_index(prop_id, i);
if((style->map[i] & 0xF) < LV_STYLE_ID_COLOR) i += sizeof(lv_style_int_t);
else if((style->map[i] & 0xF) < LV_STYLE_ID_OPA) i += sizeof(lv_color_t);
else if((style->map[i] & 0xF) < LV_STYLE_ID_PTR) i += sizeof(lv_opa_t);
else i += sizeof(const void *);
i += sizeof(lv_style_property_t);
} }
return id_guess; return id_guess;
@@ -1081,9 +1112,85 @@ static lv_style_t * get_alloc_local_style(lv_style_list_t * list)
} }
lv_style_init(local_style); lv_style_init(local_style);
/*Add the local style to the furst place*/ /*Add the local style to the first place*/
_lv_style_list_add_style(list, local_style); _lv_style_list_add_style(list, local_style);
list->has_local = 1; list->has_local = 1;
return local_style; return local_style;
} }
/**
* Resizes a style map. Useful entry point for debugging.
* @param style pointer to the style to be resized.
* @param size new size
*/
static inline void style_resize(lv_style_t * style, size_t sz)
{
style->map = lv_mem_realloc(style->map, sz);
}
/**
* Get style property in index.
* @param style pointer to style.
* @param idx index of the style in style->map
* @return property in style->map + idx
*/
static inline lv_style_property_t get_style_prop(const lv_style_t * style, size_t idx)
{
lv_style_property_t prop;
uint8_t * prop_p = (uint8_t *)&prop;
prop_p[0] = style->map[idx];
prop_p[1] = style->map[idx + 1];
return prop;
}
/**
* Get style property id in index.
* @param style pointer to style.
* @param idx index of the style in style->map
* @return id of property in style->map + idx
*/
static inline uint8_t get_style_prop_id(const lv_style_t * style, size_t idx)
{
return get_style_prop(style, idx) & 0xFF;
}
/**
* Get style property attributes for index.
* @param style pointer to style.
* @param idx index of the style in style->map
* @return attribute of property in style->map + idx
*/
static inline uint8_t get_style_prop_attr(const lv_style_t * style, size_t idx)
{
return ((get_style_prop(style, idx) >> 8) & 0xFFU);
}
/**
* Get property size.
* @param prop_id property id.
* @param idx index of the style in style->map
* @return attribute of property in style->map + idx
*/
static inline size_t get_prop_size(uint8_t prop_id)
{
prop_id &= 0xF;
size_t size = sizeof(lv_style_property_t);
if(prop_id < LV_STYLE_ID_COLOR) size += sizeof(lv_style_int_t);
else if(prop_id < LV_STYLE_ID_OPA) size += sizeof(lv_color_t);
else if(prop_id < LV_STYLE_ID_PTR) size += sizeof(lv_opa_t);
else size += sizeof(const void *);
return size;
}
/**
* Get next property index, given current property and index.
* @param prop_id property id.
* @param idx index of the style in style->map
* @return index of next property in style->map
*/
static inline size_t get_next_prop_index(uint8_t prop_id, size_t idx)
{
return idx + get_prop_size(prop_id);
}

View File

@@ -19,6 +19,7 @@ extern "C" {
#include "../lv_misc/lv_area.h" #include "../lv_misc/lv_area.h"
#include "../lv_misc/lv_anim.h" #include "../lv_misc/lv_anim.h"
#include "../lv_misc/lv_types.h" #include "../lv_misc/lv_types.h"
#include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw_blend.h" #include "../lv_draw/lv_draw_blend.h"
/********************* /*********************
@@ -80,13 +81,10 @@ enum {
typedef uint8_t lv_text_decor_t; typedef uint8_t lv_text_decor_t;
typedef union { typedef uint8_t lv_style_attr_t;
struct {
uint8_t state : 7; /* To which state the property refers to*/ #define LV_STYLE_ATTR_GET_INHERIT(f) ((f)&0x80)
uint8_t inherit : 1; /*1: The property can be inherited*/ #define LV_STYLE_ATTR_GET_STATE(f) ((f)&0x7F)
} bits;
uint8_t full;
} lv_style_attr_t;
#define LV_STYLE_ID_VALUE 0x0 /*max 9 pcs*/ #define LV_STYLE_ID_VALUE 0x0 /*max 9 pcs*/
#define LV_STYLE_ID_COLOR 0x9 /*max 3 pcs*/ #define LV_STYLE_ID_COLOR 0x9 /*max 3 pcs*/
@@ -101,7 +99,7 @@ enum {
LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_WIDTH, 0x0, LV_STYLE_ID_VALUE + 4, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_WIDTH, 0x0, LV_STYLE_ID_VALUE + 4, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_HEIGHT, 0x0, LV_STYLE_ID_VALUE + 5, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_HEIGHT, 0x0, LV_STYLE_ID_VALUE + 5, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_ANGLE, 0x0, LV_STYLE_ID_VALUE + 6, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_ANGLE, 0x0, LV_STYLE_ID_VALUE + 6, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_ZOOM, 0x0, LV_STYLE_ID_VALUE + 7, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_TRANSFORM_ZOOM, 0x0, LV_STYLE_ID_VALUE + 7, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_OPA_SCALE, 0x0, LV_STYLE_ID_OPA + 0, LV_STYLE_ATTR_INHERIT), LV_STYLE_PROP_INIT(LV_STYLE_OPA_SCALE, 0x0, LV_STYLE_ID_OPA + 0, LV_STYLE_ATTR_INHERIT),
LV_STYLE_PROP_INIT(LV_STYLE_PAD_TOP, 0x1, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_PAD_TOP, 0x1, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_NONE),
@@ -136,8 +134,8 @@ enum {
LV_STYLE_PROP_INIT(LV_STYLE_OUTLINE_OPA, 0x4, LV_STYLE_ID_OPA + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_OUTLINE_OPA, 0x4, LV_STYLE_ID_OPA + 0, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_WIDTH, 0x5, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_WIDTH, 0x5, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_OFS_X, 0x5, LV_STYLE_ID_VALUE + 1, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_OFS_X, 0x5, LV_STYLE_ID_VALUE + 1, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_OFS_Y, 0x5, LV_STYLE_ID_VALUE + 2, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_OFS_Y, 0x5, LV_STYLE_ID_VALUE + 2, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_SPREAD, 0x5, LV_STYLE_ID_VALUE + 3, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_SPREAD, 0x5, LV_STYLE_ID_VALUE + 3, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_BLEND_MODE, 0x5, LV_STYLE_ID_VALUE + 4, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_BLEND_MODE, 0x5, LV_STYLE_ID_VALUE + 4, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_COLOR, 0x5, LV_STYLE_ID_COLOR + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SHADOW_COLOR, 0x5, LV_STYLE_ID_COLOR + 0, LV_STYLE_ATTR_NONE),
@@ -193,12 +191,12 @@ enum {
LV_STYLE_PROP_INIT(LV_STYLE_TRANSITION_PROP_6, 0xB, LV_STYLE_ID_VALUE + 7, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_TRANSITION_PROP_6, 0xB, LV_STYLE_ID_VALUE + 7, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_TRANSITION_PATH, 0xB, LV_STYLE_ID_PTR + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_TRANSITION_PATH, 0xB, LV_STYLE_ID_PTR + 0, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SCALE_WIDTH, 0xC, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SCALE_WIDTH, 0xC, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SCALE_BORDER_WIDTH, 0xC, LV_STYLE_ID_VALUE + 1, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SCALE_BORDER_WIDTH, 0xC, LV_STYLE_ID_VALUE + 1, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SCALE_END_BORDER_WIDTH, 0xC, LV_STYLE_ID_VALUE + 2, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SCALE_END_BORDER_WIDTH, 0xC, LV_STYLE_ID_VALUE + 2, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SCALE_END_LINE_WIDTH, 0xC, LV_STYLE_ID_VALUE + 3, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SCALE_END_LINE_WIDTH, 0xC, LV_STYLE_ID_VALUE + 3, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SCALE_GRAD_COLOR, 0xC, LV_STYLE_ID_COLOR + 0, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SCALE_GRAD_COLOR, 0xC, LV_STYLE_ID_COLOR + 0, LV_STYLE_ATTR_NONE),
LV_STYLE_PROP_INIT(LV_STYLE_SCALE_END_COLOR, 0xC, LV_STYLE_ID_COLOR + 1, LV_STYLE_ATTR_NONE), LV_STYLE_PROP_INIT(LV_STYLE_SCALE_END_COLOR, 0xC, LV_STYLE_ID_COLOR + 1, LV_STYLE_ATTR_NONE),
}; };
typedef uint16_t lv_style_property_t; typedef uint16_t lv_style_property_t;
@@ -541,6 +539,19 @@ lv_res_t _lv_style_list_get_opa(lv_style_list_t * list, lv_style_property_t prop
*/ */
lv_res_t _lv_style_list_get_ptr(lv_style_list_t * list, lv_style_property_t prop, const void ** res); lv_res_t _lv_style_list_get_ptr(lv_style_list_t * list, lv_style_property_t prop, const void ** res);
/**
* Check whether a style is valid (initialized correctly)
* @param style pointer to a style
* @return true: valid
*/
bool lv_debug_check_style(const lv_style_t * style);
/**
* Check whether a style list is valid (initialized correctly)
* @param style pointer to a style
* @return true: valid
*/
bool lv_debug_check_style_list(const lv_style_list_t * list);
/************************* /*************************
* GLOBAL VARIABLES * GLOBAL VARIABLES
@@ -562,6 +573,34 @@ lv_res_t _lv_style_list_get_ptr(lv_style_list_t * list, lv_style_property_t prop
#define LV_STYLE_CREATE(name, copy_p) static lv_style_t name; lv_style_init(&name); lv_style_copy(&name, copy); #define LV_STYLE_CREATE(name, copy_p) static lv_style_t name; lv_style_init(&name); lv_style_copy(&name, copy);
#if LV_USE_DEBUG
# ifndef LV_DEBUG_IS_STYLE
# define LV_DEBUG_IS_STYLE(style_p) (lv_debug_check_style(style_p))
# endif
# ifndef LV_DEBUG_IS_STYLE_LIST
# define LV_DEBUG_IS_STYLE_LIST(list_p) (lv_debug_check_style_list(list_p))
# endif
# if LV_USE_ASSERT_STYLE
# ifndef LV_ASSERT_STYLE
# define LV_ASSERT_STYLE(style_p) LV_DEBUG_ASSERT(LV_DEBUG_IS_STYLE(style_p), "Invalid style", style_p);
# endif
# ifndef LV_ASSERT_STYLE_LIST
# define LV_ASSERT_STYLE_LIST(list_p) LV_DEBUG_ASSERT(LV_DEBUG_IS_STYLE_LIST(list_p), "Invalid style list", list_p);
# endif
# else
# define LV_ASSERT_STYLE(style_p) true
# define LV_ASSERT_STYLE_LIST(list_p) true
# endif
#else
# define LV_ASSERT_STYLE(p) true
# define LV_ASSERT_STYLE_LIST(p) true
#endif
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -60,6 +60,10 @@ static inline lv_color_t color_blend_true_color_subtractive(lv_color_t fg, lv_co
* STATIC VARIABLES * STATIC VARIABLES
**********************/ **********************/
#if LV_USE_GPU || LV_USE_GPU_STM32_DMA2D
LV_ATTRIBUTE_DMA static lv_color_t blend_buf[LV_HOR_RES_MAX];
#endif
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/
@@ -267,8 +271,10 @@ static void fill_set_px(const lv_area_t * disp_area, lv_color_t * disp_buf, con
for(y = draw_area->y1; y <= draw_area->y2; y++) { for(y = draw_area->y1; y <= draw_area->y2; y++) {
for(x = draw_area->x1; x <= draw_area->x2; x++) { for(x = draw_area->x1; x <= draw_area->x2; x++) {
disp->driver.set_px_cb(&disp->driver, (void *)disp_buf, disp_w, x, y, color, if(mask_tmp[x]) {
(uint32_t)((uint32_t)opa * mask_tmp[x]) >> 8); disp->driver.set_px_cb(&disp->driver, (void *)disp_buf, disp_w, x, y, color,
(uint32_t)((uint32_t)opa * mask_tmp[x]) >> 8);
}
} }
mask_tmp += draw_area_w; mask_tmp += draw_area_w;
} }
@@ -336,7 +342,6 @@ LV_ATTRIBUTE_FAST_MEM static void fill_normal(const lv_area_t * disp_area, lv_co
else { else {
#if LV_USE_GPU #if LV_USE_GPU
if(disp->driver.gpu_blend_cb && lv_area_get_size(draw_area) > GPU_SIZE_LIMIT) { if(disp->driver.gpu_blend_cb && lv_area_get_size(draw_area) > GPU_SIZE_LIMIT) {
static lv_color_t blend_buf[LV_HOR_RES_MAX];
for(x = 0; x < draw_area_w ; x++) blend_buf[x].full = color.full; for(x = 0; x < draw_area_w ; x++) blend_buf[x].full = color.full;
for(y = draw_area->y1; y <= draw_area->y2; y++) { for(y = draw_area->y1; y <= draw_area->y2; y++) {
@@ -350,7 +355,6 @@ LV_ATTRIBUTE_FAST_MEM static void fill_normal(const lv_area_t * disp_area, lv_co
#if LV_USE_GPU_STM32_DMA2D #if LV_USE_GPU_STM32_DMA2D
if(lv_area_get_size(draw_area) >= 240) { if(lv_area_get_size(draw_area) >= 240) {
static lv_color_t blend_buf[LV_HOR_RES_MAX] = {0};
if(blend_buf[0].full != color.full) lv_color_fill(blend_buf, color, LV_HOR_RES_MAX); if(blend_buf[0].full != color.full) lv_color_fill(blend_buf, color, LV_HOR_RES_MAX);
lv_coord_t line_h = LV_HOR_RES_MAX / draw_area_w; lv_coord_t line_h = LV_HOR_RES_MAX / draw_area_w;
@@ -643,8 +647,10 @@ static void map_set_px(const lv_area_t * disp_area, lv_color_t * disp_buf, cons
for(y = draw_area->y1; y <= draw_area->y2; y++) { for(y = draw_area->y1; y <= draw_area->y2; y++) {
for(x = draw_area->x1; x <= draw_area->x2; x++) { for(x = draw_area->x1; x <= draw_area->x2; x++) {
disp->driver.set_px_cb(&disp->driver, (void *)disp_buf, disp_w, x, y, map_buf_tmp[x], if(mask_tmp[x]) {
(uint32_t)((uint32_t)opa * mask_tmp[x]) >> 8); disp->driver.set_px_cb(&disp->driver, (void *)disp_buf, disp_w, x, y, map_buf_tmp[x],
(uint32_t)((uint32_t)opa * mask_tmp[x]) >> 8);
}
} }
mask_tmp += draw_area_w; mask_tmp += draw_area_w;
map_buf_tmp += map_w; map_buf_tmp += map_w;

View File

@@ -458,9 +458,9 @@ LV_ATTRIBUTE_FAST_MEM static void lv_draw_map(const lv_area_t * map_area, const
/*Most complicated case: transform or other mask or chroma keyed*/ /*Most complicated case: transform or other mask or chroma keyed*/
else { else {
/*Build the image and a mask line-by-line*/ /*Build the image and a mask line-by-line*/
uint32_t mask_buf_size = lv_area_get_size(&draw_area) > LV_HOR_RES_MAX ? LV_HOR_RES_MAX : lv_area_get_size(&draw_area); uint32_t mask_buf_size = lv_area_get_size(&draw_area) > LV_HOR_RES_MAX ? LV_HOR_RES_MAX : lv_area_get_size(&draw_area);
lv_color_t * map2 = _lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t)); lv_color_t * map2 = _lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t));
lv_opa_t * mask_buf = _lv_mem_buf_get(mask_buf_size); lv_opa_t * mask_buf = _lv_mem_buf_get(mask_buf_size);
#if LV_USE_IMG_TRANSFORM #if LV_USE_IMG_TRANSFORM
lv_img_transform_dsc_t trans_dsc; lv_img_transform_dsc_t trans_dsc;
@@ -548,7 +548,9 @@ LV_ATTRIBUTE_FAST_MEM static void lv_draw_map(const lv_area_t * map_area, const
mask_buf[px_i] = 0xFF; mask_buf[px_i] = 0xFF;
} }
#if LV_COLOR_DEPTH == 8 #if LV_COLOR_DEPTH == 1
c.full = map_px[0];
#elif LV_COLOR_DEPTH == 8
c.full = map_px[0]; c.full = map_px[0];
#elif LV_COLOR_DEPTH == 16 #elif LV_COLOR_DEPTH == 16
c.full = map_px[0] + (map_px[1] << 8); c.full = map_px[0] + (map_px[1] << 8);

View File

@@ -11,7 +11,7 @@
#include "../lv_hal/lv_hal_disp.h" #include "../lv_hal/lv_hal_disp.h"
#include "../lv_core/lv_refr.h" #include "../lv_core/lv_refr.h"
#include "../lv_misc/lv_bidi.h" #include "../lv_misc/lv_bidi.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
/********************* /*********************
* DEFINES * DEFINES
@@ -206,10 +206,10 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label(const lv_area_t * coords, const lv_area
lv_opa_t opa = dsc->opa; lv_opa_t opa = dsc->opa;
uint16_t sel_start = dsc->sel_start; uint32_t sel_start = dsc->sel_start;
uint16_t sel_end = dsc->sel_end; uint32_t sel_end = dsc->sel_end;
if(sel_start > sel_end) { if(sel_start > sel_end) {
uint16_t tmp = sel_start; uint32_t tmp = sel_start;
sel_start = sel_end; sel_start = sel_end;
sel_end = tmp; sel_end = tmp;
} }
@@ -225,7 +225,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label(const lv_area_t * coords, const lv_area
cmd_state_t cmd_state = CMD_STATE_WAIT; cmd_state_t cmd_state = CMD_STATE_WAIT;
uint32_t i; uint32_t i;
uint16_t par_start = 0; uint32_t par_start = 0;
lv_color_t recolor; lv_color_t recolor;
int32_t letter_w; int32_t letter_w;
@@ -250,11 +250,11 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label(const lv_area_t * coords, const lv_area
#endif #endif
while(i < line_end - line_start) { while(i < line_end - line_start) {
uint16_t logical_char_pos = 0; uint32_t logical_char_pos = 0;
if(sel_start != 0xFFFF && sel_end != 0xFFFF) { if(sel_start != 0xFFFF && sel_end != 0xFFFF) {
#if LV_USE_BIDI #if LV_USE_BIDI
logical_char_pos = _lv_txt_encoded_get_char_id(txt, line_start); logical_char_pos = _lv_txt_encoded_get_char_id(txt, line_start);
uint16_t t = _lv_txt_encoded_get_char_id(bidi_txt, i); uint32_t t = _lv_txt_encoded_get_char_id(bidi_txt, i);
logical_char_pos += _lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, dsc->bidi_dir, t, NULL); logical_char_pos += _lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, dsc->bidi_dir, t, NULL);
#else #else
logical_char_pos = _lv_txt_encoded_get_char_id(txt, line_start + i); logical_char_pos = _lv_txt_encoded_get_char_id(txt, line_start + i);
@@ -758,7 +758,7 @@ static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_
} }
/*Go to the next column*/ /*Go to the next column*/
if(col_bit < (int32_t) (8 - bpp)) { if(col_bit < (int32_t)(8 - bpp)) {
col_bit += bpp; col_bit += bpp;
bitmask = bitmask >> bpp; bitmask = bitmask >> bpp;
} }

View File

@@ -33,8 +33,8 @@ typedef struct {
lv_opa_t opa; lv_opa_t opa;
lv_style_int_t line_space; lv_style_int_t line_space;
lv_style_int_t letter_space; lv_style_int_t letter_space;
uint16_t sel_start; uint32_t sel_start;
uint16_t sel_end; uint32_t sel_end;
lv_coord_t ofs_x; lv_coord_t ofs_x;
lv_coord_t ofs_y; lv_coord_t ofs_y;
lv_bidi_dir_t bidi_dir; lv_bidi_dir_t bidi_dir;

View File

@@ -13,7 +13,7 @@
#include "lv_draw_mask.h" #include "lv_draw_mask.h"
#include "../lv_misc/lv_math.h" #include "../lv_misc/lv_math.h"
#include "../lv_misc/lv_log.h" #include "../lv_misc/lv_log.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_misc/lv_gc.h" #include "../lv_misc/lv_gc.h"
#if defined(LV_GC_INCLUDE) #if defined(LV_GC_INCLUDE)
@@ -95,12 +95,12 @@ int16_t lv_draw_mask_add(void * param, void * custom_id)
} }
/** /**
* Apply the added buffers on a line. Used internally by the library's drawing routins. * Apply the added buffers on a line. Used internally by the library's drawing routines.
* @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`.
* @param abs_x absolute X coordinate where the line to calculate start * @param abs_x absolute X coordinate where the line to calculate start
* @param abs_y absolute Y coordinate where the line to calculate start * @param abs_y absolute Y coordinate where the line to calculate start
* @param len length of the line to calculate (in pixel count) * @param len length of the line to calculate (in pixel count)
* @return Oneof these values: * @return One of these values:
* - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero
* - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
* - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
@@ -272,8 +272,8 @@ void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t
/** /**
*Initialize a line mask from a point and an angle. *Initialize a line mask from a point and an angle.
* @param param pointer to a `lv_draw_mask_param_t` to initialize * @param param pointer to a `lv_draw_mask_param_t` to initialize
* @param px X coordiante of a point of the line * @param px X coordinate of a point of the line
* @param py X coordiante of a point of the line * @param py X coordinate of a point of the line
* @param angle right 0 deg, bottom: 90 * @param angle right 0 deg, bottom: 90
* @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep.
* With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept
@@ -370,7 +370,7 @@ void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vert
* @param param param pointer to a `lv_draw_mask_param_t` to initialize * @param param param pointer to a `lv_draw_mask_param_t` to initialize
* @param rect coordinates of the rectangle to affect (absolute coordinates) * @param rect coordinates of the rectangle to affect (absolute coordinates)
* @param radius radius of the rectangle * @param radius radius of the rectangle
* @param inv: true: keep the pixels inside teh rectangle; keep teh pixels outside of the rectangle * @param inv: true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle
*/ */
void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv) void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv)
{ {

View File

@@ -190,7 +190,7 @@ int16_t lv_draw_mask_add(void * param, void * custom_id);
* @param abs_x absolute X coordinate where the line to calculate start * @param abs_x absolute X coordinate where the line to calculate start
* @param abs_y absolute Y coordinate where the line to calculate start * @param abs_y absolute Y coordinate where the line to calculate start
* @param len length of the line to calculate (in pixel count) * @param len length of the line to calculate (in pixel count)
* @return Oneof these values: * @return One of these values:
* - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero
* - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
* - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
@@ -245,8 +245,8 @@ void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t
/** /**
*Initialize a line mask from a point and an angle. *Initialize a line mask from a point and an angle.
* @param param pointer to a `lv_draw_mask_param_t` to initialize * @param param pointer to a `lv_draw_mask_param_t` to initialize
* @param px X coordiante of a point of the line * @param px X coordinate of a point of the line
* @param py X coordiante of a point of the line * @param py X coordinate of a point of the line
* @param angle right 0 deg, bottom: 90 * @param angle right 0 deg, bottom: 90
* @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep.
* With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept
@@ -271,7 +271,7 @@ void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vert
* @param param param pointer to a `lv_draw_mask_param_t` to initialize * @param param param pointer to a `lv_draw_mask_param_t` to initialize
* @param rect coordinates of the rectangle to affect (absolute coordinates) * @param rect coordinates of the rectangle to affect (absolute coordinates)
* @param radius radius of the rectangle * @param radius radius of the rectangle
* @param inv: true: keep the pixels inside teh rectangle; keep teh pixels outside of the rectangle * @param inv: true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle
*/ */
void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv); void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv);

View File

@@ -11,7 +11,7 @@
#include "lv_draw_mask.h" #include "lv_draw_mask.h"
#include "../lv_misc/lv_math.h" #include "../lv_misc/lv_math.h"
#include "../lv_core/lv_refr.h" #include "../lv_core/lv_refr.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
/********************* /*********************
* DEFINES * DEFINES
@@ -185,10 +185,13 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
/*Create a mask if there is a radius*/ /*Create a mask if there is a radius*/
lv_opa_t * mask_buf = _lv_mem_buf_get(draw_area_w); lv_opa_t * mask_buf = _lv_mem_buf_get(draw_area_w);
lv_grad_dir_t grad_dir = dsc->bg_grad_dir;
if(dsc->bg_color.full == dsc->bg_grad_color.full) grad_dir = LV_GRAD_DIR_NONE;
uint16_t other_mask_cnt = lv_draw_mask_get_cnt(); uint16_t other_mask_cnt = lv_draw_mask_get_cnt();
bool simple_mode = true; bool simple_mode = true;
if(other_mask_cnt) simple_mode = false; if(other_mask_cnt) simple_mode = false;
else if(dsc->bg_grad_dir == LV_GRAD_DIR_HOR) simple_mode = false; else if(grad_dir == LV_GRAD_DIR_HOR) simple_mode = false;
int16_t mask_rout_id = LV_MASK_ID_INV; int16_t mask_rout_id = LV_MASK_ID_INV;
@@ -201,7 +204,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
if(rout > short_side >> 1) rout = short_side >> 1; if(rout > short_side >> 1) rout = short_side >> 1;
/*Most simple case: just a plain rectangle*/ /*Most simple case: just a plain rectangle*/
if(simple_mode && rout == 0 && (dsc->bg_grad_dir == LV_GRAD_DIR_NONE)) { if(simple_mode && rout == 0 && (grad_dir == LV_GRAD_DIR_NONE)) {
_lv_blend_fill(clip, &coords_bg, _lv_blend_fill(clip, &coords_bg,
dsc->bg_color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, dsc->bg_color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa,
dsc->bg_blend_mode); dsc->bg_blend_mode);
@@ -222,7 +225,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
lv_color_t * grad_map = NULL; lv_color_t * grad_map = NULL;
/*In case of horizontal gradient pre-compute a line with a gradient*/ /*In case of horizontal gradient pre-compute a line with a gradient*/
if(dsc->bg_grad_dir == LV_GRAD_DIR_HOR && dsc->bg_color.full != dsc->bg_grad_color.full) { if(grad_dir == LV_GRAD_DIR_HOR) {
grad_map = _lv_mem_buf_get(coords_w * sizeof(lv_color_t)); grad_map = _lv_mem_buf_get(coords_w * sizeof(lv_color_t));
int32_t i; int32_t i;
@@ -267,12 +270,12 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
} }
/*Get the current line color*/ /*Get the current line color*/
if(dsc->bg_grad_dir == LV_GRAD_DIR_VER && dsc->bg_color.full != dsc->bg_grad_color.full) { if(grad_dir == LV_GRAD_DIR_VER) {
grad_color = grad_get(dsc, lv_area_get_height(&coords_bg), y - coords_bg.y1); grad_color = grad_get(dsc, lv_area_get_height(&coords_bg), y - coords_bg.y1);
} }
/* If there is not other mask and drawing the corner area split the drawing to corner and middle areas /* If there is not other mask and drawing the corner area split the drawing to corner and middle areas
* because it the middle mask shuldn't be taken into account (therefore its faster)*/ * because it the middle mask shouldn't be taken into account (therefore its faster)*/
if(simple_mode && split && if(simple_mode && split &&
(y < coords_bg.y1 + rout + 1 || (y < coords_bg.y1 + rout + 1 ||
y > coords_bg.y2 - rout - 1)) { y > coords_bg.y2 - rout - 1)) {
@@ -288,7 +291,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
grad_color, mask_buf, mask_res, opa2, dsc->bg_blend_mode); grad_color, mask_buf, mask_res, opa2, dsc->bg_blend_mode);
/*Center part*/ /*Center part*/
if(dsc->bg_grad_dir == LV_GRAD_DIR_VER) { if(grad_dir == LV_GRAD_DIR_VER) {
fill_area2.x1 = coords_bg.x1 + rout; fill_area2.x1 = coords_bg.x1 + rout;
fill_area2.x2 = coords_bg.x2 - rout; fill_area2.x2 = coords_bg.x2 - rout;
_lv_blend_fill(clip, &fill_area2, _lv_blend_fill(clip, &fill_area2,
@@ -307,10 +310,10 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
} }
else { else {
if(dsc->bg_grad_dir == LV_GRAD_DIR_HOR) { if(grad_dir == LV_GRAD_DIR_HOR) {
_lv_blend_map(clip, &fill_area, grad_map, mask_buf, mask_res, opa2, dsc->bg_blend_mode); _lv_blend_map(clip, &fill_area, grad_map, mask_buf, mask_res, opa2, dsc->bg_blend_mode);
} }
else if(dsc->bg_grad_dir == LV_GRAD_DIR_VER) { else if(grad_dir == LV_GRAD_DIR_VER) {
_lv_blend_fill(clip, &fill_area, _lv_blend_fill(clip, &fill_area,
grad_color, mask_buf, mask_res, opa2, dsc->bg_blend_mode); grad_color, mask_buf, mask_res, opa2, dsc->bg_blend_mode);
} }
@@ -323,7 +326,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_bg(const lv_area_t * coords, const lv_are
fill_area.y2++; fill_area.y2++;
} }
if(dsc->bg_grad_dir == LV_GRAD_DIR_NONE && other_mask_cnt == 0 && split) { if(grad_dir == LV_GRAD_DIR_NONE && other_mask_cnt == 0 && split) {
/*Central part*/ /*Central part*/
fill_area.x1 = coords_bg.x1 + rout; fill_area.x1 = coords_bg.x1 + rout;
fill_area.x2 = coords_bg.x2 - rout; fill_area.x2 = coords_bg.x2 - rout;
@@ -1044,7 +1047,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(const lv_area_t * coords, const lv
if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED;
_lv_blend_fill(clip, &fa, dsc->shadow_color, mask_buf, _lv_blend_fill(clip, &fa, dsc->shadow_color, mask_buf,
mask_res, LV_OPA_COVER, dsc->shadow_blend_mode); mask_res, LV_OPA_COVER, dsc->shadow_blend_mode);
fa.y1++; fa.y1++;
fa.y2++; fa.y2++;
} }
@@ -1108,7 +1111,7 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coord
_lv_mem_buf_release(mask_line); _lv_mem_buf_release(mask_line);
if(sw == 1) { if(sw == 1) {
uint32_t i; int32_t i;
lv_opa_t * res_buf = (lv_opa_t *)sh_buf; lv_opa_t * res_buf = (lv_opa_t *)sh_buf;
for(i = 0; i < size * size; i++) { for(i = 0; i < size * size; i++) {
res_buf[i] = (sh_buf[i] >> SHADOW_UPSACALE_SHIFT); res_buf[i] = (sh_buf[i] >> SHADOW_UPSACALE_SHIFT);
@@ -1137,7 +1140,7 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coord
shadow_blur_corner(size, sw, sh_buf); shadow_blur_corner(size, sw, sh_buf);
} }
uint32_t x; int32_t x;
lv_opa_t * res_buf = (lv_opa_t *)sh_buf; lv_opa_t * res_buf = (lv_opa_t *)sh_buf;
for(x = 0; x < size * size; x++) { for(x = 0; x < size * size; x++) {
res_buf[x] = sh_buf[x]; res_buf[x] = sh_buf[x];

View File

@@ -60,7 +60,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t
uint32_t px = dsc->header.w * y * px_size + x * px_size; uint32_t px = dsc->header.w * y * px_size + x * px_size;
_lv_memcpy_small(&p_color, &buf_u8[px], sizeof(lv_color_t)); _lv_memcpy_small(&p_color, &buf_u8[px], sizeof(lv_color_t));
#if LV_COLOR_SIZE == 32 #if LV_COLOR_SIZE == 32
p_color.ch.alpha = 0xFF; /*Only the color should be get so use a deafult alpha value*/ p_color.ch.alpha = 0xFF; /*Only the color should be get so use a default alpha value*/
#endif #endif
} }
else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) {
@@ -414,7 +414,7 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf)
#if LV_USE_IMG_TRANSFORM #if LV_USE_IMG_TRANSFORM
/** /**
* Initialize a descriptor to tranform an image * Initialize a descriptor to transform an image
* @param dsc pointer to an `lv_img_transform_dsc_t` variable whose `cfg` field is initialized * @param dsc pointer to an `lv_img_transform_dsc_t` variable whose `cfg` field is initialized
*/ */
void _lv_img_buf_transform_init(lv_img_transform_dsc_t * dsc) void _lv_img_buf_transform_init(lv_img_transform_dsc_t * dsc)
@@ -471,6 +471,15 @@ void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t
lv_point_t * pivot) lv_point_t * pivot)
{ {
#if LV_USE_IMG_TRANSFORM #if LV_USE_IMG_TRANSFORM
if(angle == 0 && zoom == LV_IMG_ZOOM_NONE) {
res->x1 = 0;
res->y1 = 0;
res->x2 = w - 1;
res->y2 = h - 1;
return;
}
int32_t angle_low = angle / 10; int32_t angle_low = angle / 10;
int32_t angle_hight = angle_low + 1; int32_t angle_hight = angle_low + 1;
int32_t angle_rem = angle - (angle_low * 10); int32_t angle_rem = angle - (angle_low * 10);
@@ -528,8 +537,8 @@ void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t
LV_UNUSED(pivot); LV_UNUSED(pivot);
res->x1 = 0; res->x1 = 0;
res->y1 = 0; res->y1 = 0;
res->x2 = w; res->x2 = w - 1;
res->y2 = h; res->y2 = h - 1;
#endif #endif
} }
@@ -545,7 +554,7 @@ bool _lv_img_buf_transform_anti_alias(lv_img_transform_dsc_t * dsc)
/*Get the fractional part of the source pixel*/ /*Get the fractional part of the source pixel*/
int xs_fract = dsc->tmp.xs & 0xff; int xs_fract = dsc->tmp.xs & 0xff;
int ys_fract = dsc->tmp.ys & 0xff; int ys_fract = dsc->tmp.ys & 0xff;
int32_t xn; /*x neightboor*/ int32_t xn; /*x neighbor*/
lv_opa_t xr; /*x mix ratio*/ lv_opa_t xr; /*x mix ratio*/
if(xs_fract < 0x70) { if(xs_fract < 0x70) {
@@ -563,7 +572,7 @@ bool _lv_img_buf_transform_anti_alias(lv_img_transform_dsc_t * dsc)
xr = 0xFF; xr = 0xFF;
} }
int32_t yn; /*x neightboor*/ int32_t yn; /*x neighbor*/
lv_opa_t yr; /*x mix ratio*/ lv_opa_t yr; /*x mix ratio*/
if(ys_fract < 0x70) { if(ys_fract < 0x70) {

View File

@@ -102,10 +102,26 @@ typedef uint8_t lv_img_cf_t;
/** /**
* LVGL image header * LVGL image header
*/ */
/* The first 8 bit is very important to distinguish the different source types.
* For more info see `lv_img_get_src_type()` in lv_img.c
* On big endian systems the order is reversed so cf and always_zero must be at
* the end of the struct.
* */
#if LV_BIG_ENDIAN_SYSTEM
typedef struct {
uint32_t h : 11; /*Height of the image map*/
uint32_t w : 11; /*Width of the image map*/
uint32_t reserved : 2; /*Reserved to be used later*/
uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a
non-printable character*/
uint32_t cf : 5; /* Color format: See `lv_img_color_format_t`*/
} lv_img_header_t;
#else
typedef struct { typedef struct {
/* The first 8 bit is very important to distinguish the different source types.
* For more info see `lv_img_get_src_type()` in lv_img.c */
uint32_t cf : 5; /* Color format: See `lv_img_color_format_t`*/ uint32_t cf : 5; /* Color format: See `lv_img_color_format_t`*/
uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a
non-printable character*/ non-printable character*/
@@ -115,7 +131,7 @@ typedef struct {
uint32_t w : 11; /*Width of the image map*/ uint32_t w : 11; /*Width of the image map*/
uint32_t h : 11; /*Height of the image map*/ uint32_t h : 11; /*Height of the image map*/
} lv_img_header_t; } lv_img_header_t;
#endif
/** Image header it is compatible with /** Image header it is compatible with
* the result from image converter utility*/ * the result from image converter utility*/

View File

@@ -6,7 +6,7 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "lv_img_cache.h" #include "lv_img_cache.h"
#include "lv_img_decoder.h" #include "lv_img_decoder.h"
#include "lv_draw_img.h" #include "lv_draw_img.h"

View File

@@ -7,7 +7,7 @@
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_img_decoder.h" #include "lv_img_decoder.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw_img.h" #include "../lv_draw/lv_draw_img.h"
#include "../lv_misc/lv_ll.h" #include "../lv_misc/lv_ll.h"
#include "../lv_misc/lv_color.h" #include "../lv_misc/lv_color.h"

View File

@@ -171,6 +171,10 @@ LV_FONT_DECLARE(lv_font_montserrat_30)
LV_FONT_DECLARE(lv_font_montserrat_32) LV_FONT_DECLARE(lv_font_montserrat_32)
#endif #endif
#if LV_FONT_MONTSERRAT_34
LV_FONT_DECLARE(lv_font_montserrat_34)
#endif
#if LV_FONT_MONTSERRAT_36 #if LV_FONT_MONTSERRAT_36
LV_FONT_DECLARE(lv_font_montserrat_36) LV_FONT_DECLARE(lv_font_montserrat_36)
#endif #endif

View File

@@ -8,7 +8,7 @@
*********************/ *********************/
#include "lv_font.h" #include "lv_font.h"
#include "lv_font_fmt_txt.h" #include "lv_font_fmt_txt.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_misc/lv_types.h" #include "../lv_misc/lv_types.h"
#include "../lv_misc/lv_log.h" #include "../lv_misc/lv_log.h"
@@ -214,7 +214,8 @@ static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter)
glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp];
} }
else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) {
uint8_t * p = _lv_utils_bsearch(&rcp, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, uint16_t key = rcp;
uint8_t * p = _lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length,
sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare);
if(p) { if(p) {
@@ -224,7 +225,8 @@ static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter)
} }
} }
else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) {
uint8_t * p = _lv_utils_bsearch(&rcp, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, uint16_t key = rcp;
uint8_t * p = _lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length,
sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare);
if(p) { if(p) {
@@ -384,7 +386,7 @@ static inline void decompress_line(uint8_t * out, lv_coord_t w)
/** /**
* Read bits from an input buffer. The read can cross byte boundary. * Read bits from an input buffer. The read can cross byte boundary.
* @param in the input buffer to read from. * @param in the input buffer to read from.
* @param bit_pos index of teh first bit to read. * @param bit_pos index of the first bit to read.
* @param len number of bits to read (must be <= 8). * @param len number of bits to read (must be <= 8).
* @return the read bits * @return the read bits
*/ */

View File

@@ -135,7 +135,7 @@ typedef struct {
2 Get the class of the left and right glyphs as `left_class` and `right_class` 2 Get the class of the left and right glyphs as `left_class` and `right_class`
left_class = left_class_mapping[glyph_id_left]; left_class = left_class_mapping[glyph_id_left];
right_class = right_class_mapping[glyph_id_right]; right_class = right_class_mapping[glyph_id_right];
3. value = class_pair_values[(left_class-1)*right_class_cnt + (righ_class-1)] 3. value = class_pair_values[(left_class-1)*right_class_cnt + (right_class-1)]
*/ */
const int8_t * class_pair_values; /*left_class_num * right_class_num value*/ const int8_t * class_pair_values; /*left_class_num * right_class_num value*/
@@ -155,7 +155,7 @@ typedef enum {
/*Describe store additional data for fonts */ /*Describe store additional data for fonts */
typedef struct { typedef struct {
/*The bitmaps os all glyphs*/ /*The bitmaps of all glyphs*/
const uint8_t * glyph_bitmap; const uint8_t * glyph_bitmap;
/*Describe the glyphs*/ /*Describe the glyphs*/

View File

@@ -9,7 +9,7 @@ extern "C" {
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
/*------------------------------- /*-------------------------------
* Symbols from FontAwsome font * Symbols from FontAwesome font
*-----------------------------*/ *-----------------------------*/
/* In the font converter use this list as range: /* In the font converter use this list as range:

View File

@@ -11,19 +11,14 @@
#if LV_USE_GPU_STM32_DMA2D #if LV_USE_GPU_STM32_DMA2D
#if defined(STM32F4) #include LV_GPU_DMA2D_CMSIS_INCLUDE
#include "stm32f4xx_hal.h"
#elif defined(STM32F7)
#include "stm32f7xx_hal.h"
#else
#error "Not supported STM32 family to use DMA2D"
#endif
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
#if LV_COLOR_16_SWAP #if LV_COLOR_16_SWAP
// TODO: F7 has red blue swap bit in control register for all layers and output
#error "Can't use DMA2D with LV_COLOR_16_SWAP 1" #error "Can't use DMA2D with LV_COLOR_16_SWAP 1"
#endif #endif
@@ -32,11 +27,9 @@
#endif #endif
#if LV_COLOR_DEPTH == 16 #if LV_COLOR_DEPTH == 16
#define DMA2D_OUTPUT_FORMAT DMA2D_OUTPUT_RGB565 #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_RGB565
#define DMA2D_INPUT_FORMAT DMA2D_INPUT_RGB565
#elif LV_COLOR_DEPTH == 32 #elif LV_COLOR_DEPTH == 32
#define DMA2D_OUTPUT_FORMAT DMA2D_OUTPUT_ARGB8888 #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_ARGB8888
#define DMA2D_INPUT_FORMAT DMA2D_INPUT_ARGB8888
#else #else
/*Can't use GPU with other formats*/ /*Can't use GPU with other formats*/
#endif #endif
@@ -54,7 +47,6 @@ static void dma2d_wait(void);
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
**********************/ **********************/
static DMA2D_HandleTypeDef hdma2d;
/********************** /**********************
* MACROS * MACROS
@@ -64,6 +56,21 @@ static DMA2D_HandleTypeDef hdma2d;
* GLOBAL FUNCTIONS * GLOBAL FUNCTIONS
**********************/ **********************/
/**
* Turn on the peripheral and set output color mode, this only needs to be done once
*/
void lv_gpu_stm32_dma2d_init(void)
{
/* Enable DMA2D clock */
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN;
/* Delay after setting peripheral clock */
volatile uint32_t temp = RCC->AHB1ENR;
/* set output colour mode */
DMA2D->OPFCCR = LV_DMA2D_COLOR_FORMAT;
}
/** /**
* Fill an area in the buffer with a color * Fill an area in the buffer with a color
* @param buf a buffer which should be filled * @param buf a buffer which should be filled
@@ -77,18 +84,16 @@ void lv_gpu_stm32_dma2d_fill(lv_color_t * buf, lv_coord_t buf_w, lv_color_t colo
{ {
invalidate_cache(); invalidate_cache();
hdma2d.Instance = DMA2D; DMA2D->CR = 0x30000;
hdma2d.Init.Mode = DMA2D_R2M; DMA2D->OMAR = (uint32_t)buf;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_FORMAT; /* as input color mode is same as output we don't need to convert here do we? */
hdma2d.Init.OutputOffset = buf_w - fill_w; DMA2D->OCOLR = color.full;
hdma2d.LayerCfg[1].InputAlpha = DMA2D_NO_MODIF_ALPHA; DMA2D->OOR = buf_w - fill_w;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_FORMAT; DMA2D->NLR = (fill_w << DMA2D_NLR_PL_Pos) | (fill_h << DMA2D_NLR_NL_Pos);
hdma2d.LayerCfg[1].InputOffset = 0;
/* start transfer */
DMA2D->CR |= DMA2D_CR_START_Msk;
/* DMA2D Initialization */
HAL_DMA2D_Init(&hdma2d);
HAL_DMA2D_ConfigLayer(&hdma2d, 1);
HAL_DMA2D_Start(&hdma2d, (uint32_t)lv_color_to32(color), (uint32_t)buf, fill_w, fill_h);
dma2d_wait(); dma2d_wait();
} }
@@ -106,6 +111,7 @@ void lv_gpu_stm32_dma2d_fill(lv_color_t * buf, lv_coord_t buf_w, lv_color_t colo
void lv_gpu_stm32_dma2d_fill_mask(lv_color_t * buf, lv_coord_t buf_w, lv_color_t color, const lv_opa_t * mask, void lv_gpu_stm32_dma2d_fill_mask(lv_color_t * buf, lv_coord_t buf_w, lv_color_t color, const lv_opa_t * mask,
lv_opa_t opa, lv_coord_t fill_w, lv_coord_t fill_h) lv_opa_t opa, lv_coord_t fill_w, lv_coord_t fill_h)
{ {
#if 0
invalidate_cache(); invalidate_cache();
/* Configure the DMA2D Mode, Color Mode and line output offset */ /* Configure the DMA2D Mode, Color Mode and line output offset */
@@ -134,6 +140,7 @@ void lv_gpu_stm32_dma2d_fill_mask(lv_color_t * buf, lv_coord_t buf_w, lv_color_t
HAL_DMA2D_ConfigLayer(&hdma2d, 1); HAL_DMA2D_ConfigLayer(&hdma2d, 1);
HAL_DMA2D_BlendingStart(&hdma2d, (uint32_t) mask, (uint32_t) buf, (uint32_t)buf, fill_w, fill_h); HAL_DMA2D_BlendingStart(&hdma2d, (uint32_t) mask, (uint32_t) buf, (uint32_t)buf, fill_w, fill_h);
dma2d_wait(); dma2d_wait();
#endif
} }
/** /**
@@ -141,7 +148,7 @@ void lv_gpu_stm32_dma2d_fill_mask(lv_color_t * buf, lv_coord_t buf_w, lv_color_t
* @param buf a buffer where map should be copied * @param buf a buffer where map should be copied
* @param buf_w width of the buffer in pixels * @param buf_w width of the buffer in pixels
* @param map an "image" to copy * @param map an "image" to copy
* @param map_w width of teh map in pixels * @param map_w width of the map in pixels
* @param copy_w width of the area to copy in pixels (<= buf_w) * @param copy_w width of the area to copy in pixels (<= buf_w)
* @param copy_h height of the area to copy in pixels * @param copy_h height of the area to copy in pixels
* @note `map_w - fill_w` is offset to the next line after copy * @note `map_w - fill_w` is offset to the next line after copy
@@ -151,22 +158,17 @@ void lv_gpu_stm32_dma2d_copy(lv_color_t * buf, lv_coord_t buf_w, const lv_color_
{ {
invalidate_cache(); invalidate_cache();
hdma2d.Instance = DMA2D; DMA2D->CR = 0;
hdma2d.Init.Mode = DMA2D_M2M; /* copy output colour mode, this register controls both input and output colour format */
hdma2d.Init.ColorMode = DMA2D_OUTPUT_FORMAT; DMA2D->FGPFCCR = LV_DMA2D_COLOR_FORMAT;
hdma2d.Init.OutputOffset = buf_w - copy_w; DMA2D->FGMAR = (uint32_t)map;
DMA2D->FGOR = map_w - copy_w;
DMA2D->OMAR = (uint32_t)buf;
DMA2D->OOR = buf_w - copy_w;
DMA2D->NLR = (copy_w << DMA2D_NLR_PL_Pos) | (copy_h << DMA2D_NLR_NL_Pos);
/* Foreground layer */ /* start transfer */
hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; DMA2D->CR |= DMA2D_CR_START_Msk;
hdma2d.LayerCfg[1].InputAlpha = 0xFF;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_FORMAT;
hdma2d.LayerCfg[1].InputOffset = map_w - copy_w;
/* DMA2D Initialization */
HAL_DMA2D_Init(&hdma2d);
HAL_DMA2D_ConfigLayer(&hdma2d, 0);
HAL_DMA2D_ConfigLayer(&hdma2d, 1);
HAL_DMA2D_Start(&hdma2d, (uint32_t)map, (uint32_t)buf, copy_w, copy_h);
dma2d_wait(); dma2d_wait();
} }
@@ -176,7 +178,7 @@ void lv_gpu_stm32_dma2d_copy(lv_color_t * buf, lv_coord_t buf_w, const lv_color_
* @param buf_w width of the buffer in pixels * @param buf_w width of the buffer in pixels
* @param map an "image" to copy * @param map an "image" to copy
* @param opa opacity of `map` * @param opa opacity of `map`
* @param map_w width of teh map in pixels * @param map_w width of the map in pixels
* @param copy_w width of the area to copy in pixels (<= buf_w) * @param copy_w width of the area to copy in pixels (<= buf_w)
* @param copy_h height of the area to copy in pixels * @param copy_h height of the area to copy in pixels
* @note `map_w - fill_w` is offset to the next line after copy * @note `map_w - fill_w` is offset to the next line after copy
@@ -185,28 +187,26 @@ void lv_gpu_stm32_dma2d_blend(lv_color_t * buf, lv_coord_t buf_w, const lv_color
lv_coord_t map_w, lv_coord_t copy_w, lv_coord_t copy_h) lv_coord_t map_w, lv_coord_t copy_w, lv_coord_t copy_h)
{ {
invalidate_cache(); invalidate_cache();
DMA2D->CR = 0x20000;
hdma2d.Instance = DMA2D; DMA2D->BGPFCCR = LV_DMA2D_COLOR_FORMAT;
hdma2d.Init.Mode = DMA2D_M2M_BLEND; DMA2D->BGMAR = (uint32_t)buf;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_FORMAT; DMA2D->BGOR = buf_w - copy_w;
hdma2d.Init.OutputOffset = buf_w - copy_w;
/* Background layer */ DMA2D->FGPFCCR = (uint32_t)LV_DMA2D_COLOR_FORMAT
hdma2d.LayerCfg[0].AlphaMode = DMA2D_NO_MODIF_ALPHA; /* alpha mode 2, replace with foreground * alpha value */
hdma2d.LayerCfg[0].InputColorMode = DMA2D_INPUT_FORMAT; | (2 << DMA2D_FGPFCCR_AM_Pos)
hdma2d.LayerCfg[0].InputOffset = buf_w - copy_w; /* alpha value */
| (opa << DMA2D_FGPFCCR_ALPHA_Pos);
DMA2D->FGMAR = (uint32_t)map;
DMA2D->FGOR = map_w - copy_w;
/* Foreground layer */ DMA2D->OMAR = (uint32_t)buf;
hdma2d.LayerCfg[1].AlphaMode = DMA2D_COMBINE_ALPHA; DMA2D->OOR = buf_w - copy_w;
hdma2d.LayerCfg[1].InputAlpha = opa; DMA2D->NLR = (copy_w << DMA2D_NLR_PL_Pos) | (copy_h << DMA2D_NLR_NL_Pos);
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_FORMAT;
hdma2d.LayerCfg[1].InputOffset = map_w - copy_w;
/* DMA2D Initialization */ /* start transfer */
HAL_DMA2D_Init(&hdma2d); DMA2D->CR |= DMA2D_CR_START_Msk;
HAL_DMA2D_ConfigLayer(&hdma2d, 0);
HAL_DMA2D_ConfigLayer(&hdma2d, 1);
HAL_DMA2D_BlendingStart(&hdma2d, (uint32_t)map, (uint32_t)buf, (uint32_t)buf, copy_w, copy_h);
dma2d_wait(); dma2d_wait();
} }
@@ -226,7 +226,7 @@ static void invalidate_cache(void)
static void dma2d_wait(void) static void dma2d_wait(void)
{ {
lv_disp_t * disp = _lv_refr_get_disp_refreshing(); lv_disp_t * disp = _lv_refr_get_disp_refreshing();
while(HAL_DMA2D_PollForTransfer(&hdma2d, 0) == HAL_TIMEOUT) { while(DMA2D->CR & DMA2D_CR_START_Msk) {
if(disp->driver.wait_cb) disp->driver.wait_cb(&disp->driver); if(disp->driver.wait_cb) disp->driver.wait_cb(&disp->driver);
} }
} }

View File

@@ -20,6 +20,12 @@ extern "C" {
* DEFINES * DEFINES
*********************/ *********************/
#define LV_DMA2D_ARGB8888 0
#define LV_DMA2D_RGB888 1
#define LV_DMA2D_RGB565 2
#define LV_DMA2D_ARGB1555 3
#define LV_DMA2D_ARGB4444 4
/********************** /**********************
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
@@ -28,6 +34,11 @@ extern "C" {
* GLOBAL PROTOTYPES * GLOBAL PROTOTYPES
**********************/ **********************/
/**
* Turn on the peripheral and set output color mode, this only needs to be done once
*/
void lv_gpu_stm32_dma2d_init(void);
/** /**
* Fill an area in the buffer with a color * Fill an area in the buffer with a color
* @param buf a buffer which should be filled * @param buf a buffer which should be filled
@@ -60,7 +71,7 @@ void lv_gpu_stm32_dma2d_fill_mask(lv_color_t * buf, lv_coord_t buf_w, lv_color_t
* @param buf a buffer where map should be copied * @param buf a buffer where map should be copied
* @param buf_w width of the buffer in pixels * @param buf_w width of the buffer in pixels
* @param map an "image" to copy * @param map an "image" to copy
* @param map_w width of teh map in pixels * @param map_w width of the map in pixels
* @param copy_w width of the area to copy in pixels (<= buf_w) * @param copy_w width of the area to copy in pixels (<= buf_w)
* @param copy_h height of the area to copy in pixels * @param copy_h height of the area to copy in pixels
* @note `map_w - fill_w` is offset to the next line after copy * @note `map_w - fill_w` is offset to the next line after copy
@@ -73,7 +84,7 @@ void lv_gpu_stm32_dma2d_copy(lv_color_t * buf, lv_coord_t buf_w, const lv_color_
* @param buf_w width of the buffer in pixels * @param buf_w width of the buffer in pixels
* @param map an "image" to copy * @param map an "image" to copy
* @param opa opacity of `map` * @param opa opacity of `map`
* @param map_w width of teh map in pixels * @param map_w width of the map in pixels
* @param copy_w width of the area to copy in pixels (<= buf_w) * @param copy_w width of the area to copy in pixels (<= buf_w)
* @param copy_h height of the area to copy in pixels * @param copy_h height of the area to copy in pixels
* @note `map_w - fill_w` is offset to the next line after copy * @note `map_w - fill_w` is offset to the next line after copy

View File

@@ -14,7 +14,7 @@
#include "lv_hal.h" #include "lv_hal.h"
#include "../lv_misc/lv_mem.h" #include "../lv_misc/lv_mem.h"
#include "../lv_misc/lv_gc.h" #include "../lv_misc/lv_gc.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_core/lv_obj.h" #include "../lv_core/lv_obj.h"
#include "../lv_core/lv_refr.h" #include "../lv_core/lv_refr.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
@@ -158,6 +158,11 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver)
lv_task_ready(disp->refr_task); /*Be sure the screen will be refreshed immediately on start up*/ lv_task_ready(disp->refr_task); /*Be sure the screen will be refreshed immediately on start up*/
/*Can't handle this case later so add an error*/
if(lv_disp_is_true_double_buf(disp) && disp->driver.set_px_cb) {
LV_LOG_ERROR("Can't handle 2 screen sized buffers with set_px_cb. Display will not be refreshed.");
}
return disp; return disp;
} }

View File

@@ -8,7 +8,7 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_hal/lv_hal_indev.h" #include "../lv_hal/lv_hal_indev.h"
#include "../lv_core/lv_indev.h" #include "../lv_core/lv_indev.h"
#include "../lv_misc/lv_mem.h" #include "../lv_misc/lv_mem.h"
@@ -73,7 +73,7 @@ lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver)
if(driver->disp == NULL) driver->disp = lv_disp_get_default(); if(driver->disp == NULL) driver->disp = lv_disp_get_default();
if(driver->disp == NULL) { if(driver->disp == NULL) {
LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attache the indev to " LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attach the indev to "
"a display"); "a display");
return NULL; return NULL;
} }
@@ -143,6 +143,11 @@ bool _lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data)
else if(indev->driver.type == LV_INDEV_TYPE_KEYPAD) { else if(indev->driver.type == LV_INDEV_TYPE_KEYPAD) {
data->key = indev->proc.types.keypad.last_key; data->key = indev->proc.types.keypad.last_key;
} }
/*For compatibility assume that used button was enter (encoder push) */
else if(indev->driver.type == LV_INDEV_TYPE_ENCODER) {
data->key = LV_KEY_ENTER;
data->enc_diff = 0;
}
if(indev->driver.read_cb) { if(indev->driver.read_cb) {
LV_LOG_TRACE("idnev read started"); LV_LOG_TRACE("idnev read started");

View File

@@ -137,7 +137,7 @@ typedef struct _lv_indev_proc_t {
lv_point_t drag_sum; /*Count the dragged pixels to check LV_INDEV_DEF_DRAG_LIMIT*/ lv_point_t drag_sum; /*Count the dragged pixels to check LV_INDEV_DEF_DRAG_LIMIT*/
lv_point_t drag_throw_vect; lv_point_t drag_throw_vect;
struct _lv_obj_t * act_obj; /*The object being pressed*/ struct _lv_obj_t * act_obj; /*The object being pressed*/
struct _lv_obj_t * last_obj; /*The last obejct which was pressed (used by dragthrow and struct _lv_obj_t * last_obj; /*The last object which was pressed (used by drag_throw and
other post-release event)*/ other post-release event)*/
struct _lv_obj_t * last_pressed; /*The lastly pressed object*/ struct _lv_obj_t * last_pressed; /*The lastly pressed object*/

View File

@@ -56,12 +56,17 @@ LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period)
uint32_t lv_tick_get(void) uint32_t lv_tick_get(void)
{ {
#if LV_TICK_CUSTOM == 0 #if LV_TICK_CUSTOM == 0
/* If `lv_tick_inc` is called from an interrupt while `sys_time` is read
* the result might be corrupted.
* This loop detects if `lv_tick_inc` was called while reading `sys_time`.
* If `tick_irq_flag` was cleared in `lv_tick_inc` try to read again
* until `tick_irq_flag` remains `1`. */
uint32_t result; uint32_t result;
do { do {
tick_irq_flag = 1; tick_irq_flag = 1;
result = sys_time; result = sys_time;
} while(!tick_irq_flag); /*'lv_tick_inc()' clears this flag which can be in an interrupt. } while(!tick_irq_flag); /*Continue until see a non interrupted cycle */
Continue until make a non interrupted cycle */
return result; return result;
#else #else

View File

@@ -11,7 +11,7 @@
#if LV_USE_ANIMATION #if LV_USE_ANIMATION
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_hal/lv_hal_tick.h" #include "../lv_hal/lv_hal_tick.h"
#include "lv_task.h" #include "lv_task.h"
#include "lv_math.h" #include "lv_math.h"
@@ -64,7 +64,7 @@ void _lv_anim_core_init(void)
last_task_run = lv_tick_get(); last_task_run = lv_tick_get();
_lv_anim_task = lv_task_create(anim_task, LV_DISP_DEF_REFR_PERIOD, LV_ANIM_TASK_PRIO, NULL); _lv_anim_task = lv_task_create(anim_task, LV_DISP_DEF_REFR_PERIOD, LV_ANIM_TASK_PRIO, NULL);
anim_mark_list_change(); /*Turn off the animation task*/ anim_mark_list_change(); /*Turn off the animation task*/
anim_list_changed = false; /*The list has not actaully changed*/ anim_list_changed = false; /*The list has not actually changed*/
} }
/** /**
@@ -73,7 +73,6 @@ void _lv_anim_core_init(void)
* lv_anim_t a; * lv_anim_t a;
* lv_anim_init(&a); * lv_anim_init(&a);
* lv_anim_set_...(&a); * lv_anim_set_...(&a);
* lv_anim_craete(&a);
* @param a pointer to an `lv_anim_t` variable to initialize * @param a pointer to an `lv_anim_t` variable to initialize
*/ */
void lv_anim_init(lv_anim_t * a) void lv_anim_init(lv_anim_t * a)
@@ -501,7 +500,7 @@ static void anim_task(lv_task_t * param)
* Called when an animation is ready to do the necessary thinks * Called when an animation is ready to do the necessary thinks
* e.g. repeat, play back, delete etc. * e.g. repeat, play back, delete etc.
* @param a pointer to an animation descriptor * @param a pointer to an animation descriptor
* @return true: animation delete occurred nnd the `LV_GC_ROOT(_lv_anim_ll)` has changed * @return true: animation delete occurred and the `LV_GC_ROOT(_lv_anim_ll)` has changed
* */ * */
static bool anim_ready_handler(lv_anim_t * a) static bool anim_ready_handler(lv_anim_t * a)
{ {
@@ -529,11 +528,11 @@ static bool anim_ready_handler(lv_anim_t * a)
} }
/*If the animation is not deleted then restart it*/ /*If the animation is not deleted then restart it*/
else { else {
a->act_time = -a->repeat_delay; /*Restart the animation*/ a->act_time = -(int32_t)(a->repeat_delay); /*Restart the animation*/
/*Swap the start and end values in play back mode*/ /*Swap the start and end values in play back mode*/
if(a->playback_time != 0) { if(a->playback_time != 0) {
/*If now turning back use the 'playback_pause*/ /*If now turning back use the 'playback_pause*/
if(a->playback_now == 0) a->act_time = -a->playback_delay; if(a->playback_now == 0) a->act_time = -(int32_t)(a->playback_delay);
/*Toggle the play back state*/ /*Toggle the play back state*/
a->playback_now = a->playback_now == 0 ? 1 : 0; a->playback_now = a->playback_now == 0 ? 1 : 0;

View File

@@ -116,7 +116,6 @@ void _lv_anim_core_init(void);
* lv_anim_t a; * lv_anim_t a;
* lv_anim_init(&a); * lv_anim_init(&a);
* lv_anim_set_...(&a); * lv_anim_set_...(&a);
* lv_anim_create(&a);
* @param a pointer to an `lv_anim_t` variable to initialize * @param a pointer to an `lv_anim_t` variable to initialize
*/ */
void lv_anim_init(lv_anim_t * a); void lv_anim_init(lv_anim_t * a);
@@ -160,7 +159,7 @@ static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration)
*/ */
static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay)
{ {
a->act_time = (int32_t)(-delay); a->act_time = -(int32_t)(delay);
} }
/** /**

View File

@@ -44,7 +44,7 @@ struct _lv_obj_t;
/** /**
* Call an asynchronous function the next time lv_task_handler() is run. This function is likely to return * Call an asynchronous function the next time lv_task_handler() is run. This function is likely to return
* **before** the call actually happens! * **before** the call actually happens!
* @param task_xcb a callback which is the task itself. * @param async_xcb a callback which is the task itself.
* (the 'x' in the argument name indicates that its not a fully generic function because it not follows * (the 'x' in the argument name indicates that its not a fully generic function because it not follows
* the `func_name(object, callback, ...)` convention) * the `func_name(object, callback, ...)` convention)
* @param user_data custom parameter * @param user_data custom parameter

View File

@@ -130,8 +130,8 @@ lv_bidi_dir_t _lv_bidi_detect_base_dir(const char * txt)
* Can be `NULL` is unused * Can be `NULL` is unused
* @param len length of the line in character count * @param len length of the line in character count
* @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` * @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL`
* @param vicual_pos the visual character position which logical position should be get * @param visual_pos the visual character position which logical position should be get
* @param is_rtl tell the the char at `viasual_pos` is RTL or LTR context * @param is_rtl tell the the char at `visual_pos` is RTL or LTR context
* @return the logical character position * @return the logical character position
*/ */
uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_bidi_dir_t base_dir, uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_bidi_dir_t base_dir,
@@ -207,7 +207,7 @@ uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t
* Bidi process a paragraph of text * Bidi process a paragraph of text
* @param str_in the string to process * @param str_in the string to process
* @param str_out store the result here * @param str_out store the result here
* @param len length of teh text * @param len length of the text
* @param base_dir base dir of the text * @param base_dir base dir of the text
* @param pos_conv_out an `uint16_t` array to store the related logical position of the character. * @param pos_conv_out an `uint16_t` array to store the related logical position of the character.
* Can be `NULL` is unused * Can be `NULL` is unused

View File

@@ -71,8 +71,8 @@ lv_bidi_dir_t _lv_bidi_detect_base_dir(const char * txt);
* Can be `NULL` is unused * Can be `NULL` is unused
* @param len length of the line in character count * @param len length of the line in character count
* @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` * @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL`
* @param vicual_pos the visual character position which logical position should be get * @param visual_pos the visual character position which logical position should be get
* @param is_rtl tell the the char at `viasual_pos` is RTL or LTR context * @param is_rtl tell the the char at `visual_pos` is RTL or LTR context
* @return the logical character position * @return the logical character position
*/ */
uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_bidi_dir_t base_dir, uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_bidi_dir_t base_dir,
@@ -97,7 +97,7 @@ uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t
* Bidi process a paragraph of text * Bidi process a paragraph of text
* @param str_in the string to process * @param str_in the string to process
* @param str_out store the result here * @param str_out store the result here
* @param len length of teh text * @param len length of the text
* @param base_dir base dir of the text * @param base_dir base dir of the text
* @param pos_conv_out an `uint16_t` array to store the related logical position of the character. * @param pos_conv_out an `uint16_t` array to store the related logical position of the character.
* Can be `NULL` is unused * Can be `NULL` is unused

View File

@@ -72,8 +72,8 @@ enum {
LV_OPA_COVER = 255, LV_OPA_COVER = 255,
}; };
#define LV_OPA_MIN 5 /*Opacities below this will be transparent*/ #define LV_OPA_MIN 2 /*Opacities below this will be transparent*/
#define LV_OPA_MAX 250 /*Opacities above this will fully cover*/ #define LV_OPA_MAX 253 /*Opacities above this will fully cover*/
#if LV_COLOR_DEPTH == 1 #if LV_COLOR_DEPTH == 1
#define LV_COLOR_SIZE 8 #define LV_COLOR_SIZE 8
@@ -456,9 +456,12 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co
lv_color_t ret; lv_color_t ret;
#if LV_COLOR_DEPTH != 1 #if LV_COLOR_DEPTH != 1
/*LV_COLOR_DEPTH == 8, 16 or 32*/ /*LV_COLOR_DEPTH == 8, 16 or 32*/
LV_COLOR_SET_R(ret, LV_MATH_UDIV255((uint16_t) LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) * (255 - mix) + LV_COLOR_MIX_ROUND_OFS)); LV_COLOR_SET_R(ret, LV_MATH_UDIV255((uint16_t) LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) *
LV_COLOR_SET_G(ret, LV_MATH_UDIV255((uint16_t) LV_COLOR_GET_G(c1) * mix + LV_COLOR_GET_G(c2) * (255 - mix) + LV_COLOR_MIX_ROUND_OFS)); (255 - mix) + LV_COLOR_MIX_ROUND_OFS));
LV_COLOR_SET_B(ret, LV_MATH_UDIV255((uint16_t) LV_COLOR_GET_B(c1) * mix + LV_COLOR_GET_B(c2) * (255 - mix) + LV_COLOR_MIX_ROUND_OFS)); LV_COLOR_SET_G(ret, LV_MATH_UDIV255((uint16_t) LV_COLOR_GET_G(c1) * mix + LV_COLOR_GET_G(c2) *
(255 - mix) + LV_COLOR_MIX_ROUND_OFS));
LV_COLOR_SET_B(ret, LV_MATH_UDIV255((uint16_t) LV_COLOR_GET_B(c1) * mix + LV_COLOR_GET_B(c2) *
(255 - mix) + LV_COLOR_MIX_ROUND_OFS));
LV_COLOR_SET_A(ret, 0xFF); LV_COLOR_SET_A(ret, 0xFF);
#else #else
/*LV_COLOR_DEPTH == 1*/ /*LV_COLOR_DEPTH == 1*/

View File

@@ -6,11 +6,13 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_obj.h"
#include "lv_debug.h" #include "lv_debug.h"
#if LV_USE_DEBUG #if LV_USE_DEBUG
#include "lv_mem.h"
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
@@ -28,7 +30,6 @@
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
**********************/ **********************/
static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find);
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
@@ -54,68 +55,6 @@ bool lv_debug_check_mem_integrity(void)
return lv_mem_test() == LV_RES_OK ? true : false; return lv_mem_test() == LV_RES_OK ? true : false;
} }
bool lv_debug_check_obj_type(const lv_obj_t * obj, const char * obj_type)
{
if(obj_type[0] == '\0') return true;
lv_obj_type_t types;
lv_obj_get_type((lv_obj_t *)obj, &types);
uint8_t i;
for(i = 0; i < LV_MAX_ANCESTOR_NUM; i++) {
if(types.type[i] == NULL) break;
if(strcmp(types.type[i], obj_type) == 0) return true;
}
return false;
}
bool lv_debug_check_obj_valid(const lv_obj_t * obj)
{
lv_disp_t * disp = lv_disp_get_next(NULL);
while(disp) {
lv_obj_t * scr;
_LV_LL_READ(disp->scr_ll, scr) {
if(scr == obj) return true;
bool found = obj_valid_child(scr, obj);
if(found) return true;
}
disp = lv_disp_get_next(disp);
}
return false;
}
bool lv_debug_check_style(const lv_style_t * style)
{
if(style == NULL) return true; /*NULL style is still valid*/
#if LV_USE_ASSERT_STYLE
if(style->sentinel != LV_DEBUG_STYLE_SENTINEL_VALUE) {
LV_LOG_WARN("Invalid style (local variable or not initialized?)");
return false;
}
#endif
return true;
}
bool lv_debug_check_style_list(const lv_style_list_t * list)
{
if(list == NULL) return true; /*NULL list is still valid*/
#if LV_USE_ASSERT_STYLE
if(list->sentinel != LV_DEBUG_STYLE_LIST_SENTINEL_VALUE) {
LV_LOG_WARN("Invalid style (local variable or not initialized?)");
return false;
}
#endif
return true;
}
bool lv_debug_check_str(const void * str) bool lv_debug_check_str(const void * str)
{ {
const uint8_t * s = (const uint8_t *)str; const uint8_t * s = (const uint8_t *)str;
@@ -196,20 +135,6 @@ void lv_debug_log_error(const char * msg, uint64_t value)
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find)
{
/*Check all children of `parent`*/
lv_obj_t * child;
_LV_LL_READ(parent->child_ll, child) {
if(child == obj_to_find) return true;
/*Check the children*/
bool found = obj_valid_child(child, obj_to_find);
if(found) return true;
}
return false;
}
#endif /*LV_USE_DEBUG*/ #endif /*LV_USE_DEBUG*/

View File

@@ -13,9 +13,10 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_obj.h" #include "../lv_conf_internal.h"
#if LV_USE_DEBUG #if LV_USE_DEBUG
#include <stdbool.h>
/********************* /*********************
* DEFINES * DEFINES
@@ -32,14 +33,6 @@ bool lv_debug_check_null(const void * p);
bool lv_debug_check_mem_integrity(void); bool lv_debug_check_mem_integrity(void);
bool lv_debug_check_obj_type(const lv_obj_t * obj, const char * obj_type);
bool lv_debug_check_obj_valid(const lv_obj_t * obj);
bool lv_debug_check_style(const lv_style_t * style);
bool lv_debug_check_style_list(const lv_style_list_t * list);
bool lv_debug_check_str(const void * str); bool lv_debug_check_str(const void * str);
void lv_debug_log_error(const char * msg, uint64_t value); void lv_debug_log_error(const char * msg, uint64_t value);
@@ -77,20 +70,6 @@ void lv_debug_log_error(const char * msg, uint64_t value);
lv_debug_check_str(str)) lv_debug_check_str(str))
#endif #endif
#ifndef LV_DEBUG_IS_OBJ
#define LV_DEBUG_IS_OBJ(obj_p, obj_type) (lv_debug_check_null(obj_p) && \
lv_debug_check_obj_valid(obj_p) && \
lv_debug_check_obj_type(obj_p, obj_type))
#endif
#ifndef LV_DEBUG_IS_STYLE
#define LV_DEBUG_IS_STYLE(style_p) (lv_debug_check_style(style_p))
#endif
#ifndef LV_DEBUG_IS_STYLE_LIST
#define LV_DEBUG_IS_STYLE_LIST(list_p) (lv_debug_check_style_list(list_p))
#endif
/*----------------- /*-----------------
* ASSERTS * ASSERTS
*-----------------*/ *-----------------*/
@@ -133,30 +112,6 @@ void lv_debug_log_error(const char * msg, uint64_t value);
# endif # endif
#endif #endif
#if LV_USE_ASSERT_OBJ
# ifndef LV_ASSERT_OBJ
# define LV_ASSERT_OBJ(obj_p, obj_type) LV_DEBUG_ASSERT(LV_DEBUG_IS_OBJ(obj_p, obj_type), "Invalid object", obj_p);
# endif
#else /* LV_USE_ASSERT_OBJ == 0 */
# if LV_USE_ASSERT_NULL /*Use at least LV_ASSERT_NULL if enabled*/
# define LV_ASSERT_OBJ(obj_p, obj_type) LV_ASSERT_NULL(obj_p)
# else
# define LV_ASSERT_OBJ(obj_p, obj_type) true
# endif
#endif
#if LV_USE_ASSERT_STYLE
# ifndef LV_ASSERT_STYLE
# define LV_ASSERT_STYLE(style_p) LV_DEBUG_ASSERT(LV_DEBUG_IS_STYLE(style_p), "Invalid style", style_p);
# endif
# ifndef LV_ASSERT_STYLE_LIST
# define LV_ASSERT_STYLE_LIST(list_p) LV_DEBUG_ASSERT(LV_DEBUG_IS_STYLE_LIST(list_p), "Invalid style list", list_p);
# endif
#else
# define LV_ASSERT_STYLE(style_p) true
# define LV_ASSERT_STYLE_LIST(list_p) true
#endif
#else /* LV_USE_DEBUG == 0 */ #else /* LV_USE_DEBUG == 0 */
@@ -167,8 +122,6 @@ void lv_debug_log_error(const char * msg, uint64_t value);
#define LV_ASSERT_MEM_INTEGRITY() true #define LV_ASSERT_MEM_INTEGRITY() true
#define LV_ASSERT_STR(p) true #define LV_ASSERT_STR(p) true
#define LV_ASSERT_OBJ(obj, obj_type) true #define LV_ASSERT_OBJ(obj, obj_type) true
#define LV_ASSERT_STYLE(p) true
#define LV_ASSERT_STYLE_LIST(p) true
#endif /* LV_USE_DEBUG */ #endif /* LV_USE_DEBUG */
/*clang-format on*/ /*clang-format on*/

View File

@@ -9,7 +9,7 @@
#include "lv_fs.h" #include "lv_fs.h"
#if LV_USE_FILESYSTEM #if LV_USE_FILESYSTEM
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "lv_ll.h" #include "lv_ll.h"
#include <string.h> #include <string.h>
#include "lv_gc.h" #include "lv_gc.h"
@@ -60,7 +60,7 @@ void _lv_fs_init(void)
} }
/** /**
* Test if a drive is rady or not. If the `ready` function was not initialized `true` will be * Test if a drive is ready or not. If the `ready` function was not initialized `true` will be
* returned. * returned.
* @param letter letter of the drive * @param letter letter of the drive
* @return true: drive is ready; false: drive is not ready * @return true: drive is ready; false: drive is not ready

View File

@@ -129,7 +129,7 @@ void lv_fs_drv_register(lv_fs_drv_t * drv_p);
lv_fs_drv_t * lv_fs_get_drv(char letter); lv_fs_drv_t * lv_fs_get_drv(char letter);
/** /**
* Test if a drive is rady or not. If the `ready` function was not initialized `true` will be * Test if a drive is ready or not. If the `ready` function was not initialized `true` will be
* returned. * returned.
* @param letter letter of the drive * @param letter letter of the drive
* @return true: drive is ready; false: drive is not ready * @return true: drive is ready; false: drive is not ready

View File

@@ -51,18 +51,12 @@ void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size)
{ {
ll_p->head = NULL; ll_p->head = NULL;
ll_p->tail = NULL; ll_p->tail = NULL;
#ifdef LV_MEM_ENV64 #ifdef LV_ARCH_64
/*Round the size up to 8*/ /*Round the size up to 8*/
if(node_size & 0x7) { node_size = (node_size + 7) & (~0x7);
node_size = node_size & (~0x7);
node_size += 8;
}
#else #else
/*Round the size up to 4*/ /*Round the size up to 4*/
if(node_size & 0x3) { node_size = (node_size + 3) & (~0x3);
node_size = node_size & (~0x3);
node_size += 4;
}
#endif #endif
ll_p->n_size = node_size; ll_p->n_size = node_size;
@@ -140,7 +134,7 @@ void * _lv_ll_ins_tail(lv_ll_t * ll_p)
if(n_new != NULL) { if(n_new != NULL) {
node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/ node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/
node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is tho old tail*/ node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is the old tail*/
if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/ if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/
node_set_next(ll_p, ll_p->tail, n_new); node_set_next(ll_p, ll_p->tail, n_new);
} }
@@ -339,7 +333,7 @@ uint32_t _lv_ll_get_len(const lv_ll_t * ll_p)
} }
/** /**
* Move a nodw before an other node in the same linked list * Move a node before an other node in the same linked list
* @param ll_p pointer to a linked list * @param ll_p pointer to a linked list
* @param n_act pointer to node to move * @param n_act pointer to node to move
* @param n_after pointer to a node which should be after `n_act` * @param n_after pointer to a node which should be after `n_act`
@@ -401,14 +395,13 @@ static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * pre
if(act == NULL) return; /*Can't set the prev node of `NULL`*/ if(act == NULL) return; /*Can't set the prev node of `NULL`*/
uint8_t * act8 = (uint8_t *) act; uint8_t * act8 = (uint8_t *) act;
uint8_t * prev8 = (uint8_t *) &prev;
act8 += LL_PREV_P_OFFSET(ll_p); act8 += LL_PREV_P_OFFSET(ll_p);
uint32_t i; lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8;
for(i = 0; i < sizeof(lv_ll_node_t *); i++) { lv_ll_node_t ** prev_node_p = (lv_ll_node_t **) &prev;
act8[i] = prev8[i];
} *act_node_p = *prev_node_p;
} }
/** /**
@@ -421,12 +414,10 @@ static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * nex
{ {
if(act == NULL) return; /*Can't set the next node of `NULL`*/ if(act == NULL) return; /*Can't set the next node of `NULL`*/
uint8_t * act8 = (uint8_t *) act; uint8_t * act8 = (uint8_t *) act;
uint8_t * prev8 = (uint8_t *) &next;
act8 += LL_NEXT_P_OFFSET(ll_p); act8 += LL_NEXT_P_OFFSET(ll_p);
lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8;
lv_ll_node_t ** next_node_p = (lv_ll_node_t **) &next;
uint32_t i; *act_node_p = *next_node_p;
for(i = 0; i < sizeof(lv_ll_node_t *); i++) {
act8[i] = prev8[i];
}
} }

View File

@@ -139,7 +139,7 @@ void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p);
*/ */
/** /**
* Move a nodw before an other node in the same linked list * Move a node before an other node in the same linked list
* @param ll_p pointer to a linked list * @param ll_p pointer to a linked list
* @param n_act pointer to node to move * @param n_act pointer to node to move
* @param n_after pointer to a node which should be after `n_act` * @param n_after pointer to a node which should be after `n_act`

View File

@@ -45,7 +45,7 @@ static lv_log_print_g_cb_t custom_print_cb;
/** /**
* Register custom print/write function to call when a log is added. * Register custom print/write function to call when a log is added.
* It can format its "File path", "Line number" and "Description" as required * It can format its "File path", "Line number" and "Description" as required
* and send the formatted log message to a consol or serial port. * and send the formatted log message to a console or serial port.
* @param print_cb a function pointer to print a log * @param print_cb a function pointer to print a log
*/ */
void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb)

View File

@@ -56,7 +56,7 @@ typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char *, uint32_t
/** /**
* Register custom print/write function to call when a log is added. * Register custom print/write function to call when a log is added.
* It can format its "File path", "Line number" and "Description" as required * It can format its "File path", "Line number" and "Description" as required
* and send the formatted log message to a consol or serial port. * and send the formatted log message to a console or serial port.
* @param print_cb a function pointer to print a log * @param print_cb a function pointer to print a log
*/ */
void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb);

View File

@@ -103,7 +103,7 @@ int32_t _lv_bezier3(uint32_t t, int32_t u0, int32_t u1, int32_t u2, int32_t u3)
/** /**
* Get the square root of a number * Get the square root of a number
* @param x integer which square root should be calculatoed * @param x integer which square root should be calculated
* @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit
* @param mask: optional to skip some iterations if the magnitude of the root is known. * @param mask: optional to skip some iterations if the magnitude of the root is known.
* Set to 0x8000 by default. * Set to 0x8000 by default.

View File

@@ -92,7 +92,7 @@ uint16_t _lv_atan2(int x, int y);
/** /**
* Get the square root of a number * Get the square root of a number
* @param x integer which square root should be calculatoed * @param x integer which square root should be calculated
* @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit
* @param mask: optional to skip some iterations if the magnitude of the root is known. * @param mask: optional to skip some iterations if the magnitude of the root is known.
* Set to 0x8000 by default. * Set to 0x8000 by default.

View File

@@ -86,6 +86,9 @@ typedef struct {
static uint32_t zero_mem; /*Give the address of this variable if 0 byte should be allocated*/ static uint32_t zero_mem; /*Give the address of this variable if 0 byte should be allocated*/
#if LV_MEM_CUSTOM == 0
static uint32_t mem_max_size; /*Tracks the maximum total size of memory ever used from the internal heap*/
#endif
static uint8_t mem_buf1_32[MEM_BUF_SMALL_SIZE]; static uint8_t mem_buf1_32[MEM_BUF_SMALL_SIZE];
static uint8_t mem_buf2_32[MEM_BUF_SMALL_SIZE]; static uint8_t mem_buf2_32[MEM_BUF_SMALL_SIZE];
@@ -108,7 +111,7 @@ static lv_mem_buf_t mem_buf_small[] = {{.p = mem_buf1_32, .size = MEM_BUF_SMALL_
**********************/ **********************/
/** /**
* Initiaiize the dyn_mem module (work memory and other variables) * Initialize the dyn_mem module (work memory and other variables)
*/ */
void _lv_mem_init(void) void _lv_mem_init(void)
{ {
@@ -118,6 +121,7 @@ void _lv_mem_init(void)
/*Allocate a large array to store the dynamically allocated data*/ /*Allocate a large array to store the dynamically allocated data*/
static LV_MEM_ATTR MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)]; static LV_MEM_ATTR MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)];
work_mem = (uint8_t *)work_mem_int; work_mem = (uint8_t *)work_mem_int;
mem_max_size = 0;
#else #else
work_mem = (uint8_t *)LV_MEM_ADR; work_mem = (uint8_t *)LV_MEM_ADR;
#endif #endif
@@ -157,16 +161,10 @@ void * lv_mem_alloc(size_t size)
#ifdef LV_ARCH_64 #ifdef LV_ARCH_64
/*Round the size up to 8*/ /*Round the size up to 8*/
if(size & 0x7) { size = (size + 7) & (~0x7);
size = size & (~0x7);
size += 8;
}
#else #else
/*Round the size up to 4*/ /*Round the size up to 4*/
if(size & 0x3) { size = (size + 3) & (~0x3);
size = size & (~0x3);
size += 4;
}
#endif #endif
void * alloc = NULL; void * alloc = NULL;
@@ -206,7 +204,19 @@ void * lv_mem_alloc(size_t size)
if(alloc != NULL) _lv_memset(alloc, 0xaa, size); if(alloc != NULL) _lv_memset(alloc, 0xaa, size);
#endif #endif
if(alloc == NULL) LV_LOG_WARN("Couldn't allocate memory"); if(alloc == NULL) {
LV_LOG_WARN("Couldn't allocate memory");
}
else {
#if LV_MEM_CUSTOM == 0
/* just a safety check, should always be true */
if((uintptr_t) alloc > (uintptr_t) work_mem) {
if((((uintptr_t) alloc - (uintptr_t) work_mem) + size) > mem_max_size) {
mem_max_size = ((uintptr_t) alloc - (uintptr_t) work_mem) + size;
}
}
#endif
}
return alloc; return alloc;
} }
@@ -281,16 +291,10 @@ void * lv_mem_realloc(void * data_p, size_t new_size)
#ifdef LV_ARCH_64 #ifdef LV_ARCH_64
/*Round the size up to 8*/ /*Round the size up to 8*/
if(new_size & 0x7) { new_size = (new_size + 7) & (~0x7);
new_size = new_size & (~0x7);
new_size += 8;
}
#else #else
/*Round the size up to 4*/ /*Round the size up to 4*/
if(new_size & 0x3) { new_size = (new_size + 3) & (~0x3);
new_size = new_size & (~0x3);
new_size += 4;
}
#endif #endif
/*data_p could be previously freed pointer (in this case it is invalid)*/ /*data_p could be previously freed pointer (in this case it is invalid)*/
@@ -436,6 +440,7 @@ void lv_mem_monitor(lv_mem_monitor_t * mon_p)
e = ent_get_next(e); e = ent_get_next(e);
} }
mon_p->total_size = LV_MEM_SIZE; mon_p->total_size = LV_MEM_SIZE;
mon_p->max_used = mem_max_size;
mon_p->used_pct = 100 - (100U * mon_p->free_size) / mon_p->total_size; mon_p->used_pct = 100 - (100U * mon_p->free_size) / mon_p->total_size;
if(mon_p->free_size > 0) { if(mon_p->free_size > 0) {
mon_p->frag_pct = (uint32_t)mon_p->free_biggest_size * 100U / mon_p->free_size; mon_p->frag_pct = (uint32_t)mon_p->free_biggest_size * 100U / mon_p->free_size;
@@ -525,14 +530,13 @@ void * _lv_mem_buf_get(uint32_t size)
/*if this fails you probably need to increase your LV_MEM_SIZE/heap size*/ /*if this fails you probably need to increase your LV_MEM_SIZE/heap size*/
LV_GC_ROOT(_lv_mem_buf[i]).p = lv_mem_realloc(LV_GC_ROOT(_lv_mem_buf[i]).p, size); LV_GC_ROOT(_lv_mem_buf[i]).p = lv_mem_realloc(LV_GC_ROOT(_lv_mem_buf[i]).p, size);
if(LV_GC_ROOT(_lv_mem_buf[i]).p == NULL) { if(LV_GC_ROOT(_lv_mem_buf[i]).p == NULL) {
LV_LOG_ERROR("lv_mem_buf_get: Out of memory, can't allocate a new buffer (increase your LV_MEM_SIZE/heap size)") LV_DEBUG_ASSERT(false, "Out of memory, can't allocate a new buffer (increase your LV_MEM_SIZE/heap size", 0x00);
} }
return LV_GC_ROOT(_lv_mem_buf[i]).p; return LV_GC_ROOT(_lv_mem_buf[i]).p;
} }
} }
LV_LOG_ERROR("lv_mem_buf_get: no free buffer. Increase LV_DRAW_BUF_MAX_NUM."); LV_DEBUG_ASSERT(false, "No free buffer. Increase LV_DRAW_BUF_MAX_NUM.", 0x00);
return NULL; return NULL;
} }
@@ -858,18 +862,13 @@ static void * ent_alloc(lv_mem_ent_t * e, size_t size)
*/ */
static void ent_trunc(lv_mem_ent_t * e, size_t size) static void ent_trunc(lv_mem_ent_t * e, size_t size)
{ {
#ifdef LV_ARCH_64 #ifdef LV_ARCH_64
/*Round the size up to 8*/ /*Round the size up to 8*/
if(size & 0x7) { size = (size + 7) & (~0x7);
size = size & (~0x7);
size += 8;
}
#else #else
/*Round the size up to 4*/ /*Round the size up to 4*/
if(size & 0x3) { size = (size + 3) & (~0x3);
size = size & (~0x3);
size += 4;
}
#endif #endif
/*Don't let empty space only for a header without data*/ /*Don't let empty space only for a header without data*/

View File

@@ -41,6 +41,7 @@ typedef struct {
uint32_t free_size; /**< Size of available memory */ uint32_t free_size; /**< Size of available memory */
uint32_t free_biggest_size; uint32_t free_biggest_size;
uint32_t used_cnt; uint32_t used_cnt;
uint32_t max_used; /**< Max size of Heap memory used */
uint8_t used_pct; /**< Percentage used */ uint8_t used_pct; /**< Percentage used */
uint8_t frag_pct; /**< Amount of fragmentation */ uint8_t frag_pct; /**< Amount of fragmentation */
} lv_mem_monitor_t; } lv_mem_monitor_t;
@@ -59,7 +60,7 @@ extern lv_mem_buf_arr_t _lv_mem_buf;
**********************/ **********************/
/** /**
* Initiaize the dyn_mem module (work memory and other variables) * Initialize the dyn_mem module (work memory and other variables)
*/ */
void _lv_mem_init(void); void _lv_mem_init(void);

View File

@@ -14,6 +14,7 @@ CSRCS += lv_utils.c
CSRCS += lv_async.c CSRCS += lv_async.c
CSRCS += lv_printf.c CSRCS += lv_printf.c
CSRCS += lv_bidi.c CSRCS += lv_bidi.c
CSRCS += lv_debug.c
DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_misc DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_misc
VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_misc VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/lv_misc

View File

@@ -9,7 +9,7 @@
*********************/ *********************/
#include <stddef.h> #include <stddef.h>
#include "lv_task.h" #include "lv_task.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_hal/lv_hal_tick.h" #include "../lv_hal/lv_hal_tick.h"
#include "lv_gc.h" #include "lv_gc.h"
@@ -193,9 +193,9 @@ LV_ATTRIBUTE_TASK_HANDLER uint32_t lv_task_handler(void)
return time_till_next; return time_till_next;
} }
/** /**
* Create an "empty" task. It needs to initialzed with at least * Create an "empty" task. It needs to initialized with at least
* `lv_task_set_cb` and `lv_task_set_period` * `lv_task_set_cb` and `lv_task_set_period`
* @return pointer to the craeted task * @return pointer to the created task
*/ */
lv_task_t * lv_task_create_basic(void) lv_task_t * lv_task_create_basic(void)
{ {
@@ -256,13 +256,13 @@ lv_task_t * lv_task_create_basic(void)
* @param user_data custom parameter * @param user_data custom parameter
* @return pointer to the new task * @return pointer to the new task
*/ */
lv_task_t * lv_task_create(lv_task_cb_t task_cb, uint32_t period, lv_task_prio_t prio, void * user_data) lv_task_t * lv_task_create(lv_task_cb_t task_xcb, uint32_t period, lv_task_prio_t prio, void * user_data)
{ {
lv_task_t * new_task = lv_task_create_basic(); lv_task_t * new_task = lv_task_create_basic();
LV_ASSERT_MEM(new_task); LV_ASSERT_MEM(new_task);
if(new_task == NULL) return NULL; if(new_task == NULL) return NULL;
lv_task_set_cb(new_task, task_cb); lv_task_set_cb(new_task, task_xcb);
lv_task_set_period(new_task, period); lv_task_set_period(new_task, period);
lv_task_set_prio(new_task, prio); lv_task_set_prio(new_task, prio);
new_task->user_data = user_data; new_task->user_data = user_data;
@@ -273,7 +273,7 @@ lv_task_t * lv_task_create(lv_task_cb_t task_cb, uint32_t period, lv_task_prio_t
/** /**
* Set the callback the task (the function to call periodically) * Set the callback the task (the function to call periodically)
* @param task pointer to a task * @param task pointer to a task
* @param task_cb teh function to call periodically * @param task_cb the function to call periodically
*/ */
void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb) void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb)
{ {

View File

@@ -88,9 +88,9 @@ LV_ATTRIBUTE_TASK_HANDLER uint32_t lv_task_handler(void);
//! @endcond //! @endcond
/** /**
* Create an "empty" task. It needs to initialzed with at least * Create an "empty" task. It needs to initialized with at least
* `lv_task_set_cb` and `lv_task_set_period` * `lv_task_set_cb` and `lv_task_set_period`
* @return pointer to the craeted task * @return pointer to the created task
*/ */
lv_task_t * lv_task_create_basic(void); lv_task_t * lv_task_create_basic(void);

View File

@@ -147,7 +147,7 @@ void _lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t
* *
* If the first character is a break character, returns the next index. * If the first character is a break character, returns the next index.
* *
* Example calls from lv_txt_get_next_line() assuming sufficent max_width and * Example calls from lv_txt_get_next_line() assuming sufficient max_width and
* txt = "Test text\n" * txt = "Test text\n"
* 0123456789 * 0123456789
* *
@@ -169,7 +169,7 @@ void _lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t
* @param force Force return the fraction of the word that can fit in the provided space. * @param force Force return the fraction of the word that can fit in the provided space.
* @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different) * @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different)
*/ */
static uint16_t lv_txt_get_next_word(const char * txt, const lv_font_t * font, static uint32_t lv_txt_get_next_word(const char * txt, const lv_font_t * font,
lv_coord_t letter_space, lv_coord_t max_width, lv_coord_t letter_space, lv_coord_t max_width,
lv_txt_flag_t flag, uint32_t * word_w_ptr, lv_txt_cmd_state_t * cmd_state, bool force) lv_txt_flag_t flag, uint32_t * word_w_ptr, lv_txt_cmd_state_t * cmd_state, bool force)
{ {
@@ -290,7 +290,7 @@ static uint16_t lv_txt_get_next_word(const char * txt, const lv_font_t * font,
* @param flags settings for the text from 'txt_flag_type' enum * @param flags settings for the text from 'txt_flag_type' enum
* @return the index of the first char of the new line (in byte index not letter index. With UTF-8 they are different) * @return the index of the first char of the new line (in byte index not letter index. With UTF-8 they are different)
*/ */
uint16_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font, uint32_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font,
lv_coord_t letter_space, lv_coord_t max_width, lv_txt_flag_t flag) lv_coord_t letter_space, lv_coord_t max_width, lv_txt_flag_t flag)
{ {
if(txt == NULL) return 0; if(txt == NULL) return 0;
@@ -350,7 +350,7 @@ uint16_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font,
* @param flags settings for the text from 'txt_flag_t' enum * @param flags settings for the text from 'txt_flag_t' enum
* @return length of a char_num long text * @return length of a char_num long text
*/ */
lv_coord_t _lv_txt_get_width(const char * txt, uint16_t length, const lv_font_t * font, lv_coord_t letter_space, lv_coord_t _lv_txt_get_width(const char * txt, uint32_t length, const lv_font_t * font, lv_coord_t letter_space,
lv_txt_flag_t flag) lv_txt_flag_t flag)
{ {
if(txt == NULL) return 0; if(txt == NULL) return 0;
@@ -534,6 +534,7 @@ static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni)
*/ */
static uint32_t lv_txt_utf8_conv_wc(uint32_t c) static uint32_t lv_txt_utf8_conv_wc(uint32_t c)
{ {
#if LV_BIG_ENDIAN_SYSTEM == 0
/*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/ /*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/
if((c & 0x80) != 0) { if((c & 0x80) != 0) {
uint32_t swapped; uint32_t swapped;
@@ -547,7 +548,7 @@ static uint32_t lv_txt_utf8_conv_wc(uint32_t c)
} }
c = swapped; c = swapped;
} }
#endif
return c; return c;
} }

View File

@@ -84,7 +84,7 @@ void _lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t
* @return the index of the first char of the new line (in byte index not letter index. With UTF-8 * @return the index of the first char of the new line (in byte index not letter index. With UTF-8
* they are different) * they are different)
*/ */
uint16_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font, lv_coord_t letter_space, lv_coord_t max_width, uint32_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font, lv_coord_t letter_space, lv_coord_t max_width,
lv_txt_flag_t flag); lv_txt_flag_t flag);
/** /**
@@ -97,11 +97,11 @@ uint16_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font, lv_coor
* @param flags settings for the text from 'txt_flag_t' enum * @param flags settings for the text from 'txt_flag_t' enum
* @return length of a char_num long text * @return length of a char_num long text
*/ */
lv_coord_t _lv_txt_get_width(const char * txt, uint16_t length, const lv_font_t * font, lv_coord_t letter_space, lv_coord_t _lv_txt_get_width(const char * txt, uint32_t length, const lv_font_t * font, lv_coord_t letter_space,
lv_txt_flag_t flag); lv_txt_flag_t flag);
/** /**
* Check next character in a string and decide if te character is part of the command or not * Check next character in a string and decide if the character is part of the command or not
* @param state pointer to a txt_cmd_state_t variable which stores the current state of command * @param state pointer to a txt_cmd_state_t variable which stores the current state of command
* processing * processing
* @param c the current character * @param c the current character

View File

@@ -155,6 +155,7 @@ typedef struct {
const lv_font_t * font_subtitle; const lv_font_t * font_subtitle;
const lv_font_t * font_title; const lv_font_t * font_title;
uint32_t flags; uint32_t flags;
void * user_data;
} lv_theme_t; } lv_theme_t;
/********************** /**********************

View File

@@ -26,7 +26,7 @@
**********************/ **********************/
typedef struct { typedef struct {
lv_style_t opa_cover; lv_style_t opa_cover;
}theme_styles_t; } theme_styles_t;
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES

View File

@@ -73,8 +73,7 @@
/********************** /**********************
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
typedef struct typedef struct {
{
lv_style_t scr; lv_style_t scr;
lv_style_t bg; lv_style_t bg;
lv_style_t bg_click; lv_style_t bg_click;
@@ -83,96 +82,96 @@ typedef struct
lv_style_t pad_inner; lv_style_t pad_inner;
lv_style_t pad_small; lv_style_t pad_small;
#if LV_USE_ARC #if LV_USE_ARC
lv_style_t arc_indic; lv_style_t arc_indic;
lv_style_t arc_bg; lv_style_t arc_bg;
#endif #endif
#if LV_USE_BAR #if LV_USE_BAR
lv_style_t bar_bg; lv_style_t bar_bg;
lv_style_t bar_indic; lv_style_t bar_indic;
#endif #endif
#if LV_USE_CALENDAR #if LV_USE_CALENDAR
lv_style_t calendar_date_nums, calendar_header, calendar_daynames; lv_style_t calendar_date_nums, calendar_header, calendar_daynames;
#endif #endif
#if LV_USE_CPICKER #if LV_USE_CPICKER
lv_style_t cpicker_bg, cpicker_indic; lv_style_t cpicker_bg, cpicker_indic;
#endif #endif
#if LV_USE_CHART #if LV_USE_CHART
lv_style_t chart_bg, chart_series_bg, chart_series; lv_style_t chart_bg, chart_series_bg, chart_series;
#endif #endif
#if LV_USE_CHECKBOX #if LV_USE_CHECKBOX
lv_style_t cb_bg, cb_bullet; lv_style_t cb_bg, cb_bullet;
#endif #endif
#if LV_USE_DROPDOWN #if LV_USE_DROPDOWN
lv_style_t ddlist_page, ddlist_sel; lv_style_t ddlist_page, ddlist_sel;
#endif #endif
#if LV_USE_GAUGE #if LV_USE_GAUGE
lv_style_t gauge_main, gauge_strong, gauge_needle; lv_style_t gauge_main, gauge_strong, gauge_needle;
#endif #endif
#if LV_USE_KEYBOARD #if LV_USE_KEYBOARD
lv_style_t kb_bg; lv_style_t kb_bg;
#endif #endif
#if LV_USE_LED #if LV_USE_LED
lv_style_t led; lv_style_t led;
#endif #endif
#if LV_USE_LINEMETER #if LV_USE_LINEMETER
lv_style_t lmeter; lv_style_t lmeter;
#endif #endif
#if LV_USE_LIST #if LV_USE_LIST
lv_style_t list_bg, list_btn; lv_style_t list_bg, list_btn;
#endif #endif
#if LV_USE_MSGBOX #if LV_USE_MSGBOX
lv_style_t mbox_bg; lv_style_t mbox_bg;
#endif #endif
#if LV_USE_PAGE #if LV_USE_PAGE
lv_style_t sb; lv_style_t sb;
#if LV_USE_ANIMATION #if LV_USE_ANIMATION
lv_style_t edge_flash; lv_style_t edge_flash;
#endif #endif
#endif #endif
#if LV_USE_ROLLER #if LV_USE_ROLLER
lv_style_t roller_bg, roller_sel; lv_style_t roller_bg, roller_sel;
#endif #endif
#if LV_USE_SLIDER #if LV_USE_SLIDER
lv_style_t slider_knob, slider_bg; lv_style_t slider_knob, slider_bg;
#endif #endif
#if LV_USE_SPINBOX #if LV_USE_SPINBOX
lv_style_t spinbox_cursor; lv_style_t spinbox_cursor;
#endif #endif
#if LV_USE_SWITCH #if LV_USE_SWITCH
lv_style_t sw_knob; lv_style_t sw_knob;
#endif #endif
#if LV_USE_TABLE #if LV_USE_TABLE
lv_style_t table_cell; lv_style_t table_cell;
#endif #endif
#if LV_USE_TABVIEW || LV_USE_WIN #if LV_USE_TABVIEW || LV_USE_WIN
lv_style_t tabview_btns, tabview_btns_bg, tabview_indic, tabview_page_scrl; lv_style_t tabview_btns, tabview_btns_bg, tabview_indic, tabview_page_scrl;
#endif #endif
#if LV_USE_TEXTAREA #if LV_USE_TEXTAREA
lv_style_t ta_cursor, ta_placeholder; lv_style_t ta_cursor, ta_placeholder;
#endif #endif
}theme_styles_t; } theme_styles_t;
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
@@ -246,7 +245,7 @@ static void basic_init(void)
lv_style_set_bg_color(&styles->bg_click, LV_STATE_DISABLED, COLOR_BG_DIS); lv_style_set_bg_color(&styles->bg_click, LV_STATE_DISABLED, COLOR_BG_DIS);
lv_style_set_border_width(&styles->bg_click, LV_STATE_CHECKED, 0); lv_style_set_border_width(&styles->bg_click, LV_STATE_CHECKED, 0);
lv_style_set_border_color(&styles->bg_click, LV_STATE_FOCUSED | LV_STATE_PRESSED, lv_color_darken(theme.color_primary, lv_style_set_border_color(&styles->bg_click, LV_STATE_FOCUSED | LV_STATE_PRESSED, lv_color_darken(theme.color_primary,
LV_OPA_20)); LV_OPA_20));
lv_style_set_border_color(&styles->bg_click, LV_STATE_PRESSED, COLOR_BG_BORDER_PR); lv_style_set_border_color(&styles->bg_click, LV_STATE_PRESSED, COLOR_BG_BORDER_PR);
lv_style_set_border_color(&styles->bg_click, LV_STATE_CHECKED, COLOR_BG_BORDER_CHK); lv_style_set_border_color(&styles->bg_click, LV_STATE_CHECKED, COLOR_BG_BORDER_CHK);
lv_style_set_border_color(&styles->bg_click, LV_STATE_PRESSED | LV_STATE_CHECKED, COLOR_BG_BORDER_CHK_PR); lv_style_set_border_color(&styles->bg_click, LV_STATE_PRESSED | LV_STATE_CHECKED, COLOR_BG_BORDER_CHK_PR);
@@ -546,21 +545,24 @@ static void calendar_init(void)
lv_style_set_text_color(&styles->calendar_header, LV_STATE_PRESSED, IS_LIGHT ? lv_color_hex(0x888888) : LV_COLOR_WHITE); lv_style_set_text_color(&styles->calendar_header, LV_STATE_PRESSED, IS_LIGHT ? lv_color_hex(0x888888) : LV_COLOR_WHITE);
style_init_reset(&styles->calendar_daynames); style_init_reset(&styles->calendar_daynames);
lv_style_set_text_color(&styles->calendar_daynames, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex3(0xeee)); lv_style_set_text_color(&styles->calendar_daynames, LV_STATE_DEFAULT,
IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex3(0xeee));
lv_style_set_pad_left(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_left(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_right(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_right(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_bottom(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_bottom(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF);
style_init_reset(&styles->calendar_date_nums); style_init_reset(&styles->calendar_date_nums);
lv_style_set_radius(&styles->calendar_date_nums, LV_STATE_DEFAULT, LV_DPX(4)); lv_style_set_radius(&styles->calendar_date_nums, LV_STATE_DEFAULT, LV_DPX(4));
lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_CHECKED, IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE); lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_CHECKED,
IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE);
lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_CHECKED, IS_LIGHT ? LV_OPA_20 : LV_OPA_40); lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_CHECKED, IS_LIGHT ? LV_OPA_20 : LV_OPA_40);
lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_PRESSED, LV_OPA_20); lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_PRESSED, LV_OPA_20);
lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_FOCUSED, LV_OPA_COVER); lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_FOCUSED, LV_OPA_COVER);
lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_FOCUSED, LV_COLOR_WHITE); lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_FOCUSED, LV_COLOR_WHITE);
lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_FOCUSED, theme.color_primary); lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_FOCUSED, theme.color_primary);
lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x666666) : LV_COLOR_WHITE); lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_DEFAULT,
IS_LIGHT ? lv_color_hex(0x666666) : LV_COLOR_WHITE);
lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_CHECKED, theme.color_primary); lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_CHECKED, theme.color_primary);
lv_style_set_border_width(&styles->calendar_date_nums, LV_STATE_CHECKED, 2); lv_style_set_border_width(&styles->calendar_date_nums, LV_STATE_CHECKED, 2);
lv_style_set_border_side(&styles->calendar_date_nums, LV_STATE_CHECKED, LV_BORDER_SIDE_LEFT); lv_style_set_border_side(&styles->calendar_date_nums, LV_STATE_CHECKED, LV_BORDER_SIDE_LEFT);
@@ -684,7 +686,8 @@ static void textarea_init(void)
lv_style_set_border_side(&styles->ta_cursor, LV_STATE_DEFAULT, LV_BORDER_SIDE_LEFT); lv_style_set_border_side(&styles->ta_cursor, LV_STATE_DEFAULT, LV_BORDER_SIDE_LEFT);
style_init_reset(&styles->ta_placeholder); style_init_reset(&styles->ta_placeholder);
lv_style_set_text_color(&styles->ta_placeholder, LV_STATE_DEFAULT, IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd)); lv_style_set_text_color(&styles->ta_placeholder, LV_STATE_DEFAULT,
IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd));
#endif #endif
} }
@@ -734,6 +737,10 @@ static void list_init(void)
lv_style_set_border_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_primary); lv_style_set_border_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_primary);
lv_style_set_border_width(&styles->list_btn, LV_STATE_DEFAULT, 1); lv_style_set_border_width(&styles->list_btn, LV_STATE_DEFAULT, 1);
lv_style_set_outline_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_secondary);
lv_style_set_outline_width(&styles->list_btn, LV_STATE_FOCUSED, BORDER_WIDTH);
lv_style_set_outline_pad(&styles->list_btn, LV_STATE_FOCUSED, -BORDER_WIDTH);
lv_style_set_pad_left(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_left(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_right(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_right(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_top(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_top(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
@@ -741,9 +748,10 @@ static void list_init(void)
lv_style_set_pad_inner(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); lv_style_set_pad_inner(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_transform_width(&styles->list_btn, LV_STATE_DEFAULT, - PAD_DEF); lv_style_set_transform_width(&styles->list_btn, LV_STATE_DEFAULT, - PAD_DEF);
lv_style_set_transform_width(&styles->list_btn, LV_STATE_PRESSED, 0); lv_style_set_transform_width(&styles->list_btn, LV_STATE_PRESSED, -BORDER_WIDTH);
lv_style_set_transform_width(&styles->list_btn, LV_STATE_CHECKED, 0); lv_style_set_transform_width(&styles->list_btn, LV_STATE_CHECKED, -BORDER_WIDTH);
lv_style_set_transform_width(&styles->list_btn, LV_STATE_DISABLED, 0); lv_style_set_transform_width(&styles->list_btn, LV_STATE_DISABLED, -BORDER_WIDTH);
lv_style_set_transform_width(&styles->list_btn, LV_STATE_FOCUSED, - BORDER_WIDTH);
lv_style_set_transition_time(&styles->list_btn, LV_STATE_DEFAULT, TRANSITION_TIME); lv_style_set_transition_time(&styles->list_btn, LV_STATE_DEFAULT, TRANSITION_TIME);
lv_style_set_transition_prop_6(&styles->list_btn, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR); lv_style_set_transition_prop_6(&styles->list_btn, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR);
@@ -784,6 +792,39 @@ static void roller_init(void)
static void tabview_init(void) static void tabview_init(void)
{ {
#if LV_USE_TABVIEW != 0 #if LV_USE_TABVIEW != 0
#endif
}
static void tileview_init(void)
{
#if LV_USE_TILEVIEW != 0
#endif
}
static void table_init(void)
{
#if LV_USE_TABLE != 0
style_init_reset(&styles->table_cell);
lv_style_set_border_color(&styles->table_cell, LV_STATE_DEFAULT, COLOR_BG_BORDER);
lv_style_set_border_width(&styles->table_cell, LV_STATE_DEFAULT, 1);
lv_style_set_border_side(&styles->table_cell, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM);
lv_style_set_pad_left(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_right(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_top(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_bottom(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
#endif
}
static void win_init(void)
{
#if LV_USE_WIN != 0
#endif
}
static void tabview_win_shared_init(void)
{
#if LV_USE_TABVIEW || LV_USE_WIN
style_init_reset(&styles->tabview_btns_bg); style_init_reset(&styles->tabview_btns_bg);
lv_style_set_bg_opa(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_OPA_COVER); lv_style_set_bg_opa(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_OPA_COVER);
lv_style_set_bg_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, COLOR_BG); lv_style_set_bg_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, COLOR_BG);
@@ -823,34 +864,6 @@ static void tabview_init(void)
#endif #endif
} }
static void tileview_init(void)
{
#if LV_USE_TILEVIEW != 0
#endif
}
static void table_init(void)
{
#if LV_USE_TABLE != 0
style_init_reset(&styles->table_cell);
lv_style_set_border_color(&styles->table_cell, LV_STATE_DEFAULT, COLOR_BG_BORDER);
lv_style_set_border_width(&styles->table_cell, LV_STATE_DEFAULT, 1);
lv_style_set_border_side(&styles->table_cell, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM);
lv_style_set_pad_left(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_right(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_top(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
lv_style_set_pad_bottom(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF);
#endif
}
static void win_init(void)
{
#if LV_USE_WIN != 0
#endif
}
/********************** /**********************
* GLOBAL FUNCTIONS * GLOBAL FUNCTIONS
@@ -919,6 +932,7 @@ lv_theme_t * lv_theme_material_init(lv_color_t color_primary, lv_color_t color_s
tileview_init(); tileview_init();
table_init(); table_init();
win_init(); win_init();
tabview_win_shared_init();
theme.apply_xcb = theme_apply; theme.apply_xcb = theme_apply;

View File

@@ -24,21 +24,20 @@
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
typedef struct typedef struct {
{ lv_style_t scr;
lv_style_t scr; lv_style_t bg;
lv_style_t bg; lv_style_t clip_corner;
lv_style_t clip_corner; lv_style_t btn;
lv_style_t btn; lv_style_t round;
lv_style_t round; lv_style_t no_radius;
lv_style_t no_radius; lv_style_t fg_color;
lv_style_t fg_color; lv_style_t border_none;
lv_style_t border_none; lv_style_t big_line_space; /*In roller or dropdownlist*/
lv_style_t big_line_space; /*In roller or dropdownlist*/ lv_style_t pad_none;
lv_style_t pad_none; lv_style_t pad_normal;
lv_style_t pad_normal; lv_style_t pad_small;
lv_style_t pad_small; lv_style_t pad_inner;
lv_style_t pad_inner;
#if LV_USE_ARC #if LV_USE_ARC
lv_style_t arc_bg, arc_indic; lv_style_t arc_bg, arc_indic;
@@ -79,7 +78,7 @@ lv_style_t pad_inner;
#if LV_USE_TABVIEW #if LV_USE_TABVIEW
lv_style_t tab_bg; lv_style_t tab_bg;
#endif #endif
}theme_styles_t; } theme_styles_t;
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES

View File

@@ -80,7 +80,8 @@ static void basic_init(void)
style_init_reset(&styles->btn); style_init_reset(&styles->btn);
lv_style_set_bg_color(&styles->btn, LV_STATE_PRESSED, lv_color_hex3(0xccc)); lv_style_set_bg_color(&styles->btn, LV_STATE_PRESSED, lv_color_hex3(0xccc));
lv_style_set_bg_color(&styles->btn, LV_STATE_CHECKED, theme.color_primary); lv_style_set_bg_color(&styles->btn, LV_STATE_CHECKED, theme.color_primary);
lv_style_set_bg_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_darken(theme.color_primary, LV_OPA_30)); lv_style_set_bg_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_darken(theme.color_primary,
LV_OPA_30));
lv_style_set_bg_color(&styles->btn, LV_STATE_DISABLED, LV_COLOR_SILVER); lv_style_set_bg_color(&styles->btn, LV_STATE_DISABLED, LV_COLOR_SILVER);
lv_style_set_text_color(&styles->btn, LV_STATE_DISABLED, LV_COLOR_GRAY); lv_style_set_text_color(&styles->btn, LV_STATE_DISABLED, LV_COLOR_GRAY);
lv_style_set_image_recolor(&styles->btn, LV_STATE_DISABLED, LV_COLOR_GRAY); lv_style_set_image_recolor(&styles->btn, LV_STATE_DISABLED, LV_COLOR_GRAY);

View File

@@ -9,7 +9,7 @@
#include "lv_arc.h" #include "lv_arc.h"
#if LV_USE_ARC != 0 #if LV_USE_ARC != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_misc/lv_math.h" #include "../lv_misc/lv_math.h"
#include "../lv_draw/lv_draw_arc.h" #include "../lv_draw/lv_draw_arc.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"

View File

@@ -11,7 +11,7 @@
#include "lv_bar.h" #include "lv_bar.h"
#if LV_USE_BAR != 0 #if LV_USE_BAR != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_misc/lv_anim.h" #include "../lv_misc/lv_anim.h"
@@ -148,7 +148,7 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy)
* Set a new value on the bar * Set a new value on the bar
* @param bar pointer to a bar object * @param bar pointer to a bar object
* @param value new value * @param value new value
* @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediatelly * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately
*/ */
void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim) void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim)
{ {
@@ -175,7 +175,7 @@ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim)
* Set a new start value on the bar * Set a new start value on the bar
* @param bar pointer to a bar object * @param bar pointer to a bar object
* @param value new start value * @param value new start value
* @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediatelly * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately
*/ */
void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_t anim) void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_t anim)
{ {

View File

@@ -114,7 +114,7 @@ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim);
* Set a new start value on the bar * Set a new start value on the bar
* @param bar pointer to a bar object * @param bar pointer to a bar object
* @param value new start value * @param value new start value
* @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediatelly * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately
*/ */
void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_t anim); void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_t anim);

View File

@@ -12,7 +12,7 @@
#include <string.h> #include <string.h>
#include "../lv_core/lv_group.h" #include "../lv_core/lv_group.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_misc/lv_area.h" #include "../lv_misc/lv_area.h"
@@ -202,7 +202,8 @@ lv_btn_state_t lv_btn_get_state(const lv_obj_t * btn)
if(obj_state & LV_STATE_CHECKED) { if(obj_state & LV_STATE_CHECKED) {
if(obj_state & LV_STATE_PRESSED) return LV_BTN_STATE_CHECKED_PRESSED; if(obj_state & LV_STATE_PRESSED) return LV_BTN_STATE_CHECKED_PRESSED;
else return LV_BTN_STATE_CHECKED_RELEASED; else return LV_BTN_STATE_CHECKED_RELEASED;
} else { }
else {
if(obj_state & LV_STATE_PRESSED) return LV_BTN_STATE_PRESSED; if(obj_state & LV_STATE_PRESSED) return LV_BTN_STATE_PRESSED;
else return LV_BTN_STATE_RELEASED; else return LV_BTN_STATE_RELEASED;
} }
@@ -288,6 +289,7 @@ static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param)
} }
} }
else if(sign == LV_SIGNAL_CONTROL) { else if(sign == LV_SIGNAL_CONTROL) {
#if LV_USE_GROUP
char c = *((char *)param); char c = *((char *)param);
if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { if(c == LV_KEY_RIGHT || c == LV_KEY_UP) {
if(lv_btn_get_checkable(btn)) { if(lv_btn_get_checkable(btn)) {
@@ -308,6 +310,7 @@ static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param)
if(res != LV_RES_OK) return res; if(res != LV_RES_OK) return res;
} }
} }
#endif
} }
return res; return res;

View File

@@ -9,7 +9,7 @@
#include "lv_btnmatrix.h" #include "lv_btnmatrix.h"
#if LV_USE_BTNMATRIX != 0 #if LV_USE_BTNMATRIX != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_core/lv_group.h" #include "../lv_core/lv_group.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_core/lv_refr.h" #include "../lv_core/lv_refr.h"
@@ -422,6 +422,23 @@ void lv_btnmatrix_set_one_check(lv_obj_t * btnm, bool one_chk)
make_one_button_toggled(btnm, 0); make_one_button_toggled(btnm, 0);
} }
/**
* Set the align of the map text (left, right or center)
* @param btnm pointer to a btnmatrix object
* @param align LV_LABEL_ALIGN_LEFT, LV_LABEL_ALIGN_RIGHT or LV_LABEL_ALIGN_CENTER
*/
void lv_btnmatrix_set_align(lv_obj_t * btnm, lv_label_align_t align)
{
LV_ASSERT_OBJ(btnm, LV_OBJX_NAME);
lv_btnmatrix_ext_t * ext = lv_obj_get_ext_attr(btnm);
if(ext->align == align) return;
ext->align = align;
lv_obj_invalidate(btnm);
}
/*===================== /*=====================
* Getter functions * Getter functions
*====================*/ *====================*/
@@ -563,12 +580,38 @@ bool lv_btnmatrix_get_one_check(const lv_obj_t * btnm)
return ext->one_check; return ext->one_check;
} }
/**
* Get the align attribute
* @param btnm pointer to a btnmatrix object
* @return LV_LABEL_ALIGN_LEFT, LV_LABEL_ALIGN_RIGHT or LV_LABEL_ALIGN_CENTER
*/
lv_label_align_t lv_btnmatrix_get_align(const lv_obj_t * btnm)
{
LV_ASSERT_OBJ(btnm, LV_OBJX_NAME);
lv_btnmatrix_ext_t * ext = lv_obj_get_ext_attr(btnm);
lv_label_align_t align = ext->align;
if(align == LV_LABEL_ALIGN_AUTO) {
#if LV_USE_BIDI
lv_bidi_dir_t base_dir = lv_obj_get_base_dir(btnm);
if(base_dir == LV_BIDI_DIR_RTL) align = LV_LABEL_ALIGN_RIGHT;
else align = LV_LABEL_ALIGN_LEFT;
#else
align = LV_LABEL_ALIGN_LEFT;
#endif
}
return align;
}
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
/** /**
* Handle the drawing related tasks of the button matrixs * Handle the drawing related tasks of the button matrix
* @param btnm pointer to a button matrix object * @param btnm pointer to a button matrix object
* @param clip_area the object will be drawn only in this area * @param clip_area the object will be drawn only in this area
* @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area
@@ -598,7 +641,10 @@ static lv_design_res_t lv_btnmatrix_design(lv_obj_t * btnm, const lv_area_t * cl
uint16_t btn_i = 0; uint16_t btn_i = 0;
uint16_t txt_i = 0; uint16_t txt_i = 0;
lv_txt_flag_t txt_flag = LV_TXT_FLAG_NONE; lv_txt_flag_t txt_flag = LV_TXT_FLAG_NONE;
if(ext->recolor) txt_flag = LV_TXT_FLAG_RECOLOR; if(ext->recolor) txt_flag |= LV_TXT_FLAG_RECOLOR;
lv_label_align_t align = lv_btnmatrix_get_align(btnm);
if(align == LV_LABEL_ALIGN_CENTER) txt_flag |= LV_TXT_FLAG_CENTER;
if(align == LV_LABEL_ALIGN_RIGHT) txt_flag |= LV_TXT_FLAG_RIGHT;
lv_draw_rect_dsc_t draw_rect_rel_dsc; lv_draw_rect_dsc_t draw_rect_rel_dsc;
lv_draw_label_dsc_t draw_label_rel_dsc; lv_draw_label_dsc_t draw_label_rel_dsc;
@@ -821,11 +867,11 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa
} }
#endif #endif
if(ext->btn_id_act != LV_BTNMATRIX_BTN_NONE) { if(ext->btn_id_pr != LV_BTNMATRIX_BTN_NONE) {
if(button_is_click_trig(ext->ctrl_bits[ext->btn_id_act]) == false && if(button_is_click_trig(ext->ctrl_bits[ext->btn_id_pr]) == false &&
button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && button_is_inactive(ext->ctrl_bits[ext->btn_id_pr]) == false &&
button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { button_is_hidden(ext->ctrl_bits[ext->btn_id_pr]) == false) {
uint32_t b = ext->btn_id_act; uint32_t b = ext->btn_id_pr;
res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b); res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b);
} }
} }
@@ -844,21 +890,22 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa
if(ext->btn_id_pr != LV_BTNMATRIX_BTN_NONE) { if(ext->btn_id_pr != LV_BTNMATRIX_BTN_NONE) {
invalidate_button_area(btnm, ext->btn_id_pr); invalidate_button_area(btnm, ext->btn_id_pr);
} }
ext->btn_id_pr = btn_pr;
ext->btn_id_act = btn_pr;
lv_indev_reset_long_press(param); /*Start the log press time again on the new button*/ lv_indev_reset_long_press(param); /*Start the log press time again on the new button*/
if(btn_pr != LV_BTNMATRIX_BTN_NONE && if(btn_pr != LV_BTNMATRIX_BTN_NONE &&
button_is_inactive(ext->ctrl_bits[btn_pr]) == false && button_is_inactive(ext->ctrl_bits[btn_pr]) == false &&
button_is_hidden(ext->ctrl_bits[btn_pr]) == false) { button_is_hidden(ext->ctrl_bits[btn_pr]) == false) {
/* Send VALUE_CHANGED for the newly pressed button */ /* Send VALUE_CHANGED for the newly pressed button */
uint32_t b = ext->btn_id_act; uint32_t b = btn_pr;
res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b); res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b);
if(res == LV_RES_OK) { if(res == LV_RES_OK) {
invalidate_button_area(btnm, btn_pr); invalidate_button_area(btnm, btn_pr);
} }
} }
} }
ext->btn_id_pr = btn_pr;
ext->btn_id_act = btn_pr;
} }
else if(sign == LV_SIGNAL_RELEASED) { else if(sign == LV_SIGNAL_RELEASED) {
if(ext->btn_id_pr != LV_BTNMATRIX_BTN_NONE) { if(ext->btn_id_pr != LV_BTNMATRIX_BTN_NONE) {
@@ -924,6 +971,7 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa
/*In navigation mode don't select any button but in edit mode select the fist*/ /*In navigation mode don't select any button but in edit mode select the fist*/
if(lv_group_get_editing(lv_obj_get_group(btnm))) { if(lv_group_get_editing(lv_obj_get_group(btnm))) {
ext->btn_id_focused = 0; ext->btn_id_focused = 0;
ext->btn_id_act = ext->btn_id_focused;
} }
else { else {
ext->btn_id_focused = LV_BTNMATRIX_BTN_NONE; ext->btn_id_focused = LV_BTNMATRIX_BTN_NONE;
@@ -931,9 +979,9 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa
} }
else if(indev_type == LV_INDEV_TYPE_KEYPAD) { else if(indev_type == LV_INDEV_TYPE_KEYPAD) {
ext->btn_id_focused = 0; ext->btn_id_focused = 0;
ext->btn_id_act = ext->btn_id_focused;
} }
ext->btn_id_act = ext->btn_id_focused;
#endif #endif
} }
else if(sign == LV_SIGNAL_DEFOCUS || sign == LV_SIGNAL_LEAVE) { else if(sign == LV_SIGNAL_DEFOCUS || sign == LV_SIGNAL_LEAVE) {
@@ -944,6 +992,7 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa
ext->btn_id_act = LV_BTNMATRIX_BTN_NONE; ext->btn_id_act = LV_BTNMATRIX_BTN_NONE;
} }
else if(sign == LV_SIGNAL_CONTROL) { else if(sign == LV_SIGNAL_CONTROL) {
#if LV_USE_GROUP
char c = *((char *)param); char c = *((char *)param);
if(c == LV_KEY_RIGHT) { if(c == LV_KEY_RIGHT) {
if(ext->btn_id_focused == LV_BTNMATRIX_BTN_NONE) if(ext->btn_id_focused == LV_BTNMATRIX_BTN_NONE)
@@ -1011,10 +1060,13 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa
ext->btn_id_act = ext->btn_id_focused; ext->btn_id_act = ext->btn_id_focused;
lv_obj_invalidate(btnm); lv_obj_invalidate(btnm);
} }
#endif
} }
else if(sign == LV_SIGNAL_GET_EDITABLE) { else if(sign == LV_SIGNAL_GET_EDITABLE) {
#if LV_USE_GROUP
bool * editable = (bool *)param; bool * editable = (bool *)param;
*editable = true; *editable = true;
#endif
} }
return res; return res;
} }

View File

@@ -59,6 +59,7 @@ typedef struct {
uint16_t btn_id_act; /*Index of the active button (being pressed/released etc) or LV_BTNMATRIX_BTN_NONE */ uint16_t btn_id_act; /*Index of the active button (being pressed/released etc) or LV_BTNMATRIX_BTN_NONE */
uint8_t recolor : 1; /*Enable button recoloring*/ uint8_t recolor : 1; /*Enable button recoloring*/
uint8_t one_check : 1; /*Single button toggled at once*/ uint8_t one_check : 1; /*Single button toggled at once*/
uint8_t align : 2; /*Align type from 'lv_label_align_t'*/
} lv_btnmatrix_ext_t; } lv_btnmatrix_ext_t;
enum { enum {
@@ -170,6 +171,13 @@ void lv_btnmatrix_set_btn_width(lv_obj_t * btnm, uint16_t btn_id, uint8_t width)
*/ */
void lv_btnmatrix_set_one_check(lv_obj_t * btnm, bool one_chk); void lv_btnmatrix_set_one_check(lv_obj_t * btnm, bool one_chk);
/**
* Set the align of the map text (left, right or center)
* @param btnm pointer to a btnmatrix object
* @param align LV_LABEL_ALIGN_LEFT, LV_LABEL_ALIGN_RIGHT or LV_LABEL_ALIGN_CENTER
*/
void lv_btnmatrix_set_align(lv_obj_t * btnm, lv_label_align_t align);
/*===================== /*=====================
* Getter functions * Getter functions
*====================*/ *====================*/
@@ -236,6 +244,14 @@ bool lv_btnmatrix_get_btn_ctrl(lv_obj_t * btnm, uint16_t btn_id, lv_btnmatrix_ct
* @return whether "one toggle" mode is enabled * @return whether "one toggle" mode is enabled
*/ */
bool lv_btnmatrix_get_one_check(const lv_obj_t * btnm); bool lv_btnmatrix_get_one_check(const lv_obj_t * btnm);
/**
* Get the align attribute
* @param btnm pointer to a btnmatrix object
* @return LV_LABEL_ALIGN_LEFT, LV_LABEL_ALIGN_RIGHT or LV_LABEL_ALIGN_CENTER
*/
lv_label_align_t lv_btnmatrix_get_align(const lv_obj_t * btnm);
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/

View File

@@ -9,7 +9,7 @@
#include "lv_calendar.h" #include "lv_calendar.h"
#if LV_USE_CALENDAR != 0 #if LV_USE_CALENDAR != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_hal/lv_hal_indev.h" #include "../lv_hal/lv_hal_indev.h"
#include "../lv_misc/lv_utils.h" #include "../lv_misc/lv_utils.h"
@@ -515,6 +515,7 @@ static lv_res_t lv_calendar_signal(lv_obj_t * calendar, lv_signal_t sign, void *
lv_obj_invalidate(calendar); lv_obj_invalidate(calendar);
} }
else if(sign == LV_SIGNAL_CONTROL) { else if(sign == LV_SIGNAL_CONTROL) {
#if LV_USE_GROUP
uint8_t c = *((uint8_t *)param); uint8_t c = *((uint8_t *)param);
lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar);
if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { if(c == LV_KEY_RIGHT || c == LV_KEY_UP) {
@@ -537,6 +538,7 @@ static lv_res_t lv_calendar_signal(lv_obj_t * calendar, lv_signal_t sign, void *
} }
lv_obj_invalidate(calendar); lv_obj_invalidate(calendar);
} }
#endif
} }
return res; return res;

View File

@@ -8,7 +8,7 @@
*********************/ *********************/
#include <stdlib.h> #include <stdlib.h>
#include "lv_canvas.h" #include "lv_canvas.h"
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_misc/lv_math.h" #include "../lv_misc/lv_math.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_core/lv_refr.h" #include "../lv_core/lv_refr.h"

View File

@@ -9,7 +9,7 @@
#include "lv_chart.h" #include "lv_chart.h"
#if LV_USE_CHART != 0 #if LV_USE_CHART != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_core/lv_refr.h" #include "../lv_core/lv_refr.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_misc/lv_math.h" #include "../lv_misc/lv_math.h"
@@ -203,9 +203,9 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color)
} }
/** /**
* Clear the point of a serie * Clear the point of a series
* @param chart pointer to a chart object * @param chart pointer to a chart object
* @param serie pointer to the chart's serie to clear * @param serie pointer to the chart's series to clear
*/ */
void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie) void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie)
{ {
@@ -650,9 +650,10 @@ static lv_res_t lv_chart_signal(lv_obj_t * chart, lv_signal_t sign, void * param
lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart);
if(sign == LV_SIGNAL_CLEANUP) { if(sign == LV_SIGNAL_CLEANUP) {
lv_coord_t ** datal; lv_chart_series_t * ser;
_LV_LL_READ(ext->series_ll, datal) { _LV_LL_READ(ext->series_ll, ser) {
lv_mem_free(*datal); lv_mem_free(ser->points);
lv_mem_free(ser);
} }
_lv_ll_clear(&ext->series_ll); _lv_ll_clear(&ext->series_ll);

View File

@@ -78,7 +78,7 @@ typedef struct {
typedef struct { typedef struct {
/*No inherited ext*/ /*Ext. of ancestor*/ /*No inherited ext*/ /*Ext. of ancestor*/
/*New data for this type */ /*New data for this type */
lv_ll_t series_ll; /*Linked list for the data line pointers (stores lv_chart_dl_t)*/ lv_ll_t series_ll; /*Linked list for the data line pointers (stores lv_chart_series_t)*/
lv_coord_t ymin; /*y min value (used to scale the data)*/ lv_coord_t ymin; /*y min value (used to scale the data)*/
lv_coord_t ymax; /*y max value (used to scale the data)*/ lv_coord_t ymax; /*y max value (used to scale the data)*/
uint8_t hdiv_cnt; /*Number of horizontal division lines*/ uint8_t hdiv_cnt; /*Number of horizontal division lines*/
@@ -126,9 +126,9 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy);
lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color); lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color);
/** /**
* Clear the point of a serie * Clear the point of a series
* @param chart pointer to a chart object * @param chart pointer to a chart object
* @param serie pointer to the chart's serie to clear * @param serie pointer to the chart's series to clear
*/ */
void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie); void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie);

View File

@@ -9,7 +9,7 @@
#include "lv_checkbox.h" #include "lv_checkbox.h"
#if LV_USE_CHECKBOX != 0 #if LV_USE_CHECKBOX != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_core/lv_group.h" #include "../lv_core/lv_group.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
@@ -193,11 +193,13 @@ static lv_res_t lv_checkbox_signal(lv_obj_t * cb, lv_signal_t sign, void * param
lv_obj_set_state(ext->bullet, lv_obj_get_state(cb, LV_CHECKBOX_PART_BG)); lv_obj_set_state(ext->bullet, lv_obj_get_state(cb, LV_CHECKBOX_PART_BG));
} }
else if(sign == LV_SIGNAL_CONTROL) { else if(sign == LV_SIGNAL_CONTROL) {
#if LV_USE_GROUP
char c = *((char *)param); char c = *((char *)param);
if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN || c == LV_KEY_LEFT || c == LV_KEY_UP) { if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN || c == LV_KEY_LEFT || c == LV_KEY_UP) {
/*Follow the backgrounds state with the bullet*/ /*Follow the backgrounds state with the bullet*/
lv_obj_set_state(ext->bullet, lv_obj_get_state(cb, LV_CHECKBOX_PART_BG)); lv_obj_set_state(ext->bullet, lv_obj_get_state(cb, LV_CHECKBOX_PART_BG));
} }
#endif
} }
return res; return res;

View File

@@ -14,7 +14,7 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_draw/lv_draw_mask.h" #include "../lv_draw/lv_draw_mask.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"

View File

@@ -10,7 +10,7 @@
#include "lv_cpicker.h" #include "lv_cpicker.h"
#if LV_USE_CPICKER != 0 #if LV_USE_CPICKER != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw_arc.h" #include "../lv_draw/lv_draw_arc.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_core/lv_indev.h" #include "../lv_core/lv_indev.h"
@@ -701,6 +701,7 @@ static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * p
lv_obj_invalidate(cpicker); lv_obj_invalidate(cpicker);
} }
else if(sign == LV_SIGNAL_CONTROL) { else if(sign == LV_SIGNAL_CONTROL) {
#if LV_USE_GROUP
uint32_t c = *((uint32_t *)param); /*uint32_t because can be UTF-8*/ uint32_t c = *((uint32_t *)param); /*uint32_t because can be UTF-8*/
if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { if(c == LV_KEY_RIGHT || c == LV_KEY_UP) {
@@ -745,6 +746,7 @@ static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * p
if(res != LV_RES_OK) return res; if(res != LV_RES_OK) return res;
} }
} }
#endif
} }
else if(sign == LV_SIGNAL_PRESSED) { else if(sign == LV_SIGNAL_PRESSED) {
ext->last_change_time = lv_tick_get(); ext->last_change_time = lv_tick_get();

View File

@@ -9,7 +9,7 @@
#include "lv_dropdown.h" #include "lv_dropdown.h"
#if LV_USE_DROPDOWN != 0 #if LV_USE_DROPDOWN != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_core/lv_group.h" #include "../lv_core/lv_group.h"
#include "../lv_core/lv_indev.h" #include "../lv_core/lv_indev.h"
@@ -208,7 +208,7 @@ void lv_dropdown_set_options(lv_obj_t * ddlist, const char * options)
/*Count the '\n'-s to determine the number of options*/ /*Count the '\n'-s to determine the number of options*/
ext->option_cnt = 0; ext->option_cnt = 0;
uint16_t i; uint32_t i;
for(i = 0; options[i] != '\0'; i++) { for(i = 0; options[i] != '\0'; i++) {
if(options[i] == '\n') ext->option_cnt++; if(options[i] == '\n') ext->option_cnt++;
} }
@@ -237,7 +237,7 @@ void lv_dropdown_set_options(lv_obj_t * ddlist, const char * options)
/** /**
* Set the options in a drop down list from a string * Set the options in a drop down list from a string
* @param ddlist pointer to drop down list object * @param ddlist pointer to drop down list object
* @param options a staic string with '\n' separated options. E.g. "One\nTwo\nThree" * @param options a static string with '\n' separated options. E.g. "One\nTwo\nThree"
*/ */
void lv_dropdown_set_options_static(lv_obj_t * ddlist, const char * options) void lv_dropdown_set_options_static(lv_obj_t * ddlist, const char * options)
{ {
@@ -248,7 +248,7 @@ void lv_dropdown_set_options_static(lv_obj_t * ddlist, const char * options)
/*Count the '\n'-s to determine the number of options*/ /*Count the '\n'-s to determine the number of options*/
ext->option_cnt = 0; ext->option_cnt = 0;
uint16_t i; uint32_t i;
for(i = 0; options[i] != '\0'; i++) { for(i = 0; options[i] != '\0'; i++) {
if(options[i] == '\n') ext->option_cnt++; if(options[i] == '\n') ext->option_cnt++;
} }
@@ -271,7 +271,7 @@ void lv_dropdown_set_options_static(lv_obj_t * ddlist, const char * options)
* @param option a string without '\n'. E.g. "Four" * @param option a string without '\n'. E.g. "Four"
* @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string * @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string
*/ */
void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint16_t pos) void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint32_t pos)
{ {
LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME);
LV_ASSERT_STR(option); LV_ASSERT_STR(option);
@@ -302,9 +302,9 @@ void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint16_t pos
ext->options[old_len] = 0; ext->options[old_len] = 0;
/*Find the insert character position*/ /*Find the insert character position*/
uint16_t insert_pos = old_len; uint32_t insert_pos = old_len;
if(pos != LV_DROPDOWN_POS_LAST) { if(pos != LV_DROPDOWN_POS_LAST) {
int opcnt = 0; uint32_t opcnt = 0;
for(insert_pos = 0; ext->options[insert_pos] != 0; insert_pos++) { for(insert_pos = 0; ext->options[insert_pos] != 0; insert_pos++) {
if(opcnt == pos) if(opcnt == pos)
break; break;
@@ -489,21 +489,21 @@ uint16_t lv_dropdown_get_option_cnt(const lv_obj_t * ddlist)
* @param buf pointer to an array to store the string * @param buf pointer to an array to store the string
* @param buf_size size of `buf` in bytes. 0: to ignore it. * @param buf_size size of `buf` in bytes. 0: to ignore it.
*/ */
void lv_dropdown_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t buf_size) void lv_dropdown_get_selected_str(const lv_obj_t * ddlist, char * buf, uint32_t buf_size)
{ {
LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME);
lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist);
uint16_t i; uint32_t i;
uint16_t line = 0; uint32_t line = 0;
size_t txt_len = strlen(ext->options); size_t txt_len = strlen(ext->options);
for(i = 0; i < txt_len && line != ext->sel_opt_id_orig; i++) { for(i = 0; i < txt_len && line != ext->sel_opt_id_orig; i++) {
if(ext->options[i] == '\n') line++; if(ext->options[i] == '\n') line++;
} }
uint16_t c; uint32_t c;
for(c = 0; i < txt_len && ext->options[i] != '\n'; c++, i++) { for(c = 0; i < txt_len && ext->options[i] != '\n'; c++, i++) {
if(buf_size && c >= buf_size - 1) { if(buf_size && c >= buf_size - 1) {
LV_LOG_WARN("lv_dropdown_get_selected_str: the buffer was too small") LV_LOG_WARN("lv_dropdown_get_selected_str: the buffer was too small")
@@ -586,10 +586,10 @@ void lv_dropdown_open(lv_obj_t * ddlist)
ext->page = lv_page_create(lv_obj_get_screen(ddlist), NULL); ext->page = lv_page_create(lv_obj_get_screen(ddlist), NULL);
lv_obj_add_protect(ext->page, LV_PROTECT_POS | LV_PROTECT_CLICK_FOCUS); lv_obj_add_protect(ext->page, LV_PROTECT_POS | LV_PROTECT_CLICK_FOCUS);
lv_obj_add_protect(lv_page_get_scrllable(ext->page), LV_PROTECT_CLICK_FOCUS); lv_obj_add_protect(lv_page_get_scrollable(ext->page), LV_PROTECT_CLICK_FOCUS);
if(ancestor_page_signal == NULL) ancestor_page_signal = lv_obj_get_signal_cb(ext->page); if(ancestor_page_signal == NULL) ancestor_page_signal = lv_obj_get_signal_cb(ext->page);
if(ancestor_page_scrl_signal == NULL) ancestor_page_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrllable( if(ancestor_page_scrl_signal == NULL) ancestor_page_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrollable(
ext->page)); ext->page));
if(ancestor_page_design == NULL) ancestor_page_design = lv_obj_get_design_cb(ext->page); if(ancestor_page_design == NULL) ancestor_page_design = lv_obj_get_design_cb(ext->page);
@@ -604,7 +604,7 @@ void lv_dropdown_open(lv_obj_t * ddlist)
lv_obj_set_design_cb(ext->page, lv_dropdown_page_design); lv_obj_set_design_cb(ext->page, lv_dropdown_page_design);
lv_obj_set_signal_cb(ext->page, lv_dropdown_page_signal); lv_obj_set_signal_cb(ext->page, lv_dropdown_page_signal);
lv_obj_set_signal_cb(lv_page_get_scrllable(ext->page), lv_dropdown_page_scrl_signal); lv_obj_set_signal_cb(lv_page_get_scrollable(ext->page), lv_dropdown_page_scrl_signal);
lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_BG), &ext->style_page); lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_BG), &ext->style_page);
lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_SCROLLBAR), &ext->style_scrlbar); lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_SCROLLBAR), &ext->style_scrlbar);
@@ -935,6 +935,9 @@ static lv_res_t lv_dropdown_signal(lv_obj_t * ddlist, lv_signal_t sign, void * p
lv_dropdown_close(ddlist); lv_dropdown_close(ddlist);
if(ext->sel_opt_id_orig != ext->sel_opt_id) { if(ext->sel_opt_id_orig != ext->sel_opt_id) {
ext->sel_opt_id_orig = ext->sel_opt_id; ext->sel_opt_id_orig = ext->sel_opt_id;
uint32_t id = ext->sel_opt_id; /*Just to use uint32_t in event data*/
res = lv_event_send(ddlist, LV_EVENT_VALUE_CHANGED, &id);
if(res != LV_RES_OK) return res;
lv_obj_invalidate(ddlist); lv_obj_invalidate(ddlist);
} }
#if LV_USE_GROUP #if LV_USE_GROUP
@@ -965,6 +968,7 @@ static lv_res_t lv_dropdown_signal(lv_obj_t * ddlist, lv_signal_t sign, void * p
if(ext->page) lv_obj_refresh_style(ext->page, LV_STYLE_PROP_ALL); if(ext->page) lv_obj_refresh_style(ext->page, LV_STYLE_PROP_ALL);
} }
else if(sign == LV_SIGNAL_CONTROL) { else if(sign == LV_SIGNAL_CONTROL) {
#if LV_USE_GROUP
char c = *((char *)param); char c = *((char *)param);
if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) {
if(ext->page == NULL) { if(ext->page == NULL) {
@@ -989,10 +993,13 @@ static lv_res_t lv_dropdown_signal(lv_obj_t * ddlist, lv_signal_t sign, void * p
ext->sel_opt_id = ext->sel_opt_id_orig; ext->sel_opt_id = ext->sel_opt_id_orig;
lv_dropdown_close(ddlist); lv_dropdown_close(ddlist);
} }
#endif
} }
else if(sign == LV_SIGNAL_GET_EDITABLE) { else if(sign == LV_SIGNAL_GET_EDITABLE) {
#if LV_USE_GROUP
bool * editable = (bool *)param; bool * editable = (bool *)param;
*editable = true; *editable = true;
#endif
} }
return res; return res;
@@ -1020,10 +1027,10 @@ static lv_res_t lv_dropdown_page_signal(lv_obj_t * page, lv_signal_t sign, void
if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) {
/* Make possible to draw on the full width of the background to redraw the selected rectangle /* Make possible to draw on the full width of the background to redraw the selected rectangle
* when the ddlist is scrolled in fix height mode. * when the ddlist is scrolled in fix height mode.
* (The scrollabel is scrolled the "select rectangle" is drawn on the bg too)*/ * (The scrollable is scrolled then "select rectangle" is drawn on the bg too)*/
lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_LIST); lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_LIST);
lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_LIST); lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_LIST);
lv_obj_t * scrl = lv_page_get_scrllable(page); lv_obj_t * scrl = lv_page_get_scrollable(page);
scrl->ext_draw_pad = LV_MATH_MAX3(scrl->ext_draw_pad, left, right); scrl->ext_draw_pad = LV_MATH_MAX3(scrl->ext_draw_pad, left, right);
} }
else if(sign == LV_SIGNAL_RELEASED) { else if(sign == LV_SIGNAL_RELEASED) {
@@ -1078,7 +1085,7 @@ static lv_res_t lv_dropdown_page_scrl_signal(lv_obj_t * scrl, lv_signal_t sign,
else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) {
/* Make possible to draw on the full width of the background to redraw the selected rectangle /* Make possible to draw on the full width of the background to redraw the selected rectangle
* when the ddlist is scrolled in fix height mode. * when the ddlist is scrolled in fix height mode.
* (The scrollabel is scrolled the "select rectangle" is drawn on the bg too)*/ * (The scrollable is scrolled then "select rectangle" is drawn on the bg too)*/
lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_LIST); lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_LIST);
lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_LIST); lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_LIST);
scrl->ext_draw_pad = LV_MATH_MAX3(scrl->ext_draw_pad, left, right); scrl->ext_draw_pad = LV_MATH_MAX3(scrl->ext_draw_pad, left, right);
@@ -1266,7 +1273,7 @@ static uint16_t get_id_on_point(lv_obj_t * ddlist, lv_coord_t x, lv_coord_t y)
if(label == NULL) return 0; if(label == NULL) return 0;
x -= label->coords.x1; x -= label->coords.x1;
y -= label->coords.y1; y -= label->coords.y1;
uint16_t letter_i; uint32_t letter_i;
lv_point_t p = {x, y}; lv_point_t p = {x, y};
letter_i = lv_label_get_letter_on(label, &p); letter_i = lv_label_get_letter_on(label, &p);
@@ -1297,7 +1304,7 @@ static void position_to_selected(lv_obj_t * ddlist)
const lv_font_t * font = lv_obj_get_style_text_font(ddlist, LV_DROPDOWN_PART_LIST); const lv_font_t * font = lv_obj_get_style_text_font(ddlist, LV_DROPDOWN_PART_LIST);
lv_coord_t font_h = lv_font_get_line_height(font); lv_coord_t font_h = lv_font_get_line_height(font);
lv_obj_t * scrl = lv_page_get_scrllable(ext->page); lv_obj_t * scrl = lv_page_get_scrollable(ext->page);
lv_obj_t * label = get_label(ddlist); lv_obj_t * label = get_label(ddlist);
if(label == NULL) return; if(label == NULL) return;
@@ -1317,7 +1324,7 @@ static lv_obj_t * get_label(const lv_obj_t * ddlist)
lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist);
if(ext->page == NULL) return NULL; if(ext->page == NULL) return NULL;
return lv_obj_get_child(lv_page_get_scrllable(ext->page), NULL); return lv_obj_get_child(lv_page_get_scrollable(ext->page), NULL);
} }
#endif #endif

View File

@@ -125,7 +125,7 @@ void lv_dropdown_set_options_static(lv_obj_t * ddlist, const char * options);
* @param option a string without '\n'. E.g. "Four" * @param option a string without '\n'. E.g. "Four"
* @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string * @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string
*/ */
void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint16_t pos); void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint32_t pos);
/** /**
* Set the selected option * Set the selected option
@@ -201,7 +201,7 @@ uint16_t lv_dropdown_get_option_cnt(const lv_obj_t * ddlist);
* @param buf pointer to an array to store the string * @param buf pointer to an array to store the string
* @param buf_size size of `buf` in bytes. 0: to ignore it. * @param buf_size size of `buf` in bytes. 0: to ignore it.
*/ */
void lv_dropdown_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t buf_size); void lv_dropdown_get_selected_str(const lv_obj_t * ddlist, char * buf, uint32_t buf_size);
/** /**
* Get the fix height value. * Get the fix height value.

View File

@@ -9,7 +9,7 @@
#include "lv_gauge.h" #include "lv_gauge.h"
#if LV_USE_GAUGE != 0 #if LV_USE_GAUGE != 0
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_draw/lv_draw.h" #include "../lv_draw/lv_draw.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_misc/lv_txt.h" #include "../lv_misc/lv_txt.h"
@@ -519,7 +519,7 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask)
lv_coord_t y_ofs = gauge->coords.y1 + r + top + scale_width + txt_pad; lv_coord_t y_ofs = gauge->coords.y1 + r + top + scale_width + txt_pad;
int16_t scale_angle = lv_linemeter_get_scale_angle(gauge); int16_t scale_angle = lv_linemeter_get_scale_angle(gauge);
uint16_t label_num = ext->label_count; uint16_t label_num = ext->label_count;
int16_t angle_ofs = 90 + (360 - scale_angle) / 2; int16_t angle_ofs = 90 + (360 - scale_angle) / 2 + lv_gauge_get_angle_offset(gauge);
int32_t min = lv_gauge_get_min_value(gauge); int32_t min = lv_gauge_get_min_value(gauge);
int32_t max = lv_gauge_get_max_value(gauge); int32_t max = lv_gauge_get_max_value(gauge);
@@ -578,7 +578,7 @@ static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * clip_area)
lv_coord_t x_ofs = gauge->coords.x1 + r + left + pad; lv_coord_t x_ofs = gauge->coords.x1 + r + left + pad;
lv_coord_t y_ofs = gauge->coords.y1 + r + top + pad; lv_coord_t y_ofs = gauge->coords.y1 + r + top + pad;
uint16_t angle = lv_linemeter_get_scale_angle(gauge); uint16_t angle = lv_linemeter_get_scale_angle(gauge);
int16_t angle_ofs = 90 + (360 - angle) / 2; int16_t angle_ofs = 90 + (360 - angle) / 2 + lv_gauge_get_angle_offset(gauge);
int16_t min = lv_gauge_get_min_value(gauge); int16_t min = lv_gauge_get_min_value(gauge);
int16_t max = lv_gauge_get_max_value(gauge); int16_t max = lv_gauge_get_max_value(gauge);
lv_point_t p_mid; lv_point_t p_mid;

View File

@@ -14,7 +14,7 @@
#error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " #error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) "
#endif #endif
#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_debug.h"
#include "../lv_themes/lv_theme.h" #include "../lv_themes/lv_theme.h"
#include "../lv_draw/lv_img_decoder.h" #include "../lv_draw/lv_img_decoder.h"
#include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_fs.h"
@@ -340,10 +340,9 @@ void lv_img_set_angle(lv_obj_t * img, int16_t angle)
transf_zoom = (transf_zoom * ext->zoom) >> 8; transf_zoom = (transf_zoom * ext->zoom) >> 8;
lv_style_int_t transf_angle = lv_obj_get_style_transform_angle(img, LV_IMG_PART_MAIN); lv_style_int_t transf_angle = lv_obj_get_style_transform_angle(img, LV_IMG_PART_MAIN);
transf_angle += ext->angle;
lv_area_t a; lv_area_t a;
_lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle, transf_zoom, &ext->pivot); _lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle + ext->angle, transf_zoom, &ext->pivot);
a.x1 += img->coords.x1; a.x1 += img->coords.x1;
a.y1 += img->coords.y1; a.y1 += img->coords.y1;
a.x2 += img->coords.x1; a.x2 += img->coords.x1;
@@ -353,7 +352,7 @@ void lv_img_set_angle(lv_obj_t * img, int16_t angle)
ext->angle = angle; ext->angle = angle;
lv_obj_refresh_ext_draw_pad(img); lv_obj_refresh_ext_draw_pad(img);
_lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle, transf_zoom, &ext->pivot); _lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle + ext->angle, transf_zoom, &ext->pivot);
a.x1 += img->coords.x1; a.x1 += img->coords.x1;
a.y1 += img->coords.y1; a.y1 += img->coords.y1;
a.x2 += img->coords.x1; a.x2 += img->coords.x1;
@@ -379,13 +378,12 @@ void lv_img_set_zoom(lv_obj_t * img, uint16_t zoom)
if(zoom == 0) zoom = 1; if(zoom == 0) zoom = 1;
lv_style_int_t transf_zoom = lv_obj_get_style_transform_zoom(img, LV_IMG_PART_MAIN); lv_style_int_t transf_zoom = lv_obj_get_style_transform_zoom(img, LV_IMG_PART_MAIN);
transf_zoom = (transf_zoom * ext->zoom) >> 8;
lv_style_int_t transf_angle = lv_obj_get_style_transform_angle(img, LV_IMG_PART_MAIN); lv_style_int_t transf_angle = lv_obj_get_style_transform_angle(img, LV_IMG_PART_MAIN);
transf_angle += ext->angle; transf_angle += ext->angle;
lv_area_t a; lv_area_t a;
_lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle, transf_zoom, &ext->pivot); _lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle, (transf_zoom * ext->zoom) >> 8, &ext->pivot);
a.x1 += img->coords.x1; a.x1 += img->coords.x1;
a.y1 += img->coords.y1; a.y1 += img->coords.y1;
a.x2 += img->coords.x1; a.x2 += img->coords.x1;
@@ -395,7 +393,7 @@ void lv_img_set_zoom(lv_obj_t * img, uint16_t zoom)
ext->zoom = zoom; ext->zoom = zoom;
lv_obj_refresh_ext_draw_pad(img); lv_obj_refresh_ext_draw_pad(img);
_lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle, transf_zoom, &ext->pivot); _lv_img_buf_get_transformed_area(&a, ext->w, ext->h, transf_angle, (transf_zoom * ext->zoom) >> 8, &ext->pivot);
a.x1 += img->coords.x1; a.x1 += img->coords.x1;
a.y1 += img->coords.y1; a.y1 += img->coords.y1;
a.x2 += img->coords.x1; a.x2 += img->coords.x1;
@@ -587,7 +585,8 @@ static lv_design_res_t lv_img_design(lv_obj_t * img, const lv_area_t * clip_area
if(zoom_final != LV_IMG_ZOOM_NONE) { if(zoom_final != LV_IMG_ZOOM_NONE) {
if(_lv_area_is_in(clip_area, &img->coords, 0) == false) return LV_DESIGN_RES_NOT_COVER; if(_lv_area_is_in(clip_area, &img->coords, 0) == false) return LV_DESIGN_RES_NOT_COVER;
} else { }
else {
lv_area_t a; lv_area_t a;
_lv_img_buf_get_transformed_area(&a, lv_obj_get_width(img), lv_obj_get_height(img), 0, zoom_final, &ext->pivot); _lv_img_buf_get_transformed_area(&a, lv_obj_get_width(img), lv_obj_get_height(img), 0, zoom_final, &ext->pivot);
a.x1 += img->coords.x1; a.x1 += img->coords.x1;
@@ -794,21 +793,24 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param)
} }
else if(sign == LV_SIGNAL_HIT_TEST) { else if(sign == LV_SIGNAL_HIT_TEST) {
lv_hit_test_info_t * info = param; lv_hit_test_info_t * info = param;
if(ext->zoom != 256 && ext->angle == 0) { lv_style_int_t zoom = lv_obj_get_style_transform_zoom(img, LV_IMG_PART_MAIN);
lv_coord_t origin_width = lv_area_get_width(&img->coords); zoom = (zoom * ext->zoom) >> 8;
lv_coord_t origin_height = lv_area_get_height(&img->coords);
lv_coord_t scaled_width = (origin_width * ext->zoom + 255) / 256;
lv_coord_t scaled_height = (origin_height * ext->zoom + 255) / 256;
lv_coord_t width_offset = (origin_width - scaled_width) / 2; lv_style_int_t angle = lv_obj_get_style_transform_angle(img, LV_IMG_PART_MAIN);
lv_coord_t height_offset = (origin_height - scaled_height) / 2; angle += ext->angle;
/* If the object is exactly image sized (not cropped, not mosaic) and transformed
* perform hit test on it's transformed area */
if(ext->w == lv_obj_get_width(img) && ext->h == lv_obj_get_height(img) &&
(zoom != LV_IMG_ZOOM_NONE || angle != 0 || ext->pivot.x != ext->w / 2 || ext->pivot.y != ext->h / 2)) {
lv_area_t coords; lv_area_t coords;
lv_area_copy(&coords, &img->coords); _lv_img_buf_get_transformed_area(&coords, ext->w, ext->h, angle, zoom, &ext->pivot);
coords.x1 += width_offset; coords.x1 += img->coords.x1;
coords.x2 -= width_offset; coords.y1 += img->coords.y1;
coords.y1 += height_offset; coords.x2 += img->coords.x1;
coords.y2 -= height_offset; coords.y2 += img->coords.y1;
info->result = _lv_area_is_point_on(&coords, info->point, 0); info->result = _lv_area_is_point_on(&coords, info->point, 0);
} }
else else

View File

@@ -39,7 +39,7 @@ typedef struct {
lv_coord_t h; /*Height of the image (Handled by the library)*/ lv_coord_t h; /*Height of the image (Handled by the library)*/
uint16_t angle; /*rotation angle of the image*/ uint16_t angle; /*rotation angle of the image*/
lv_point_t pivot; /*rotation center of the image*/ lv_point_t pivot; /*rotation center of the image*/
uint16_t zoom; /*256 means no zoom, 512 double size, 128 hasl size*/ uint16_t zoom; /*256 means no zoom, 512 double size, 128 half size*/
uint8_t src_type : 2; /*See: lv_img_src_t*/ uint8_t src_type : 2; /*See: lv_img_src_t*/
uint8_t auto_size : 1; /*1: automatically set the object size to the image size*/ uint8_t auto_size : 1; /*1: automatically set the object size to the image size*/
uint8_t cf : 5; /*Color format from `lv_img_color_format_t`*/ uint8_t cf : 5; /*Color format from `lv_img_color_format_t`*/

Some files were not shown because too many files have changed in this diff Show More