hallo helfende(r) engel 🙂 ,
ich versuche gerade eine font-datei (.ttf) zu parsen,
und sitze deswegen über den open true type spezifikationen von microsoft (und von apple)
und in head - Font Header werden grössen-angaben in Fixed - 32-bit signed fixed-point number (16.16) erwartet...
ULONG : 32-bit unsigned integer
LONG : 32-bit signed integer
etc sind mir bekannt, aber:
wie gross ist 'fword' und/oder
++Fixed : 32-bit signed fixed-point number (16.16) ++(= Int32 ??)
zu 'fword' hat etwas mit 6 byte zu tun - das ist alles, was mir die vs c# express hilfe dazu sagen kann - findet ihr mehr?
danke für eure hilfe!
oliver
Wenns um FWORD geht so steht doch in Deinem Link, dass es sich um den Typ short, also Int16 handelt.
Und das passende für Fixed dürfte Decimal sein. Aber 16.16 kann man ja auch konvertieren:
var foo = ( ( fixed >> 16 ) + ( fixed & 0xffff ) / 65536.0 );
wenn mich ned alles täuscht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
danke! für die antwort...
Wenns um FWORD geht so steht doch in Deinem Link, dass es sich um den Typ short, also Int16 handelt.
wo bitte steht das? (wie konnte ich das nur übersehen haben...)
**decimal **scheint aber nicht zu stimmen...
mein code ist bereits fertig und stimmt (hoffentlich), die ergebnisse sind mir auch bereits bekannt - es muss nur noch an EINER stelle diese 'fixed zahl' eingetragen werden (um auf die bereits bekannten ergebnisse zu kommen) - aber wenn ich dort 'decimal' angebe bekomme ich immer noch falsche ergebnisse...
(ich hoffe das war klar genug ausgedrückt :tongue🙂
es müsste eine andere einheit sein...
FWORD 16-bit signed integer (SHORT) that describes a quantity in FUnits.
Und in .NET steckt hintert short einfach ein Int16.
Wenns Fixed32 ist, dann passt Decimal nicht (ich hab die Spezifikation jetzt nicht durchgelesen). Google mal nach Fixed32, ob Du dort was passendes findest.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
(zögerndes) hmm, danke, aber 'fixed32' bringt mich jetzt auch nicht wirklich weiter...
mit decimal hattest du aber eigentlich recht, ich weiss bloss nicht wie ich es in meinem fall anwenden soll:
ich erstelle wie z.B. aus dieser seite: HEAD
Fixed Table version number 0x00010000 for version 1.0.
Fixed fontRevision Set by font manufacturer.
ULONG checkSumAdjustment To compute: set it to 0, sum the entire font as ULONG, then store 0xB1B0AFBA - sum.
ULONG magicNumber Set to 0x5F0F3CF5.
USHORT flags Bit 0: Baseline for font at y=0;
Bit 1: Left sidebearing point at x=0;
etc
STRUCTs für die header,
struct TT_HEAD_TABLE_HEADER__struct { public **[datatype???]** a_tableVersion__uint32; // Festkommazahl (fixed point) ??? public **[datatype???]** b_fontRevision__uint32; // Festkommazahl (fixed point) ??? public ulong c_checkSumAdjustment__ulong; // public ulong d_magicNumber__ulong; // public ushort e_flags__ushort; public ushort f_unitsPerEm__ushort; public Int64 g_date_created__int64 ; // LONGDATETIME created
etc
aber es passt immer noch nichts- auch kein decimal - hat noch jemand eine idee?
danke,
oliver
Ev. findest Du hier noch Code:
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo e2020,
in der Spezifikation steht:
Fixed 32-bit signed fixed-point number (16.16)
Insofern ist schon mal klar, dass für die Struktur-Definition wohl nur ein Int32 bzw. Alternativ zwei Int16 in Frage kommen.
Wie man dann diese 32Bits interpretiert, steht auf einem anderen Blatt. Ich habe die Bezeichnung "fixed-point number (16.16)" noch nicht gehört, würde aber vermuten, dass dies bedeutet, dass der Vorkommaanteil aus 16bit und der Nachkommaanteil auf (weiteren) 16bit besteht. Die 16bit vor dem Komma werden ganz einfach eine Int16-Ganzzahl sein. Also die Wertigkeiten 20 bis 214 (bzw. 215). Die 16bit nach dem Komma werden wohl die Wertigkeiten 2-1 bis 2^-16 haben, also 0.5, 0.25, 0.125 usw. Dafür gibt es aber keinen nativen Datentyp in C#. Deshalb müsste man eben auf einen zweiten Int16 ausweichen und die Bits dann selber interpretieren.
herbivore
hallo 🙂 und danke für eure antworten!
@programmierhans
danke für den tip, aber den code bin ich bereits durch - das ist c++, die schreiben dort auch nur 'fixed' - und das ist/war ja gerade meine frage...
@herbivore "Alternativ zwei Int16 in Frage kommen"
ja, genau, danke, in diesem fall sollte passen:
zwei USHORT 16-bit unsigned integer.
mal sehen ob's jetzt geht...
@ProGamer
ähm, soweit wie ich es verstanden habe (und ich bin heute schon etwas 'betriebsblind') scheint es in c# keinen datentyp für 'festkommazahl' (fixed point) zu geben - das einzige uns dafür zur verfügung stehende instrument ist wohl 'decimal' - dein link wäre für 'float' - aber in meinem fall geht's dann doch noch um etwas anderes und zwar wie aus zwei 16 bit (zahlen) EINE versionsnummer (mit festkomma, und zwar in der mitte, deshalb auch der name "16,16" ) entsteht, d.h. die zahl vor und nach dem komma entstehen jweils aus 16 bit ...
so, jetzt muss ich das erstmal ausprobieren 👅
danke!
oliver
Hallo,
bestimmt hattest du das hier schon gefunden, aber vllt hilft es dir ja mit den neuen erkenntnissen weiter: How to convert packed integer (16.16) fixed-point to float
was es jetzt hiermit auf sich hat würde mich auch mal interessieren, nur leider kann ich mir ebenfalls keine reim drauf machen -.-
MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden!
*"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht."
*"Ignorance simplifies ANY problem."
*"Stoppt die Piraterie der Musikindustrie"
Hi e2020,
wenn ich es richtig verstehe, geht es bei dir lediglich um die Darstellung der Versions-Nummern. Dazu steht in den Docs (http://www.microsoft.com/typography/otspec/otff.htm):
When a Fixed number is used as a version, the upper 16 bits comprise a major version number, and the lower 16 bits a minor.
Das entspricht auch der Darstellung, die du oben gepostet hast:
Fixed | Table version number | 0x00010000 for version 1.0
Ich sehe da wirklich kein Problem. Aber vielleicht sollstest du mal konkrete Werte posten, damit man die bisher gemachten Überlegungen auch verifizieren kann.
Christian
Weeks of programming can save you hours of planning