标签: font-rendering

JavaFX字体渲染中的字符间距(字距调整)错误(在Linux中)

我已经开始在JavaFX中开发一个应用程序而且我遇到了一个问题,我发现很少有用的信息:Linux中字符之间的间距非常不均匀.我不是在谈论不同角色的宽度,而是在谈论角色之间的空间.

它在普通文本中可见,但以下示例比普通文本更好地说明了效果.看看第一行.前两个字符之间的空间小于第二个和第三个字符之间的空格.这也发生在第六和第七个角色之间以及其他几个角色:

字符间距不均匀

Swing没有这个问题,JavaFX在Windows中没有这个问题,或者在该操作系统上几乎看不到.它似乎也不是Mac上的主要问题.为了比较,这里是Mac Retina MacBook Pro的一个示例输出,2014年中,运行OS X 10.12.6和Java 9.0.4:

在此输入图像描述

有谁知道这是否是JavaFX字体渲染引擎中的错误?如果是这样,有解决方法吗?

我真的开始怀疑我是否应该更改框架,因为在我看来这样糟糕的字体渲染是不可接受的.

关于这个问题还有另外一个问题但尚未得到解答: 为什么JavaFX在使用Text组件时在字母之间添加额外的间距以及如何修复它?

我已经能够在运行Manjaro的两台不同Linux机器上以及运行Debian的虚拟机中使用以下代码重现此问题:

package de.localtoast.fonttest;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FontTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox();
        Label label1 = new Label("0000000000000000000000");
        Label label2 = new Label("OOOOOOOOOOOOOOOOOOOOOO");
        Label label3 = new Label("oooooooooooooooooooooo");

        root.getChildren().add(label1);
        root.getChildren().add(label2);
        root.getChildren().add(label3);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Font Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args); …
Run Code Online (Sandbox Code Playgroud)

java javafx kerning subpixel font-rendering

5
推荐指数
1
解决办法
541
查看次数

如何使 VSCode for MacOS 中的字体渲染看起来与 VSCode for Windows 完全相同?

这个问题有点相反。

我不喜欢 VSCode for Mac 中的字体呈现方式。对我来说,缺乏对比度是一个障碍,因为我视力不好,字母因为缺乏对比度而变得有点混乱。我可以缩放,但会损失很多工作空间(MacBook Air 的屏幕很小)。

我切换到 VSCode for Windows (Consolas) 中使用的字体,但它仍然变得模糊。

MacOS系统General > Font smoothing没有任何区别。

有什么方法可以使 VSCode for Mac 中的字体渲染看起来与 VSCode for Windows 中的字体渲染完全相同?

适用于 Windows 的 VS Code(非常好,打印是通过 VM 连接到 Windows 计算机进行的) 在此输入图像描述

VS Code for Mac 具有字体抗锯齿 ( "workbench.fontAliasing": "antialiased")(不太鲜艳和模糊) 在此输入图像描述

VS Code for Mac 没有字体抗锯齿 ( "workbench.fontAliasing": "none")(更加生动和对比度,但看起来很糟糕) 在此输入图像描述

fonts consolas contrast visual-studio-code font-rendering

4
推荐指数
1
解决办法
7787
查看次数

在 OpenGL 中使用 RGB 纹理作为 alpha 值/子像素字体渲染

目前,我在子像素模式下使用 FreeType,并将每个像素的最大颜色作为 alpha 值,并使用以下片段着色器:

    uniform sampler2D Image;
    uniform vec4 Color;

    smooth in vec2 vVaryingTexCoord;

    out vec4 vFragColor;

    void main(void){
        vec4 color = texture(Image, vVaryingTexCoord);
        vFragColor = color * Color;
    }
Run Code Online (Sandbox Code Playgroud)

这对于深色背景效果很好,但在浅色背景上会显示边框像素(例如,当文本像素为 (1,0,0) 时)。为了使其适用于更明亮的背景,我需要传递背景颜色并自己进行混合,一旦我转向更复杂的背景,混合就会开始崩溃。

有没有办法使用 FreeType 中的 RGB 值作为纯色的 alpha 值(传递给着色器)?这个公式基本上是这样的,其中 b = 背景像素,t = 当前文本像素,c = 静态颜色:

b*((1,1,1) - t) + t*c.rgb*c.a
Run Code Online (Sandbox Code Playgroud)

我认为先绘制其他所有内容并将帧缓冲区传递给字体着色器会起作用,但这似乎有点过大了。有没有办法在 OpenGL 混合阶段做到这一点?我尝试使用 glBlendFunc 等,但没有取得任何进展。

opengl font-rendering

3
推荐指数
1
解决办法
1533
查看次数

如何在 freetype 中使用 FT_RENDER_MODE_SDF?

我对字体渲染很陌生,我正在尝试使用 freetype 生成有符号距离场,以便它可以在 OpenGL 中的片段着色器中使用。这是我尝试过的代码:

           error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
           if (error)
           {
              // Handle error
           }
 
           
           error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_SDF);
           if (error)
           {
              // Handle error
           }

Run Code Online (Sandbox Code Playgroud)

也许我完全误解了 SDF 的想法,但我的想法是我可以给 freetype 一个 ttf 文件,并使用 FT_RENDER_MODE_SDF 它应该生成一个带有符号距离的缓冲区。但 FT_Render_Glyph 返回错误 (19),恰好是“无法渲染此字形格式”。

c freetype font-rendering

1
推荐指数
1
解决办法
3234
查看次数