Placement précis de lettre sur un graphics

a marqué ce sujet comme résolu.

Salut,

Je suis face à un truc chiant: je tente de render une image (carré, 200x200), et je veux insérer 1 caractère monospace prenant précisément de 50x50 à 150x150 (c.f. image de grille). j’ai tenté plusieurs méthodes, notamment de faire du trial and error, en regardant la taille théorique obtenue à chaque tour, mais impossible de correctement scale.

// Le code de trial-and-error
fun getFontForSize(g: Graphics, pixelSize: Int): Font {
    var size = pixelSize
    while (true) {
        val f = Font(Font.MONOSPACED, Font.PLAIN, size)
        val obtainedHeight = g.getFontMetrics(f).height

        if (obtainedHeight < pixelSize) { size++ }
        else { return f }
    }
}
// Le code (morceau de main) de draw
g.font = getFontForSize(g, 100)
g.color = Color.BLACK
g.drawString("I", 50, 150)

Il faut noter que c’est fait pour tourner sur un environnement serveur, donc pas de serveur graphique.

L’image obtenue est la suivante.

Le but est que la lettre prenne la plus grande taille possible (100% centrée) dans le carré montré par le quadrillage.

Une idée ?

Ce qui est donné à la ligne 6 est la hauteur obtenue de la lettre, d’après ce que j’ai compris.

Hors, si l’algo est théoriquement fonctionnel, le I devrait prendre toute la hauteur du carré, voire admettre un très léger dépassement en hauteur, ce qui n’est clairement pas le cas.

Je me dis donc que Font pourrait avoir une certaine line height, et que cette propriété height serait bien la line-height (donc letter + spacing, et non pas seulement letter), dans quel cas je ne sais pas comment aborder le problème.

La question que je me pose surtout est s’il y a une façon "plus propre" de faire, ou non.

Edit: La doc indique 3 propriétés

  • ascent
  • descent
  • leading

Mon baseline sera toujours "en bas" (ROMAN_BASELINE afaik), du coup je ne sais pas sur quelle valeur, ou combinaison de valeurs, me reposer pour calculer la hauteur du caractère obtenu.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte