From b7a54a30167f211647222c0a2f90b369e0e33e32 Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Mon, 5 Oct 2015 10:16:27 -0500 Subject: Allow text to scale to fit Change-Id: Iacd4bb78f551b51d092ecde09521b5541e7dadcd --- gui/button.cpp | 39 +++++++------- gui/checkbox.cpp | 4 +- gui/console.cpp | 2 +- gui/devices/landscape/res/landscape.xml | 4 +- gui/devices/portrait/res/portrait.xml | 4 +- gui/devices/watch/res/watch.xml | 4 +- gui/keyboard.cpp | 4 +- gui/objects.hpp | 16 ++---- gui/pages.cpp | 4 +- gui/placement.h | 32 ++++++++++++ gui/scrolllist.cpp | 6 +-- gui/slider.cpp | 1 + gui/slidervalue.cpp | 6 +-- gui/text.cpp | 40 +++++++------- minuitwrp/graphics.c | 93 ++++++++++++++++++++++++++------- minuitwrp/minui.h | 4 ++ minuitwrp/truetype.c | 15 ++++++ 17 files changed, 189 insertions(+), 89 deletions(-) create mode 100644 gui/placement.h diff --git a/gui/button.cpp b/gui/button.cpp index 18b5560c4..601a51667 100644 --- a/gui/button.cpp +++ b/gui/button.cpp @@ -93,6 +93,23 @@ GUIButton::GUIButton(xml_node<>* node) LoadPlacement(FindNode(node, "placement"), &x, &y, &w, &h, &TextPlacement); } SetRenderPos(x, y, w, h); + if (mButtonLabel) { + TextPlacement = (Placement)LoadAttrInt(FindNode(node, "placement"), "textplacement", TOP_LEFT); + if (TextPlacement != TEXT_ONLY_RIGHT) { + mButtonLabel->scaleWidth = 1; + mButtonLabel->SetMaxWidth(w); + mButtonLabel->SetPlacement(CENTER); + mTextX = ((mRenderW / 2) + mRenderX); + mTextY = mRenderY + (mRenderH / 2); + mButtonLabel->SetRenderPos(mTextX, mTextY); + } else { + mTextX = mRenderW + mRenderX + 5; + mRenderW += mTextW + 5; + mButtonLabel->GetCurrentBounds(mTextW, mTextH); + mTextY = mRenderY + (mRenderH / 2) - (mTextH / 2); + mButtonLabel->SetRenderPos(mTextX, mTextY); + } + } } GUIButton::~GUIButton() @@ -125,15 +142,6 @@ int GUIButton::Render(void) mButtonLabel->GetCurrentBounds(w, h); if (w != mTextW) { mTextW = w; - if (TextPlacement == CENTER_X_ONLY) { - mTextX = ((mRenderW - mRenderX) / 2); - } else if (mTextW > mRenderW) { // As a special case, we'll allow large text which automatically moves it to the right. - mTextX = mRenderW + mRenderX + 5; - mRenderW += mTextW + 5; - } else { - mTextX = mRenderX + ((mRenderW - mTextW) / 2); - } - mButtonLabel->SetRenderPos(mTextX, mTextY); } ret = mButtonLabel->Render(); if (ret < 0) return ret; @@ -198,28 +206,19 @@ int GUIButton::SetRenderPos(int x, int y, int w, int h) mTextW = 0; mIconX = mRenderX + ((mRenderW - mIconW) / 2); if (mButtonLabel) mButtonLabel->GetCurrentBounds(mTextW, mTextH); - if (mTextW) + if (mTextW && TextPlacement == TEXT_ONLY_RIGHT) { - if (TextPlacement == CENTER_X_ONLY) { - mTextX = ((mRenderW - mRenderX) / 2); - } else if (mTextW > mRenderW) { // As a special case, we'll allow large text which automatically moves it to the right. - mTextX = mRenderW + mRenderX + 5; - mRenderW += mTextW + 5; - } else { - mTextX = mRenderX + ((mRenderW - mTextW) / 2); - } + mRenderW += mTextW + 5; } if (mIconH == 0 || mTextH == 0 || mIconH + mTextH > mRenderH) { mIconY = mRenderY + (mRenderH / 2) - (mIconH / 2); - mTextY = mRenderY + (mRenderH / 2) - (mTextH / 2); } else { int divisor = mRenderH - (mIconH + mTextH); mIconY = mRenderY + (divisor / 3); - mTextY = mRenderY + (divisor * 2 / 3) + mIconH; } if (mButtonLabel) mButtonLabel->SetRenderPos(mTextX, mTextY); diff --git a/gui/checkbox.cpp b/gui/checkbox.cpp index 46a770861..8eb0f529d 100644 --- a/gui/checkbox.cpp +++ b/gui/checkbox.cpp @@ -139,9 +139,11 @@ int GUICheckbox::SetRenderPos(int x, int y, int w, int h) mRenderH = mCheckH; mTextX = mRenderX + mCheckW + 5; - mTextY = mRenderY + ((mCheckH / 2) - (textH / 2)); + mTextY = mRenderY + (mCheckH / 2); mLabel->SetRenderPos(mTextX, mTextY, 0, 0); + mLabel->SetPlacement(TEXT_ONLY_RIGHT); + mLabel->SetMaxWidth(gr_fb_width() - mTextX); SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH); return 0; } diff --git a/gui/console.cpp b/gui/console.cpp index 1544d77a1..2d6414ea4 100644 --- a/gui/console.cpp +++ b/gui/console.cpp @@ -319,7 +319,7 @@ void GUIConsole::RenderItem(size_t itemindex, int yPos, bool selected) // render text const char* text = rConsole[itemindex].c_str(); - gr_textEx(mRenderX, yPos, text, mFont->GetResource()); + gr_textEx_scaleW(mRenderX, yPos, text, mFont->GetResource(), mRenderW, TOP_LEFT, 0); } void GUIConsole::NotifySelect(size_t item_selected) diff --git a/gui/devices/landscape/res/landscape.xml b/gui/devices/landscape/res/landscape.xml index c75be3c6f..57406d9c8 100644 --- a/gui/devices/landscape/res/landscape.xml +++ b/gui/devices/landscape/res/landscape.xml @@ -990,7 +990,7 @@ - + Only mount system read-only @@ -999,7 +999,7 @@ - + Only mount system read-only diff --git a/gui/devices/portrait/res/portrait.xml b/gui/devices/portrait/res/portrait.xml index 969044c19..db54e5527 100644 --- a/gui/devices/portrait/res/portrait.xml +++ b/gui/devices/portrait/res/portrait.xml @@ -2125,7 +2125,7 @@ - + Only mount system read-only @@ -2134,7 +2134,7 @@ - + Only mount system read-only diff --git a/gui/devices/watch/res/watch.xml b/gui/devices/watch/res/watch.xml index 28198fb2d..00780d00f 100644 --- a/gui/devices/watch/res/watch.xml +++ b/gui/devices/watch/res/watch.xml @@ -2133,7 +2133,7 @@ - + Only mount system read-only @@ -2142,7 +2142,7 @@ - + Only mount system read-only diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp index f35a5d318..e55fb1b66 100644 --- a/gui/keyboard.cpp +++ b/gui/keyboard.cpp @@ -326,7 +326,7 @@ void GUIKeyboard::DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH) int textH = labelFont->GetHeight(); int textX = keyX + (keyW - textW) / 2; int textY = keyY + (keyH - textH) / 2; - gr_textEx(textX, textY, labelText.c_str(), fontResource); + gr_textEx_scaleW(textX, textY, labelText.c_str(), fontResource, keyW, TOP_LEFT, 0); } // longpress key label (only if font is defined) @@ -339,7 +339,7 @@ void GUIKeyboard::DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH) int textW = gr_measureEx(text.c_str(), fontResource); int textX = keyX + keyW - longpressOffsetX - textW; int textY = keyY + longpressOffsetY; - gr_textEx(textX, textY, text.c_str(), fontResource); + gr_textEx_scaleW(textX, textY, text.c_str(), fontResource, keyW, TOP_LEFT, 0); } } diff --git a/gui/objects.hpp b/gui/objects.hpp index 7028956ad..cf92024bb 100644 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -34,6 +34,7 @@ using namespace rapidxml; #include "resources.hpp" #include "pages.hpp" #include "../partitions.hpp" +#include "placement.h" #ifndef TW_X_OFFSET #define TW_X_OFFSET 0 @@ -44,16 +45,6 @@ using namespace rapidxml; class RenderObject { -public: - enum Placement { - TOP_LEFT = 0, - TOP_RIGHT = 1, - BOTTOM_LEFT = 2, - BOTTOM_RIGHT = 3, - CENTER = 4, - CENTER_X_ONLY = 5, - }; - public: RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; } virtual ~RenderObject() {} @@ -207,6 +198,8 @@ public: public: bool isHighlighted; + bool scaleWidth; + unsigned maxWidth; protected: std::string mText; @@ -217,7 +210,6 @@ protected: int mIsStatic; int mVarChanged; int mFontHeight; - unsigned maxWidth; unsigned charSkip; }; @@ -1157,7 +1149,7 @@ FontResource* LoadAttrFont(xml_node<>* element, const char* attrname); ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname); AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname); -bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL); +bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL); #endif // _OBJECTS_HEADER diff --git a/gui/pages.cpp b/gui/pages.cpp index 374a431a8..9bff289d3 100644 --- a/gui/pages.cpp +++ b/gui/pages.cpp @@ -229,7 +229,7 @@ AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname) return PageManager::GetResources()->FindAnimation(name); } -bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h /* = NULL */, RenderObject::Placement* placement /* = NULL */) +bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h /* = NULL */, Placement* placement /* = NULL */) { if (!node) return false; @@ -247,7 +247,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h *h = LoadAttrIntScaleY(node, "h"); if (placement && node->first_attribute("placement")) - *placement = (RenderObject::Placement) LoadAttrInt(node, "placement"); + *placement = (Placement) LoadAttrInt(node, "placement"); return true; } diff --git a/gui/placement.h b/gui/placement.h new file mode 100644 index 000000000..02079e8eb --- /dev/null +++ b/gui/placement.h @@ -0,0 +1,32 @@ +/* + Copyright 2015 bigbiff/Dees_Troy TeamWin + This file is part of TWRP/TeamWin Recovery Project. + + TWRP is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + TWRP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with TWRP. If not, see . +*/ + +#ifndef __PLACEMENT_H +#define __PLACEMENT_H + +enum Placement { + TOP_LEFT = 0, + TOP_RIGHT = 1, + BOTTOM_LEFT = 2, + BOTTOM_RIGHT = 3, + CENTER = 4, + CENTER_X_ONLY = 5, + TEXT_ONLY_RIGHT = 6, +}; + +#endif // __PLACEMENT_H diff --git a/gui/scrolllist.cpp b/gui/scrolllist.cpp index ec42fe6c0..7bd4598e7 100644 --- a/gui/scrolllist.cpp +++ b/gui/scrolllist.cpp @@ -266,7 +266,7 @@ int GUIScrollList::Render(void) // render the text gr_color(mHeaderFontColor.red, mHeaderFontColor.green, mHeaderFontColor.blue, mHeaderFontColor.alpha); - gr_textEx(mRenderX + IconOffsetX + 5, yPos + (int)((mHeaderH - mFontHeight) / 2), mLastHeaderValue.c_str(), mFont->GetResource()); + gr_textEx_scaleW(mRenderX + IconOffsetX + 5, yPos + (int)(mHeaderH / 2), mLastHeaderValue.c_str(), mFont->GetResource(), mRenderW, TEXT_ONLY_RIGHT, 0); // Add the separator gr_color(mHeaderSeparatorColor.red, mHeaderSeparatorColor.green, mHeaderSeparatorColor.blue, mHeaderSeparatorColor.alpha); @@ -346,8 +346,8 @@ void GUIScrollList::RenderStdItem(int yPos, bool selected, ImageResource* icon, // render label text int textX = mRenderX + maxIconWidth + 5; - int textY = yPos + (iconAndTextH - mFontHeight) / 2; - gr_textEx(textX, textY, text, mFont->GetResource()); + int textY = yPos + (iconAndTextH / 2); + gr_textEx_scaleW(textX, textY, text, mFont->GetResource(), mRenderW, TEXT_ONLY_RIGHT, 0); } int GUIScrollList::Update(void) diff --git a/gui/slider.cpp b/gui/slider.cpp index a3884474b..6ee2024d5 100644 --- a/gui/slider.cpp +++ b/gui/slider.cpp @@ -80,6 +80,7 @@ GUISlider::GUISlider(xml_node<>* node) : GUIObject(node) sSliderLabel->GetCurrentBounds(w, h); int sTextY = mRenderY + ((mRenderH - h) / 2); sSliderLabel->SetRenderPos(sTextX, sTextY); + sSliderLabel->SetMaxWidth(mRenderW); } if (sTouch && sTouch->GetResource()) { diff --git a/gui/slidervalue.cpp b/gui/slidervalue.cpp index 3974c37d0..8a44a3cb7 100644 --- a/gui/slidervalue.cpp +++ b/gui/slidervalue.cpp @@ -307,15 +307,15 @@ int GUISliderValue::Render(void) if(mShowRange) { int rangeY = (mLineY - mLineH/2) - mFontHeight/2; - gr_textEx(mRenderX + mPadding/2, rangeY, mMinStr.c_str(), fontResource); - gr_textEx(mLineX + mLineW + mPadding/2, rangeY, mMaxStr.c_str(), fontResource); + gr_textEx_scaleW(mRenderX + mPadding/2, rangeY, mMinStr.c_str(), fontResource, mRenderW, TOP_LEFT, 0); + gr_textEx_scaleW(mLineX + mLineW + mPadding/2, rangeY, mMaxStr.c_str(), fontResource, mRenderW, TOP_LEFT, 0); } if(mValueStr && mShowCurr) { sprintf(mValueStr, "%d", mValue); int textW = measureText(mValueStr); - gr_textEx(mRenderX + (mRenderW/2 - textW/2), mSliderY+mSliderH, mValueStr, fontResource); + gr_textEx_scaleW(mRenderX + (mRenderW/2 - textW/2), mSliderY+mSliderH, mValueStr, fontResource, mRenderW, TOP_LEFT, 0); } mRendered = true; diff --git a/gui/text.cpp b/gui/text.cpp index effb9359b..9898e2838 100644 --- a/gui/text.cpp +++ b/gui/text.cpp @@ -34,7 +34,9 @@ GUIText::GUIText(xml_node<>* node) mFontHeight = 0; maxWidth = 0; charSkip = 0; + scaleWidth = true; isHighlighted = false; + mText = ""; if (!node) return; @@ -54,6 +56,23 @@ GUIText::GUIText(xml_node<>* node) xml_node<>* child = FindNode(node, "text"); if (child) mText = child->value(); + child = FindNode(node, "noscaling"); + if (child) { + scaleWidth = false; + } else { + if (mPlacement == TOP_LEFT || mPlacement == BOTTOM_LEFT) { + maxWidth = gr_fb_width() - mRenderX; + } else if (mPlacement == TOP_RIGHT || mPlacement == BOTTOM_RIGHT) { + maxWidth = mRenderX; + } else if (mPlacement == CENTER || mPlacement == CENTER_X_ONLY) { + if (mRenderX < gr_fb_width() / 2) { + maxWidth = mRenderX * 2; + } else { + maxWidth = (gr_fb_width() - mRenderX) * 2; + } + } + } + // Simple way to check for static state mLastValue = gui_parse_text(mText); if (mLastValue != mText) mIsStatic = 0; @@ -81,30 +100,13 @@ int GUIText::Render(void) int x = mRenderX, y = mRenderY; int width = gr_measureEx(displayValue.c_str(), fontResource); - if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT) - { - if (mPlacement == CENTER || mPlacement == CENTER_X_ONLY) - x -= (width / 2); - else - x -= width; - } - if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT) - { - if (mPlacement == CENTER) - y -= (mFontHeight / 2); - else if (mPlacement == BOTTOM_LEFT || mPlacement == BOTTOM_RIGHT) - y -= mFontHeight; - } - if (isHighlighted) gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha); else gr_color(mColor.red, mColor.green, mColor.blue, mColor.alpha); - if (maxWidth) - gr_textExW(x, y, displayValue.c_str(), fontResource, maxWidth + x); - else - gr_textEx(x, y, displayValue.c_str(), fontResource); + gr_textEx_scaleW(mRenderX, mRenderY, displayValue.c_str(), fontResource, maxWidth, mPlacement, scaleWidth); + return 0; } diff --git a/minuitwrp/graphics.c b/minuitwrp/graphics.c index 5cc560e2f..fb86c1450 100644 --- a/minuitwrp/graphics.c +++ b/minuitwrp/graphics.c @@ -33,6 +33,7 @@ #include #include "minui.h" +#include "../gui/placement.h" #ifdef RECOVERY_BGRA #define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888 @@ -93,14 +94,14 @@ int overlay_display_frame(int fd, GGLubyte* data, size_t size); #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 @@ static int get_framebuffer(GGLSurface *fb) 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 @@ static int get_framebuffer(GGLSurface *fb) } #ifdef PRINT_SCREENINFO - print_fb_var_screeninfo(); + print_fb_var_screeninfo(); #endif return fd; @@ -433,6 +434,58 @@ int gr_textEx(int x, int y, const char *s, void* pFont) 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 1744928dd..25a785a5b 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 @@ void gr_line(int x0, int y0, int x1, int y1, int width); 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_maxExW(const char *s, void* font, int max_width); 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 8f62ff26b..d9ed0198b 100644 --- a/minuitwrp/truetype.c +++ b/minuitwrp/truetype.c @@ -265,6 +265,21 @@ exit: 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; -- cgit v1.2.3