Windows GDI und WinAPI

Antworten
Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ich habe hier mal einen Teil meines TOPBitmap mit einer Demo hochgeladen:
[Link vorübergehend entfernt]

Sonst dümpelt das Ding noch lange ungenutzt bei mir rum! ;-)
Ich wäre froh, wenn Schnullerbacke, Christian und andere interssierte dies mal testen würden.
Ich möchte gerne wissen, ob das auf anderen Systemen läuft, und das betrifft vor allem den Lazarus-interface teil (lazbridge.pas), welchen ich heute geschrieben habe. (OPBitmap läuft auf Delphi, Kylix, Lazarus. Deshalb ist es nicht so integriert sondern es gibt "bridges")

Ich habe aber eine grosse Bitte: Der Code ist noch unfertig und enthält auch noch ein bisschen Schrott.
Bei Gelegenheit gibt's auch mal ein Redesign.

Es wäre also sehr angenehm, wenn die Sache vorerst unter uns Forumsteilnehmern bliebe, und wenn ihn niemand in einer ernsthaften Anwendung einsetzte.

Eigentlich habe ich TOPBitmap ja geschrieben,um verschiedene Bild-Dateiformat Routinen aus Delphi wiederverwenden zu können.
Im Zip habe ich aber absichtlich noch keine beigelegt.

Weil es aber gerade zum Thema Scanline passt habe ich eine Demo zu diesem Thema gemacht, weil TOPBitmap das auch kann.
Wie ihr im der Demo seht, könnt ihr vorhandene Delphi 24Bit Scanline Codes gebrauchen.

Ich hoffe, dass es klappt! Ich habe soeben noch mit GTK2 und Qt getestet und da geht's. Windows weiss ich nicht, aber die Chancen sind gut.

Ich denke es ist nicht zu langsam. Wenn ihr das aber doch findet, bedenkt bitte, dass in der Demo immer erst das File in ein TBitmap geladen werden muss, dann nach TOPBitmap kovertiert und und am Schluss wieder nach TBitmap. Die Performance von TOPBitmap selber kann man so nicht richtig beurteilen.
Mit den später eingehängten File-Formaten wird der erste Teil wegfallen, bzw. falls man's gar nicht auf den Screen bringen will (in Konverter, Server oder so) wird autonom geöffnet und gespeichert, ohne X/WinAPI.

Vielen Dank für eure Tests!

Euer Theo ;-)
Zuletzt geändert von theo am Mo 29. Jan 2007, 17:35, insgesamt 1-mal geändert.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Kanns leider nicht downloaden, die Seite existiert angeblich nicht.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

schnullerbacke hat geschrieben:Kanns leider nicht downloaden, die Seite existiert angeblich nicht.
Sorry Schnullerbacke, hab's wieder entfernt.
Nachdem sich dann kein Freiwilliger gemeldet hatte, musste ich's selber auf Windows testen (wäh).
Und da habe ich noch Böcke gefünden, die ich zuerst in den Griff kriegen muss.

Wie vermutet, macht wahrscheinlich das Line-Boundary noch Probleme
Ausserdem habe ich noch Transparenz ins Painting eingebaut.
Es gibt doch so einiges, was man bei der Transformation berücksichtigen muss.

Ich mache dann noch einen Versuch, wenn ich's im Griff habe.
Danke für dein Interesse.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Dann erzähl mir mal kurz ob bei lazarus irgendwo die externalsym's für die lib's deklariert sind. Hab schon ein kleines testproggi gebaut und die Mimik in ne Extraunit gepackt. Kann nur nicht an TRawImage ran, ich weiß nicht welche Bedingungen dafür gesetzt werden müssen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

schnullerbacke hat geschrieben:Dann erzähl mir mal kurz ob bei lazarus irgendwo die externalsym's für die lib's deklariert sind. Hab schon ein kleines testproggi gebaut und die Mimik in ne Extraunit gepackt. Kann nur nicht an TRawImage ran, ich weiß nicht welche Bedingungen dafür gesetzt werden müssen.
Lieber Schnullerbacke,
Ich verstehe mal wieder kein einziges Wort von dem was du sagst.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Ich hab bei der GraphicsMisc in der uses Graphics aufgeführt, er lehnt aber TRawImage als unbekannt ab obwohl lclintfh.inc in Graphics aufgeführt ist. Das sollte also da sein, ist es aber nicht.

Um mir aber den Weg direkt über GTK nicht zu verlegen, könnte es ja sein, das irgendwo (ähnlich wie bei Delphi's WinAPI) die "externalsym's", also Prozedureinsprünge und Datentypen für die GTKXX.dll, irgendwo deklariert sind. Wäre hilfreich wenn ich da jetzt nicht wieder bis zur Vergasung suchen muß.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

wie wärs mit lazarus\fpc\2.1.1\source\packages\extra\gtk

gefunden übrigends mit der suche :)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Thank you very düchtich... :lol:
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

keen problem machmer doch jarne
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Verdammte Scheisse!
Ich muss jetzt mal Dampf ablassen! ;-)
Ich hab jetzt nochmal 5 Stunden daran rumgebastelt, mein OPBitmap zuverlässig und mit Masken (Transparenz) auf den (Lazarus) Bildschirm zu kriegen.
Das ist Plattformübergreifend und auch sonst einfach nicht hinzukriegen.
Und ich mein das jetzt nicht so: "Mami ich kriegs nicht hin"

Ich habe verdammt nochmal (fast alles probiert) sieht etwa so aus:

Code: Alles auswählen

Rawi:=SystemPrefs;
  if RawI.Description.BitsPerPixel=16 then
   OpBitmap.PixelFormat := PixelFormatFromBPP(RawI.Description.Depth)
  else
   OpBitmap.PixelFormat := PixelFormatFromBPP(RawI.Description.BitsPerPixel);
  rawi.Description.Width := OpBitmap.Width;
  rawi.Description.Height := OpBitmap.Height;
  rawi.Description.LineEnd:=rileByteBoundary;
  rawi.Description.BitOrder:=riboBitsInOrder;
  rawi.Description.ByteOrder:=riboLSBFirst;
  rawi.Description.LineOrder:=riloTopToBottom;
  rawi.Description.AlphaLineEnd:=rileByteBoundary;
  rawi.DataSize := OpBitmap.LineLength * OpBitmap.height;
  RawI.Data := OpBitmap.ScanLine[0];
Aber diese verdammte Scheisse macht einfach nichts woran man anknüpfen könnte.
Natürlich krieg ich so ein Bild auf den Screen. Und das mit der Maske ist vielleicht auch noch mein Fehler, aber im Sub-Byte Bereich ist's nicht mehr so einfach. Ich muss die überflüssigen Bits am letzten Byte im Zeilenende auf 1 setzen. Krieg ich hin.

Aber was mir total auf den Sack geht, ist dass auf Windows...

WidgetSet.CreateBitmapFromRawImage(RawI, bmph, mbmph, True);

...das verdammte Bild nicht quasi auf jungfräulich gesetzt wird, sondern irgend ein Gaga auf das zuletzt beschriebene Bitmap druntergemalt wird.

Ich werd noch verrückt dabei. ;-)

In OpBitmap.pas gibt's dann Routinen die das Maskenbild erstellen sollen:

Code: Alles auswählen

function TOPBitmap.GetTransparentMask(Tolerance: Byte; var Data: PByte): integer;
var x, y: integer;
begin
  if not Empty then
  begin
    fMask.Width := Width;
    fMask.Height := Height;
 
    if Tolerance = 0 then
    begin
 
      for y := 0 to Height - 1 do
        for x := 0 to Width - 1 do
          if Pixels[x, y] = fTransparentColor then
            fMask.SetNativePixel(x, y, false) else
            fMask.SetNativePixel(x, y, true);
 
    end else
    begin
 
      for y := 0 to Height - 1 do
        for x := 0 to Width - 1 do
          if ColorInRange(Pixels[x, y], fTransparentColor, Tolerance) then
            fMask.SetNativePixel(x, y, false) else
            fMask.SetNativePixel(x, y, true);
    end;
 
    Data := PByte(fMask.fPixels);
    Result := fMask.Height * fMask.LineLength;
  end;
end;
Das funktioniert auf Linux aber nicht so richtig auf Windows.

Arrg! Klappt alles 1a auf Kylix und Delphi.
Der FPC Teil funktioniert auch wunderbar.
Aber diese ?/(%&ç/ Lazarus Grafik ist einfach:
S C H E I S S E!

Wie könnt ihr bloss alle mit dieser Scheisse leben und auch noch sagen, das sei besser als Kylix oder gar Delphi??



@Monta: Dieser Text enthält vulgäre Worte und ist als Übertreibung / Sarkasmus zu verstehen. Was ich damit ausdrücken will ist, dass die Bitmap unterstützung in Lazarus dringende Hilfe benötigt.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

LoL *kopfstreichel*
Wie könnt ihr bloss alle mit dieser Scheisse leben und auch noch sagen, das sei besser als Kylix oder gar Delphi??
wiso versuchst du denn ständig mit der "scheise" zu leben ;)

und wo is etz das problem mit dem code da oben ? fMask is ne eigene Klasse ?
was kommt denn raus ? schaut für mich gut aus ich hab sowas mal mit 2 bitmaps gemacht um ne maske zu bekommen ohne Tolleranz aber sonst genauso
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Christian hat geschrieben:LoL *kopfstreichel*
und wo is etz das problem mit dem code da oben ? fMask is ne eigene Klasse ?
was kommt denn raus ? schaut für mich gut aus ich hab sowas mal mit 2 bitmaps gemacht um ne maske zu bekommen ohne Tolleranz aber sonst genauso
Ja , das mit der Mask ist vermutlich mein Bock. Das könnte ich hinkriegen.
Ich muss da wahrscheinlich noch die zerquetschten Bytes elliminieren.
z.B.

11111111 11111111 11111111 11111111 11111000

So sieht eine "normale" pf1Bit Zeile mit ByteBoundary aus.
(1 steht oben für "definertes" Pixel, 0 für Byte-Füller).
Die Maske erwartet aber möglicherweise das Ganze ohne Füllbits.
Wie gesagt, Blicke noch nicht wirklich durch. Mal geht's auch, mal gibt's störende Streifen.

Schlimmer ist das ganz "normale" Problem:

Code: Alles auswählen

WidgetSet.CreateBitmapFromRawImage(RawI, bmph, mbmph, True);
  Bitmap.FreeImage;
  Bitmap.Handle := bmph;
  Bitmap.MaskHandle := mbmph;
Ein Lazarus Bitmap (Win) wird damit nicht richtig zurückgesetzt.

Es gibt so Vieles, wo man erst dahinterkommen muss.
Unter Linux ist zum Beispiel eine "NullMaske" OK für ein nicht maskiertes Bild:

Code: Alles auswählen

Rawi.MaskSize:=0;
Rawi.Mask:=nil;
Unter Windows nicht. Da musste zuerst die Rawi.MaskData mit $FF füllen bzw in diesem Fallle dass
Bitmap.MaskHandle := mbmph;
nicht übergeben

Dann die 24bit Bitmaps (Depth) die mit 32bit (BPP) daherkommen.
Das Ganze ändert ja auch noch mit der Farbtiefe deiner Grafik.
Aber während man Windows immer z.B. 32bit Bitmaps übergeben kann zum zeichnen, erwartet GTK nur gerade das Format, welches dem Screen entspricht. (16 resp 15 bit, 24, 32) bei 8 bit geht eh nix.

Ich sage ja nicht, dass es nicht zu schaffen ist. Aber es ist verdammt knifflig.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

@theo

Beim Gespann Kylix/Delphi geht das aber auch alles direkt über die Qt-Lib. Die ist für sich gesehen auch sehr reichhaltig. Erste Blicke in gtk/gdk bei FPC (2.0.4) zeigen denn auch, das da vieles aus der GTK/GDK-Lib offenbar noch fehlt. Mal ganz abgesehen davon, das FPC wohl auch mehr GTK-1.2.X unterstützt als GTK-2.X.X. Da liegt der Verdacht nahe, das es an den fehlenden Teilen liegt. Wäre möglicherweise besser gewesen, konzentriert auf GTK-2.X.X abzustellen und die obsoleten Geschichten aus der GTK-1.2.X für die Abwärtskompatibilität zur Verfügung zu stellen. Das ist bei der Qt-Lib ja auch so gemacht.

Nur mit Kylix ist ab SuSE 10.1 abtuten, was eher nicht am Kernel liegt. Ich habs auf 10.0 mit dem neuesten Kernel (SuSE update) prima laufen. Was nichts daran ändert, das es eben bei der CLX auch Unterschiede gibt, die nicht so leicht zu überwinden sind. Bei Kylix kann ein TImage von Haus aus bereits GIF's und animated GIF's was bei Delphi eben nicht der Fall ist. Deswegen fand ich FPC/Lazarus eigentlich ganz prima. Da muß also offenbar dringlich an der Umsetzung der GTK-Libs kräftig gearbeitet werden um das Cross-compile wirklich hinzukriegen. Die Desktop-Schnittstelle ist ja nun eher wichtiger dafür als neuen Schnickschnack einzubauen. Die Übertragung von Delphi/Kylix-Quellen dürfte wohl auch notwendige Fähigkeit sein, schließlich dürfte keiner große Lust haben, seine kompletten Quellen neu zu schreiben oder massenweise Änderungen durchzuführen.

Stellt sich also die Frage, ob man nicht Qt unter FPC/Lazarus verwendet um Kylix/Delphi-Code zu übertragen. Das wird ja sogar angeboten, fragt sich nur obs auch wirklich geht.

Gibt ja nicht wenige professionelle Anwendungen die mit Delphi entwickelt sind.

Ähnliches gilt für dynamisch ladbare Object-Libs. Die Dinger sind bei leibe nichts neues. Die hatten wir Mitte der 80er schon bei Phillips im Einsatz um für die Tests von Controlern und Prozessoren die ROM-Codes zu laden. Das passierte i.a.R. mit UNIX-Workstations die an den Testrechnern hingen.

Um Rapid für Lazarus wahr werden zu lassen, sollten wir vielleicht mal darauf hinwirken auf diesen Bereich das Augenmerk zu lenken. Sonst dümpelt das ganze Projekt auch nur als Nischenprojekt vor sich hin. Das kann ja nicht das Ziel der Bemühungen sein.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

schnullerbacke hat geschrieben:
Beim Gespann Kylix/Delphi geht das aber auch alles direkt über die Qt-Lib. Die ist für sich gesehen auch sehr reichhaltig.
Ja. Der ganze Wahnsinn den ich mit dem "malen" hier betreibe, beschränkt sich in Kylix auf eine Zeile (für 32bit):
Move(OpBmp.ScanLine[0]^, Bmp.Scanline[0]^, OpBmp.Width * OpBmp.Height * 4);
Dann ist das Ding auf dem Screen. Ohne wenn und aber.
schnullerbacke hat geschrieben: Bei Kylix kann ein TImage von Haus aus bereits GIF's und animated GIF's was bei Delphi eben nicht der Fall ist. Deswegen fand ich FPC/Lazarus eigentlich ganz prima.
.. weil es gar nichts richtig lesen kann? (ausser vielleicht PNG).
Laz kann noch nicht mal RLE encodierte Bitmaps lesen, und etwa die Hälfte meiner JPG's auch nicht. So siehts' aus.
schnullerbacke hat geschrieben: Stellt sich also die Frage, ob man nicht Qt unter FPC/Lazarus verwendet um Kylix/Delphi-Code zu übertragen. Das wird ja sogar angeboten, fragt sich nur obs auch wirklich geht.
Die Bitmaps müssen auf allen Widgetsets laufen.
Die Grössten Probleme habe ich sowieso mit WinLin, nicht mit GTK I/II Qt .
schnullerbacke hat geschrieben: Um Rapid für Lazarus wahr werden zu lassen,
Was ist "Rapid"?

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

So, und weil viel fluchen bekanntlich viel hilft, sieht die Welt heute schon besser aus. ;-)
Dateianhänge
OPBitmap Transparenz Demo
OPBitmap Transparenz Demo

Antworten