InfiniTime.git

ref: 0.12.0

src/libs/lvgl/patches/0001-lv_refr-add-support-for-selecting-render-direction.patch


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
From 1f57703589c6d202d9f6259f1d0fefe7bfd39061 Mon Sep 17 00:00:00 2001
From: Koen Zandberg <koen@bergzand.net>
Date: Thu, 27 Feb 2020 16:33:06 +0100
Subject: [PATCH] lv_refr: add support for selecting render direction

---
 src/lv_core/lv_refr.c    | 71 ++++++++++++++++++++++++++++------------
 src/lv_hal/lv_hal_disp.h |  6 ++++
 2 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c
index 5ee3fbb2..e71e1629 100644
--- a/src/lv_core/lv_refr.c
+++ b/src/lv_core/lv_refr.c
@@ -339,30 +339,59 @@ static void lv_refr_area(const lv_area_t * area_p)
             }
         }
 
-        /*Always use the full row*/
-        lv_coord_t row;
-        lv_coord_t row_last = 0;
-        for(row = area_p->y1; row + max_row - 1 <= y2; row += max_row) {
-            /*Calc. the next y coordinates of VDB*/
-            vdb->area.x1 = area_p->x1;
-            vdb->area.x2 = area_p->x2;
-            vdb->area.y1 = row;
-            vdb->area.y2 = row + max_row - 1;
-            if(vdb->area.y2 > y2) vdb->area.y2 = y2;
-            row_last = vdb->area.y2;
-            lv_refr_area_part(area_p);
+        if (disp_refr->render_direction) {
+            /*Always use the full row*/
+            lv_coord_t row;
+            lv_coord_t row_last = y2;
+            for(row = area_p->y2; row > max_row - 1 + area_p->y1; row -= max_row) {
+                /*Calc. the next y coordinates of VDB*/
+                vdb->area.x1 = area_p->x1;
+                vdb->area.x2 = area_p->x2;
+                vdb->area.y1 = row - max_row + 1;
+                vdb->area.y2 = row;
+                if(vdb->area.y2 > y2) vdb->area.y2 = y2;
+                row_last = vdb->area.y1;
+                lv_refr_area_part(area_p);
+            }
+
+            /*If the last (first) y coordinates are not handled yet ...*/
+            if(area_p->y1 != row_last) {
+                /*Calc. the next y coordinates of VDB*/
+                vdb->area.x1 = area_p->x1;
+                vdb->area.x2 = area_p->x2;
+                vdb->area.y1 = area_p->y1;
+                vdb->area.y2 = row;
+
+                /*Refresh this part too*/
+                lv_refr_area_part(area_p);
+            }
         }
+        else {
+            /*Always use the full row*/
+            lv_coord_t row;
+            lv_coord_t row_last = 0;
+            for(row = area_p->y1; row + max_row - 1 <= y2; row += max_row) {
+                /*Calc. the next y coordinates of VDB*/
+                vdb->area.x1 = area_p->x1;
+                vdb->area.x2 = area_p->x2;
+                vdb->area.y1 = row;
+                vdb->area.y2 = row + max_row - 1;
+                if(vdb->area.y2 > y2) vdb->area.y2 = y2;
+                row_last = vdb->area.y2;
+                lv_refr_area_part(area_p);
+            }
 
-        /*If the last y coordinates are not handled yet ...*/
-        if(y2 != row_last) {
-            /*Calc. the next y coordinates of VDB*/
-            vdb->area.x1 = area_p->x1;
-            vdb->area.x2 = area_p->x2;
-            vdb->area.y1 = row;
-            vdb->area.y2 = y2;
+            /*If the last y coordinates are not handled yet ...*/
+            if(y2 != row_last) {
+                /*Calc. the next y coordinates of VDB*/
+                vdb->area.x1 = area_p->x1;
+                vdb->area.x2 = area_p->x2;
+                vdb->area.y1 = row;
+                vdb->area.y2 = y2;
 
-            /*Refresh this part too*/
-            lv_refr_area_part(area_p);
+                /*Refresh this part too*/
+                lv_refr_area_part(area_p);
+            }
         }
     }
 }
diff --git a/src/lv_hal/lv_hal_disp.h b/src/lv_hal/lv_hal_disp.h
index 8db692a0..eef22d98 100644
--- a/src/lv_hal/lv_hal_disp.h
+++ b/src/lv_hal/lv_hal_disp.h
@@ -143,6 +143,7 @@ typedef struct _disp_t
     uint8_t inv_area_joined[LV_INV_BUF_SIZE];
     uint32_t inv_p : 10;
 
+    int render_direction; /**< 0 when rendering down, 1 when rendering up */
     /*Miscellaneous data*/
     uint32_t last_activity_time; /**< Last time there was activity on this display */
 } lv_disp_t;
@@ -230,6 +231,11 @@ lv_coord_t lv_disp_get_ver_res(lv_disp_t * disp);
  */
 bool lv_disp_get_antialiasing(lv_disp_t * disp);
 
+static inline void lv_disp_set_direction(lv_disp_t * disp, int direction)
+{
+    disp->render_direction = direction;
+}
+
 //! @cond Doxygen_Suppress
 
 /**
-- 
2.24.1