@@ -95,6 +95,10 @@ namespace lgfx
9595 LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 3 , 3 , 2 , 2 , 2 , 2 ),
9696 LUT_MAKE (3 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 3 ),
9797 LUT_MAKE (3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 , 2 , 2 , 3 ),
98+ ~0u , ~0u , ~0u , ~0u ,
99+ ~0u , ~0u , ~0u , ~0u ,
100+ ~0u , ~0u , ~0u , ~0u ,
101+ ~0u , ~0u , ~0u , ~0u ,
98102 0u ,
99103 };
100104
@@ -111,6 +115,11 @@ namespace lgfx
111115 LUT_MAKE (1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
112116 LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
113117 LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 3 , 3 , 3 , 3 , 2 ),
118+ ~0u , ~0u , ~0u ,
119+ ~0u , ~0u , ~0u , ~0u ,
120+ ~0u , ~0u , ~0u , ~0u ,
121+ ~0u , ~0u , ~0u , ~0u ,
122+ ~0u , ~0u , ~0u , ~0u ,
114123 0u , // 0 1 2 3 4 5 6 7 8 9 a b c d e f
115124 };
116125
@@ -123,6 +132,7 @@ namespace lgfx
123132 LUT_MAKE (1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 ),
124133 LUT_MAKE (1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 ),
125134 LUT_MAKE (1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 ),
135+ ~0u ,
126136 0u ,
127137 };
128138
@@ -132,6 +142,7 @@ namespace lgfx
132142 LUT_MAKE (1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 ),
133143 LUT_MAKE (1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 ),
134144 LUT_MAKE (1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 ),
145+ ~0u ,
135146 0u ,
136147 };
137148
@@ -140,6 +151,7 @@ namespace lgfx
140151 static constexpr const uint32_t lut_eraser[] = {
141152 LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 1 , 1 ),
142153 LUT_MAKE (2 , 2 , 3 , 3 , 3 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
154+ ~0u ,
143155 0u ,
144156 };
145157
@@ -630,7 +642,6 @@ __asm__ __volatile(
630642 " addi " SRC " ," SRC " , 32 \n " // 元データのポインタを進める
631643 " addi " DST " ," DST " , 4 \n " // 出力先のポインタを進める
632644 " BLT_BUFFER_END: \n " // ループ終端
633- " mov a2 ," LPX " \n " // 戻り値にLPXを指定する。データ処理が存在した場合 true, 処理ナシの場合 false となる
634645 " j BLT_END \n " // 関数終了
635646
636647 " BLT_SECTION0: \n "
@@ -770,7 +781,9 @@ __asm__ __volatile(
770781 " j BLT_RETURN7 \n "
771782
772783 " BLT_END: \n "
773- :" =r" (dst));
784+ " mov a2 ," LPX " \n " // 戻り値にLPXを指定する。データ処理が存在した場合 true, 処理ナシの場合 false となる
785+ " retw \n "
786+ );
774787 return dst;
775788
776789#undef DST
@@ -935,7 +948,9 @@ __asm__ __volatile(
935948 s += 2 ;
936949 d += 4 ;
937950 }
938- } else {
951+ } else
952+ if (new_data.mode == epd_mode_t ::epd_text) {
953+ uint_fast16_t white = lut_offset | 0x00FF ;
939954 for (int i = 0 ; i < w; i += 2 ) {
940955 uint_fast16_t s0 = s[0 ];
941956 uint_fast16_t s1 = s[1 ];
@@ -946,6 +961,38 @@ __asm__ __volatile(
946961 d1 &= 0x7FFF ;
947962 d3 &= 0x7FFF ;
948963
964+ // 白以外またはリクエスト済みの内容と相違がある場合に更新
965+ if (white != d1 || d1 != s0) {
966+ uint_fast16_t d0 = d[0 ];
967+ d[1 ] = s0;
968+ // 消去処理を挟んで更新指示する。(元の値の下位8bitのみを使用するとlut_eraser扱いになる)
969+ // 既に消去処理動作中の場合は変更しない
970+ if (d0 >= (lut_eraser_step << 8 )) {
971+ d[0 ] = (uint8_t )d0;
972+ }
973+ }
974+
975+ // 白以外またはリクエスト済みの内容と相違がある場合に更新
976+ if (white != d3 || d3 != s1) {
977+ uint_fast16_t d2 = d[2 ];
978+ d[3 ] = s1;
979+ if (d2 >= (lut_eraser_step << 8 )) {
980+ // 消去処理を挟んで更新指示する。(元の値の下位8bitのみを使用するとlut_eraser扱いになる)
981+ d[2 ] = (uint8_t )d2;
982+ }
983+ }
984+ s += 2 ;
985+ d += 4 ;
986+ }
987+ } else {
988+ for (int i = 0 ; i < w; i += 2 ) {
989+ uint_fast16_t s0 = s[0 ];
990+ uint_fast16_t s1 = s[1 ];
991+ uint_fast16_t d1 = d[1 ];
992+ uint_fast16_t d3 = d[3 ];
993+ s0 += lut_offset;
994+ s1 += lut_offset;
995+
949996 // 既にリクエスト済みの内容と相違がある場合のみ更新
950997 if (d1 != s0) {
951998 uint_fast16_t d0 = d[0 ];
0 commit comments