Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Programmation d'applications complexes
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF & TTF

Message par boddhi »

Nouvelle version avec les améliorations suivantes :
  • Prise en charge des fichiers TTC (Collection de fontes)
  • Détection si une police est de type variable (Différentes variations d"une fonte dans un même fichier)
  • Lecture des données Panose (Informations diverses sur les caractéristiques de la fonte)
  • Lecture des données recensant les plages Unicode implémentées dans la fonte
    ⚠ Important : Après plusieurs tests sur différentes fontes, il semble que ces données ne soient pas toujours correctement encodées.
    Je n'en connais pas la cause réelle mais j'ai constaté qu'après une recompilation de ces fontes avec la version de FontForge la plus récente,
    ces données étaient après coup correctement encodées.
    J'en conclus que ces fontes ont peut-être été compilées avec une version d'un logiciel qui ne gérait pas convenablement ce type d'informations.

Partie 1/3 : Assignations et déclarations (Partie 1)

Code : Tout sélectionner

EnableExplicit
DebugLevel 4 ; 5 Pour plus de détails
;
; ╔══════════════════════════════════════════════════════════════════════════════════════════════════════╗
; ║ PLUGINS - STRUCTURES - ENUMERATIONS - MAPS - CONSTANTES - VARIABLES GLOBALES - DECLARATIONS - MACROS ║
; ╚══════════════════════════════════════════════════════════════════════════════════════════════════════╝
;{ ════  STRUCTURES               ════
;- ════  STRUCTURES               ════
Structure ENTETETTC             ;{
  VersionMaj.u
  VersionMin.u
  NbFontes.u
  Array DecalagesBlocsFontes.q(0)
EndStructure ;}
Structure DESCRIPTEURTABLE      ;{
  NomTable.l
  SommeControle.l
  Decalage.l
  Taille.l
EndStructure ;}
Structure ENTETEBLOCTABLENAME   ;{
  Version.u
  NbDonnees.u
  Offset.u
EndStructure ;}
Structure DESCRIPTEURTABLENAME  ;{
  IDPlateforme.u                ; Tableau Plateformes()
  IDEncodage.u                  ; Tableaux Encodages(),EncodagesMAC(),EncodagesWIN()
  IDLangue.u                    ; Tableau LanguesMAC() et Map LanguesWIN()
  IDNom.u                       ; Tableau NomsID
  Taille.u
  Offset.u
  Donnee.s
EndStructure ;}
Structure DONNEESPANOSE         ;{
  Famille.s
  Style.s
  Graisse.s
  Proportion.s
  Contraste.s
  VariationFut.s
  Jambage.s
  FormeFonte.s
  Mediane.s
  HauteurX.s
EndStructure  ;}
Structure DONNEESTABLEOS2       ;{
  Version.a
  Panose.a[10]
  Unicode.q[4]
  Graisse.u
  Chasse.a
  Style.u
  IDVendeur.s ; https://learn.microsoft.com/fr-fr/typography/vendors/
EndStructure  ;}
Structure DONNEESTABLES         ;{
  Revision.f
  DateCreat.q
  DateModif.q
  LongDecalage.a
  Variable.a
  Proportionnelle.a
  Fixe.a
  NbGlyphes.l
  List DonneesTableName.DESCRIPTEURTABLENAME()
  DonneesTableOS2.DONNEESTABLEOS2
EndStructure ;}
Structure DONNEESPOLICE         ;{
  DossierRelatif.s
  Copyright.s
  Famille.s ; Nom
  SousFamille.s ; Style
  Identifiant.s
  FamilleComplet.s
  Version.s
  NomPostScript.s
  MarqueDeposee.s
  Vendeur.s
  Createur.s
  Description.s
  URLVendeur.s
  URLCreateur.s
  Licence.s
  URLLicence.s
  FamilleTypo.s
  SousFamilleTypo.s
  Compatibilite.s
  ExampleTexte.s
  CIDPostScript.s
  FamilleWWS.s
  SousFamilleWWS.s
  PaletteClaire.s
  PaletteSombre.s
  PrefixePostScript.s
  Graisse.u
  GraisseInt.s
  Chasse.a
  ChasseInt.s
  Style.u
  StyleInt.s
  IDVendeur.s
  Revision.f
  DateCreat.q
  DateModif.q
  Variable.a
  Proportionnelle.a
  Fixe.a
  NbGlyphes.l
  Panose.a[10]
  PanoseInt.s[10]
  PlagesUnicode.q[4]
  Map PlagesUnicodeInt.s()
EndStructure ;}
;}
;{ ════  ENUMERATIONS             ════
;- ════  ENUMERATIONS             ════
Enumeration Fichiers
  #FIC_POLICE
EndEnumeration
;}
;{ ════  CONSTANTES               ════
;- ════  CONSTANTES               ════
#ALIGT_INTEL=$4949        ; 'II'
#ALIGT_MOTOROLA=$4D4D     ; 'MM'
#ALIGT_BYTE=$FF
;
#FORMAT_DATE="%dd/%mm/%yyyy %hh:%ii:%ss"
#LANGUE=$40C ; Langue choisie pour la récupération, si absente : Anglais USA
#CHOIXOS=3   ; Choix Plateforme données récupérés : 0 = Mac, 1 = Linux, 3 = Windows
;}
;{ ════  TABLEAUX, LISTES, MAPS   ════
;- ════  TABLEAUX, LISTES, MAPS   ════
Global Dim Plateformes.s(3)       ;{
Plateformes(0)="Unicode"
Plateformes(1)="Mac"
Plateformes(3)="Windows"
;}
Global Dim Encodages.s(4)         ;{
Encodages(0)="Unicode 1.0 semantics—déprécié"
Encodages(1)="Unicode 1.1 semantics—déprécié"
Encodages(2)="ISO/IEC 10646 semantics—déprécié"
Encodages(3)="Unicode 2.0 And onwards semantics, Unicode BMP only"
Encodages(4)="Unicode 2.0 And onwards semantics, Unicode full repertoire"
;}
Global Dim EncodagesMAC.s(32)     ;{
EncodagesMAC(0)="Latin"
EncodagesMAC(1)="Japonais"
EncodagesMAC(2)="Chinois traditionnel"
EncodagesMAC(3)="Coréen"
EncodagesMAC(4)="Arabe"
EncodagesMAC(5)="Hébreu"
EncodagesMAC(6)="Grec"
EncodagesMAC(7)="Russe"
EncodagesMAC(8)="RSymbol"
EncodagesMAC(9)="Dévanagari"
EncodagesMAC(10)="Gourmoukhî"
EncodagesMAC(11)="Goudjarati"
EncodagesMAC(12)="Odia"
EncodagesMAC(13)="Bengali"
EncodagesMAC(14)="Tamoul"
EncodagesMAC(15)="Télougou"
EncodagesMAC(16)="Kannada"
EncodagesMAC(17)="Malayalam"
EncodagesMAC(18)="Cingalais"
EncodagesMAC(19)="Birman"
EncodagesMAC(20)="Khmer"
EncodagesMAC(21)="Thaï"
EncodagesMAC(22)="Laotien"
EncodagesMAC(23)="Géorgien"
EncodagesMAC(24)="Arménien"
EncodagesMAC(25)="Chinois simplifié"
EncodagesMAC(26)="Tibétain"
EncodagesMAC(27)="Mongol"
EncodagesMAC(28)="Guèze"
EncodagesMAC(29)="Slavon"
EncodagesMAC(30)="Vietnamien"
EncodagesMAC(31)="Sindhi"
EncodagesMAC(32)="Non-interprété"
;}
Global Dim LanguesMAC.s(150)      ;{
LanguesMAC(0)="Anglais"         ; English
LanguesMAC(1)="Français"        ; French
LanguesMAC(2)="Allemand"        ; German
LanguesMAC(3)="Italien"         ; Italian
LanguesMAC(4)="Néerlandais"     ; Dutch
LanguesMAC(5)="Suédois"         ; Swedish
LanguesMAC(6)="Espagnol"        ; Spanish
LanguesMAC(7)="Danois"          ; Danish
LanguesMAC(8)="Portugais"       ; Portuguese
LanguesMAC(9)="Norvégien"       ; Norwegian
LanguesMAC(10)="Hébreu"         ; Hebrew
LanguesMAC(11)="Japonais"       ; Japanese
LanguesMAC(12)="Arabe"          ; Arabic
LanguesMAC(13)="Finnois"        ; Finnish
LanguesMAC(14)="Grec"           ; Greek
LanguesMAC(15)="Islandais"      ; Icelandic
LanguesMAC(16)="Maltais"        ; Maltese
LanguesMAC(17)="Turc"           ; Turkish
LanguesMAC(18)="Croate"         ; Croatian
LanguesMAC(19)="Chinois traditionnel"                   ; Chinese (Traditional)
LanguesMAC(20)="Ourdou"                                 ; Urdu
LanguesMAC(21)="Hindi"                                  ; Hindi
LanguesMAC(22)="Thaï"                                   ; Thai
LanguesMAC(23)="Coréen"                                 ; Korean
LanguesMAC(24)="Lituanien"                              ; Lithuanian
LanguesMAC(25)="Polonais"                               ; Polish
LanguesMAC(26)="Hongrois"                               ; Hungarian
LanguesMAC(27)="Estonien"                               ; Estonian
LanguesMAC(28)="Letton"                                 ; Latvian
LanguesMAC(29)="Sami"                                   ; Sami
LanguesMAC(30)="Féroïen"                                ; Faroese
LanguesMAC(31)="Farsi/Perse"                            ; Farsi/Persian
LanguesMAC(32)="Russe"                                  ; Russian
LanguesMAC(33)="Chinois simplifié"                      ; Chinese (Simplified)
LanguesMAC(34)="Flamand"                                ; Flemish
LanguesMAC(35)="Irlandais"                              ; Irish
LanguesMAC(36)="Albanais"                               ; Albanian
LanguesMAC(37)="Roumain"                                ; Romanian
LanguesMAC(38)="Tchèque"                                ; Czech
LanguesMAC(39)="Slovaque"                               ; Slovak
LanguesMAC(40)="Slovénien"                              ; Slovenian
LanguesMAC(41)="Yiddish"                                ; Yiddish
LanguesMAC(42)="Serbe"                                  ; Serbian
LanguesMAC(43)="Macédonien"                             ; Macedonian
LanguesMAC(44)="Bulgare"                                ; Bulgarian
LanguesMAC(45)="Ukrainien"                              ; Ukrainian
LanguesMAC(46)="Biélorusse"                             ; Byelorussian
LanguesMAC(47)="Ouzbek"                                 ; Uzbek
LanguesMAC(48)="Kazakh"                                 ; Kazakh
LanguesMAC(49)="Azerbaïdjanais (Cyrillique)"            ; Azerbaijani (Cyrillic script)
LanguesMAC(50)="Azerbaïdjanais (Arabe)"                 ; Azerbaijani (Arabic script)
LanguesMAC(51)="Arménien"                               ; Armenian
LanguesMAC(52)="Géorgien"                               ; Georgian
LanguesMAC(53)="Roumain (Moldave)"                      ; Romanian (Moldova)
LanguesMAC(54)="Kirghiz"                                ; Kirghiz
LanguesMAC(55)="Tadjik"                                 ; Tajiki
LanguesMAC(56)="Turkmène"                               ; Turkmen
LanguesMAC(57)="Mongol"                                 ; Mongolian (Mongolian script)
LanguesMAC(58)="Mongol (Cyrillique)"                    ; Mongolian (Cyrillic script)
LanguesMAC(59)="Pachto"                                 ; Pashto
LanguesMAC(60)="Kurde"                                  ; Kurdish
LanguesMAC(61)="Cachemiri"                              ; Kashmiri
LanguesMAC(62)="Sindhi"                                 ; Sindhi
LanguesMAC(63)="Tibétain"                               ; Tibetan
LanguesMAC(64)="Népalais"                               ; Nepali
LanguesMAC(65)="Sanskrit"                               ; Sanskrit
LanguesMAC(66)="Marathi"                                ; Marathi
LanguesMAC(67)="Bengali"                                ; Bangla
LanguesMAC(68)="Assamais"                               ; Assamese
LanguesMAC(69)="Goudjarati"                             ; Gujarati
LanguesMAC(70)="Pendjabi"                               ; Punjabi
LanguesMAC(71)="Odia"                                   ; Odia
LanguesMAC(72)="Malayalam"                              ; Malayalam
LanguesMAC(73)="Kannada"                                ; Kannada
LanguesMAC(74)="Tamoul"                                 ; Tamil
LanguesMAC(75)="Télougou"                               ; Telugu
LanguesMAC(76)="Cingalais"                              ; Sinhalese
LanguesMAC(77)="Birman"                                 ; Burmese
LanguesMAC(78)="Khmer"                                  ; Khmer
LanguesMAC(79)="Laotien"                                ; Lao
LanguesMAC(80)="Vietnamien"                             ; Vietnamese
LanguesMAC(81)="Indonésien"                             ; Indonesian
LanguesMAC(82)="Tagalog"                                ; Tagalog
LanguesMAC(83)="Malais (Romain)"                        ; Malay (Roman script)
LanguesMAC(84)="Malais (Arabe)"                         ; Malay (Arabic script)
LanguesMAC(85)="Amharique"                              ; Amharic
LanguesMAC(86)="Tigrigna"                               ; Tigrinya
LanguesMAC(87)="Galla"                                  ; Galla
LanguesMAC(88)="Somali"                                 ; Somali
LanguesMAC(89)="Swahili"                                ; Swahili
LanguesMAC(90)="Kinyarwanda (Rwanda)"                   ; Kinyarwanda/Ruanda
LanguesMAC(91)="Rwanda-Rundi"                           ; Rundi
LanguesMAC(92)="Chewa"                                  ; Nyanja/Chewa
LanguesMAC(93)="Malgache"                               ; Malagasy
LanguesMAC(94)="Esperanto"                              ; Esperanto
LanguesMAC(128)="Gallois"                               ; Welsh
LanguesMAC(129)="Basque"                                ; Basque
LanguesMAC(130)="Catalan"                               ; Catalan
LanguesMAC(131)="Latin"                                 ; Latin
LanguesMAC(132)="Quechua"                               ; Quechua
LanguesMAC(133)="Guarani"                               ; Guarani
LanguesMAC(134)="Aymara"                                ; Aymara
LanguesMAC(135)="Tatar"                                 ; Tatar
LanguesMAC(136)="Ouïghour"                              ; Uighur
LanguesMAC(137)="Dzongkha"                              ; Dzongkha
LanguesMAC(138)="Javanais (Romain)"                     ; Javanese (Roman script)
LanguesMAC(139)="Soudanais (Romain)"                    ; Sundanese (Roman script)
LanguesMAC(140)="Galicien"                              ; Galician
LanguesMAC(141)="Afrikaans"                             ; Afrikaans
LanguesMAC(142)="Breton"                                ; Breton
LanguesMAC(143)="Inuktitut"                             ; Inuktitut
LanguesMAC(144)="Gaélique écossais"                     ; Scottish Gaelic
LanguesMAC(145)="Mannois"                               ; Manx
LanguesMAC(146)="Irlandais (avec point diacritique)"    ; Irish (with dot above)
LanguesMAC(147)="Tongien"                               ; Tongan
LanguesMAC(148)="Grec (Polytonique)"                    ; Greek (polytonic)
LanguesMAC(149)="Groenlandais"                          ; Greenlandic
LanguesMAC(150)="Azerbaïdjanais (Romain)"               ; Azerbaijani (Roman script)
                                                        ;}
Global Dim EncodagesWIN.s(32)     ;{
EncodagesWIN(0)="Symbol"
EncodagesWIN(1)="Unicode BMP"
EncodagesWIN(2)="ShiftJIS"
EncodagesWIN(3)="PRC"
EncodagesWIN(4)="Big5"
EncodagesWIN(5)="Wansung"
EncodagesWIN(6)="Johab"
EncodagesWIN(7)="Réservé"
EncodagesWIN(8)="Réservé"
EncodagesWIN(9)="Réservé"
EncodagesWIN(10)="Unicode Répertoire total"
;}
Global NewMap Graisses.s()        ;{
Graisses("5")="Contours"
Graisses("7")="Contours"
Graisses(Str(#FW_THIN))="Fin"
Graisses(Str(#FW_EXTRALIGHT))="Ultra-léger"
Graisses("250")="Ultra-léger"
Graisses("275")="Ultra-léger"
Graisses(Str(#FW_LIGHT))="Léger"
Graisses("350")="Semi-léger"
Graisses(Str(#FW_NORMAL))="Normal"
Graisses(Str(#FW_MEDIUM))="Moyen"
Graisses(Str(#FW_SEMIBOLD))="Semi-gras"
Graisses(Str(#FW_BOLD))="Gras"
Graisses(Str(#FW_EXTRABOLD))="Très gras"
Graisses(Str(#FW_BLACK))="Très noir"
;}
Global NewMap Chasses.s()         ;{
Chasses("1")="Ultra-condensé"
Chasses("2")="Extra-condensé"
Chasses("3")="Condensé"
Chasses("4")="Semi-condensé"
Chasses("5")="Medium (Normal)"
Chasses("6")="Semi-étendu"
Chasses("7")="Étendu"
Chasses("8")="Extra-étendu"
Chasses("9")="Ultra-étendu"
;}
Global NewMap LanguesWIN.s()      ;{
LanguesWIN("1025")="Arabe (Arabie-Saoudite)"                      ; $0401 - Arabic/Saudi Arabia
LanguesWIN("1026")="Bulgare (Biulgarie)"                          ; $0402 - Bulgarian/Bulgaria
LanguesWIN("1027")="Catalan (Espagne)"                            ; $0403 - Catalan/Catalan
LanguesWIN("1028")="Chinois (Taïwan)"                             ; $0404 - Chinese/Taiwan
LanguesWIN("1029")="Tchèque (Tchéquie)"                           ; $0405 - Czech/Czech Republic
LanguesWIN("1030")="Danois (Danemark)"                            ; $0406 - Danish/Denmark
LanguesWIN("1031")="Allemand (Allemagne)"                         ; $0407 - German/Germany
LanguesWIN("1032")="Grec (Grèce)"                                 ; $0408 - Greek/Greece
LanguesWIN("1033")="Anglais (Etats-Unis)"                         ; $0409 - English/United States
LanguesWIN("1040")="Italien (Italie)"                             ; $0410 - Italian/Italy
LanguesWIN("1041")="Japonais (Japon)"                             ; $0411 - Japanese/Japan
LanguesWIN("1042")="Coréen (Corée)"                               ; $0412 - Korean/Korea
LanguesWIN("1043")="Néerlandais (Pays-Bas)"                       ; $0413 - Dutch/Netherlands
LanguesWIN("1044")="Bokmål (Norvège)"                             ; $0414 - Norwegian (Bokmal)/Norway
LanguesWIN("1045")="Polonais (Pologne)"                           ; $0415 - Polish/Poland
LanguesWIN("1046")="Portugais (Brésil)"                           ; $0416 - Portuguese/Brazil
LanguesWIN("1047")="Romanche (Suisse)"                            ; $0417 - Romansh/Switzerland
LanguesWIN("1048")="Roumain (Roumanie)"                           ; $0418 - Romanian/Romania
LanguesWIN("1049")="Russe (Russie)"                               ; $0419 - Russian/Russia
LanguesWIN("1056")="Ourdou (Pakistan)"                            ; $0420 - Urdu/Islamic Republic of Pakistan
LanguesWIN("1057")="Indonésien (Indonésie)"                       ; $0421 - Indonesian/Indonesia
LanguesWIN("1058")="Ukrainien (Ukraine)"                          ; $0422 - Ukrainian/Ukraine
LanguesWIN("1059")="Biélorusse (Biélorussie)"                     ; $0423 - Belarusian/Belarus
LanguesWIN("1060")="Slovénien (Slovénie)"                         ; $0424 - Slovenian/Slovenia
LanguesWIN("1061")="Estonien (Estonie)"                           ; $0425 - Estonian/Estonia
LanguesWIN("1062")="Letton (Lettonie)"                            ; $0426 - Latvian/Latvia
LanguesWIN("1063")="Lituanien (Lituanie)"                         ; $0427 - Lithuanian/Lithuania
LanguesWIN("1064")="Tadjik (Cyrillique) (Tadjikistan)"            ; $0428 - Tajik (Cyrillic)/Tajikistan
LanguesWIN("1074")="Tswana (Afrique du Sud)"                      ; $0432 - Setswana/South Africa
LanguesWIN("1076")="Xhosa (Afrique du Sud)"                       ; $0434 - isiXhosa/South Africa
LanguesWIN("1077")="Zoulou (Afrique du Sud)"                      ; $0435 - isiZulu/South Africa
LanguesWIN("1078")="Afrikaans (Afrique du Sud)"                   ; $0436 - Afrikaans/South Africa
LanguesWIN("1079")="Géorgien (Géorgie)"                           ; $0437 - Georgian/Georgia
LanguesWIN("1080")="Féroïen (Iles Féroé)"                         ; $0438 - Faroese/Faroe Islands
LanguesWIN("1081")="Hindi (Inde)"                                 ; $0439 - Hindi/India
LanguesWIN("1088")="Kirghize (Kirghizistan)"                      ; $0440 - Kyrgyz/Kyrgyzstan
LanguesWIN("1089")="Kiswahili (Kenya)"                            ; $0441 - Kiswahili/Kenya
LanguesWIN("1090")="Turkmène (Turkménistan)"                      ; $0442 - Turkmen/Turkmenistan
LanguesWIN("1091")="Ouzbek (Latin) (Ouzbékistan)"                 ; $0443 - Uzbek (Latin)/Uzbekistan
LanguesWIN("1092")="Tatar (Russie)"                               ; $0444 - Tatar/Russia
LanguesWIN("1093")="Bengali (Inde)"                               ; $0445 - Bangla/India
LanguesWIN("1094")="Pendjabi (Inde)"                              ; $0446 - Punjabi/India
LanguesWIN("1095")="Goudjarati (Inde)"                            ; $0447 - Gujarati/India
LanguesWIN("1096")="Odia (Inde)"                                  ; $0448 - Odia/India
LanguesWIN("1097")="Tamoul (Inde)"                                ; $0449 - Tamil/India
LanguesWIN("1104")="Mongol (Cyrillique) (Mongolie)"               ; $0450 - Mongolian (Cyrillic)/Mongolia
LanguesWIN("1105")="Tibétain (Chine)"                             ; $0451 - Tibetan/PRC
LanguesWIN("1106")="Gallois (Royaume-Uni)"                        ; $0452 - Welsh/United Kingdom
LanguesWIN("1107")="Khmer (Cambodge)"                             ; $0453 - Khmer/Cambodia
LanguesWIN("1108")="Laotien (Laos)"                               ; $0454 - Lao/Lao P.D.R.
LanguesWIN("1110")="Galicien (Galice)"                            ; $0456 - Galician/Galician
LanguesWIN("1111")="Konkani (Inde)"                               ; $0457 - Konkani/India
LanguesWIN("1121")="Népalais (Népal)"                             ; $0461 - Nepali/Nepal
LanguesWIN("1122")="Frison (Pays-Bas)"                            ; $0462 - Frisian/Netherlands
LanguesWIN("1123")="Pachto (Afghanistan)"                         ; $0463 - Pashto/Afghanistan
LanguesWIN("1124")="Philippin (Philippines)"                      ; $0464 - Filipino/Philippines
LanguesWIN("1125")="Dhivehi (Maldives)"                           ; $0465 - Divehi/Maldives
LanguesWIN("1128")="Haoussa (Nigeria)"                            ; $0468 - Hausa (Latin)/Nigeria
LanguesWIN("1136")="Igbo (Nigeria)"                               ; $0470 - Igbo/Nigeria
LanguesWIN("1144")="Yi (Chine)"                                   ; $0478 - Yi/PRC
LanguesWIN("1152")="Ouïghour (Chine)"                             ; $0480 - Uighur/PRC
LanguesWIN("1153")="Maori (Nouvelle-Zélande)"                     ; $0481 - Maori/New Zealand
LanguesWIN("1154")="Occitan (France)"                             ; $0482 - Occitan/France
LanguesWIN("1155")="Corse (France)"                               ; $0483 - Corsican/France
LanguesWIN("1156")="Alsacien (France)"                            ; $0484 - Alsatian/France
LanguesWIN("1157")="Yakoute  (Russie)"                            ; $0485 - Sakha/Russia
LanguesWIN("1158")="Quiché (Guatemala)"                           ; $0486 - K’iche/Guatemala
LanguesWIN("1159")="Kinyarwanda (Rwanda)"                         ; $0487 - Kinyarwanda/Rwanda
LanguesWIN("1160")="Wolof (Sénégal)"                              ; $0488 - Wolof/Senegal
LanguesWIN("2049")="Arabe (Irak)"                                 ; $0801 - Arabic/Iraq
LanguesWIN("2052")="Chinois (Chine)"                              ; $0804 - Chinese/People’s Republic of China
LanguesWIN("2055")="Allemand (Suisse)"                            ; $0807 - German/Switzerland
LanguesWIN("2057")="Anglais (Royaume-Uni)"                        ; $0809 - English/United Kingdom
LanguesWIN("2064")="Italien (Italie)"                             ; $0810 - Italian/Switzerland
LanguesWIN("2067")="Néerlandais (Belgique)"                       ; $0813 - Dutch/Belgium
LanguesWIN("2068")="Nynorsk (Norvège)"                            ; $0814 - Norwegian (Nynorsk)/Norway
LanguesWIN("2070")="Portugais (Portugal)"                         ; $0816 - Portuguese/Portugal
LanguesWIN("2115")="Ouzbek (Cyrillique) (Ouzbékistan)"            ; $0843 - Uzbek (Cyrillic)/Uzbekistan
LanguesWIN("2117")="Bengali (Bangladesh)"                         ; $0845 - Bangla/Bangladesh
LanguesWIN("2128")="Mongol (Mongolie)"                            ; $0850 - Mongolian (Traditional)/People’s Republic of China
LanguesWIN("4097")="Arabe (Libye)"                                ; $1001 - Arabic/Libya
LanguesWIN("4100")="Chinois (Singapour)"                          ; $1004 - Chinese/Singapore
LanguesWIN("4103")="Allemand (Luxembourg)"                        ; $1007 - German/Luxembourg
LanguesWIN("4105")="Anglais (Canada)"                             ; $1009 - English/Canada
LanguesWIN("5121")="Arabe (Algérie)"                              ; $1401 - Arabic/Algeria
LanguesWIN("5124")="Chinois (Macao)"                              ; $1404 - Chinese/Macao SAR
LanguesWIN("5127")="Allemand (Liechtenstein)"                     ; $1407 - German/Liechtenstein
LanguesWIN("5129")="Anglais (Nouvelle-Zélande)"                   ; $1409 - English/New Zealand
LanguesWIN("6145")="Arabe (Maroc)"                                ; $1801 - Arabic/Morocco
LanguesWIN("6153")="Anglais (Irlande)"                            ; $1809 - English/Ireland
LanguesWIN("8193")="Arabe (Oman)"                                 ; $2001 - Arabic/Oman
LanguesWIN("8201")="Anglais (Jamaïque)"                           ; $2009 - English/Jamaica
LanguesWIN("9217")="Arabe (Yémen)"                                ; $2401 - Arabic/Yemen
LanguesWIN("9225")="Anglais (Caraïbes)"                           ; $2409 - English/Caribbean
LanguesWIN("10241")="Arabe (Syrie)"                               ; $2801 - Arabic/Syria
LanguesWIN("10249")="Anglais (Bélize)"                            ; $2809 - English/Belize
LanguesWIN("12289")="Arabe (Liban)"                               ; $3001 - Arabic/Lebanon
LanguesWIN("12297")="Anglais (Zimbabwe)"                          ; $3009 - English/Zimbabwe
LanguesWIN("13313")="Arabe (Koweït)"                              ; $3401 - Arabic/Kuwait
LanguesWIN("13321")="Anglais (Philippines)"                       ; $3409 - English/Republic of the Philippines
LanguesWIN("14337")="Arabe (Émirats arabes unis)"                 ; $3801 - Arabic/U.A.E.
LanguesWIN("16385")="Arabe (Qatar)"                               ; $4001 - Arabic/Qatar
LanguesWIN("16393")="Anglais (Inde)"                              ; $4009 - English/India
LanguesWIN("17417")="Anglais (Malaisie)"                          ; $4409 - English/Malaysia
LanguesWIN("18441")="Anglais (Singapour)"                         ; $4809 - English/Singapore
LanguesWIN("1034")="Espagnol (Traditionnel) (Espagne)"            ; $040A - Spanish (Traditional Sort)/Spain
LanguesWIN("1035")="Finnois (Finlande)"                           ; $040B - Finnish/Finland
LanguesWIN("1036")="Français (France)"                            ; $040C - French/France
LanguesWIN("1037")="Hébreu (Israël)"                              ; $040D - Hebrew/Israel
LanguesWIN("1038")="Hongrois (Hongrie)"                           ; $040E - Hungarian/Hungary
LanguesWIN("1039")="Islandais (Islande)"                          ; $040F - Icelandic/Iceland
LanguesWIN("1050")="Croate (Croatie)"                             ; $041A - Croatian/Croatia
LanguesWIN("1051")="Slovaque (Slovaquie)"                         ; $041B - Slovak/Slovakia
LanguesWIN("1052")="Albanais (Albanie)"                           ; $041C - Albanian/Albania
LanguesWIN("1053")="Suédois (Suède)"                              ; $041D - Swedish/Sweden
LanguesWIN("1054")="Thaï (ThaIlande)"                             ; $041E - Thai/Thailand
LanguesWIN("1055")="Turc (Turquie)"                               ; $041F - Turkish/Türkiye
LanguesWIN("1066")="Vietnamien (Vietnam)"                         ; $042A - Vietnamese/Vietnam
LanguesWIN("1067")="Arménien (Arménie)"                           ; $042B - Armenian/Armenia
LanguesWIN("1068")="Azerbaïdjanais (Arabe) (Azerbaïdjan)"         ; $042C - Azerbaijani (Latin)/Azerbaijan
LanguesWIN("1069")="Basque (France)"                              ; $042D - Basque/Basque
LanguesWIN("1070")="Haut-sorabe (Allemagne)"                      ; $042E - Upper Sorbian/Germany
LanguesWIN("1071")="Macédonien (Macédoine)"                       ; $042F - Macedonian/North Macedonia
LanguesWIN("1082")="Maltais (Malte)"                              ; $043A - Maltese/Malta
LanguesWIN("1083")="Same (Nord) (Norvège)"                        ; $043B - Sami (Northern)/Norway
LanguesWIN("1086")="Malais (Malaisie)"                            ; $043E - Malay/Malaysia
LanguesWIN("1087")="Kazakh (Kazakhstan)"                          ; $043F - Kazakh/Kazakhstan
LanguesWIN("1098")="Télougou (Inde)"                              ; $044A - Telugu/India
LanguesWIN("1099")="Kannada (Inde)"                               ; $044B - Kannada/India
LanguesWIN("1100")="Malayalam (Inde)"                             ; $044C - Malayalam/India
LanguesWIN("1101")="Assamais (Inde)"                              ; $044D - Assamese/India
LanguesWIN("1102")="Marathi (Inde)"                               ; $044E - Marathi/India
LanguesWIN("1103")="Sanskrit (Sanskritie)"                        ; $044F - Sanskrit/India
LanguesWIN("1114")="Syriaque (Syrie)"                             ; $045A - Syriac/Syria
LanguesWIN("1115")="Cingalais (Sri Lanka)"                        ; $045B - Sinhala/Sri Lanka
LanguesWIN("1117")="Inuktitut (Canada)"                           ; $045D - Inuktitut/Canada
LanguesWIN("1118")="Amharique (Éthiopie)"                         ; $045E - Amharic/Ethiopia
LanguesWIN("1130")="Yoruba (Nigeria)"                             ; $046A - Yoruba/Nigeria
LanguesWIN("1131")="Quechua (Bolivie)"                            ; $046B - Quechua/Bolivia
LanguesWIN("1132")="Sotho du Nord (Afrique du Sud)"               ; $046C - Sesotho sa Leboa/South Africa
LanguesWIN("1133")="Russe (Russie)"                               ; $046D - Bashkir/Russia
LanguesWIN("1134")="Luxembourgeois (Luxembourg)"                  ; $046E - Luxembourgish/Luxembourg
LanguesWIN("1135")="Groenlandais (Groenland)"                     ; $046F - Greenlandic/Greenland
LanguesWIN("1146")="Mapudungun (Chili)"                           ; $047A - Mapudungun/Chile
LanguesWIN("1148")="Mohawk (Canada/USA)"                          ; $047C - Mohawk/Mohawk
LanguesWIN("1150")="Breton (France)"                              ; $047E - Breton/France
LanguesWIN("1164")="Dari (Afghanistan)"                           ; $048C - Dari/Afghanistan
LanguesWIN("2058")="Espagnol (Mexique)"                           ; $080A - Spanish/Mexico
LanguesWIN("2060")="Français (Belgique)"                          ; $080C - French/Belgium
LanguesWIN("2074")="Serbe (Latin) (Serbie)"                       ; $081A - Serbian (Latin)/Serbia
LanguesWIN("2077")="Suédois (Finlande)"                           ; $081D - Swedish/Finland
LanguesWIN("2092")="Azerbaïdjanais (Cyrillique) (Azerbaïdjan)"    ; $082C - Azerbaijani (Cyrillic)/Azerbaijan
LanguesWIN("2094")="Bas-sorabe (Allemagne)"                       ; $082E - Lower Sorbian/Germany
LanguesWIN("2107")="Same (Nord) (Suède)"                          ; $083B - Sami (Northern)/Sweden
LanguesWIN("2108")="Irlandais (Irlande)"                          ; $083C - Irish/Ireland
LanguesWIN("2110")="Malais (Brunei)"                              ; $083E - Malay/Brunei Darussalam
LanguesWIN("2141")="Inuktitut (Latin) (Canada)"                   ; $085D - Inuktitut (Latin)/Canada
LanguesWIN("2143")="Tamazight (Latin) (Algérie)"                  ; $085F - Tamazight (Latin)/Algeria
LanguesWIN("2155")="Quechua (Quechuaie)"                          ; $086B - Quechua/Ecuador
LanguesWIN("3073")="Arabe (Égypte)"                               ; $0C01 - Arabic/Egypt
LanguesWIN("3076")="Chinois (Hong-Kong)"                          ; $0C04 - Chinese/Hong Kong SAR
LanguesWIN("3079")="Allemand (Autriche)"                          ; $0C07 - German/Austria
LanguesWIN("3081")="Anglais (Australie)"                          ; $0C09 - English/Australia
LanguesWIN("3082")="Espagnol (Moderne) (Espagne)"                 ; $0C0A - Spanish (Modern Sort)/Spain
LanguesWIN("3084")="Français (Canada)"                            ; $0C0C - French/Canada
LanguesWIN("3098")="Serbe (Cyrillique) (Serbie)"                  ; $0C1A - Serbian (Cyrillic)/Serbia
LanguesWIN("3131")="Same (Nord) (Finlande)"                       ; $0C3B - Sami (Northern)/Finland
LanguesWIN("3179")="Quechua (Pérou)"                              ; $0C6B - Quechua/Peru
LanguesWIN("4106")="Espagnol (Guatemala)"                         ; $100A - Spanish/Guatemala
LanguesWIN("4108")="Français (Suisse)"                            ; $100C - French/Switzerland
LanguesWIN("4122")="Croate (Latin) (Bosnie-Herzégovine)"          ; $101A - Croatian (Latin)/Bosnia and Herzegovina
LanguesWIN("4155")="Same (Lule) (Norvège)"                        ; $103B - Sami (Lule)/Norway
LanguesWIN("5130")="Espagnol (Costa Rica)"                        ; $140A - Spanish/Costa Rica
LanguesWIN("5132")="Français (Luxembourg)"                        ; $140c - French/Luxembourg
LanguesWIN("5146")="Azerbaïdjanais (Arabe) (Bosnie-Herzégovine)"  ; $141A - Bosnian (Latin)/Bosnia and Herzegovina
LanguesWIN("5179")="Same (Lule) (Suède)"                          ; $143B - Sami (Lule)/Sweden
LanguesWIN("6154")="Espagnol (Panama)"                            ; $180A - Spanish/Panama
LanguesWIN("6156")="Français (Monaco)"                            ; $180C - French/Principality of Monaco
LanguesWIN("6170")="Serbe (Latin) (Bosnie-Herzégovine)"           ; $181A - Serbian (Latin)/Bosnia and Herzegovina
LanguesWIN("6203")="Same (Sud) (Norvège)"                         ; $183B - Sami (Southern)/Norway
LanguesWIN("7169")="Arabe (Tunisie)"                              ; $1C01 - Arabic/Tunisia
LanguesWIN("7177")="Anglais (Afrique du Sud)"                     ; $1C09 - English/South Africa
LanguesWIN("7178")="Espagnol (République dominicaine)"            ; $1C0A - Spanish/Dominican Republic
LanguesWIN("7194")="Serbe (Cyrillique) (Bosnie-Herzégovine)"      ; $1C1A - Serbian (Cyrillic)/Bosnia and Herzegovina
LanguesWIN("7227")="Same (Sud) (Suède)"                           ; $1C3B - Sami (Southern)/Sweden
LanguesWIN("8202")="Espagnol (Espagne)"                           ; $200A - Spanish/Venezuela
LanguesWIN("8218")="Bosnien (Cyrillique) (Bosnie-Herzégovine)"    ; $201A - Bosnian (Cyrillic)/Bosnia and Herzegovina
LanguesWIN("8251")="Same (Skolt) (Finlande)"                      ; $203B - Sami (Skolt)/Finland
LanguesWIN("9226")="Espagnol (Colombie)"                          ; $240A - Spanish/Colombia
LanguesWIN("9275")="Same (Inari) (Finlande)"                      ; $243B - Sami (Inari)/Finland
LanguesWIN("10250")="Espagnol (Pérou)"                            ; $280A - Spanish/Peru
LanguesWIN("11265")="Arabe (Jordanie)"                            ; $2C01 - Arabic/Jordan
LanguesWIN("11273")="Anglais (Trinité-et-Tobago)"                 ; $2C09 - English/Trinidad and Tobago
LanguesWIN("11274")="Espagnol (Argentine)"                        ; $2C0A - Spanish/Argentina
LanguesWIN("12298")="Espagnol (Équateur)"                         ; $300A - Spanish/Ecuador
LanguesWIN("13322")="Espagnol (Chili)"                            ; $340A - Spanish/Chile
LanguesWIN("14346")="Espagnol (Espagne)"                          ; $380A - Spanish/Uruguay
LanguesWIN("15361")="Arabe (Bahreïn)"                             ; $3C01 - Arabic/Bahrain
LanguesWIN("15370")="Espagnol (Paraguay)"                         ; $3C0A - Spanish/Paraguay
LanguesWIN("16394")="Espagnol (Bolivie)"                          ; $400A - Spanish/Bolivia
LanguesWIN("17418")="Espagnol (Salvador)"                         ; $440A - Spanish/El Salvador
LanguesWIN("18442")="Espagnol (Honduras)"                         ; $480A - Spanish/Honduras
LanguesWIN("19466")="Espagnol (Nicaragua)"                        ; $4C0A - Spanish/Nicaragua
LanguesWIN("20490")="Espagnol (Porto-Rico)"                       ; $500A - Spanish/Puerto Rico
LanguesWIN("21514")="Espagnol (USA)"                              ; $540A - Spanish/United States
;}
Global NewMap NomsID.s()          ;{
NomsID("0")="Copyright"
NomsID("1")="Famille"
NomsID("2")="Sous-famille"
NomsID("3")="Identifiant unique"
NomsID("4")="Nom complet"
NomsID("5")="Version"
NomsID("6")="Nom PostScript"
NomsID("7")="Marque déposée"
NomsID("8")="Vendeur"
NomsID("9")="Créateur"
NomsID("10")="Description"
NomsID("11")="URL Vendeur"
NomsID("12")="URL Créateur"
NomsID("13")="Licence"
NomsID("14")="URL Licence"
NomsID("15")="Réservé"
NomsID("16")="Famille typographique"
NomsID("17")="Sous-famille typographique"
NomsID("18")="Compatibilité totale"
NomsID("19")="Example texte"
NomsID("20")="CID PostScript"
NomsID("21")="Famille WWS"
NomsID("22")="Sous-famille WWS"
NomsID("23")="Palette arrière-plan clair"
NomsID("24")="Palette arrière-plan sombre"
NomsID("25")="Préfixe nom PostScript"
;}
Dernière modification par boddhi le jeu. 28/mars/2024 17:29, modifié 1 fois.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF & TTF

Message par boddhi »

Partie 2/3 : Assignations et déclarations (Partie 2)

Code : Tout sélectionner

Global NewMap PanoseIntitules.s() ;{
PanoseIntitules("2-0")="Famille"
PanoseIntitules("2-1")="Style"
PanoseIntitules("2-2")="Graisse"
PanoseIntitules("2-3")="Proportion"
PanoseIntitules("2-4")="Contraste"
PanoseIntitules("2-5")="Variation fût"
PanoseIntitules("2-6")="Jambage"
PanoseIntitules("2-7")="Forme"
PanoseIntitules("2-8")="Médiane"
PanoseIntitules("2-9")="Hauteur d'oeil"
PanoseIntitules("3-0")=PanoseIntitules("2-0")
PanoseIntitules("3-1")="Outil"
PanoseIntitules("3-2")=PanoseIntitules("2-2")
PanoseIntitules("3-3")="Espacement"
PanoseIntitules("3-4")="Ratio H/L"
PanoseIntitules("3-5")=PanoseIntitules("2-4")
PanoseIntitules("3-6")="Topologie"
PanoseIntitules("3-7")=PanoseIntitules("2-7")
PanoseIntitules("3-8")="Poinçons"
PanoseIntitules("3-9")="Hauteur bas de casse"
PanoseIntitules("4-0")=PanoseIntitules("2-0")
PanoseIntitules("4-1")="Classe"
PanoseIntitules("4-2")=PanoseIntitules("2-2")
PanoseIntitules("4-3")="Aspect"
PanoseIntitules("4-4")=PanoseIntitules("2-4")
PanoseIntitules("4-5")="Variation d'empattement"
PanoseIntitules("4-6")="Traitement"
PanoseIntitules("4-7")="Habillage"
PanoseIntitules("4-8")=PanoseIntitules("3-6")
PanoseIntitules("4-9")="Gamme"
PanoseIntitules("5-0")=PanoseIntitules("2-0")
PanoseIntitules("5-1")="Genre"
PanoseIntitules("5-2")=PanoseIntitules("2-2")
PanoseIntitules("5-3")=PanoseIntitules("3-3")
PanoseIntitules("5-4")=PanoseIntitules("3-4")
PanoseIntitules("5-5")=PanoseIntitules("3-4")+" car. 94"
PanoseIntitules("5-6")=PanoseIntitules("3-4")+" car. 119"
PanoseIntitules("5-7")=PanoseIntitules("3-4")+" car. 157"
PanoseIntitules("5-8")=PanoseIntitules("3-4")+" car. 163"
PanoseIntitules("5-9")=PanoseIntitules("3-4")+" car. 211"
PanoseIntitules("255")="Classe n°"
;}
Global NewMap PanoseValeurs.s()   ;{
;{ Types familles           - Octet 0
PanoseValeurs("0-"+Str(#PAN_ANY)+"-0")="N'importe quel(le)"
PanoseValeurs("0-"+Str(#PAN_NO_FIT)+"-0")="Pas de correspondance"
PanoseValeurs("0-"+Str(#PAN_FAMILY_TEXT_DISPLAY)+"-0")="Texte et titrage"
PanoseValeurs("0-"+Str(#PAN_FAMILY_SCRIPT)+"-0")="Manuscrite"
PanoseValeurs("0-"+Str(#PAN_FAMILY_DECORATIVE)+"-0")="Décorative"
PanoseValeurs("0-"+Str(#PAN_FAMILY_PICTORIAL)+"-0")="Graphique"
;}
;{ Styles empattement       - Octet 1       - Famille 2 / Octet 5 - Famille 4  ---- 1 exception
PanoseValeurs("1-2-"+Str(#PAN_SERIF_COVE))="Anse"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_OBTUSE_COVE))="Anse obtuse"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_SQUARE_COVE))="Anse carrée"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_OBTUSE_SQUARE_COVE))="Anse obtuse carrée"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_SQUARE))="Carré"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_THIN))="Mince"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_BONE))="Arête"        ; Ovale pour famille 4
PanoseValeurs("1-2-"+Str(#PAN_SERIF_EXAGGERATED))="Exagéré"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_TRIANGLE))="Triangulaire"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_NORMAL_SANS))="Normal sans empattement"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_OBTUSE_SANS))="Obtus sans empattement"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_PERP_SANS))="Perpendiculaire sans empattement"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_FLARED))="Évasé"
PanoseValeurs("1-2-"+Str(#PAN_SERIF_ROUNDED))="Arrondi"
PanoseValeurs("1-2-16")="Écriture"
;}
;{ Outils                   - Octet 1       - Famille 3
PanoseValeurs("1-3-2")="Plume rigide"
PanoseValeurs("1-3-3")="Plume sensible à la pression"
PanoseValeurs("1-3-4")="Gravure"
PanoseValeurs("1-3-5")="Stylo-bille (Bout rond)"
PanoseValeurs("1-3-6")="Pinceau"
PanoseValeurs("1-3-7")="Grossier"
PanoseValeurs("1-3-8")="Feutre ou pinceau"
PanoseValeurs("1-3-9")="Pinceau fou dégoulinant"
;}
;{ Classes                  - Octet 1       - Famille 4
PanoseValeurs("1-4-2")="Dérivée"
PanoseValeurs("1-4-3")="Topologie non standard"
PanoseValeurs("1-4-4")="Éléments non standars"
PanoseValeurs("1-4-5")="Aspect non standard"
PanoseValeurs("1-4-6")="Initiales"
PanoseValeurs("1-4-7")="Bande-dessinée"
PanoseValeurs("1-4-8")="Fûts en image"
PanoseValeurs("1-4-9")="Ornementé"
PanoseValeurs("1-4-10")="Texte et arrière-plan"
PanoseValeurs("1-4-11")="Collage"
PanoseValeurs("1-4-12")="Montage"
;}
;{ Genres                   - Octet 1       - Famille 5
PanoseValeurs("1-5-2")="Montages"
PanoseValeurs("1-5-3")="Images"
PanoseValeurs("1-5-4")="Formes"
PanoseValeurs("1-5-5")="Scientifique"
PanoseValeurs("1-5-6")="Musique"
PanoseValeurs("1-5-7")="Expert"
PanoseValeurs("1-5-8")="Motifs"
PanoseValeurs("1-5-9")="Bordures"
PanoseValeurs("1-5-10")="Icônes"
PanoseValeurs("1-5-11")="Logos"
PanoseValeurs("1-5-12")="Spécifique à l'industrie"
;}
;{ Graisses                 - Octet 2
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_VERY_LIGHT))="Très légère"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_LIGHT))="Légère"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_THIN))="Mince"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_BOOK))="Normal"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_MEDIUM))="Moyenne"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_DEMI))="Semi-grasse"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_BOLD))="Grasse"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_HEAVY))="Extra-grasse"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_BLACK))="Noire"
PanoseValeurs("2-2-"+Str(#PAN_WEIGHT_NORD))="Extra-noire"
;}
;{ Proportions              - Octet 3       - Famille 2
PanoseValeurs("3-2-"+Str(#PAN_PROP_OLD_STYLE))="Style ancien"
PanoseValeurs("3-2-"+Str(#PAN_PROP_MODERN))="Moderne"
PanoseValeurs("3-2-"+Str(#PAN_PROP_EVEN_WIDTH))="Largeur égalisée"
PanoseValeurs("3-2-"+Str(#PAN_PROP_EXPANDED))="Élargie"
PanoseValeurs("3-2-"+Str(#PAN_PROP_CONDENSED))="Étroite"
PanoseValeurs("3-2-"+Str(#PAN_PROP_VERY_EXPANDED))="Très élargie"
PanoseValeurs("3-2-"+Str(#PAN_PROP_VERY_CONDENSED))="Très étroite"
PanoseValeurs("3-2-"+Str(#PAN_PROP_MONOSPACED))="Chasse fixe"
;}
;{ Espacements              - Octet 3       - Familles 3 et 5
PanoseValeurs("3-3-2")="Chasse proportionnelle"
PanoseValeurs("3-3-3")=PanoseValeurs("3-2-"+Str(#PAN_PROP_MONOSPACED))
;}
;{ Aspects                  - Octet 3       - Famille 4
PanoseValeurs("3-4-2")="Super étroit"
PanoseValeurs("3-4-3")="Très étroit"
PanoseValeurs("3-4-4")="Étroit"
PanoseValeurs("3-4-5")="Normal"
PanoseValeurs("3-4-6")="Étendu"
PanoseValeurs("3-4-7")="Très étendu"
PanoseValeurs("3-4-8")="Extrêmement étendu"
PanoseValeurs("3-4-9")=PanoseValeurs("3-2-"+Str(#PAN_PROP_MONOSPACED))
;}
;{ Contrastes               - Octet 4       - Familles 2 et 4 / Octet 5 - Famille 3
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_NONE))="Aucun"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_VERY_LOW))="Très faible"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_LOW))="Faible"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_MEDIUM_LOW))="Moyen faible"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_MEDIUM))="Moyen"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_MEDIUM_HIGH))="Moyennement élevé"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_HIGH))="Élevé"
PanoseValeurs("4-2-"+Str(#PAN_CONTRAST_VERY_HIGH))="Très élevé"
PanoseValeurs("4-2-10")="Horizontal bas"
PanoseValeurs("4-2-11")="Horizontal médian"
PanoseValeurs("4-2-12")="Horizontal haut"
PanoseValeurs("4-2-13")="Invalide"
;}
;{ Ratio aspect             - Octet 4       - Familles 3 et 5
PanoseValeurs("4-3-2")=PanoseValeurs("3-4-3")
PanoseValeurs("4-3-3")=PanoseValeurs("3-4-4")
PanoseValeurs("4-3-4")=PanoseValeurs("3-4-5")
PanoseValeurs("4-3-5")="Large"
PanoseValeurs("4-3-6")="Très large"
;}
;{ Variations fûts          - Octet 5       - Famille 2
PanoseValeurs("5-2-"+Str(#PAN_STROKE_GRADUAL_DIAG))="Graduelle/Diagonale"
PanoseValeurs("5-2-"+Str(#PAN_STROKE_GRADUAL_TRAN))="Progressive/Transitionnelle"
PanoseValeurs("5-2-"+Str(#PAN_STROKE_GRADUAL_VERT))="Graduelle/Verticale"
PanoseValeurs("5-2-"+Str(#PAN_STROKE_GRADUAL_HORZ))="Progressive/Horizontale"
PanoseValeurs("5-2-"+Str(#PAN_STROKE_RAPID_VERT))="Rapide/Verticale"
PanoseValeurs("5-2-"+Str(#PAN_STROKE_RAPID_HORZ))="Rapide/Horizontale"
PanoseValeurs("5-2-"+Str(#PAN_STROKE_INSTANT_VERT))="Instantanée/Verticale"
PanoseValeurs("5-2-10")="Instantanée/Horizontale"
;}
;{ Variantes empattement    - Octet 5       - Famille 4
PanoseValeurs("5-4-8")="Ovale"
;}
;{ Ratio H/L                - Octets 5 à 9  - Famille 5
PanoseValeurs("5-5-2")="Pas de largeur"
PanoseValeurs("5-5-3")="Exceptionnellement large"
PanoseValeurs("5-5-4")="Super large"
PanoseValeurs("5-5-5")=PanoseValeurs("4-3-6")
PanoseValeurs("5-5-6")=PanoseValeurs("4-3-5")
PanoseValeurs("5-5-7")=PanoseValeurs("3-4-5")
PanoseValeurs("5-5-7")="Condensé"
PanoseValeurs("5-5-8")="Très condensé"
;}
;{ Jambages                 - Octet 6       - Famille 2
PanoseValeurs("6-2-"+Str(#PAN_STRAIGHT_ARMS_HORZ))="Traverses droites/Horizontal"
PanoseValeurs("6-2-"+Str(#PAN_STRAIGHT_ARMS_WEDGE))="Traverses droites/Coin"
PanoseValeurs("6-2-"+Str(#PAN_STRAIGHT_ARMS_VERT))="Traverses droites/Vertical"
PanoseValeurs("6-2-"+Str(#PAN_STRAIGHT_ARMS_SINGLE_SERIF))="Traverses droites/Empattement simple"
PanoseValeurs("6-2-"+Str(#PAN_STRAIGHT_ARMS_DOUBLE_SERIF))="Traverses droites/Empattement double"
PanoseValeurs("6-2-"+Str(#PAN_BENT_ARMS_HORZ))="Traverses non droites/Horizontal"
PanoseValeurs("6-2-"+Str(#PAN_BENT_ARMS_WEDGE))="Traverses non droites/Coin"
PanoseValeurs("6-2-"+Str(#PAN_BENT_ARMS_VERT))="Traverses non droites/Vertical"
PanoseValeurs("6-2-"+Str(#PAN_BENT_ARMS_SINGLE_SERIF))="Traverses non droites/Empattement simple"
PanoseValeurs("6-2-"+Str(#PAN_BENT_ARMS_DOUBLE_SERIF))="Traverses non droites/Empattement double"
;}
;{ Topologies               - Octet 6       - Famille 3
PanoseValeurs("6-3-2")="Romaine détachée"
PanoseValeurs("6-3-3")="Romaine empattements étendus"
PanoseValeurs("6-3-4")="Romaine attachée"
PanoseValeurs("6-3-5")="Cursive détachée"
PanoseValeurs("6-3-6")="Cursive empattements étendus"
PanoseValeurs("6-3-7")="Cursive attachée"
PanoseValeurs("6-3-8")="Gothique détachée"
PanoseValeurs("6-3-9")="Gothique empattements étendus"
PanoseValeurs("6-3-10")="Gothique attachée"
;}
;{ Traitements              - Octet 6       - Famille 4
PanoseValeurs("6-4-2")="Plein standard"
PanoseValeurs("6-4-3")="Sans remplissage"
PanoseValeurs("6-4-4")="Remplissage par motif"
PanoseValeurs("6-4-5")="Remplissage complexe"
PanoseValeurs("6-4-6")="Remplissage par forme"
PanoseValeurs("6-4-7")="Dessiné ou usé"
;}
;{ Types lettrages          - Octet 7       - Famille 2
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_CONTACT))="Normale/Touchante"
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_WEIGHTED))="Normale/Equilibrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_BOXED))="Normale/Encadrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_FLATTENED))="Normale/Aplatie"
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_ROUNDED))="Normale/Arrondie"
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_OFF_CENTER))="Normale/Décentrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_NORMAL_SQUARE))="Normale/Carrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_CONTACT))="Oblique/Touchante"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_WEIGHTED))="Oblique/Equilibrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_BOXED))="Oblique/Encadrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_FLATTENED))="Oblique/Aplatie"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_ROUNDED))="Oblique/Arrondie"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_OFF_CENTER))="Oblique/Décentrée"
PanoseValeurs("7-2-"+Str(#PAN_LETT_OBLIQUE_SQUARE))="Oblique/Carrée"
;}
;{ Formes                   - Octet 7       - Famille 3
PanoseValeurs("7-3-2")="Droite/Sans enroulement"
PanoseValeurs("7-3-3")="Droite/Certain enroulement"
PanoseValeurs("7-3-4")="Droite/Plus d'enroulement"
PanoseValeurs("7-3-5")="Droite/Enroulement extrême"
PanoseValeurs("7-3-6")="Oblique/Sans enroulement"
PanoseValeurs("7-3-7")="Oblique/Certain enroulement"
PanoseValeurs("7-3-8")="Oblique/Plus d'enroulement"
PanoseValeurs("7-3-9")="Oblique/Enroulement extrême"
PanoseValeurs("7-3-10")="Exagérée/Sans enroulement"
PanoseValeurs("7-3-11")="Exagérée/Certain enroulement"
PanoseValeurs("7-3-12")="Exagérée/Plus d'enroulement"
PanoseValeurs("7-3-13")="Exagérée/Enroulement extrême"
;}
;{ Habillages               - Octet 7       - Famille 4
PanoseValeurs("7-4-2")="Aucun"
PanoseValeurs("7-4-3")="Ligne intérieure"
PanoseValeurs("7-4-4")="Ligne extérieure"
PanoseValeurs("7-4-5")="Gravé (Lignes multiples)"
PanoseValeurs("7-4-6")="Ombre"
PanoseValeurs("7-4-7")="Relief"
PanoseValeurs("7-4-8")="Toile de fond"
;}
;{ Médianes                 - Octet 8       - Famille 2
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_STANDARD_TRIMMED))="Standard/Coupé"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_STANDARD_POINTED))="Standard/Pointu"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_STANDARD_SERIFED))="Standard/Empâté"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_HIGH_TRIMMED))="Élevé/Coupé"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_HIGH_POINTED))="Élevé/Pointu"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_HIGH_SERIFED))="Élevé/Empâté"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_CONSTANT_TRIMMED))="Constante/Coupé"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_CONSTANT_POINTED))="Constante/Pointu"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_CONSTANT_SERIFED))="Constante/Empâté"
PanoseValeurs("8-v"+Str(#PAN_MIDLINE_LOW_TRIMMED))="Faible/Coupé"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_LOW_POINTED))="Faible/Pointu"
PanoseValeurs("8-2-"+Str(#PAN_MIDLINE_LOW_SERIFED))="Faible/Empâté"
;}
;{ Poinçons                 - Octet 8       - Famille 3
PanoseValeurs("8-3-2")="Aucun/Sans boucle"
PanoseValeurs("8-3-3")="Aucun/Boucles fermées"
PanoseValeurs("8-3-4")="Aucun/Boucles ouvertes"
PanoseValeurs("8-3-5")="Tranchants/Sans boucle"
PanoseValeurs("8-3-6")="Tranchants/Boucles fermées"
PanoseValeurs("8-3-7")="Tranchants/Boucles ouvertes"
PanoseValeurs("8-3-8")="Fuselés/Sans boucle"
PanoseValeurs("8-3-9")="Fuselés/Boucles fermées"
PanoseValeurs("8-3-10")="Fuselés/Boucles ouvertes"
PanoseValeurs("8-3-11")="Arrondis/Sans boucle"
PanoseValeurs("8-3-12")="Arrondis/Boucles fermées"
PanoseValeurs("8-3-13")="Arrondis/Boucles ouvertes"
;}
;{ Topologie                - Octet 8       - Famille 4
PanoseValeurs("8-4-2")="Standard"
PanoseValeurs("8-4-3")="Carré"
PanoseValeurs("8-4-4")="Segment multiple"
PanoseValeurs("8-4-5")="Art-Déco, ligne médiane"
PanoseValeurs("8-4-6")="Graisse inégale"
PanoseValeurs("8-4-7")="Fûts et traverses divers"
PanoseValeurs("8-4-8")="Formes diverses"
PanoseValeurs("8-4-9")="Formes lombardiques"
PanoseValeurs("8-4-10")="Majuscule en minusucle"
PanoseValeurs("8-4-11")="Topologie sous-entendue"
PanoseValeurs("8-4-12")="E et A en fer à cheval"
PanoseValeurs("8-4-13")="Écriture cursive"
PanoseValeurs("8-4-14")="Écriture gothique"
PanoseValeurs("8-4-15")="Lettres ornées multiples"
;}
;{ Hauteurs d'oeil          - Octet 9       - Famille 2
PanoseValeurs("9-2-"+Str(#PAN_XHEIGHT_CONSTANT_SMALL))="Constante/Petite"
PanoseValeurs("9-2-"+Str(#PAN_XHEIGHT_CONSTANT_STD))="Constante/Standard"
PanoseValeurs("9-2-"+Str(#PAN_XHEIGHT_CONSTANT_LARGE))="Constante/Grande"
PanoseValeurs("9-2-"+Str(#PAN_XHEIGHT_DUCKING_SMALL))="Plongeante/Petite"
PanoseValeurs("9-2-"+Str(#PAN_XHEIGHT_DUCKING_STD))="Plongeante/Standard"
PanoseValeurs("9-2-"+Str(#PAN_XHEIGHT_DUCKING_LARGE))="Plongeante/Grande"
;}
;{ Hauteurs bas de casse    - Octet 9       - Famille 3
PanoseValeurs("9-3-2")="Très basse"
PanoseValeurs("9-3-3")="Basse"
PanoseValeurs("9-3-4")="Moyenne"
PanoseValeurs("9-3-5")="Élevée"
PanoseValeurs("9-3-6")="Très élevée"
;}
;{ Gammes caractères        - Octet 9       - Famille 4
PanoseValeurs("9-4-2")="Collection étendue"
PanoseValeurs("9-4-3")="Litéraux"
PanoseValeurs("9-4-4")="Pas de minuscules"
PanoseValeurs("9-4-5")="Petites capitales"
;}
PanoseValeurs("255")="(Inconnu)"
;}
Global NewMap PlagesUnicode.s() ;{
PlagesUnicode("0")="Latin de base (U+0000-007F)"
PlagesUnicode("1")="Latin-1 Supplément (U+0080-00FF)"
PlagesUnicode("2")="Latin-A étendu (U+0100-017F)"
PlagesUnicode("3")="Latin-B étendu (U+0180-024F)"
PlagesUnicode("4")="Extensions IPA (U+0250-02AF)"
PlagesUnicode("4-4")=" + Latin - Supplément phonétique (U+1D00-1D7F) + Latin - Supplément phonétique étendu (U+1D80-1DBF)"
PlagesUnicode("5")="Lettres modificatrices avec chasse (U+02B0-02FF)"
PlagesUnicode("5-4")=" + Lettres modificatrices de ton (U+A700-A71F)"
PlagesUnicode("6")="Diacritiques (U+0300-036F)"
PlagesUnicode("6-4")=" + Diacritiques - Supplément (U+1DC0-1DFF)"
PlagesUnicode("7")="Grec et copte (U+0370-03FF)"
PlagesUnicode("8")="Copte (U+2C80-2CFF)"
PlagesUnicode("9")="Cyrillique (U+0400-04FF)"
PlagesUnicode("9-3")=" + Cyrillique - Supplément (U+0500-052F)"
PlagesUnicode("9-4")=" + Cyrillique étendu A (U+2DE0-2DFF) + Cyrillique étendu B (U+A640-A69F)"
PlagesUnicode("10")="Arménien (U+0530-058F)"
PlagesUnicode("11")="Hébreu (U+0590-05FF)"
PlagesUnicode("12")="Vai (U+A500-A63F)"
PlagesUnicode("13")="Arabe (U+0600-06FF)"
PlagesUnicode("13-4")=" + Arabe - Supplément (U+0750-077F)"
PlagesUnicode("14")="Nko (U+07C0-07FF)"
PlagesUnicode("15")="Dévanâgarî (U+0900-097F)"
PlagesUnicode("16")="Bengalî (U+0980-09FF)"
PlagesUnicode("17")="Gourmoukhî (U+0A00-0A7F)"
PlagesUnicode("18")="Goudjarâtî (U+0A80-0AFF)"
PlagesUnicode("19")="Oriya (U+0B00-0B7F)"
PlagesUnicode("20")="Tamoul (U+0B80-0BFF)"
PlagesUnicode("21")="Télougou (U+0C00-0C7F)"
PlagesUnicode("22")="Kannara (U+0C80-0CFF)"
PlagesUnicode("23")="Malayâlam (U+0D00-0D7F)"
PlagesUnicode("24")="Thaï (U+0E00-0E7F)"
PlagesUnicode("25")="Laotien (U+0E80-0EFF)"
PlagesUnicode("26")="Géorgien (U+10A0-10FF)"
PlagesUnicode("26-4")=" + Géorgien - Supplément (U+2D00-2D2F)"
PlagesUnicode("27")="Balinais (U+1B00-1B7F)"
PlagesUnicode("28")="Hangûl - Jamos (U+1100-11FF)"
PlagesUnicode("29")="Latin étendu supplément (U+1E00-1EFF)"
PlagesUnicode("29-4")=" + Latin étendu C (U+2C60-2C7F) + Latin étendu D (U+A720-A7FF)"
PlagesUnicode("30")="Grec étendu (U+1F00-1FFF)"
PlagesUnicode("31")="Ponctuation générale (U+2000-206F)"
PlagesUnicode("31-4")="Ponctuation - Supplément (U+2E00-2E7F)"
PlagesUnicode("32")="Exposants et indices (U+2070-209F)"
PlagesUnicode("33")="Symboles monétaires (U+20A0-20CF)"
PlagesUnicode("34")="Signes combinatoires pour symboles (U+20D0-20FF)"
PlagesUnicode("35")="Symboles alphabétiques (U+2100-214F)"
PlagesUnicode("36")="Formes numérales (U+2150-218F)"
PlagesUnicode("37")="Flèches (U+2190-21FF)"
PlagesUnicode("37-3")=" + Flèches - Supplément A (U+27F0-27FF) + Flèches - supplément B (U+2900-297F)"
PlagesUnicode("37-4")=" + Symboles et flèches divers (U+2B00-2BFF)"
PlagesUnicode("38")="Opérateurs mathématiques (U+2200-22FF)"
PlagesUnicode("38-3")=" + Symboles mathématiques divers (U+A27C0-27EF) + Symboles mathématiques divers B (U+2980-29FF) + Opérateurs mathématiques - supplément (U+2A00-2AFF)"
PlagesUnicode("39")="Signes techniques divers (U+2300-23FF)"
PlagesUnicode("40")="Pictogrammes de commande (U+2400-243F)"
PlagesUnicode("41")="Reconnaissance OCR (U+2440-245F)"
PlagesUnicode("42")="Alphanumériques cerclés (U+2460-24FF)"
PlagesUnicode("43")="Filets (U+2500-257F)"
PlagesUnicode("44")="Pavés (U+2580-259F)"
PlagesUnicode("45")="Formes géométriques (U+25A0-25FF)"
PlagesUnicode("46")="Symboles divers (U+2600-26FF)"
PlagesUnicode("47")="Casseaux (U+2700-27BF)"
PlagesUnicode("48")="Symboles et ponctuation CJC (U+3000-303F)"
PlagesUnicode("49")="Hiragana (U+3040-309F)"
PlagesUnicode("50")="Katakana (U+30A0-30FF)"
PlagesUnicode("50-3")=" + Katakana - Extension phonétique (U+31F0-31FF)"
PlagesUnicode("51")="Bopomofo (U+3100-312F)"
PlagesUnicode("51-2")=" + Bopomofo étendu (U+31A0-31BF)"
PlagesUnicode("52")="Hangûl ― Jamos de compatibilité (U+3130-318F)"
PlagesUnicode("53")="Phags-pa (U+A840-A87F)"
PlagesUnicode("54")="Lettres et mois CJC cerclés (U+3200-32FF)"
PlagesUnicode("55")="Sinogrammes (Compatibilité CJC) (U+3300-33FF)"
PlagesUnicode("56")="Hangûl ― Syllabes (U+AC00-D7AF)"
PlagesUnicode("57")="Plans multilingues complémentaires (U+10000-10FFFF)"
PlagesUnicode("58")="Phénicien (U+10900-1091F)"
PlagesUnicode("59")="Idéogrammes unifiés CJC (U+4E00-9FFF)"
PlagesUnicode("59-2")=" + Sinogrammes CJC - Supplément (U+2E80-2EFF) + Sinogrammes - Clés chinoises du Kangxi (U+2F00-2FDF) + Description idéographique (U+2FF0-2FFF) + Sinogrammes CJK extension A (U+3400-4D8F)"
PlagesUnicode("59-3")=" + Kanbun (U+3190-319F) + Sinogrammes unifiés CJC - Supplément B (U+20000-U+2A6DF)"
PlagesUnicode("60")="Zone à usage privé (U+E000-F8FF)"
PlagesUnicode("61")="Sinogrammes de compatibilité CJC (U+F900-FAFF)"
PlagesUnicode("61-3")=" + Sinogrammes de compatibilité CJC - Supplément (U+2F800-2FA1F)"
PlagesUnicode("61-4")=" + Sinogrammes & traits CJC (U+31C0-31EF)"
PlagesUnicode("62")="Formes de présentation alphabétiques (U+FB00-FB4F)"
PlagesUnicode("63")="Arabe (Formes de présentation A) (U+FB50-FDFF)"
PlagesUnicode("64")="Demi-signes combinatoires (U+FE20-FE2F)"
PlagesUnicode("65")="Sinogrammes & formes de compatibilité CJC (U+FE30-FE4F)"
PlagesUnicode("65-4")=" + Formes verticales (U+FE10-FE1F)"
PlagesUnicode("66")="Petites variantes de forme (U+FE50-FE6F)"
PlagesUnicode("67")="Arabe (Formes de présentation B) (U+FE70-FEFF)"
PlagesUnicode("68")="Formes de demi et pleine chasse (U+FF00-FFEF)"
PlagesUnicode("69")="Caractères spéciaux (U+FFF0-FFFF)"
PlagesUnicode("70")="Tibétain (U+0F00-0FFF)"
PlagesUnicode("71")="Syriaque (U+0700-074F)"
PlagesUnicode("72")="Thâna (U+0780-07BF)"
PlagesUnicode("73")="Singhalais (U+0D80-0DFF)"
PlagesUnicode("74")="Birman (U+1000-109F)"
PlagesUnicode("75")="Éthiopien (U+1200-137F)"
PlagesUnicode("75-4")=" + Éthiopien - Supplément (U+1380-139F) + Éthiopien étendu (U+2D80-2DDF)"
PlagesUnicode("76")="Chéroki (U+13A0-13FF)"
PlagesUnicode("77")="Syllabaires autochtones canadiens unifiés (U+1400-167F)"
PlagesUnicode("78")="Ogham (U+1680-169F)"
PlagesUnicode("79")="Runes (U+16A0-16FF)"
PlagesUnicode("80")="Khmer (U+1780-17FF)"
PlagesUnicode("80-4")=" + Khmer - Symboles (U+19E0-19FF)"
PlagesUnicode("81")="Mongol (U+1800-18AF)"
PlagesUnicode("82")="Combinaisons Braille (U+2800-28FF)"
PlagesUnicode("83")="Yi - Syllabaire (U+A000-A48F) + Yi - Radicaux (U+A490-A4CF)"
PlagesUnicode("84")="Tagalog (U+1700-171F) + Hanounóo (U+1720-173F) + Bouhide (U+1740-175F) + Tagbanoua (U+1760-177F)"
PlagesUnicode("85")="Alphabet italique (U+10300-1032F)"
PlagesUnicode("86")="Gothique (U+10330-1034F)"
PlagesUnicode("87")="Deseret (Mormon) (U+10400-1044F)"
PlagesUnicode("88")="Symboles musicaux byzantins (U+1D000-1D0FF) + Symboles musicaux (U+1D100-1D1FF)"
PlagesUnicode("88-4")=" + Notation musicale grecque ancienne (U+1D200-1D24F)"
PlagesUnicode("89")="Symboles mathématiques alphanumériques (U+1D400-1D7FF)"
PlagesUnicode("90")="Zone supplémentaire à usage privé A (U+F0000-FFFFD) et B (U+100000-10FFFD)"
PlagesUnicode("91")="Sélecteurs de variante (U+FE00-FE0F) + Sélecteurs de variante - Supplément (U+E0100-E01EF)"
PlagesUnicode("92")="Étiquettes (U+E0000-E007F)"
PlagesUnicode("93")="Limbou (U+1900-194F)"
PlagesUnicode("94")="Taï-le (U+1950-197F)"
PlagesUnicode("95")="Nouveau taï-lü (U+1980-19DF)"
PlagesUnicode("96")="Bugi (U+1A00-1A1F)"
PlagesUnicode("97")="Glagotique (U+2C00-2C5F)"
PlagesUnicode("98")="Tifinagh (U+2D30-2D7F)"
PlagesUnicode("99")="Hexagrammes Yi Jing (U+4DC0-4DFF)"
PlagesUnicode("100")="Sylotî nâgrî (U+A800-A82F)"
PlagesUnicode("101")="Syllabaire linéaire B (U+10000-1007F) + Idéogrammes linéaire B (U+10080-100FF) + Nombres égéens (U+10100-1013F)"
PlagesUnicode("102")="Nombres grecs anciens (U+10140-1018F)"
PlagesUnicode("103")="Ougaritique (U+10380-1039F)"
PlagesUnicode("104")="Cunéiforme perse (U+103A0-103FF)"
PlagesUnicode("105")="Shavien (U+10450-1047F)"
PlagesUnicode("106")="Osmanya (U+10480-104AF)"
PlagesUnicode("107")="Idéogrammes linéaire B (U+10080-100FF)"
PlagesUnicode("108")="Kharochthî (U+10A00-10A5F)"
PlagesUnicode("109")="Symboles Tai Xuan Jing (U+1D300-1D35F)"
PlagesUnicode("110")="Cunéiforme (U+12000-123FF) + Ponctuation et nombres cunéiformes (U+12400-1247F)"
PlagesUnicode("111")="Chiffres-bâtonnets chinois (U+1D360-1D37F)"
PlagesUnicode("112")="Soundanais (U+1B80-1BBF)"
PlagesUnicode("113")="Lepcha (U+1C00-1C4F)"
PlagesUnicode("114")="Ol tchiki (U+1C50-1C7F)"
PlagesUnicode("115")="Saurachtra (U+A880-A8DF)"
PlagesUnicode("116")="Kayah li (U+A900-A92F)"
PlagesUnicode("117")="Rejang (U+A930-A95F)"
PlagesUnicode("118")="Cham (U+AA00-AA5F)"
PlagesUnicode("119")="Symboles anciens (U+10190-101CF)"
PlagesUnicode("120")="Disque de Phaïstos (U+101D0-101FF)"
PlagesUnicode("121")="Lycien (U+10280-1029F) + Carien (U+102A0-102DF) + Lydien (U+10920-1093F)"
PlagesUnicode("122")="Pièces de mah-jong (U+1F000-1F02F) + Dominos (U+1F030-1F09F)"
;}
;}
;{ ════  VARIABLES GLOBALES       ════
;- ════  VARIABLES GLOBALES       ════
Global.a ProcIntel
;}
Dernière modification par boddhi le sam. 30/mars/2024 9:51, modifié 2 fois.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Lecture de données informationnelles Polices/Fontes OTF & TTF

Message par boddhi »

Partie 3/3 : Procédures

Code : Tout sélectionner

;-══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
; ╔════════════╗
; ║ PROCEDURES ║
; ╚════════════╝
;- ════ PROCEDURES                ════
Procedure.a Fc_Test_Processeur() ; 
  Protected.w Valeur ; => Typage obligatoire sur 2 octets

  Valeur=1
  If PeekB(@Valeur)=Valeur:ProcedureReturn #True:EndIf
EndProcedure
Procedure.u Fc_Alignement_WORD(ArgValeur.q,ArgAlignement.l,ArgProcIntel.a) ; Inverse l'alignement d'un Word selon le type de processeur
  If (ArgAlignement=#ALIGT_INTEL And Not ArgProcIntel) Or (ArgAlignement=#ALIGT_MOTOROLA And ArgProcIntel)
    ArgValeur=(ArgValeur&#ALIGT_BYTE)<<8+(ArgValeur>>8)&#ALIGT_BYTE
  EndIf
  ProcedureReturn ArgValeur
EndProcedure
Procedure.q Fc_Alignement_LONG(ArgValeur.q,ArgAlignement.l,ArgProcIntel.a) ; Inverse l'alignement d'un Long selon le type de processeur

  If (ArgAlignement=#ALIGT_INTEL And Not ArgProcIntel) Or (ArgAlignement=#ALIGT_MOTOROLA And ArgProcIntel)
    ArgValeur=(ArgValeur&#ALIGT_BYTE)<<24+((ArgValeur>>8)&#ALIGT_BYTE)<<16+((ArgValeur>>16)&#ALIGT_BYTE)<<8+(ArgValeur>>24)&#ALIGT_BYTE
  EndIf
  ProcedureReturn ArgValeur
EndProcedure
Procedure.q Fc_Alignement_QUAD(ArgValeur.q,ArgAlignement.l,ArgProcIntel.a) ; Inverse l'alignement d'un Quad selon le type de processeur
  Debug #PB_Compiler_Procedure+" (Valeur="+Str(ArgValeur)+" Alignement="+Str(ArgAlignement)+" ProcIntel="+Str(ArgProcIntel)+")",10
  If (ArgAlignement=#ALIGT_INTEL And Not ArgProcIntel) Or (ArgAlignement=#ALIGT_MOTOROLA And ArgProcIntel)
    ArgValeur=(ArgValeur&#ALIGT_BYTE)<<56+((ArgValeur>>8)&#ALIGT_BYTE)<<48+((ArgValeur>>16)&#ALIGT_BYTE)<<40+((ArgValeur>>24)&#ALIGT_BYTE)<<32+((ArgValeur>>32)&#ALIGT_BYTE)<<24+((ArgValeur>>40)&#ALIGT_BYTE)<<16+((ArgValeur>>48)&#ALIGT_BYTE)<<8+(ArgValeur>>56)&#ALIGT_BYTE
  EndIf
  ProcedureReturn ArgValeur
EndProcedure
;
Procedure.s Fc_Recuperation_ChaineMemoire(*ArgDonnee,ArgTaille.u)
  Protected.u Compteur
  Protected.u Valeur
  Protected.s Chaine
  
  ArgTaille-2
  For Compteur=0 To ArgTaille Step 2
    Valeur=PeekW(*ArgDonnee+Compteur)
    Valeur=(Valeur&$FF)<<8+(Valeur>>8)&$FF
    If Valeur>=$D800 And Valeur<=$DFFF:Valeur=63:EndIf
    Chaine+Chr(Valeur)
  Next
  ProcedureReturn Chaine
EndProcedure
Procedure.s Pc_Interpretation_DonneesStyle(ArgStyle.u)
  Protected.s ValeurRetour
  
  If ArgStyle>>6&1:ValeurRetour=" Normal":EndIf
  If ArgStyle>>3&1:ValeurRetour+" Contour":EndIf
  If ArgStyle>>9&1:ValeurRetour+" Oblique":EndIf
  If ArgStyle&1:ValeurRetour+" Italique":EndIf
  If ArgStyle>>1&1:ValeurRetour+" Souligné":EndIf
  If ArgStyle>>2&1:ValeurRetour+" Négatif":EndIf
  If ArgStyle>>4&1:ValeurRetour+" Barré":EndIf
  If ArgStyle>>5&1:ValeurRetour+" Gras":EndIf
  ProcedureReturn LTrim(ValeurRetour)
EndProcedure
Procedure.s Fc_Recuperation_IntitulePanose(ArgNoFamille.a,ArgNoOctet.a)
  Protected.s Chaine=Str(ArgNoFamille)+"-"+Str(ArgNoOctet)
  
  If FindMapElement(PanoseIntitules(),Chaine)
    Chaine=PanoseIntitules(Chaine)
  Else
    Chaine=PanoseIntitules("255")+" "+Str(ArgNoOctet)
  EndIf
  ProcedureReturn Chaine
EndProcedure
Procedure.s Fc_Interpretation_DonneesPanose(ArgNoFamille.a,ArgNoOctet.a,ArgValeur.q)
  Protected.s Cle,Chaine
  
  Select ArgValeur
    Case 0,1:Chaine=PanoseValeurs("0-"+Str(ArgValeur)+"-0")
    Default
      Select ArgNoOctet
        ; IMPORTANT : Le cas 5 doit absoulement être traité en premier à cause de la valeur 8 de la famille 4
        Case 5
          Select ArgNoFamille
            Case 3:ArgNoFamille=2:ArgNoOctet=4
            Case 4:If ArgValeur<>8:ArgNoFamille=2:ArgNoOctet=1:EndIf
          EndSelect
        Case 0:ArgValeur=0
        Case 2:ArgNoFamille=2
          Case 3:If ArgNoFamille=5:ArgNoFamille=3:EndIf
        Case 4
          Select ArgNoFamille
            Case 4:ArgNoFamille=2
            Case 5:ArgNoFamille=3
          EndSelect
        Case 6 To 9:If ArgNoFamille=5:ArgNoOctet=5:EndIf
      EndSelect
      Cle=Str(ArgNoOctet)+"-"+Str(ArgNoFamille)+"-"+Str(ArgValeur)
      If FindMapElement(PanoseValeurs(),Cle)
        Chaine=PanoseValeurs(Cle)
      Else
        Chaine=Str(ArgValeur)+" "+PanoseValeurs("255")
      EndIf
  EndSelect
  ProcedureReturn Chaine
EndProcedure
Procedure   Pc_Traduction_PlagesUnicode(ArgNoIndice.a,ArgValeur.q,ArgNoVersionOS2.a,Map ArgPlagesUnicode.s())
  Protected.a DebutIndice=ArgNoIndice*32,NoBit,ValeurBit.a,Compteur
  Protected.s LibellePlage
  
  For Compteur=0 To 31
    ValeurBit=ArgValeur>>Compteur&1
    If ValeurBit
      NoBit=DebutIndice+Compteur
      LibellePlage=PlagesUnicode(Str(NoBit))
      Select NoBit ; Ajouts Version 2 OS/2
        Case 51,59
          Select ArgNoVersionOS2
            Case 2 To 4:LibellePlage=LibellePlage+PlagesUnicode(Str(NoBit)+"-2")
          EndSelect
      EndSelect
      Select NoBit ; Ajouts Version 3 OS/2
        Case 9,37 To 38,50,59,61
          Select ArgNoVersionOS2
            Case 3 To 4:LibellePlage=LibellePlage+PlagesUnicode(Str(NoBit)+"-3")
          EndSelect
      EndSelect
      Select NoBit ; Ajouts Version 4 OS/2
        Case 4 To 6,9,13,26,29,37,61,65,75,80,88
          Select ArgNoVersionOS2
            Case 4:LibellePlage=LibellePlage+PlagesUnicode(Str(NoBit)+"-4")
          EndSelect
      EndSelect
      ArgPlagesUnicode(Str(NoBit))=LibellePlage
    EndIf
  Next
EndProcedure
Procedure.b Fc_Lecture_DonneesTablesPolice(ArgNoFichier.a,*ArgDonneesTables.DONNEESTABLES)
  ; Retour -1 = Fin anormale - 0 = Poursuite analyse - 1 = Fin normale
  Protected *BlocInfosTable,*BlocDonneesTable,*Donnee
  Protected.DESCRIPTEURTABLE DescripteurTable
  Protected.ENTETEBLOCTABLENAME EnteteBlocTableName
  Protected.DESCRIPTEURTABLENAME DonneesTableName
  Protected.DONNEESTABLEOS2 DonneesTableOS2
  Protected.q TailleBlocDescripteursTable,TailleBlocDonneesTable,AdresseDonnee
  Protected.q PosCourante,PosBlocDescripteursTable,PosBlocDonneesTable ; Variables utilisées pour Debug
  Protected.a PoursuiteAnalyse,CopieDonnee,Compteur
  Protected.a NomFamilleOK,NomSsFamilleOK
  Protected.b FinAnalyse=#False
  Protected.s NomTable
  Protected NewMap ChampsTable.a() ; 0=Vide 1=Anglais 2=Langue choisie 3=Autre
  Protected NewMap PositionsListe.a()
  
  If Not ReadData(ArgNoFichier,@DescripteurTable,16)=16:ProcedureReturn -1:EndIf
  With DescripteurTable
    ; Lecture Index tables police
    \SommeControle=Fc_Alignement_LONG(\SommeControle,#ALIGT_MOTOROLA,ProcIntel)
    \Decalage=Fc_Alignement_LONG(\Decalage,#ALIGT_MOTOROLA,ProcIntel)
    \Taille=Fc_Alignement_LONG(\Taille,#ALIGT_MOTOROLA,ProcIntel)
    NomTable=PeekS(@\NomTable,4,#PB_Ascii)
    PosBlocDescripteursTable=\Decalage
    Debug "    Nom table : "+NomTable,5
    Debug "      Somme contrôle : "+\SommeControle,5
    Debug "      Décalage (Position bloc table) : "+\Decalage+" ($"+Hex(\Decalage)+")",5
    Debug "      Taille table : "+DescripteurTable\taille,5
  EndWith
  Select NomTable
    Case "fvar"
      *ArgDonneesTables\Variable=#True
    Case "head"
      PosCourante=Loc(ArgNoFichier)
      FileSeek(ArgNoFichier,DescripteurTable\Decalage+4)
      With *ArgDonneesTables
        \Revision=ValF(Str(Fc_Alignement_WORD(ReadWord(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel))+"."+RSet(Str(Fc_Alignement_WORD(ReadWord(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)),3,"0"))
        FileSeek(ArgNoFichier,12,#PB_Relative)
        \DateCreat=Fc_Alignement_QUAD(ReadQuad(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)-2082844800
        \DateModif=Fc_Alignement_QUAD(ReadQuad(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)-2082844800
        FileSeek(ArgNoFichier,14,#PB_Relative)
        \LongDecalage=Fc_Alignement_WORD(ReadWord(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)
        Debug "      Revision : "+StrF(\Revision,3),5
        Debug "      Date de création : "+FormatDate(#FORMAT_DATE,\DateCreat),5
        Debug "      Date de modification : "+FormatDate(#FORMAT_DATE,\DateModif),5
        Debug "      Décalages longs : "+\LongDecalage,5
      EndWith
      FileSeek(ArgNoFichier,PosCourante) ;}
    Case "maxp"
      PosCourante=Loc(ArgNoFichier)
      FileSeek(ArgNoFichier,DescripteurTable\Decalage+4)
      *ArgDonneesTables\NbGlyphes=Fc_Alignement_WORD(ReadWord(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)
      Debug "      Nb glyphes : "+*ArgDonneesTables\NbGlyphes,5
      FileSeek(ArgNoFichier,PosCourante)
    Case "post"
      PosCourante=Loc(ArgNoFichier)
      FileSeek(ArgNoFichier,DescripteurTable\Decalage+12)
      *ArgDonneesTables\Proportionnelle=Bool(Fc_Alignement_LONG(ReadLong(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)<>0)
      Debug "      Fonte proportionnelle : "+*ArgDonneesTables\Proportionnelle,5
      FileSeek(ArgNoFichier,PosCourante)
    Case "hhea"
      PosCourante=Loc(ArgNoFichier)
      FileSeek(ArgNoFichier,DescripteurTable\Decalage+32)
      *ArgDonneesTables\Fixe=Bool(Fc_Alignement_WORD(ReadLong(ArgNoFichier),#ALIGT_MOTOROLA,ProcIntel)=3)
      Debug "      Fonte fixe : "+*ArgDonneesTables\Fixe,5
      FileSeek(ArgNoFichier,PosCourante)
    Case "OS/2"
      PosCourante=Loc(ArgNoFichier)
      FileSeek(ArgNoFichier,DescripteurTable\Decalage)
      *BlocDonneesTable=AllocateMemory(DescripteurTable\Taille)
      If *BlocDonneesTable
        If ReadData(ArgNoFichier,*BlocDonneesTable,DescripteurTable\Taille)=DescripteurTable\Taille
          EnteteBlocTableName\Version=Fc_Alignement_WORD(PeekW(*BlocDonneesTable),#ALIGT_MOTOROLA,ProcIntel)
          With *ArgDonneesTables\DonneesTableOS2
            \Version=EnteteBlocTableName\Version
            For Compteur=0 To 9
              \Panose[Compteur]=PeekB(*BlocDonneesTable+32+Compteur)&$FF
            Next
            For Compteur=0 To 3
              \Unicode[Compteur]=Fc_Alignement_LONG(PeekL(*BlocDonneesTable+42+(Compteur*4)),#ALIGT_MOTOROLA,ProcIntel)
            Next
            \Graisse=Fc_Alignement_WORD(PeekW(*BlocDonneesTable+4),#ALIGT_MOTOROLA,ProcIntel)
            \Chasse=Fc_Alignement_WORD(PeekW(*BlocDonneesTable+6),#ALIGT_MOTOROLA,ProcIntel)
            \IDVendeur=PeekS(*BlocDonneesTable+58,4,#PB_Ascii)
            \Style=Fc_Alignement_WORD(PeekW(*BlocDonneesTable+62),#ALIGT_MOTOROLA,ProcIntel)
            Debug "      Version : "+EnteteBlocTableName\Version,5
            Debug "        Graisse : "+\Graisse+" ("+Graisses(Str(\Graisse))+")",5
            Debug "        Chasse : "+\Chasse+" ("+Chasses(Str(\Chasse))+")",5
            Debug "        ID Vendeur : "+\IDVendeur,5
            For Compteur=0 To 9
              Debug "        Panose octet n° "+Compteur+" : "+\Panose[Compteur]+" ("+Fc_Recuperation_IntitulePanose(\Panose[0],Compteur)+" : "+Fc_Interpretation_DonneesPanose(\Panose[0],Compteur,\Panose[Compteur])+")",5
            Next
            Debug "        Plages 1 unicode : $"+RSet(Hex(\Unicode[0]),8,"0")+" "+RSet(Bin(\Unicode[0]),32,"0"),5
            Debug "        Plages 2 unicode : $"+RSet(Hex(\Unicode[1]),8,"0")+" "+RSet(Bin(\Unicode[1]),32,"0"),5
            Debug "        Plages 3 unicode : $"+RSet(Hex(\Unicode[2]),8,"0")+" "+RSet(Bin(\Unicode[2]),32,"0"),5
            Debug "        Plages 4 unicode : $"+RSet(Hex(\Unicode[3]),8,"0")+" "+RSet(Bin(\Unicode[3]),32,"0"),5
            Debug "        Style : "+\Style+" "+Pc_Interpretation_DonneesStyle(\Style),5
          EndWith
        EndIf
        FreeMemory(*BlocDonneesTable)
      EndIf
      FileSeek(ArgNoFichier,PosCourante)
    Case "name"
      FileSeek(ArgNoFichier,DescripteurTable\Decalage)
      If ReadData(ArgNoFichier,@EnteteBlocTableName,6)=6
        With EnteteBlocTableName
          ; Lecture Descripteurs table
          \Version=Fc_Alignement_WORD(\Version,#ALIGT_MOTOROLA,ProcIntel)
          \NbDonnees=Fc_Alignement_WORD(\NbDonnees,#ALIGT_MOTOROLA,ProcIntel)
          \Offset=Fc_Alignement_WORD(\Offset,#ALIGT_MOTOROLA,ProcIntel)
          TailleBlocDescripteursTable=\NbDonnees*12
          TailleBlocDonneesTable=DescripteurTable\Taille-\Offset
          PosBlocDonneesTable=DescripteurTable\Decalage+\Offset
          Debug "      Version : "+\Version,5
          Debug "      Nb données : "+\NbDonnees,5
          Debug "      Décalage position donnée : "+\Offset,5
          Debug "      Position bloc table : "+Str(DescripteurTable\Decalage)+" ($"+Hex(DescripteurTable\Decalage)+")",5
          Debug "      Position bloc données : "+Str(DescripteurTable\Decalage+\Offset)+" ($"+Hex(DescripteurTable\Decalage+\Offset)+")",5
          Debug "      Taille bloc descripteurs : "+TailleBlocDescripteursTable,5
          Debug "      Taille bloc données : "+TailleBlocDonneesTable,5
          ;If \Version=1:CallDebugger:EndIf
        EndWith
        *BlocInfosTable=AllocateMemory(TailleBlocDescripteursTable)
        If *BlocInfosTable
          ; Récupération Bloc Descripteurs données
          If ReadData(ArgNoFichier,*BlocInfosTable,TailleBlocDescripteursTable)=TailleBlocDescripteursTable
            *BlocDonneesTable=AllocateMemory(TailleBlocDonneesTable)
            If *BlocDonneesTable
              ; Récupération Bloc données
              PoursuiteAnalyse=Bool(ReadData(ArgNoFichier,*BlocDonneesTable,TailleBlocDonneesTable)=TailleBlocDonneesTable)
            EndIf
          EndIf
        EndIf
        If PoursuiteAnalyse
          EnteteBlocTableName\NbDonnees-1
          For Compteur=0 To EnteteBlocTableName\NbDonnees
            Debug "      Descripteur donnée table n° "+Str(Compteur+1),5
            Debug "        Position descripteur : "+Str(PosBlocDescripteursTable+6+(Compteur*12))+" ($"+Hex(PosBlocDescripteursTable+6+(Compteur*12))+")",5 ; Ajouté
            ResetStructure(@DonneesTableName,DESCRIPTEURTABLENAME)
            With DonneesTableName
              \IDPlateforme=Fc_Alignement_WORD(PeekW(*BlocInfosTable),#ALIGT_MOTOROLA,ProcIntel)
              \IDEncodage=Fc_Alignement_WORD(PeekW(*BlocInfosTable+2),#ALIGT_MOTOROLA,ProcIntel)
              \IDLangue=Fc_Alignement_WORD(PeekW(*BlocInfosTable+4),#ALIGT_MOTOROLA,ProcIntel)
              \IDNom=Fc_Alignement_WORD(PeekW(*BlocInfosTable+6),#ALIGT_MOTOROLA,ProcIntel)
              \Taille=Fc_Alignement_WORD(PeekW(*BlocInfosTable+8),#ALIGT_MOTOROLA,ProcIntel)
              \Offset=Fc_Alignement_WORD(PeekW(*BlocInfosTable+10),#ALIGT_MOTOROLA,ProcIntel)
              Debug "        IDPlateforme : "+\IDPlateforme+" = "+Plateformes(\IDPlateforme),5
              Select \IDPlateforme
                Case 0
                  Debug "        IDEncodage : "+\IDEncodage+" = "+Encodages(\IDEncodage),5
                  Debug "        IDLangue : "+\IDLangue+" = Défaut",5
                Case 1
                  Debug "        IDEncodage : "+\IDEncodage+" = "+EncodagesMAC(\IDEncodage),5
                  Debug "        IDLangue : "+\IDLangue+" = "+LanguesMAC(\IDLangue),5
                Case 3
                  Debug "        IDEncodage : "+\IDEncodage+" = "+EncodagesWIN(\IDEncodage),5
                  Debug "        IDLangue : "+\IDLangue+" = "+LanguesWIN(Str(\IDLangue)),5
              EndSelect
              If \IDNom<=25
                Debug "        IDNom : "+\IDNom+" = "+NomsID(Str(\IDNom)),5
              Else
                Debug "        IDNom : "+\IDNom+" = Personnalisé",5
              EndIf
              Debug "        Taille : "+Str(\Taille),5
              Debug "        Offset : "+\Offset,5
              Debug "        Position donnée : "+Str(PosBlocDonneesTable+\Offset)+" ($"+Hex(PosBlocDonneesTable+\Offset)+")",5
              AdresseDonnee=*BlocDonneesTable+\Offset
              If AdresseDonnee+\Taille<=*BlocDonneesTable+TailleBlocDonneesTable
                If \Taille>0
                  Select \IDPlateforme
                    Case 1
                      Select \IDEncodage
                        Case 0:\Donnee=PeekS(AdresseDonnee,\Taille,#PB_Ascii)
                        Default:\Donnee="Cas non prévu (Possiblement existant ?)"
                      EndSelect
                    Case 0,3
                      CompilerSelect #PB_Compiler_OS
                        CompilerCase #PB_OS_Windows
                          *Donnee=AllocateMemory(\Taille/2)
                          If *Donnee
                            \Donnee=Fc_Recuperation_ChaineMemoire(AdresseDonnee,\Taille)
                            FreeMemory(*Donnee)
                          EndIf
                        CompilerDefault
                          *Donnee=AllocateMemory(\Taille)
                          If *Donnee
                            \Donnee=Pc_Recuperation_ChaineMemoire(AdresseDonnee,\Taille)
                            FreeMemory(*Donnee)
                          EndIf
                      CompilerEndSelect
                  EndSelect
                EndIf
              Else
                \Donnee="Donnée corrompue"
              EndIf
              Debug "        Donnée : "+\Donnee,5
              CopieDonnee=#False
              If Not FindMapElement(ChampsTable(),Str(\IDNom))
                Select \IDLangue
                  Case $409:CopieDonnee=1
                  Case #LANGUE:CopieDonnee=2
                  Default:CopieDonnee=3
                EndSelect
                ChampsTable(Str(\IDNom))=CopieDonnee:CopieDonnee=#True
                LastElement(*ArgDonneesTables\DonneesTableName())   ; Ajouté
                AddElement(*ArgDonneesTables\DonneesTableName())
                PositionsListe(Str(\IDNom))=ListIndex(*ArgDonneesTables\DonneesTableName())
                Debug "        Ajout donnée : Item liste n° "+PositionsListe(Str(\IDNom)),5
              ElseIf \IDLangue=#LANGUE
                CopieDonnee=#True:ChampsTable(Str(\IDNom))=2:SelectElement(*ArgDonneesTables\DonneesTableName(),PositionsListe(Str(\IDNom)))
                Debug "        Modification donnée : Item liste n° "+PositionsListe(Str(\IDNom)),5
              ElseIf \IDLangue=$409 And ChampsTable(Str(\IDNom))<>2
                CopieDonnee=#True:ChampsTable(Str(\IDNom))=1:SelectElement(*ArgDonneesTables\DonneesTableName(),PositionsListe(Str(\IDNom)))
                Debug "        Modification donnée : Item liste n° "+PositionsListe(Str(\IDNom)),5
              EndIf
              If CopieDonnee
                *ArgDonneesTables\DonneesTableName()=DonneesTableName
              EndIf
            EndWith
            *BlocInfosTable+12
            TailleBlocDescripteursTable-12
          Next
          If TailleBlocDescripteursTable:FreeMemory(*BlocInfosTable):EndIf
          If *BlocDonneesTable:FreeMemory(*BlocDonneesTable):EndIf
        Else
          FinAnalyse=-1
        EndIf
      EndIf
      FinAnalyse=#True
    Default
  EndSelect
  ProcedureReturn FinAnalyse
EndProcedure
;
Procedure   Pc_Lecture_DonneesPolice(ArgFichier.s)
  Protected.DONNEESTABLES DonneesTables
  Protected.DONNEESPOLICE DonneesPolice
  Protected.l Entete
  Protected.ENTETETTC EnteteTTC
  Protected.a NbFontes,NbTables,CompteurFontes,Compteur
  Protected.b FinAnalyse
  
  Debug "Fichier : "+GetFilePart(ArgFichier),3
  If ReadFile(#FIC_POLICE,ArgFichier,#PB_File_SharedRead|#PB_Unicode)
    Entete=Fc_Alignement_LONG(ReadLong(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)
    Select Entete
      Case $00010000:Debug "  OpenType",5
      Case $4F54544F:Debug "  OpenType avec données CFF",5
      Case $74746366:Debug "  Collection TrueType",5
      Default:Debug "  Fonte non reconnue !!!",4:ProcedureReturn
    EndSelect
    If Entete=$74746366
      With EnteteTTC
        \VersionMaj=Fc_Alignement_WORD(ReadWord(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)
        \VersionMin=Fc_Alignement_WORD(ReadWord(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)
        \NbFontes=Fc_Alignement_LONG(ReadLong(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)
        Dim \DecalagesBlocsFontes(\NbFontes)
        Debug "  Version maj. : "+\VersionMaj,5
        Debug "  Version min. : "+\VersionMin,5
        Debug "  Nb fontes : "+Str(\NbFontes),5
        NbFontes=\NbFontes-1
        For Compteur=0 To NbFontes
          \DecalagesBlocsFontes(Compteur)=Fc_Alignement_LONG(ReadLong(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)
          Debug "  Décalage en-tête fonte "+Str(Compteur+1)+" : ",5
          Debug "  Position en-tête bloc fonte : "+\DecalagesBlocsFontes(Compteur)+" ($"+Hex(\DecalagesBlocsFontes(Compteur))+")",5
        Next
        NbFontes+1
        If \VersionMaj=2
          CompilerIf #PB_Compiler_IsMainFile
          If Fc_Alignement_LONG(ReadLong(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)=$44534947
            Debug "  Signature numérique présente",5
          EndIf
          CompilerEndIf
          FileSeek(#FIC_POLICE,12,#PB_Relative)
        EndIf
      EndWith
    Else
      NbFontes=1
    EndIf
    For CompteurFontes=1 To NbFontes
      CompilerIf #PB_Compiler_IsMainFile
      ResetStructure(@DonneesPolice,DONNEESPOLICE)
      CompilerElse
      ResetStructure(*ArgDonnees,DONNEESPOLICE)
      CompilerEndIf
      If EnteteTTC\NbFontes>0
        Debug "  ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅",5
        Debug "  Fonte n° "+CompteurFontes+" : ",4
      EndIf
      NbTables=Fc_Alignement_WORD(ReadWord(#FIC_POLICE),#ALIGT_MOTOROLA,ProcIntel)
      Debug "  NbTables : "+NbTables,5
      FileSeek(#FIC_POLICE,6,#PB_Relative)
      For Compteur=1 To NbTables
        FinAnalyse=Fc_Lecture_DonneesTablesPolice(#FIC_POLICE,@DonneesTables)
        If FinAnalyse<>#False:Break:EndIf
      Next
      Debug "  ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅",5
      If FinAnalyse=#True
        With DonneesPolice
          ForEach DonneesTables\DonneesTableName()
            If Trim(DonneesTables\DonneesTableName()\Donnee)<>""
              Select DonneesTables\DonneesTableName()\IDNom
                Case 0:\Copyright=DonneesTables\DonneesTableName()\Donnee
                Case 1:\Famille=DonneesTables\DonneesTableName()\Donnee
                Case 2:\SousFamille=DonneesTables\DonneesTableName()\Donnee
                Case 3:\Identifiant=DonneesTables\DonneesTableName()\Donnee
                Case 4:\FamilleComplet=DonneesTables\DonneesTableName()\Donnee
                Case 5:\Version=DonneesTables\DonneesTableName()\Donnee
                Case 6:\NomPostScript=DonneesTables\DonneesTableName()\Donnee
                Case 7:\MarqueDeposee=DonneesTables\DonneesTableName()\Donnee
                Case 8:\Vendeur=DonneesTables\DonneesTableName()\Donnee
                Case 9:\Createur=DonneesTables\DonneesTableName()\Donnee
                Case 10:\Description=DonneesTables\DonneesTableName()\Donnee
                Case 11:\URLVendeur=DonneesTables\DonneesTableName()\Donnee
                Case 12:\URLCreateur=DonneesTables\DonneesTableName()\Donnee
                Case 13:\Licence=DonneesTables\DonneesTableName()\Donnee
                Case 14:\URLLicence=DonneesTables\DonneesTableName()\Donnee
               ;Case 15;Réservé
                Case 16:\FamilleTypo=DonneesTables\DonneesTableName()\Donnee
                Case 17:\SousFamilleTypo=DonneesTables\DonneesTableName()\Donnee
                Case 18:\Compatibilite=DonneesTables\DonneesTableName()\Donnee
                Case 19:\ExampleTexte=DonneesTables\DonneesTableName()\Donnee
                Case 20:\CIDPostScript=DonneesTables\DonneesTableName()\Donnee
                Case 21:\FamilleWWS=DonneesTables\DonneesTableName()\Donnee
                Case 22:\SousFamilleWWS=DonneesTables\DonneesTableName()\Donnee
                Case 23:\PaletteClaire=DonneesTables\DonneesTableName()\Donnee
                Case 24:\PaletteSombre=DonneesTables\DonneesTableName()\Donnee
                Case 25:\PrefixePostScript=DonneesTables\DonneesTableName()\Donnee
              EndSelect
              If DonneesTables\DonneesTableName()\IDNom<=25
                Debug "    "+NomsID(Str(DonneesTables\DonneesTableName()\IDNom))+" : "+DonneesTables\DonneesTableName()\Donnee,4
              EndIf
            EndIf
          Next
          \Revision=DonneesTables\Revision
          \DateCreat=DonneesTables\DateCreat
          \DateModif=DonneesTables\DateModif
          \Variable=DonneesTables\Variable
          \Proportionnelle=DonneesTables\Proportionnelle
          \Fixe=DonneesTables\Fixe
          \NbGlyphes=DonneesTables\NbGlyphes
          \Graisse=DonneesTables\DonneesTableOS2\Graisse
          \GraisseInt=Graisses(Str(\Graisse))
          \Chasse=DonneesTables\DonneesTableOS2\Chasse
          \ChasseInt=Chasses(Str(\Chasse))
          \IDVendeur=DonneesTables\DonneesTableOS2\IDVendeur
          \Style=DonneesTables\DonneesTableOS2\Style
          If \Style:\StyleInt=Pc_Interpretation_DonneesStyle(\Style):EndIf
          Debug "    Revision : "+StrF(\Revision,3),4
          Debug "    Date UTC de création : "+FormatDate(#FORMAT_DATE,\DateCreat),4
          Debug "    Date UTC de modification : "+FormatDate(#FORMAT_DATE,\DateModif),4
          Debug "    Proportionnelle : "+\Proportionnelle,4
          Debug "    Fixe : "+\Fixe,4
          Debug "    Variable : "+\Variable,4
          Debug "    Graisse : "+\GraisseInt,4
          Debug "    Chasse : "+\ChasseInt,4
          Debug "    Style : "+\StyleInt,4
          Debug "    ID vendeur : "+\IDVendeur,4
          Debug "    Données Panose :",4
          For Compteur=0 To 9
            \Panose[Compteur]=DonneesTables\DonneesTableOS2\Panose[Compteur]
            \PanoseInt[Compteur]=Fc_Recuperation_IntitulePanose(\Panose[0],Compteur)+" : "+Fc_Interpretation_DonneesPanose(\Panose[0],Compteur,\Panose[Compteur])
            Debug "        "+\PanoseInt[Compteur],4
          Next
          Debug "    Nb glyphes : "+\NbGlyphes,4
          Debug "    Plages Unicode :",4
          For Compteur=0 To 3
            Pc_Traduction_PlagesUnicode(Compteur,DonneesTables\DonneesTableOS2\Unicode[Compteur],DonneesTables\DonneesTableOS2\Version,\PlagesUnicodeInt())
          Next
          For Compteur=0 To 122
            If FindMapElement(\PlagesUnicodeInt(),Str(Compteur))
              Debug "      "+\PlagesUnicodeInt(Str(Compteur)),4
            EndIf
          Next
          Debug "  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",4
        EndWith
        If CompteurFontes<>NbFontes
          FileSeek(#FIC_POLICE,EnteteTTC\DecalagesBlocsFontes(CompteurFontes)+4)
        EndIf
      EndIf
      If FinAnalyse<>#True
        Break
      EndIf
    Next
    Debug "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",3
  Else
    Debug "  Erreur ouverture fichier : "+ArgFichier;,3
  EndIf
EndProcedure
;-══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
; ╔═════════╗
; ║ EXEMPLE ║
; ╚═════════╝
;- ════ EXEMPLE                   ════
#FICHIERPOLICE=""
CompilerIf #FICHIERPOLICE=""
  MessageRequester("","La constante #FICHIERPOLICE doit être saisie !",#PB_MessageRequester_Error)
CompilerEndIf
;
ProcIntel=Fc_Test_Processeur()
Pc_Lecture_DonneesPolice(#FICHIERPOLICE)
Dernière modification par boddhi le jeu. 28/mars/2024 17:31, modifié 2 fois.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par boddhi »

Modification du code de la partie 3/3 visant à prévenir une erreur mémoire survenant dans le cas assez rare (une 20aine sur plus de 150 000 fontes testées !) où la fonte a été mal compilée (mauvaises compilations originelles confirmées par des logiciels comme FontForge par exemple).
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par boddhi »

Nouvelle modification de la partie 3/3 : Petite correction du code pour un cas (très rare encore) non prévu.

PS : D'avance désolé de ne pas pondre un code totalement fonctionnel dès le départ et gérant tous les cas possibles.
Je suis hélas, au gré de mes tests, confronté à des fontes, souvent (très) anciennes - certaines datant de plus de 30 ans - qui ne sont pas toujours compilées correctement, c. à d. respectant les nomenclatures actuelles.
J'atteins aujourd'hui pas loin de 170 000 fichiers de fontes testés et il me devient parfois difficile de repérer une toute petite anomalie qui n'a pas de réelle conséquence remarquable sur l'exécution du code.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par SPH »

Merci Boddhi, cela m'interesse. Je testerais ça bientôt ! 🥰

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par boddhi »

Salut SPH,
SPH a écrit : mar. 12/mars/2024 16:28 Merci Boddhi, cela m'interesse. Je testerais ça bientôt ! 🥰
N'hésite pas à me faire un retour si tu détectes des erreurs lors de tes tests :wink:
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par boddhi »

Modification du code, posté ici, permettant de générer une image graphique d'une fonte.

Dans certains cas très rare, TextWidth() renvoie des valeurs hallucinantes. J'ai le cas d'une fonte pour laquelle TextWidth() calcule, pour 18 caractères, une valeur de 55720 pixels ( ! 8O) générant dès lors une erreur lorsque ce résultat dépasse 32 000, limite fixée pour la création d'une image.

Je n'ai pas poussé les investigations plus avant sur ce phénomène mais je ne pense pas que ce soit l'instruction en elle-même qui soit à remettre en question.
Comme expliqué précédemment, j'ai constaté que parfois les données de certaines fontes étaient mal compilées (erreur logicielle ? humaine ?) et je soupçonne donc que des informations liées aux largeurs des glyphes soient parfois mal encodées ou incorrectement calculées dans certaines tables.

Je ne sais pas comment TextWidth() détermine la largeur du texte passé en paramètre mais, pour mon code, la solution consisterait vraisemblablement à cumuler les largeurs de chaque glyphe pour déterminer précisément la largeur réelle du texte.
Ce qui impliquerait d'alourdir, en poids et en temps d'exécution, mon code de lecture des informations des fontes.

J'ai donc opté pour un compromis un peu bâtard :
• Calculer à l'aide de TextWidth() la largeur de chaque ligne de texte utilisé,
• Déterminer la valeur haute de l'ensemble de ces résultats,
• Ramener cette valeur à 8192 pixels si elle les dépasse.

Je vous mets, ici, le lien vers une fonte que vous pourrez télécharger et constater ce phénomène en ajoutant entre les lignes 165 et 166 du code :

Code : Tout sélectionner

Debug "Largeur TextWidth : "+TextWidth(LignesTextes(Compteur))
 
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par boddhi »

Nouvelle version :
  • Affinage de l'interprétation des données Panose-1 (permettant, entre-autre, de déterminer le style de la fonte (texte avec ou sans empattements, cursive, décorative ou graphique))
  • Récupération du n° de révision de la fonte
  • Récupération, à partir des métadonnées, des dates UTC de création et de modification de la fonte
  • Récupération du nombre de glyphes déclaré dans la fonte
  • Récupération des informations "Fonte proportionnelle" et "Fonte à chasse fixe (Monochasse ou Monospace en anglais) ou non"

⚠ Important/Rappel : Par souci de rapidité d'exécution de la routine, les données sont extraites à partir des métadonnées et non des tables qui détaillent certaines d'entre-elles (notamment, celle des glyphes). Si elles sont très majoritairement exactes, il arrive parfois, néanmoins, que certaines ne soient pas correctement encodées ou mal indiquées par le créateur. Ce dernier cas étant le plus fréquent.
Les données Panose ou les dates de création et modification sont, par exemple, du ressort du créateur.

Et j'ai constaté de temps en temps (mais très très rarement somme toute) certaines anomalies dans les données : La description de familles Panose ne correspondant pas toujours à leur genre ou des dates de création et de modification saisies à 0 (équivalentes donc au 01/01/1904 00:00:00) ou antérieures à la fin des années 1980, ce qui est bien évidemment impossible puisque le format a été créé justement fin des années 1980.

Pour information, à ce jour, et sans être à l'abri pour autant, la routine a été testée avec succès (sans crash et sans incohérences remarquables) sur plus de 180 000 fichiers de fontes.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Lecture de données informationnelles Polices/Fontes OTF, TTC & TTF

Message par boddhi »

Nouvelle version :
  • Partie 2/3 du source : Modifications/Corrections apportées aux valeurs de la map PlagesUnicode()
Répondre