Position von Buchstaben bestimmen

  • gritsch schrieb:


    dann musst du aber wissen wie der text gezeichnet wurde: kerning, tracking, opentype-features, automatische ersetzung von fehlenden zeichen etc.
    sonst kann es in vielen fällen vorkommen dass du KOMPLETT andere positionen erhällst. nur als bei spiel wenn der text so lautet: "Das Glas ist 1/2 voll", dann kann zb das 1/2 drei zeichen sein oder eben auch ein einziges zeichen ½ welches von den maßen, abständen etc komplett anders ist. außerdem hast du einmal 3 positionen und bei der anderen methode nur 1...


    Wenn sowas ½ eingegeben wurde, habe ich doch im String auch nur ein Zeichen stehen und nicht drei.
    Eventuell habe ich noch den Grafik-Kontext zur Verfügung.

    @Thallius
    Die Windows-Funktion kann es doch auch, also kann es nicht unmöglich sein.

    Viele Grüße

    Sascha
  • Die Windows Funktion erwartet aber auch einen Zeiger zum device Content und damit ist festgelegt wo es wie ausgegeben wird. Außerdem Must du eine maxwidth angeben und erhältst dann die Anzahl Zeichen zurück die dort rein passen. Sprich es ist ein fester Bereich vorgegeben und nicht einfach nur ein String und ein Font.

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • sashs schrieb:

    Wie gesagt, wenn du jemanden fragst, wie du die Bremsen an deinem Auto wechselst, wirst du auch nicht gefragt, wozu du dein Auto brauchst, weil du ja vielleicht die Wege anders zurücklegen kannst.

    Warum und wohin Du morgen fährst ist tatsächlich nicht wichtig. Aber es kann durchaus berechtgterweise zurückgefragt werden, *wie* Du mit dem Auto fährst. Nur im Sommer oder auch im Winter bei Matsch in Schnee? Rasant mit Vollbremsung oder nur sanft. Und ob die Bremsscheiben auch ausgetauscht werden dürfen oder auf keinen Fall.
    Davon kann es abhängen, was man Dir am besten empfiehlt. Z.B. welche Bremsbacken Du wo kaufst und ob die billig oder teuer werden. Und welche davon leicht und welche schwerer einzubauen sind...
    D.h. auf Dein konkretes Problem bezogen ist das die Frage wie genau Deine Berechnungen sein sollen und welche Sonderfälle sie berücksichtigen sollen oder nicht.
    Die Basisgrößen von Glyphen bekommst Du aus NSFont. Der NSLayoutManager und NSTypeSetter schiebt das allerdings ggf. etwas herum wie andere das auch schon erläutert haben. D.h. die genauen Positionen sind kontextabhängig.
    Siehe CircleView...
  • hns schrieb:


    Warum und wohin Du morgen fährst ist tatsächlich nicht wichtig. Aber es kann durchaus berechtgterweise zurückgefragt werden, *wie* Du mit dem Auto fährst. Nur im Sommer oder auch im Winter bei Matsch in Schnee? Rasant mit Vollbremsung oder nur sanft. Und ob die Bremsscheiben auch ausgetauscht werden dürfen oder auf keinen Fall.
    Davon kann es abhängen, was man Dir am besten empfiehlt. Z.B. welche Bremsbacken Du wo kaufst und ob die billig oder teuer werden. Und welche davon leicht und welche schwerer einzubauen sind...
    D.h. auf Dein konkretes Problem bezogen ist das die Frage wie genau Deine Berechnungen sein sollen und welche Sonderfälle sie berücksichtigen sollen oder nicht.
    Die Basisgrößen von Glyphen bekommst Du aus NSFont. Der NSLayoutManager und NSTypeSetter schiebt das allerdings ggf. etwas herum wie andere das auch schon erläutert haben. D.h. die genauen Positionen sind kontextabhängig.
    Siehe CircleView...


    Das ist richtig, das sind aber konkrete Fragen und nicht allgemeine fragen wie "Was machen Sie mit dem Auto?". ;) Auf konkrete Fragen gehe ich ja ein.
    Sowas wie der NSLayoutManager wird bei mir nicht genutzt, da die GUI nicht mit Cocoa gebaut wird. Das andere Framework bietet, aber dahingehend nichts an, dass ich dafür auf Cocoa ausweichen muss.

    Viele Grüße

    Sascha
  • Wenn Du einen Text mit einem "anderen Framework" zeichnest, dann kannst Du die Position der einzelnen Zeichen mit Cocoa bzw. Core Text evtl. nicht berechnen, da das "andere Framework" evtl. kein Core Text für die Ausgabe verwendet und die Textausgaben somit evtl. nicht identisch sind.

    Um dies zu testen solltest Du einfach mal einen Text mit dem "anderen Framework" und einmal mit Core Text ausgeben und dann die beiden Ausgaben vergleichen. Wenn die Ausgaben bei gleichen "Einstellungen" nicht identisch sind, dann kannst Du Core Text für die Lösung Deines Problems schon einmal vergessen.
  • Danke dir. Da könntest du recht haben. Hatte bisher leider noch nicht so viel mit Fonts und deren Eigenschaften zu tun. An so etwas habe ich noch gar nicht gedacht.
    Damit du das "andere Framework" nicht immer in Anführungszeichen setzen musst, da handelt es sich im Firemonkey.

    Viele Grüße

    Sascha
  • ähm. CGFontGetGlyphBBoxes gibt doch zunächst einmal genau das zurück, was Du benötigst.
    >> x: 54.000000,y: 690.000000,width: 853.000000,height: 801.000000

    posX, posY, breite, höhe

    Damit solltest Du Doch alle Zeichen für Zeichen korrekt darstellen können, also so, als wäre es ein String (zumindest mit Berücksichtung von Kerning/Tracking), ich gehe mal davon aus, dass CGFont/CFType das berücksichtigt.

    Oder?

    Nachtrag:
    gritsch hat ja ebenfalls eine Möglichkeiten genannt, über CoreText. Dort werden ja ebenfalls die Glyphen mit den von Dir gewünschten Werten zurückgegeben. Ich vermute genau so (mit voller Berücksichtung aller möglichen „Attribute“ des Fonts) wie bei der oben genannten Methode. Also könnten die Anzahl der zurückgegebenen Glyphen von der Anzahl der Zeichen im String abweichen.

    Noch ein Nachtrag:
    Tallius: Dann wirst du kapieren das dein Vorhaben nicht machbar ist. Fertig.
    ? Er selbst und Gritsch haben doch unterschiedliche Methoden aufgezeigt, die genau das machen. Und natürlich muss das mehr oder weniger Ressourcenlastig funktionieren, denn irgendwie muss das iOS ja auch den Text auf den Bildschirm bekommen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von entwickler ()

  • entwickler schrieb:

    ähm. CGFontGetGlyphBBoxes gibt doch zunächst einmal genau das zurück, was Du benötigst.
    >> x: 54.000000,y: 690.000000,width: 853.000000,height: 801.000000

    posX, posY, breite, höhe


    Hallo,

    dass es eine Position und eine Breite und Höhe zurückgibt weiß ich. Leider verstehe ich die Ausgabe nicht.
    Wenn du dir mal die Ausgabe anschaust, die ich auf der ersten Seite gepostet habe, kommen da auch negative Werte raus und das ergibt für mich irgendwie keinen Sinn.

    Wenn Du mir erklären kannst warum diese negativ sind, könnte das vielleicht hilfreich sein. ;)

    Viele Grüße

    Sascha
  • @Thallius: nein, brauch ich nicht, denn das haben die Programmierer vom iOS schon gemacht.
    Und übergebe ich den Methoden die notwendigen Daten (gewünschter Font, Größe), wird das iOS alle notwendigen Berechnungen für mich durchführen, und den Text korrekt anzeigen. Und wenn ich will, sagt mir das iOS noch vorher, wohin die einzelnen Glyphen letztendlich berechnet wurden.
  • entwickler schrieb:

    @Thallius: nein, brauch ich nicht, denn das haben die Programmierer vom iOS schon gemacht.
    Und übergebe ich den Methoden die notwendigen Daten (gewünschter Font, Größe), wird das iOS alle notwendigen Berechnungen für mich durchführen, und den Text korrekt anzeigen. Und wenn ich will, sagt mir das iOS noch vorher, wohin die einzelnen Glyphen letztendlich berechnet wurden.


    Ist klar, aber er will ja die Werte verstehen und das geht nur wenn man weiß wie sich die Boundings Boxes der Glyphen errechnen.

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • @Thallius: Ah. Ok. Ich hatte es so verstanden, dass er die Werte nicht (größenmäßig) zuordnen konnte.
    @sash: na, dann viel Spaß. Insgesamt sollte eigentlich sehr klar definiert bzw. gut dokumentiert sein, was ein Standard Font so kann, bzw. beinhalten kann.
    -> Aber das ist halt eine Menge mehr, als man denkt, je besser der Font, umso mehr wird berücksichtigt. Also nichts, was man mal so nebenher selber machen macht, wenn ja, hast Du am Ende dann Core Text 2.0 ;)
  • @sash, @Thallius: ah.. oka. sorry. Ich habe den Beitrag von Sash nach meinem nicht gesehen.

    nun aber:

    negativer Wert:
    na ist doch klar. Thallius hat vollkommen Recht. Nur sehr kurz geantwortet. aber nicht ganz auf die korrekten Links verwiesen.
    das ganze nennt sich Tracking und Kerning/Tracking
    freetype.org/freetype2/docs/glyphs/glyphs-4.html
    eigentlich ganz simpel. Auf der genannten Seite ist ein Beispiel. Es sollte Dir klar sein, warum das V näher am A stehen sollte (design/ergonomisch) und warum der Wert dann wohl negativ ist.

    Okay. jetzt mal genauer geguckt. Sorry. So wie es scheint war Gritsch schon ein Schritt weiter. Denn bei den CGFont Methoden müssen schon Glyphen übergeben werden.... Kann sein, dass es dafür auch eine Methode gibt... (String rein, Glyphenarray raus) aber ein Zeichen ist noch kein CGGlyph... (also wie schon Gritsch erklärt hat, haben manche aufeinanderfolgende Buchstaben, ein gesondertes Zeichen/Glyph)
  • Dazu braucht man nicht einmal Kerning. Etwa ein A am Anfang einer Zeile kann durchaus "negativ" gesetzt sein, weil es sonst eingerückt aussieht. Gerade bei Schriften mit Serifen beginnt das Zeichen "rechts vom ersten Pixel."

    Das ales kann man sich mal mit CircleVeiw anschauen. Aber den Code schaut er sich ja auch nicht an.

    Die Windowsfunktion nimmt übrigens nicht nur einen Devicekontext, sondern auch nur einen String und keinen Text.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Dazu braucht man nicht einmal Kerning. Etwa ein A am Anfang einer Zeile kann durchaus "negativ" gesetzt sein, weil es sonst eingerückt aussieht. Gerade bei Schriften mit Serifen beginnt das Zeichen "rechts vom ersten Pixel."

    Das ales kann man sich mal mit CircleVeiw anschauen. Aber den Code schaut er sich ja auch nicht an.

    Die Windowsfunktion nimmt übrigens nicht nur einen Devicekontext, sondern auch nur einen String und keinen Text.


    Den Code schaue ich mir noch an, keine Sorge. ;) Ich ignoriere keine Hinweise.

    Ich verstehe gerade aber nicht was der Unterschied zwischen Text und String ist. Ein String kann doch einen Text enthalten. Aber aus dieser Aussage deute ich, dass ich mich wahrscheinlich zu unklar ausgedrückt habe.

    Viele Grüße

    Sascha
  • sashs schrieb:

    gritsch schrieb:


    dann musst du aber wissen wie der text gezeichnet wurde: kerning, tracking, opentype-features, automatische ersetzung von fehlenden zeichen etc.
    sonst kann es in vielen fällen vorkommen dass du KOMPLETT andere positionen erhällst. nur als bei spiel wenn der text so lautet: "Das Glas ist 1/2 voll", dann kann zb das 1/2 drei zeichen sein oder eben auch ein einziges zeichen ½ welches von den maßen, abständen etc komplett anders ist. außerdem hast du einmal 3 positionen und bei der anderen methode nur 1...


    Wenn sowas ½ eingegeben wurde, habe ich doch im String auch nur ein Zeichen stehen und nicht drei.
    Eventuell habe ich noch den Grafik-Kontext zur Verfügung.

    @Thallius
    Die Windows-Funktion kann es doch auch, also kann es nicht unmöglich sein.

    Viele Grüße

    Sascha


    doch, aus den drei zeichen 1/2 wir ein einziger glyph (nennt sich "fractions" bzw "fractional forms")
  • Text hat Attribute. Ist natürlich nur eine Begrifflichkeit, aber eine, die du kennen solltest.

    String sind reine Zeichenketten.
    Texte sind ein bisschen mehr. (Und noch deutlich mehr, als der Editor hier kann.)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?