修改OpenJDK字体渲染,无可见改进

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 修改OpenJDK字体渲染,无可见改进

 于网上找到了一段修改OpenJDK字体渲染的博文,实验之,发现无可见的效果改进。也许以后用得着,同时表示自己已确实编译测试过,故在此记录下来。


 参考博文:https://blog.csdn.net/liberize/article/details/8915482


读取配置

#include <fontconfig/fontconfig.h>
static FcPattern* matchedPattern(const FcChar8* family, double ptSize) {
    FcPattern* fcPattern = 0;
    fcPattern = FcPatternCreate();
    FcValue fcValue;
    fcValue.type = FcTypeString;
    fcValue.u.s  = family;
    FcPatternAdd(      fcPattern, FC_FAMILY,   fcValue, FcTrue);
    FcPatternAddBool(  fcPattern, FC_SCALABLE, FcTrue);
    FcPatternAddDouble(fcPattern, FC_SIZE,     ptSize);
    FcConfigSubstitute(0, fcPattern, FcMatchPattern);
    FcDefaultSubstitute(fcPattern);
    FcResult res;
    FcPattern *pattern = 0;
    pattern = FcFontMatch(0, fcPattern, &res);
    FcPatternDestroy(fcPattern);
    return pattern;
}
typedef struct {
    FT_Int32       loadFlags;
    FT_Render_Mode renderMode;
    FT_LcdFilter   lcdFilter;
}RenderProperty;
static void readFontconfig(FTScalerInfo* scalerInfo, FTScalerContext* context, RenderProperty* rp) {
   FcPattern *pattern = matchedPattern((const FcChar8 *)scalerInfo->face->family_name, context->ptsz);
   FT_Int32        load_flags = FT_LOAD_DEFAULT;
   FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL;
   FT_LcdFilter    lcd_filter = FT_LCD_FILTER_NONE;
   if (TEXT_AA_OFF == context->aaType) {
      load_flags  = FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO;
      render_mode = FT_RENDER_MODE_MONO;
   }else {
      FcBool hinting = FcTrue;
      FcPatternGetBool (  pattern, FC_HINTING,    0, &hinting);
      FcBool autohint = FcFalse;
      FcPatternGetBool(   pattern, FC_AUTOHINT,   0, &autohint);
      int hint_style = FC_HINT_FULL;
      FcPatternGetInteger(pattern, FC_HINT_STYLE, 0, &hint_style);
      if (!hinting || hint_style == FC_HINT_NONE) {
         load_flags |= FT_LOAD_NO_HINTING;
         if (autohint) load_flags |= FT_LOAD_FORCE_AUTOHINT;
      }else if (FC_HINT_NONE < hint_style && hint_style < FC_HINT_FULL) {
         load_flags |= FT_LOAD_TARGET_LIGHT;
         render_mode = FT_RENDER_MODE_LIGHT;
      }else  
         load_flags |= FT_LOAD_TARGET_NORMAL;
      switch (context->aaType) { 
      case TEXT_AA_LCD_HRGB:
      case TEXT_AA_LCD_HBGR:
         load_flags |= FT_LOAD_TARGET_LCD;
         render_mode = FT_RENDER_MODE_LCD;
         break;
      case TEXT_AA_LCD_VRGB:
      case TEXT_AA_LCD_VBGR:
         load_flags |= FT_LOAD_TARGET_LCD_V;
         render_mode = FT_RENDER_MODE_LCD_V;
      }
   }
   if (FT_RENDER_MODE_LCD_V == render_mode || FT_RENDER_MODE_LCD == render_mode) {
      int lcdfilter = FC_LCD_NONE;
      FcPatternGetInteger(pattern, FC_LCD_FILTER, 0, &lcdfilter);
      switch (lcdfilter) {
      case FC_LCD_NONE:
         lcd_filter = FT_LCD_FILTER_NONE;
         break;
      case FC_LCD_LIGHT:
         lcd_filter = FT_LCD_FILTER_LIGHT;
         break;
      case FC_LCD_LEGACY:
         lcd_filter = FT_LCD_FILTER_LEGACY;
         break;
      default:
         lcd_filter = FT_LCD_FILTER_DEFAULT;
      }
   } 
   FcPatternDestroy(pattern);
   rp->loadFlags  = load_flags;
   rp->renderMode = render_mode;
   rp->lcdFilter  = lcd_filter;
}

修改渲染代码

 

//先在函数开始的地方加上这一段,创建一个RenderProperty结构体,用来保存读取的字体配置信息  
    RenderProperty* rp = NULL;  
    rp = (RenderProperty*) calloc(1, sizeof(RenderProperty));  
    if (NULL == rp) {  
        return ptr_to_jlong(getNullGlyphImage());  
    }  
/**这段要注释掉 
    if (context->aaType == TEXT_AA_OFF) { 
        target = FT_LOAD_TARGET_MONO; 
    } else if (context->aaType == TEXT_AA_ON) { 
        target = FT_LOAD_TARGET_NORMAL; 
    } else if (context->aaType == TEXT_AA_LCD_HRGB || 
               context->aaType == TEXT_AA_LCD_HBGR) { 
        target = FT_LOAD_TARGET_LCD; 
    } else { 
        target = FT_LOAD_TARGET_LCD_V; 
    }     
    renderFlags |= target; 
*/      
    //读取配置,设置lcdfilter  
    readFontconfig(scalerInfo, context, rp);  
    renderFlags |= rp->loadFlags;      
    FT_Library_SetLcdFilter(scalerInfo->library, rp->lcdFilter);  
    glyph_index = FT_Get_Char_Index(scalerInfo->face, glyphCode);  
    error = FT_Load_Glyph(scalerInfo->face, glyphCode, renderFlags);  
    ......  
    if (ftglyph->format == FT_GLYPH_FORMAT_OUTLINE) {  
        FT_Render_Glyph(ftglyph, rp->renderMode);//renderMode改成读取过来的  
    }  
    free(rp);

编译

修改Awt2dLibraries.gmk,加上-lfontconfig,全清之后再编译。



相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
JavaScript
Vue3——压缩字体font-spider,完美解决字体压缩后会出现字体消失现象
压缩字体font-spider,完美解决字体压缩后会出现字体消失现象
549 0
Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色
Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色
Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色
位图字体插件更新了
位图字体插件更新了
131 0
|
Java 程序员 Android开发
Eclipse 答疑:Eclipse 如何更换夜间及外部主题?如何修改代码样式、背景颜色、字体大小?为何注释文字大小不一?
Eclipse 答疑:Eclipse 如何更换夜间及外部主题?如何修改代码样式、背景颜色、字体大小?为何注释文字大小不一?
257 0
Eclipse 答疑:Eclipse 如何更换夜间及外部主题?如何修改代码样式、背景颜色、字体大小?为何注释文字大小不一?
|
iOS开发
iOS开发 - 新特性的坑之应用字体根据系统字体大小而变化
iOS开发 - 新特性的坑之应用字体根据系统字体大小而变化
284 0
在 Flutter 中更改文本的字体系列
在 Flutter 中更改文本的字体系列 将字体 .ttf 文件添加到应用程序的文件夹中。说。assets/font/ 将资产和字体添加到 pubspec.yaml 文件中的 flutter 属性。您可以向应用程序添加一种或多种字体系列。在本教程中,我们将添加两种字体。
183 0
在 Flutter 中更改文本的字体系列
|
Java
修改JDK的经历:两处字体的粗体代码引起的错误
修改JDK的经历:两处字体的粗体代码引起的错误
106 0
|
Java
修改OpenJDK字体渲染,无可见改进
修改OpenJDK字体渲染,无可见改进
290 0
|
Java Linux Windows
JDK有三种字体绘制系统
JDK有三种字体绘制系统
121 0
|
Java
输入法影响JDK字体?
输入法影响JDK字体?
92 0