Try out LVGL Pro - A complete toolkit to build, test, share, and ship UIs efficiently!
LVGL
Release

LVGL v8.3.0 Released

LVGL v8.3.0 brings layer-based transformations, inherit/initial style values, NXP GPU support, color fonts with emoji, ARM2D acceleration, and PubSub messaging.

Gabor Kiss-VamosiGabor Kiss-Vamosi13 min read

Overview#

LVGL v8.3.0 introduces powerful new rendering capabilities, expanded hardware acceleration, and improved developer ergonomics.

Layers#

Support for transforming (zoom and rotate) any widgets and their children drawn by LVGL. To achieve this, LVGL renders the transformed widgets into a layer and draws that layer as an image applying all the transformations. Layers are also used when opa (not bg_opa, border_opa, etc) and blend_mode are set. This way nested objects are blended as one layer to avoid color bleeding. See more in the documentation.

Inherit and Initial Style Properties#

Besides setting "normal values" for style properties, you can now set them to inherit (inherit the parent's value) and initial (set the system default). See more in the documentation.

NXP PXP and VGLite GPU Support#

The support for NXP GPUs has been added again, bringing hardware acceleration to i.MX RT and i.MX series processors.

Color Font Support#

You can use emojis and images in texts with this great new feature. See more in the documentation.

ARM2D GPU Support#

Get support for Arm's Microcontroller 2D Graphics Acceleration, including Helium-based acceleration and DMA-350 based acceleration.

PubSub Messaging#

A publisher-subscriber based messaging system is added to make communication between components easier. See more in the documentation.

Pinyin IME#

Add support for Pinyin IME Chinese input. See more in the documentation.

Render Start Callback#

A new callback is added to lv_disp_drv_t to indicate when the rendering starts. It's useful for synchronization, such as waiting for a TE (tearing effect) signal.


New Features#

  • feat(ime_pinyin): add API to support 9-key input mode #3447
  • feat(font): add font placeholder drawing configuration #3446
  • feat(fsdrv): add posix lseek() error checking #3444
  • feat(misc): add asynchronous call function cancellation function #3439
  • feat(ime_pinyin): add API to use Pinyin IME (Chinese input) #3408
  • feat(style): add 'inherit' and 'initial' CSS properties #3390
  • feat(porting): add flushing control to the template #3384
  • feat(anim): add deleted callback #3295
  • feat(cmsis-pack): monthly update for May #3394
  • feat(textarea): make it possible to customize the bullet character #3388
  • feat(disp): add a temporary invalidation disable interface #3378
  • feat(group): add edge callbacks when trying to move focus past beginning or end #3374
  • feat(benchmark): make lvgl render at the highest frame rate #3352
  • feat(rt-thread): allow users to control refresh period in the lvgl thread #3375
  • feat(cmsis-pack): Monthly update for May (alpha) #3359
  • feat(demos): add a callback for benchmark #3353
  • feat(gpu): Update lv_gpu_arm2d with new features #3340
  • feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT #3337
  • feat(anim): add the function of getting global animation refresher timer #3331
  • feat(demo): add Weighted FPS and Opa speed log output #3326
  • feat(gpu): Update gpu arm 2d #3320
  • feat(cmsis-pack): Monthly update for April #3300
  • feat(fsdrv): fix issues for win32 backends #3284
  • feat(cmake-build): Option to allow building shared libraries #3278
  • feat(hal): add render_start_cb to disp_drv #3274
  • feat(cmsis-pack): monthly update for April (v1.0.3-alpha) #3271
  • feat(benchmark): add trace output for running a specific scenario #3245
  • feat(env_support): cmsis pack monthly update #3209
  • feat(tabview): support vertical scrolling #3184
  • feat(span): add an interface for setting the number of lines #3200
  • feat(indev): add possibility to enable/disable all input devices at once #3179
  • feat(font): add imgfont - can be used to add emojis to label/span #3160
  • feat(gpu): add gpu arm2d #3162
  • feat(dma2d): add lv_draw_stm32_dma2d_buffer_copy function #3147
  • feat(disp): add screen out animations #3081
  • feat(menu): make menu widget more compatible with encoder #3061
  • feat(label): added animation style property to apply it to circular scrolling animation of label widget #3128
  • feat(script): add pre-commit configuration for code formatting #3092
  • feat(refr): prevents dirty areas from being modified during rendering #3107
  • feat(log): improve lv_log and add log the result from lv_demo_benchmark #3084
  • feat(fragment): add fragment manager (a UI Controller concept) #2940
  • feat(porting): add a macro lv_run_timer_handler_in_period to simplify porting #3063
  • feat(gpu): reattach nxp pxp vglite accelerators 029eef7
  • feat(draw): support transforming widgets and improve sw transform 318146a
  • feat(msg): add publisher-subscriber messaging 79a29d7
  • feat(benchmark): add an API to run specific scene 305ad00
  • feat(gpu): add SWM341 gpu support (synwit) 07b7eea
  • feat(arc): add lv_arc_align_obj_to_angle and lv_arc_rotate_obj_to_angle a76bb70
  • feat(draw): add draw_ctx->buffer_copy d034511
  • feat(dropdown): add lv_dropdown_get_option_index 9997fb0
  • feat(tabview): add API to rename tab 2c9695a
  • feat(indev): send LV_EVENT_PRESS_LOST on release with wait_until_release cc18518
  • feat(gridnav): add lv_gridnav_set_focused b6d2daa

Performance#

  • perf(draw): speed up non normal blend modes 5a06fce
  • perf(draw): minor optimization in point transformation c6c2864
  • perf(layer): cache the layer_type ac2e2f1

Fixes#

  • fix(draw): conflict with external ALIGN define #3336
  • fix(arc): fix bug with LV_ARC_MODE_REVERSE #3418
  • fix(fragment): memory leak of fragments #3442
  • fix(draw): solve memory leaking issue #3437
  • fix(gridnav): correct logic in find_last_focusable #3423
  • fix(examples): correct comment in slider example #3419
  • fix(sdl): add transformation support for the SDL backend #3403
  • fix(bmp): fix with LV_COLOR_16_SWAP #3412
  • fix(sdl): fix LRU #3404
  • fix(draw): avoid use-after-free when drawing arcs #3399
  • fix(subpx): fix subpixel rendering font is not displaying bug #3387
  • fix(style): reset style lookup table after gc sweep/lv_deinit #3385
  • fix(benchmark): fix the issue that wrong scene number is used #3372
  • fix(draw): fix colour supports for indexed and alpha-only #3371
  • fix(mem): fix TLSF returning the wrong pointer when the requested size is too large #3325
  • fix(demo): fix warning #3344
  • fix(config): add LV_GPU_SDL_LRU_SIZE #3348
  • fix(txt): fix returned value of lv_txt_iso8859_1_next(..., NULL) #3338
  • fix(benchmark): remove redundant string for the small screens #3335
  • fix(chart): fix accessing uninitialized point_area #3327
  • fix(config): add LV_LAYER_SIMPLE_BUF_SIZE to Kconfig #3312
  • fix(config): Keep the sequence of widget in order #3314
  • fix(config): fix typo in LV_USE_PERF_MONITOR and LV_USE_MEM_MONITOR #3313
  • fix(refr): initializing row_cnt is to silence the warning #3309
  • fix(meter): fix typo #3308
  • fix(draw): update Makefiles #3303
  • fix(lodepng): fix NULL pointer access #3307
  • fix(Kconfig): change the type of LV_FS_STDIO_LETTER from string to int #3282
  • fix(demo): fix Wformat warning #3290
  • fix(snapshot): add missing ASSERT checks #3292
  • fix(Kconfig): Add LV_USE_GRIDNAV and LV_USE_FRAGMENT to Kconfig #3270
  • fix(msgbox): do not execute init obj when obj == NULL #3264
  • fix(menu): use LV_ASSERT_MALLOC check for new_node #3263
  • fix(canvas): image cache may expire after set canvas's buff #3267
  • fix(obj_style): prevent access to class null pointer #3252
  • fix(png): fix possible memory leak when decoding fails #3249
  • fix(libs): fix possible buffer underflow caused by extension matching #3250
  • fix(fs): track multiple directory handles with win32 backends #3243
  • fix(png): use LV_IMG_CF_TRUE_COLOR_ALPHA instead of LV_IMG_CF_RAW_ALPHA #3212
  • fix(Keil-AC5): silence warnings in Keil-AC5 #3221
  • fix(meter): fix infinite loop caused by loop variable type mismatch #3232
  • fix(chart): remove invalid decision branches #3231
  • fix(gradient): assert before dividing by 0 #3228
  • fix(calendar): fix infinite loop caused by loop variable type mismatch #3230
  • fix(flex): assert before dividing by 0 #3237
  • fix(hal): fix LV_ASSERT_MALLOC wrong placement #3236
  • fix(disp): fix missing null pointer judgment #3238
  • fix(obj_class): fix possible memory leak when the default disp is NULL #3235
  • fix(draw_sw_letter): fix incorrect use of sizeof for a pointer #3234
  • fix(indev): fix null pointer access caused by typo #3229
  • fix(event): remove invalid decision branches #3233
  • fix(draw_mask): remove invalid decision branches #3225
  • fix(spinbox): remove invalid judgment #3227
  • fix(gradient): remove invalid decision branches #3226
  • fix(txt): return 0 if letter_uni is out of range #3224
  • fix(calendar): fix possible array access out of bounds #3223
  • fix(style): remove useless null pointer judgment #3222
  • fix(obj): scrolling exception when use lv_obj_set_parent() #3210
  • fix(libs): fix memcmp memory access overflow #3205
  • fix(png): fix possible file leaks #3204
  • fix(docs): rename task-handler.md to timer-handler.md #3203
  • fix(lru): Fix use of undefined variables #3181
  • fix(rt-thread): Sconscript use LOCAL_CFLAGS to replace LOCAL_CCFLAGS #3196
  • fix(make): make files under draw/gpu #3202
  • fix(docs-CN): fix broken links to docs in dir get-started #3195
  • fix: broken links to docs in dir get-started #3190
  • fix(indev): fix warning about formatting uint32_t with %d #3193
  • fix(Kconfig): move LV_USE_IMGFONT to others menu #3176
  • fix(draw): src_buf_tmp will be NULL when LV_DRAW_COMPLEX is '0' #3163
  • fix(span): align the baselines #3164
  • fix(menu): fix crash on delete #3154
  • fix(Kconfig): add missing LV_USE_THEME_MONO #3146
  • fix(demo/stress): remove the unused assets #3139
  • fix(jpg): swap high and low bytes when macro LV_COLOR_16_SWAP is 1 #3138
  • fix(script): in lv_conf_internal fix some widget dependencies when using Kconfig #3119
  • fix(demo): minor fix for benchmark #3114
  • fix(misc): in lv_map() handle if maximum value less than minimum value #3113
  • fix(extra): adjust image decoder initialization order #3085
  • fix(chart): optimize chart invalidation #3028
  • fix(refr): fix performance monitor NULL pointer access #3105
  • fix(misc): Remove duplicate declaration of _lv_log_add #3103
  • fix(gridnav): get key code from the actual event #3101
  • fix(draw_rect): delete STDC_VERSION to ensure C++ compatibility #3099
  • fix(font): draw placeholder if get_glyph_dsc() returns false #3000
  • fix(conf): work around GCC bug #3082
  • fix(fsdrv): replacing sprintf with lv_snprintf for safety #3079
  • fix(cmsis-pack): add PIDX for cmsis-pack #3064
  • fix(fs): fix cached read and add unit test for lv_fs 98660a8
  • fix(table): invalidate only the changed cell 306fa19
  • fix(draw): handle non BLEND_MODE_NORMAL for ARGB drawing 9ac8ce6
  • fix(draw): revert handling of style_opa on not MAIN parts 51a7a61
  • fix(draw): clip the bg img to the rectangle's area in lv_draw_sw_rect 77d726e
  • fix(obj): fix LV_OBJ_FLAG_OVERFLOW_VISIBLE c742f2c
  • fix(scroll): do not fire scroll begin/end event on every scroll step 25ce6e3
  • fix(indev): do not send keys to objects in disabled state b0a46c4
  • fix(disp): make lv_scr_load work better with lv_scr_load_anim and auto_del = true 52287fd
  • fix(draw): create intermediate layer for blend modes too 8b15007
  • fix(group): in lv_group_remove() fix if the object to focus is deleted 72cb683
  • fix(draw): be sure angle values are in the correct range e624b90
  • fix(scroll): send LV_EVENT_SCROLL_BEGIN/END with no animation too 777fe1e
  • fix(arc): fix arc image drawing issue 7153e3f
  • fix(refr): fix memory write out of bounds issue 13c99fc
  • fix(gif): fix rare issue when drawing the gif's background b1e2c06
  • fix(chart): fix misaligned horizontal tick lines on bar charts 4572a0c
  • fix(font): use 0 width for non printable characters 7cf5709
  • fix(keyboard): don't show popovers on map change ac202e7
  • fix(refr): consider masks with LV_OBJ_FLAG_OVERFLOW_VISIBLE a7f9dfa
  • fix(draw): fix the calculation of the transformed coordinates 76de7c6
  • fix(style): fix heap use after free with transition styles d9ae58b
  • fix(tabview, tileview): fix scrolling 22854ff
  • fix(draw): fix disp_bg_img drawing dea75d9
  • fix(textarea): fix max length handling 127d8e8
  • fix(btnmatrix): fix extra draw size calculation to not clip shadow 7ada130
  • fix(indev): scroll_throw_vect cannot converge to 0 when vect is negative e5c11f1
  • fix(theme): make the basic theme even more simpler 62d6f3c
  • fix(color): color mix rounding error 523062b
  • fix(style): _lv_style_prop_lookup_flags tell all flags for LV_STYLE_PROP_ANY e53f602
  • fix(list): use correct icon formatting b171f7d
  • fix(layout): fix the handling of FLOATING children 48728a7
  • fix(style): make color filter inherited 5546b9d
  • fix(spinbox): set its default width in its class 3d92972
  • fix(draw): fix transformations on subdivided areas cbff8e8
  • fix(slider): fix left knob in ranged mode 17f5e0a
  • fix(Kconfig): allow unchecking LV_CONF_SKIP f3a07a3
  • fix(style): fix using width for both width and height in radius transition 6acbdaa
  • fix(dropdown): fix scrolling when options are CENTER aligned e651383
  • fix(grid): fix dead branch 46bf27d
  • fix(hal): disable driver->screen_transp by default regardless to LV_COLOR_SCREEN_TRANSP ff7204e
  • fix(theme): fix mono theme init 5ec6694
  • fix(bmp): fix typo in BPP condition cbc38af
  • fix(theme): in the basic theme show the textarea cursor only in focused state bb03fb1
  • fix(draw): fix img recolor 23eecce
  • fix(theme): add disabled style to textarea in the default theme 00f6759
  • fix(meter): improve the precision of tick line drawing 0255c6d
  • fix(gpu): fix warning with NXP GPU 6be43b8
  • fix(color): compensate rounding error during blending 42d9c07
  • fix(examples): use type-safe function for retrieving event param 71d535d
  • fix(draw): ensure variable is initialized to avoid warning 276f28a
  • fix(spinbox): rename lv_spinbox_set_pos to lv_spinbox_set_cursor_pos a99eb6b
  • fix(layout): use uint16_t LV_LAYOUT_FLEX/GRID c596a36
  • fix(event): avoid using a boolean as a pointer 06fff4b
  • fix(theme): properly disable transitions if LV_THEME_DEFAULT_TRANSITION_TIME==0 242112b
  • fix(scroll): fix scroll to view to the left 7c74f65
  • fix(fs): mark the read cache as invalid by default 54f9987
  • fix(menu): fix crash on delete a6c4c13
  • fix(roller): fix unexpected jump in infinite mode 18f2d78

Examples#

  • example(ime_pinyin): improved lv_example_ime_pinyin_1 #3428
  • example(imgfont): fix lvgl.h include path #3405
  • example(btnmatrix): update lv_example_btnmatrix_2 to explicitly check which part is drawn 6b2eac1
  • example(slider): make lv_example_slider_3 work with dark theme too 4a766c5
  • example(span): avoid ambiguous meaning 7bb09e3
  • demo(benchmark): add LV_DEMO_BENCHMARK_RGB565A8 option afaa8c9

Documentation#

  • docs(indev): add comment in input device part #3422
  • docs(slider): mention that VALUE_CHANGED is not sent on release #3397
  • docs(readme): add version portuguese brazilian #3349
  • docs(pc-simulator): add MDK with FastModel #3318
  • docs(intro): update for v8.2.0 #3316
  • docs(readme): update link to the PlatformIO Registry #3296
  • docs(gesture): fix typo lv_indev_act() → lv_indev_get_act() #3291
  • docs(scroll): add information about scroll coordinates #3088
  • docs(msgbox): fix typo #3095
  • docs(scroll): use LV_DIR_VER instead of LV_DIR_TOP #3066
  • docs: rearrange the get-started section 8a81532
  • docs: add section for renderers and gpus 378aaa6
  • docs: collapse APIs by default ebd20af
  • docs(images): fix notes about breaking change in v8.2 9a1e385
  • docs(sim): add link to qt-creator 88bbef1
  • docs(chart): describe how to set the space between columns 746917d
  • docs(README): fix broken link c2c44c6
  • docs(examples): avoid redirects when loading examples d367bb7
  • docs(gesture): describe how prevent sending events after a gesture 65db5c9
  • docs(get-started): add quick-overview to the index 91ebf81
  • docs(others): add imgfont to the index 656a0e5

CI and Tests#

  • ci(slider): add unit test #3198
  • test(line): add unit tests for line widget #3104
  • test(table): replicate issue when reducing table cells #3121
  • test(textarea): add unit test #3074
  • test(table): add unit tests #3040
  • ci(docs): replace use of sed with proper configuration variables 1816fa5
  • ci: add Makefile test ea79cee
  • test(mem): add test for memory handling 9700664
  • test(img): fix image error diff handler 48d87e1
  • ci: update docs builder to work with Python 3.10 a3d66c9
  • ci: make sure LVGL assertions cause tests to fail b83c5aa
  • ci: remove formatting comment d345f76
  • ci: don't run workflows twice on PRs fcc1152
  • ci: bump test timeout to 30 seconds 85e3e23
  • ci: limit tests to 15 seconds 003f18f
  • ci(makefile): fix typo in GitHub action a101e70
  • ci(switch): fix mem leak test 8481e3a
  • ci(stale): bump action version 5977eef
  • ci: use GCC problem matcher on ARM tests as well 9fcefe5

About the author

Gabor Kiss-Vamosi
Gabor Kiss-Vamosi

CEO & Creator of LVGL

Founder and lead developer of LVGL, the open-source embedded graphics library used in millions of devices worldwide.

Meet the people behind the blog

Discover the talented writers sharing their knowledge about LVGL

View Authors

Subscribe to our newsletter to not miss any news about LVGL. We will send maximum of 2 mails per month.

LVGL

LVGL is the most popular free and open source embedded graphics library targeting any MCU, MPU and display type to build beautiful UIs.

We also do services like UI design, implementation and consulting.

© 2026 LVGL. All rights reserved.
YouTubeGitHubLinkedIn