lib/unigraphic/GraphicsDisplay.cpp

changeset 45
2da50a3d4e9f
parent 26
86f099bda525
child 58
c1dfd75f2842
--- a/lib/unigraphic/GraphicsDisplay.cpp	Sun Nov 01 22:21:19 2020 +0100
+++ b/lib/unigraphic/GraphicsDisplay.cpp	Sat Nov 07 19:20:39 2020 +0100
@@ -267,13 +267,19 @@
     }
     return value;
 }
+
+void GraphicsDisplay::character(int c)
+{
+	character(char_x, char_y, c);
+}
+
 void GraphicsDisplay::character(int x, int y, int c)
 {
     char_x=x;
     char_y=y;
     int j,i,b;
     unsigned char* zeichen;
-    unsigned char z,w,v;
+    unsigned char z,w,v, wtot;
 
  /*   // read font parameter from start of array
     offset = font[0];                    // bytes / char
@@ -288,34 +294,54 @@
             char_y = 0;
         }
     }
-    window(char_x, char_y, fonthor*fontzoomhor, fontvert*fontzoomver); // char box
     if ((c < firstch) || (c > lastch)) {   // test char range - if not exist fill with blank
+		window(char_x, char_y, fonthor*fontzoomhor, fontvert*fontzoomver); // char box
       window_pushpixel(_background, fontzoomhor*fonthor*fontvert*fontzoomver); //(color, howmany)
       w = fonthor;
     } else {
       zeichen = &font[((c-firstch) * fontoffset) + 4]; // start of char bitmap
       w = zeichen[0];                          // width of actual char
+	  if((fontprop) && (w<fonthor))
+		  // put at least 1 blank after variable-width characters, except
+		  // characters that occupy whole fonthor space like "_"
+		  wtot = (w*fontzoomhor) + 1;
+	  else
+		  wtot = fonthor*fontzoomhor;
+	  window(char_x, char_y, wtot, fontvert*fontzoomver); // char box
+
       // construct the char into the buffer
       for (j=0; j<(fontbpl); j++) {  //  vert bytes
-	for (v=0; v<fontzoomver; v++) { // repeat horiz line for vertical zooming
-	  for (int p=0; p<8; p++) { // pixel in the current vert byte
-	    if ((j*8+p) > fontvert)
-	      break;
-	    b = 1 << p;
-	    for (i=0; i<fonthor; i++) {   //  horz line
-	      z = zeichen[(fontbpl * i) + j + 1];
-	      window_pushpixel(( z & b ) ? _foreground : _background, fontzoomhor); //(color, howmany)
-	    }
-	  }
-	} //for each zoomed vert
+		  for (v=0; v<fontzoomver; v++) { // repeat horiz line for vertical zooming
+			  for (int p=0; p<8; p++) { // pixel in the current vert byte
+				  if ((j*8+p) > fontvert)
+					  break;
+				  b = 1 << p;
+				  for (i=0; i<wtot; i++) {   //  horz line
+					  z = zeichen[(fontbpl * i) + j + 1];
+					  window_pushpixel(( z & b ) ? _foreground : _background, fontzoomhor); //(color, howmany)
+				  }
+			  }
+		  } //for each zoomed vert
       }
     }
+	char_x += wtot;
+}
+
+uint8_t GraphicsDisplay::char_width(char c, bool move_location)
+{
+	unsigned char* zeichen;
+	uint8_t w;
+
+	zeichen = &font[((c-firstch) * fontoffset) + 4]; // start of char bitmap
+	w = zeichen[0];                          // width of actual char
+
     if((fontprop) && (w<fonthor))
-      // put at least 1 blank after variable-width characters, except
-      // characters that occupy whole fonthor space like "_"
-      char_x += (w*fontzoomhor) + 1;
+      w = (w*fontzoomhor) + 1;
     else
-      char_x += fonthor*fontzoomhor;
+      w = fonthor*fontzoomhor;
+	if (move_location)
+		char_x += w;
+	return w;
 }
 
 void GraphicsDisplay::Bitmap_BW(Bitmap_s bm, int x, int y)

mercurial