Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 23.07.2014, 23:15 Titel: Eurozeichen bei FreeType2 |
|
|
Hallo liebe Leute
Ich habe mir aus der Bsp.Datei DrawStr.bas welche dem FB Paket beiliegt eine schöne Draw String Routine gebastelt. Die auch sehr gut läuft. Nun stört mich nur noch das halt kein € gezeichnet wird. In der Bsp.Datei gibt es ja folgende Sub
Code: | Sub DST_Zeichnen _
( ByVal Schrift As FT_Face, ByVal x As Integer, ByVal y As Integer, _
ByVal farbe As UInteger )
Dim As FT_Bitmap Ptr bitmap = @Schrift->glyph->bitmap
Dim As UByte Ptr source = bitmap->buffer
Dim As Integer h = bitmap->rows
Dim As Integer pitch = DST.SCR_W - bitmap->width
Dim As UInteger Ptr p = CPtr(UInteger Ptr, ScreenPtr()) + (y * DST.SCR_W) + x
While (h > 0)
Dim As Integer w = bitmap->width
While (w > 0)
' Alphablenden erstellen
#define MASK_RB_32 &h00FF00FF 'pink
#define MASK_G_32 &h0000FF00 'grün
Dim As UInteger srb = farbe And MASK_RB_32
Dim As UInteger sg = farbe And MASK_G_32
' Hintergrund auslesen
Dim As UInteger dfarbe = p[0]
Dim As UInteger drb = dfarbe And MASK_RB_32
Dim As UInteger dg = dfarbe And MASK_G_32
Dim As Integer Alpha = source[0]
srb = ((srb - drb) * Alpha) Shr 8
sg = ((sg - dg) * Alpha) Shr 8
' direkt auf Monitorpuffer Zeichnen
*p = ((drb + srb) And MASK_RB_32) Or ((dg + sg) And MASK_G_32)
p += 1: source += 1: w -= 1
Wend
h -= 1
p += pitch
Wend
End Sub
|
Die Sub hieß dort nur anders
Meine Überlegung war jetzt die Zeile
Code: | *p = ((drb + srb) And MASK_RB_32) Or ((dg + sg) And MASK_G_32) |
in eine If bedingung zu setzen, so das anstelle eines 4ecks halt ein € Zeichen gemalt wird. Dachte da erst an Data Zeilen mit 0en und 1en. Da wirds dann aber wieder kompliziert mit verschiedenen Schriftgrößen.
Ansonsten könnt ich mir noch vorstellen das mit einer BMP zu machen die man dann je nach Schriftgröße skalliert.
Oder habt Ihr da bessere bzw einfachere Ideen.
LG |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 24.07.2014, 10:20 Titel: |
|
|
dieser Abschnitt ist fürs Rendern zuständig
dort sind die Ecken wo du ansetzen müsstest:
Code: |
(FT_Load_Char(face, Asc("@"), FT_LOAD_DEFAULT)'<---- &h20AC oder dezimal 8364
|
bzw in deinem Fall:
Code: |
Dim As FT_UInt index = FT_Get_Char_Index(font, text[i])'<---- &h20AC oder dezimal 8364
'' Load character glyph
If (FT_Load_Glyph(font, index, FT_LOAD_DEFAULT) <> 0) Then'<---- &h20AC oder dezimal 8364
Return 0
End If
|
du könntest beim Zerlegen des Textes dir ein selten benutztes Zeichen aussuchen, und dieses bzw dessen asc() durch &H20AC ersetzen
Ich kenne mich mit Textcodierung auch nicht so aus, freetype benutzt wohl UTF-32
ist mit sicherheit keine optimale Lösung, aber wenn es nur darum geht, ein Euro Zeichen auf den Bildschirm zu zaubern und du eh schon freetype benutzt
Mutton |
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 24.07.2014, 11:24 Titel: |
|
|
danke, das war Rettung in letzter Sekunde. War gerade dabei FreeImage einzubinden. Hab schon die dll dateien in meine Ordner gepackt.
ich hab das jetzt erstmal mit IIF gelöst. Da die Tasten AltGr + E den Code 128 zurück geben, hab ich die Zeile nach deinem Tipp so geändert.
Code: | Dim As FT_UInt index = FT_Get_Char_Index(font, IIF(text[i] = 128, &h20AC, text[i])) |
Bin mir nur nicht so sicher ob diese Tastenkombi immer 128 zurück gibt, oder ob der Wert je nach einstellung anders ist |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 03.08.2014, 20:36 Titel: |
|
|
Hm Ok mit IIF hat es gut funktioniert wenn im Quelltext eine zeichenkette vorgegeben ist, die ein EUROzeichen enthält.
Leider ist es wie St_W schon gesagt hat bei tastureingabe nicht mehr so einfach. Und ich glaub das Problem ist, das nicht nur € sondern auch ? bei Inkey den Wert 63 zurück gibt.
Hab ihr da vllt. eine Lösung wie das €zeichen abgefragt werden kann und das natürlich ohne das Fragezeichen zu verlieren. Und am besten wär es wenn sich dies über den Quellcode bewerkstelligen ließe. Wäre schon blöd wenn man vom Benutzer verlangen müsste etwas am System zu verändern. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 04.08.2014, 07:29 Titel: |
|
|
vielleicht hilft Multikey() weiter.
Ich weiß nicht wie deine Eingaberoutine aussieht, aber vielleicht kannst du bevor du Inkey aufrufst mit multikey den Zustand der Tasten altgr und e abfragen und gegebenenfalls den Code fürs Eurozeichen an die Bibliothek senden.
Kann mich da an ein Thread erinnern von TimesChange, irgendwas mit qbasic konvertierungen..., jedenfalls wurde dort versucht die komplette Usereingabe via Multikey zu lösen, da auch alt und strg abgefragt werden mußten
Mutton |
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 04.08.2014, 11:34 Titel: |
|
|
vielen Dank
war nicht ganz einfach diese Geburt
Ich habe erst immer Inkey und Multikey getrennt abgefragt
Code: | FF_Input = Inkey
If multikey(&h1D) And Multikey(&h38) And Multikey(&h12) Then
FF_Input = "€"
Do: FF.EmptyInkey = Inkey: Loop Until FF.EmptyInkey = ""
sleep 150
End If
| und weitere ähnliche gebilde, was immer dazu führte das ich mehrfach eingaben hatte. Also bei einmal "AltGr + e" kam dann "?€€" oder "€€€€" auf dem Bildschirm.
Habs dann doch noch geschaft mit folgendem Code
Code: |
' TASTEN abfrage
' [Strg] + [Alt] + [e]
If multikey(&h1D) And Multikey(&h38) And Multikey(&h12) Then
FF_Input = "€"
Do: FF.EmptyInkey = Inkey: Loop Until FF.EmptyInkey = ""
sleep 150
' ( [LShift] oder [RShift] ) + [ß bzw ?]
Elseif ( multikey(&h2A) Or multikey(&h36) ) And multikey(&h1A) Then
FF_Input = "?"
Do: FF.EmptyInkey = Inkey: Loop Until FF.EmptyInkey = ""
sleep 150
Else
FF_Input = Inkey
If ASC(FF_Input) = 63 Then FF_Input = ""
End IF
|
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.08.2014, 13:13 Titel: |
|
|
1) Multikey solltest du nicht mit Inkey vermischen. Du solltest warten, bis genau diese drei Tasten nicht mehr gedrückt werden, und nicht mit Inkey auf leere Eingabe prüfen.
2) Mit dieser Multikey-Methode schließt du alle Benutzer aus, die kein deutsches Tastatur-Layout verwenden, oder zumindest ein Layout, bei dem man das Euro-Zeichen genau so eingibt - und es gibt genug Keyboard-Layouts, wo man das anders eingibt. Mit Inkey hat man da ein paar weniger Probleme, weil da die Tastendrücke bereits vom System in die richtigen Zeichen übersetzt werden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 08.08.2014, 10:18 Titel: |
|
|
@ Jojo, ich kann dir da gerade nicht so ganz folgen. Du sagst multikey und inkey sollte ich nicht vermischen. Aber in der Referenz steht es doch genau andersherum.
Referenz hat Folgendes geschrieben: | Der Tastaturpuffer wird nicht geleert, wenn MULTIKEY verwendet wird; jede gedrückte Taste wird gespeichert, bis sie z. B. durch INKEY abgefragt wird. Damit kein Überlauf im Tastaturpuffer stattfindet, müssen Sie diesen selbständig leeren; es empfiehlt sich daher, MULTIKEY in Kombination mit INKEY zu verwenden.
|
Und das zweite ist das ich auf Multikey ausgewichen bin da eine Abfrage über Inkey nicht funktioniert hat. der ASC wert war immer 63. Also immer der selbe wie bei einem Fragezeichen. Ich wüsste halt nicht wie ich es sonst abfragen soll. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.08.2014, 13:18 Titel: |
|
|
MULTIKEY arbeitet halt anders als INKEY, und wenn du INKEY länger nicht abfragst, wird es von den MULTIKEY-Werten abweichen. Der Hinweis in der Referenz bedeutet lediglich, dass nach einer MULTIKEY-Abfrage die Tasten noch im Tastaturpuffer liegen; wenn du also auf neue Pufferwerte zugreifen will, muss man den Puffer vorher leeren. Die Verwendung von INKEY steht im Referenztext im deutlichen Zusammenhang mit dem Leeren des Puffers und ist keine Aufforderung, beides zusammen als Abfragemöglichkeit zu nutzen.
Wenn ich die Eurotaste per INkEY abfrage, bekomme ich gleich drei Werte, nämlich die Bytes des UTF8-Wertes. Interessant, dass die Betriebssysteme da verschieden arbeiten. Es wäre vielleicht zu überlegen, dem Benutzer für unbedingt erforderliiche Nicht-ASCII-Zeichen eine besondere Eingabemöglichkeit gegeben wird, vielleicht über Funktionstasten (was dann natürlich im Programm deutlich vermerkt werden müsste) oder grafisch über ein Button. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 08.08.2014, 17:18 Titel: |
|
|
hilf mir bitte auf die sprünge. So langsam seh ich gar nicht mehr durch. Wie fragst du die Bytes des UTF8-Wertes per inkey ab? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.08.2014, 18:26 Titel: |
|
|
Das wird dir nicht viel bringen.
Code: | DO
taste = INKEY
IF taste <> "" THEN PRINT ASC(taste)
LOOP UNTIL taste = chr(27) ' ESC |
liefert mir beim Druck des Eurozeichens drei Werte: 226, 130, 172. Dein Betriebssystem macht das aber offensichtlich anders. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 08.08.2014, 18:41 Titel: |
|
|
Das Verhalten wundert mich etwas. Ich würde es eher als "Bug" bezeichnen. Denn Inkey sollte laut Doku eigentlich immer einen 1-Byte ASCII Wert oder einen 2-Byte Extended Keycode zurückgeben. Insbesondere ist es auch seltsam, dass drei einzelne Tastendrücke erkannt werden (zumindest deinem Code nach, wenn du den beschriebenen Output erhältst).
Das Input-Handling von FB ist leider sehr stark von QBasic beeinflusst und trägt daher viele Altlasten mit. Obwohl es nun insgesamt 3 Wege gibt, Tastatureingaben abzufragen (Inkey, Multikey, Screenevent) ist keine davon wirklich optimal.
Ich fände z.B. ein Inkey, das etwa die per WM_CHAR / ReadConsoleInput() erhaltenen Zeichen als Unicode zurückgibt ser sinnvoll. Der Unicode Support von FB ist allerdings immer noch sehr bescheiden bzw. großteils eher praktisch nicht vorhanden. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 09.08.2014, 16:33 Titel: |
|
|
@ nemored
Ja stimmt, bei mir ist es nur 63 ( bei AltGr+e und bei ß/? )
Hab noch was interessantes hier im Forum gefunden.
Leider gab es kein weiteres Feedback dazu ob das Allgemeintauglich ist. Aber wenn dann müsste sich daraus eigendlich eine ziehmlich gute Eingaberoutine machen lassen. Wie der Autor aber schon gesagt hat müsste dabei halt noch der Programmfocus beachtet werden. Die enthaltene TestSub lief bei mir schonmal gut. (Win7 mit Netbooktastaur und deutschem Layout) |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 09.08.2014, 21:38 Titel: |
|
|
braesident hat Folgendes geschrieben: | Hab noch was interessantes hier im Forum gefunden.
Leider gab es kein weiteres Feedback dazu ob das Allgemeintauglich ist. Aber wenn dann müsste sich daraus eigendlich eine ziehmlich gute Eingaberoutine machen lassen. Wie der Autor aber schon gesagt hat müsste dabei halt noch der Programmfocus beachtet werden. Die enthaltene TestSub lief bei mir schonmal gut. (Win7 mit Netbooktastaur und deutschem Layout) |
Der Code verwendet GetAsyncKeyState() um den aktuellen Tastaturstatus zu ermitteln - so wie Multikey. Ein Ersatz für InKey ist es damit definitiv nicht (es fragt Tasten nur in bestimmten Intervallen ab und garantiert z.B. nicht dass alle Tastendrücke erkannt werden, z.B. wenn sie schnell hintereinander oder nur ganz kurz erfolgen). Nebenbei hat es den Nachteil, dass es nur auf Windows läuft. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 17.08.2014, 23:56 Titel: |
|
|
Zitat: | Denn Inkey sollte laut Doku eigentlich immer einen 1-Byte ASCII Wert oder einen 2-Byte Extended Keycode zurückgeben. |
Ich verstehe das so, dass die einzelnen Bytes des Unicode-Zeichens in den Puffer gelegt werden und INKEY diese dann korrekt als drei einzelne Zeichen ausliest. Die Tasten in den Puffer zu legen sollte Aufgabe des Betriebssystems sein, weshalb ich hier keinen Bug vermute. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 19.08.2014, 22:33 Titel: |
|
|
Nachtrag: Um meine Vermutung zu überprüfen, habe ich das obige Programm in der Konsole ausgeführt, nachdem ich mit
die Zeichencodierung umgestellt habe (ist vermutlich jetzt vereinfacht ausgedrückt). Der Effekt ist, dass das Eurozeichen keine Ausgabe mehr erzeugt (kein passendes ANSII-Zeichen, keine Umwandlung). Es liegt also wohl wirklich an der Konsoleneinstellung und nicht an FreeBASIC - FreeBASIC verarbeitet das, was es geliefert bekommt.
Dass unter Windows ein € in ein ? umgewandelt wird, soll wohl dazu dienen, unbekannte Zeichen wenigstens irgendwie darzustellen. Ob es für die Auswertung hilfreich, ist sei mal dahin gestellt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|