Windows GDI und WinAPI

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

Beitrag von theo »

Und wie willst du das konkret machen?
Mach doch mal ein Beispiel!

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 »

Für GTK dürfte wohl hier der Hebel sein, ich muß nochmal zusätzliche Docus runterladen:

GdkDrawable

typedef struct _GdkDrawable GdkDrawable;

An opaque structure representing an object that can be drawn onto. This can be a GdkPixmap, a GdkBitmap, or a GdkWindow.

Die Qt-Doku solltet ihr eigentlich bei Linux dabei haben. wenn nicht gibt es die bei:

http://www.trolltech.com/developer/downloads/qt/x11" onclick="window.open(this.href);return false;

Das ist das volle Open-Source für X11 mit Doku.
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 »

Ach so! Auf die harte Tour? ;-)
Ja, das wird schon gehen.

Aber bevor du das Rad neu erfindest.
Schau dich mal in lclintfh.inc um

function GetRawImageFromBitmap
function CreateBitmapFromRawImage

sind eventuell heisse Kandidaten für dein Vorhaben.

Da kommst du über

Code: Alles auswählen

TRawImage = record
    Description: TRawImageDescription;
    Data: PByte;
    DataSize: PtrUInt;
    Mask: PByte;
    MaskSize: PtrUInt;
    Palette: PByte;
    PaletteSize: PtrUInt;
  end;
in GraphType an den Pointer ran (Data: PByte)

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 »

Na eben, nur so tief hab ich mich in die Untiefen der Lib's noch nicht vorgewagt. Aber damit sollte das möglich sein, sowas einfach als Extras zu bauen anstatt das bei jedem Aufruf von ScanLine völlig zu ändern.

Bei der Qt gab es sogar so eine Funktion, die fast ähnlich wie ScanLine aufgerufen werden konnte. Hatte ich mal für ein eigenes Objekt für die CLX bei Delphi gemacht.

Ist zwar etwas aufwendig aber dafür dann auch blitzschnell.
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 »

Gab dazu mal eine duskussion auf der fpc mailinglist ich glaub der 2.1.1 bietet Scanline schon über die FPimage
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 »

Den hatte ich letztens als dayli-snapshot. Leider lief da so einiges nicht richtig, hatte reichlich Macken. Teilweise hat der sogar die interfaces von Prozeduren nicht richtig erkannt obwohl lediglich die Zeilenschaltung woanders war.
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 »

Hab kurz einen Machbarkeitstest gemacht.
Müsste klappen!
Achtung: Der Test ist ohne Rücksicht auf Verluste! ;-)

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var RawI:TRawImage;
 bmph, mbmph:HBitmap;
 po:Pointer;
 i:integer;
begin
  Image1.Picture.Bitmap.LoadFromFile('/home/theo/laztest.bmp');
  Image1.Picture.Bitmap.PixelFormat:=pf32bit;
 
  WidgetSet.GetRawImageFromBitmap(Image1.Picture.Bitmap.Handle,Image1.Picture.Bitmap.MaskHandle,Rect(0,0,200,200), RawI);
 
  Po:=RawI.Data;
  for i:=0 to 3000 do
  begin
   Cardinal(Po^):=$00FF0000;
   inc(Po,4);
  end;
 
  WidgetSet.CreateBitmapFromRawImage(RawI, bmph, mbmph ,True);
  Image2.Picture.Bitmap.Handle:=bmph;
  Image2.Picture.Bitmap.MaskHandle:=mbmph;
end;

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 »

Frag Christian mal ob er schon nen sourceforge-account für die Utilitys eingerichtet hat. Dann könnten wir GraphicsMisc da gleich mit draufsetzen und das Beispiel gleich da einbauen.

Damit ich nun nicht gleich wieder mißverstanden werde, geht nicht darum das man das eventuell bei glscene schon hat. Ist mehr für die vereinfachte Übertragung von Delphi-Windoofs-Zeugs auf FPC/Lazarus ohne gleich den Vorschlaghammer zu benutzen.

Ich hätte da noch ne StreamMisc, mit der man strukturierte Daten in einem Stream verarbeiten kann. Dazu wird vor jedes Datenfeld eine Header gesetzt der spezifiziert welches Datenfeld, welcher Datentyp und welche Datengröße da angewackelt kommt. Das entspricht in etwa der Vorgehensweise der DATEV, nur das man bei dem Ding auch Multimedia-Daten im Stream haben kann. Hat den Vorteil, das man nicht auf die Reihenfolge der Daten achten muß. Einfach Header rein und die Daten dahinter. Beim Auslesen kann man sich dann am Header orientieren. Müßte man sich nur noch nen mime-magic für einfallen lassen, damit man gleich am Anfang sieht obs da strukturiert kommt.
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:Frag Christian mal ob er schon nen sourceforge-account für die Utilitys eingerichtet hat.
Wieso ich? Sprecht ihr nicht mehr miteinander? ;-)
schnullerbacke hat geschrieben: Dann könnten wir GraphicsMisc da gleich mit draufsetzen und das Beispiel gleich da einbauen.
Wart's mal ab. Das "Cowboy"-Beispiel oben hab ich in 10 Minuten zusammengehackt und bei mir funzte es mit 32bit Bitmap auf GTK. Danach musste ich kurz weg.
Hast du das mal auf Windows gecheckt? Ich werde gleich noch schauen, wie es sich mit anderen Pixelformaten verhält und ob man die eigentliche Scanline da rauskriegt.
Könnte z.B. Probleme mit den Boundaries geben.
schnullerbacke hat geschrieben: Damit ich nun nicht gleich wieder mißverstanden werde, geht nicht darum das man das eventuell bei glscene schon hat. Ist mehr für die vereinfachte Übertragung von Delphi-Windoofs-Zeugs auf FPC/Lazarus ohne gleich den Vorschlaghammer zu benutzen.
Da stimme ich dir zu.

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 »

Ich hab keinen account gemacht, da ich es für sinviller erachte das minta einen svn server auf dem forumsrechner aufsetzt was sollte man denn bitte in den sf acc reinschreiben ? is ja alles projektorientiert ausserdem villeicht teilweise etwas zu öffentlich für unsere spielereien
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 »

Na ja, das eine oder andere dürfte für's Projekt durchaus interessant werden. Aber ein svn hier würds auch erstmal tun. Ralli kann dann in den Fundus greifen und daraus gleich was für sein Tut nutzen. Ein Beispiel sagt meist mehr als 1000 Worte.
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 »

Hab's probiert mit dem TRawImage, aber ich komme damit nicht zu Potte.
Das Problem liegt nicht mal an den damit verbundenen Funktionen, sondern daran, dass das Lazarus Bitmap (mindestens unter GTK) einfach nicht wie ein Delphi Bitmap funktioniert.

Kann jemand folgende Beobachtung bestätigen:

Code: Alles auswählen

Image1.Picture.Bitmap.LoadFromFile('/home/theo/SI-calendar-2006.bmp');
 //lädt z.B. ein 8 bit Bitmap
  writeln(Ord(Image1.Picture.Bitmap.PixelFormat)); 
  //gibt immer 0 also pfDevice obwohl das geladene Bitmap 8bit hat
  writeln(Image1.Picture.Bitmap.Width,' ',Image1.Picture.Bitmap.Height); 
   //Stimmt
   Image1.Picture.Bitmap.PixelFormat:=pf24bit;
  writeln(Ord(Image1.Picture.Bitmap.PixelFormat)); 
  //Angabe 6 Stimmt
  writeln(Image1.Picture.Bitmap.Width,' ',Image1.Picture.Bitmap.Height); 
  //w und h sind 0, das Bitmap hat intern immer noch pfDevice
Also so kann man schon mal kein 24bit Bitmap erzeugen, was die meisten Delphi Codes welche Scanline benutzen erwarten.
Es sei denn, man hat zufällig die Grafik auf 24 Bit eingestellt.

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 »

ds setzen des pixelformats crasht linux auch ab und an das war eines der hauptprobleme als ich vt portiert hab
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 »

Das würde dann aber bedeuten, das GTK das Pixelformat bei LoadFromFile anpassen muß und dabei ne andere Palette verwendet. Bei mir läuft SuSE mit 24 bit, das läßt sich aber ändern. Das probier ich dann morgen mal, wie sich das bei unterschiedlichen Einstellungen verhält.
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:Das würde dann aber bedeuten, das GTK das Pixelformat bei LoadFromFile anpassen muß und dabei ne andere Palette verwendet. Bei mir läuft SuSE mit 24 bit, das läßt sich aber ändern.
Es scheint so.
Palette ist nicht das richtige Wort, die gibt's erst ab 8bit abwärts.
Aber BitsPerPixel.

Vielleicht schmeisse ich heute noch einen Teil des immer noch unfertigen und eingeschlafenen OPBitmap aufs Web.
Zum Testen für dich und alle die's interessiert. Aber mal noch ohne die Dateiformate.
Nur zum zeigen wie man doch mit 24Bit Scanline arbeiten kann.

Bin grad dabei eine Demo für unser Problem zu schreiben, welche die erwähnten Funktionen verwendet und dabei das Bild von und nach Lazarus Bitmap liest/schreibt:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var RawI:TRawImage;
 bmph, mbmph:HBitmap;
 Op:TOpbitmap;
 w,h,x,y:integer;
begin
 Image1.Picture.Bitmap.LoadFromFile('/home/theo/laztest.bmp');
  w:=Image1.Picture.Bitmap.Width;
  h:=Image1.Picture.Bitmap.Height;
 
 With Image1.Picture.Bitmap do
 WidgetSet.GetRawImageFromBitmap(Handle,MaskHandle,Rect(0,0,w,h), RawI);
 Op:=TOpbitmap.Create;
 Op.PixelFormat:=PixelFormatFromBPP(RawI.Description.BitsPerPixel);
 Op.Width:=w;
 Op.Height:=h;
 Move(RawI.Data^,OP.ScanLine[0]^,w*h*Op.BPP div 8);
 //So ab hier geht der Spass Los: OpBitmap kann nun wie ein 24bit Bitmap Behandelt werden:
 
 Op.PixelFormat:=pf24bit;
 
 For y:=0 to h-1 do
   For x:=0 to w-1 do
     PRGBTriple(Op.ScanLine[Y])[X].rgbtBlue:=0; //Einfach mal Blau auf 0 setzen für das ganze Bitmap
 
 
 //Spass Ende: OPBitmap Pixelformat auf device zurücksezten:
 Op.PixelFormat:=PixelFormatFromBPP(RawI.Description.BitsPerPixel);
 RawI.Data:=op.ScanLine[0];
 WidgetSet.CreateBitmapFromRawImage(RawI, bmph, mbmph ,True);
 Image1.Picture.Bitmap.FreeImage;
 Image1.Picture.Bitmap.Handle:=bmph;
 Image1.Picture.Bitmap.MaskHandle:=mbmph;
 Op.free;
end;

Antworten