@@ -73,6 +73,13 @@ static bool is_debug_link = 0;
7373#define OLED_OFFSET (x , y ) (OLED_BUFSIZE - 1 - (x) - ((y) / 8) * OLED_WIDTH)
7474#define OLED_MASK (x , y ) (1 << (7 - (y) % 8))
7575
76+ /*
77+ * Return the state of the pixel at x, y
78+ */
79+ bool oledGetPixel (int x , int y ) {
80+ return _oledbuffer [OLED_OFFSET (x , y )] & OLED_MASK (x , y );
81+ }
82+
7683/*
7784 * Draws a white pixel at x, y
7885 */
@@ -239,11 +246,11 @@ void oledDrawChar(int x, int y, char c, int font) {
239246 return ;
240247 }
241248
242- int zoom = (font & FONT_DOUBLE ? 2 : 1 ) ;
249+ int zoom = (font & FONT_DOUBLE ) ? 2 : 1 ;
243250 int char_width = fontCharWidth (font & 0x7f , c );
244251 const uint8_t * char_data = fontCharData (font & 0x7f , c );
245252
246- if (x <= - char_width * zoom ) {
253+ if (x <= - char_width ) {
247254 return ;
248255 }
249256
@@ -253,7 +260,7 @@ void oledDrawChar(int x, int y, char c, int font) {
253260 if (zoom <= 1 ) {
254261 oledDrawPixel (x + xo , y + yo );
255262 } else {
256- oledBox (x + xo * zoom , y + yo * zoom , x + (xo + 1 ) * zoom - 1 ,
263+ oledBox (x + xo , y + yo * zoom , x + (xo + 1 ) - 1 ,
257264 y + (yo + 1 ) * zoom - 1 , true);
258265 }
259266 }
@@ -273,12 +280,12 @@ char oledConvertChar(const char c) {
273280
274281int oledStringWidth (const char * text , int font ) {
275282 if (!text ) return 0 ;
276- int size = (font & FONT_DOUBLE ? 2 : 1 ) ;
283+ int space = (font & FONT_DOUBLE ) ? 2 : 1 ;
277284 int l = 0 ;
278285 for (; * text ; text ++ ) {
279286 char c = oledConvertChar (* text );
280287 if (c ) {
281- l += size * ( fontCharWidth (font & 0x7f , c ) + 1 ) ;
288+ l += fontCharWidth (font & 0x7f , c ) + space ;
282289 }
283290 }
284291 return l ;
@@ -287,12 +294,12 @@ int oledStringWidth(const char *text, int font) {
287294void oledDrawString (int x , int y , const char * text , int font ) {
288295 if (!text ) return ;
289296 int l = 0 ;
290- int size = (font & FONT_DOUBLE ? 2 : 1 ) ;
297+ int space = (font & FONT_DOUBLE ) ? 2 : 1 ;
291298 for (; * text ; text ++ ) {
292299 char c = oledConvertChar (* text );
293300 if (c ) {
294301 oledDrawChar (x + l , y , c , font );
295- l += size * ( fontCharWidth (font & 0x7f , c ) + 1 ) ;
302+ l += fontCharWidth (font & 0x7f , c ) + space ;
296303 }
297304 }
298305}
@@ -413,3 +420,21 @@ void oledSwipeRight(void) {
413420 oledRefresh ();
414421 }
415422}
423+
424+ /*
425+ * Mitigate SCA on lines y1-y2 by setting exactly width pixels black
426+ */
427+ void oledSCA (int y1 , int y2 , int width ) {
428+ y1 = MAX (y1 , 0 );
429+ y2 = MIN (y2 , OLED_HEIGHT - 1 );
430+ for (int y = y1 ; y <= y2 ; y ++ ) {
431+ int pix = 0 ;
432+ for (int x = 0 ; x < OLED_WIDTH ; x ++ ) {
433+ pix += oledGetPixel (x , y );
434+ }
435+ pix = MAX (width - pix , 0 );
436+ for (int x = 0 + (pix / 2 ); x < OLED_WIDTH - ((pix + 1 ) / 2 ); x ++ ) {
437+ oledInvertPixel (x , y );
438+ }
439+ }
440+ }
0 commit comments