Anti-aliasing in LVGL v9 Seems Not Working Properly

Description

What MCU/Processor/Board and compiler are you using?

I’m using an ESP32-based smartwatch project with a round AMOLED display (480x480 resolution). The LVGL version is v9.4.

What do you want to achieve?

I want to achieve smooth, anti-aliased rotation of clock hands (image or vector-based) without noticeable tearing or jagged edges during rotation.
Currently, rotating at angles such as 0°, 90°, 180° shows acceptable visual quality, but at intermediate angles, tearing and strong jagged edges appear, which makes the rotation look unstable and visually unpleasant.

What have you tried so far?

  1. I first used PNG images as clock hands. Rotation caused visible tearing and jagged edges.
  2. I investigated LVGL settings. Anti-aliasing is said to be enabled by default in LVGL 9, but I couldn’t find actual anti-aliasing logic in the image rotation code.
  3. I suspected that SVG might help, but in LVGL 9, when rotating an SVG image, the object disappears.
  4. I then tried using Lottie animations (vector-based). However, even with Lottie, the same tearing and jagged edges appear when animating rotations.
  5. Therefore, it seems that anti-aliasing is not being applied to image or vector rotations in LVGL 9, or something is not working correctly.
  6. I am unsure if this is a configuration issue, a resource issue, missing anti-aliasing in the rotation implementation, or a bug in LVGL 9.

I would like to confirm:

  • Is anti-aliasing for rotated images/vectors actually implemented in LVGL 9?
  • Is there any configuration or compile option required to enable it?
  • Is this a known limitation or bug?
  • What is the recommended solution for smooth hand rotation in round smartwatch UI?

Code to reproduce

(Please note: I can provide a minimal example if needed. Currently using a standard lv_img object and rotating using lv_img_set_angle() or Lottie animation with angle updates.)

lv_img is an “image” widget and the only thing being rendered is an image. it’s a pixel for pixel copy from the image to the frame buffer. anti-aliasing only applies to things that LVGL draws not images.