Allow text to scale to fit

Change-Id: Iacd4bb78f551b51d092ecde09521b5541e7dadcd
diff --git a/minuitwrp/graphics.c b/minuitwrp/graphics.c
index 5cc560e..fb86c14 100644
--- a/minuitwrp/graphics.c
+++ b/minuitwrp/graphics.c
@@ -33,6 +33,7 @@
 #include <pixelflinger/pixelflinger.h>
 
 #include "minui.h"
+#include "../gui/placement.h"
 
 #ifdef RECOVERY_BGRA
 #define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888
@@ -93,14 +94,14 @@
 #ifdef PRINT_SCREENINFO
 static void print_fb_var_screeninfo()
 {
-	printf("vi.xres: %d\n", vi.xres);
-	printf("vi.yres: %d\n", vi.yres);
-	printf("vi.xres_virtual: %d\n", vi.xres_virtual);
-	printf("vi.yres_virtual: %d\n", vi.yres_virtual);
-	printf("vi.xoffset: %d\n", vi.xoffset);
-	printf("vi.yoffset: %d\n", vi.yoffset);
-	printf("vi.bits_per_pixel: %d\n", vi.bits_per_pixel);
-	printf("vi.grayscale: %d\n", vi.grayscale);
+    printf("vi.xres: %d\n", vi.xres);
+    printf("vi.yres: %d\n", vi.yres);
+    printf("vi.xres_virtual: %d\n", vi.xres_virtual);
+    printf("vi.yres_virtual: %d\n", vi.yres_virtual);
+    printf("vi.xoffset: %d\n", vi.xoffset);
+    printf("vi.yoffset: %d\n", vi.yoffset);
+    printf("vi.bits_per_pixel: %d\n", vi.bits_per_pixel);
+    printf("vi.grayscale: %d\n", vi.grayscale);
 }
 #endif
 
@@ -221,20 +222,20 @@
         vi.transp.length  = 8;
     } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGB_565) {
 #ifdef RECOVERY_RGB_565
-		fprintf(stderr, "Pixel format: RGB_565\n");
-		vi.blue.offset    = 0;
-		vi.green.offset   = 5;
-		vi.red.offset     = 11;
+        fprintf(stderr, "Pixel format: RGB_565\n");
+        vi.blue.offset    = 0;
+        vi.green.offset   = 5;
+        vi.red.offset     = 11;
 #else
         fprintf(stderr, "Pixel format: BGR_565\n");
-		vi.blue.offset    = 11;
-		vi.green.offset   = 5;
-		vi.red.offset     = 0;
+        vi.blue.offset    = 11;
+        vi.green.offset   = 5;
+        vi.red.offset     = 0;
 #endif
-		if (PIXEL_SIZE != 2)    fprintf(stderr, "E: Pixel Size mismatch!\n");
-		vi.blue.length    = 5;
-		vi.green.length   = 6;
-		vi.red.length     = 5;
+        if (PIXEL_SIZE != 2)    fprintf(stderr, "E: Pixel Size mismatch!\n");
+        vi.blue.length    = 5;
+        vi.green.length   = 6;
+        vi.red.length     = 5;
         vi.blue.msb_right = 0;
         vi.green.msb_right = 0;
         vi.red.msb_right = 0;
@@ -331,7 +332,7 @@
     }
 
 #ifdef PRINT_SCREENINFO
-	print_fb_var_screeninfo();
+    print_fb_var_screeninfo();
 #endif
 
     return fd;
@@ -433,6 +434,58 @@
     return gr_ttf_textExWH(gl, x, y, s, pFont, -1, -1);
 }
 
+int gr_textEx_scaleW(int x, int y, const char *s, void* pFont, int max_width, int placement, int scale)
+{
+    GGLContext *gl = gr_context;
+    void* vfont = pFont;
+    GRFont *font = (GRFont*) pFont;
+    unsigned off;
+    unsigned cwidth;
+    int y_scale = 0, measured_width, measured_height, ret, new_height;
+
+    if (!s || strlen(s) == 0 || !font)
+        return 0;
+
+    measured_height = gr_ttf_getMaxFontHeight(font);
+
+    if (scale) {
+        measured_width = gr_ttf_measureEx(s, vfont);
+        if (measured_width > max_width) {
+            // Adjust font size down until the text fits
+            void *new_font = gr_ttf_scaleFont(vfont, max_width, measured_width);
+            if (!new_font) {
+                printf("gr_textEx_scaleW new_font is NULL\n");
+                return 0;
+            }
+            measured_width = gr_ttf_measureEx(s, new_font);
+            // These next 2 lines adjust the y point based on the new font's height
+            new_height = gr_ttf_getMaxFontHeight(new_font);
+            y_scale = (measured_height - new_height) / 2;
+            vfont = new_font;
+        }
+    } else
+        measured_width = gr_ttf_measureEx(s, vfont);
+
+    int x_adj = measured_width;
+    if (measured_width > max_width)
+        x_adj = max_width;
+
+    if (placement != TOP_LEFT && placement != BOTTOM_LEFT && placement != TEXT_ONLY_RIGHT) {
+        if (placement == CENTER || placement == CENTER_X_ONLY)
+            x -= (x_adj / 2);
+        else
+            x -= x_adj;
+    }
+
+    if (placement != TOP_LEFT && placement != TOP_RIGHT) {
+        if (placement == CENTER || placement == TEXT_ONLY_RIGHT)
+            y -= (measured_height / 2);
+        else if (placement == BOTTOM_LEFT || placement == BOTTOM_RIGHT)
+            y -= measured_height;
+    }
+    return gr_ttf_textExWH(gl, x, y + y_scale, s, vfont, measured_width + x, -1);
+}
+
 int gr_textExW(int x, int y, const char *s, void* pFont, int max_width)
 {
     GGLContext *gl = gr_context;
diff --git a/minuitwrp/minui.h b/minuitwrp/minui.h
index 1744928..25a785a 100644
--- a/minuitwrp/minui.h
+++ b/minuitwrp/minui.h
@@ -17,6 +17,8 @@
 #ifndef _MINUI_H_
 #define _MINUI_H_
 
+#include "../gui/placement.h"
+
 typedef void* gr_surface;
 typedef unsigned short gr_pixel;
 
@@ -40,6 +42,7 @@
 gr_surface gr_render_circle(int radius, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
 
 int gr_textEx(int x, int y, const char *s, void* font);
+int gr_textEx_scaleW(int x, int y, const char *s, void* pFont, int max_width, int placement, int scale);
 int gr_textExW(int x, int y, const char *s, void* font, int max_width);
 int gr_textExWH(int x, int y, const char *s, void* pFont, int max_width, int max_height);
 static inline int gr_text(int x, int y, const char *s)     { return gr_textEx(x, y, s, NULL); }
@@ -50,6 +53,7 @@
 int gr_getMaxFontHeight(void *font);
 
 void *gr_ttf_loadFont(const char *filename, int size, int dpi);
+void *gr_ttf_scaleFont(void *font, int max_width, int measured_width);
 void gr_ttf_freeFont(void *font);
 int gr_ttf_textExWH(void *context, int x, int y, const char *s, void *pFont, int max_width, int max_height);
 int gr_ttf_measureEx(const char *s, void *font);
diff --git a/minuitwrp/truetype.c b/minuitwrp/truetype.c
index 8f62ff2..d9ed019 100644
--- a/minuitwrp/truetype.c
+++ b/minuitwrp/truetype.c
@@ -265,6 +265,21 @@
     return res;
 }
 
+void *gr_ttf_scaleFont(void *font, int max_width, int measured_width)
+{
+    if (!font)
+        return NULL;
+
+    TrueTypeFont *f = font;
+    float scale_value = (float)(max_width) / (float)(measured_width);
+    int new_size = ((int)((float)f->size * scale_value)) - 1;
+    if (new_size < 1)
+        new_size = 1;
+    const char* file = f->key->path;
+    int dpi = f->dpi;
+    return gr_ttf_loadFont(file, new_size, dpi);
+}
+
 static bool gr_ttf_freeFontCache(void *key, void *value, void *context)
 {
     TrueTypeCacheEntry *e = value;