Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 15:15

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 08, 2006 00:32 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Hi,
da ich ebengerade auf nen Fehler im Jedi-SDL-Header gestossen bin, der dazu sorgt, dass fälschlicherweise SDL_BYTEORDER auf SDL_BIG_ENDIAN gesetzt wird, obwohl man sich auf einer Little_Endian-Maschine befindet.
Um dieses Problem zu lösen, sollte folgender Code der jedi-sdl.inc hinzugefügt werden:
Code:
  1. {$IFDEF ver180}
  2.    {$DEFINE Delphi}      {TurboDelphi}
  3.    {$DEFINE Delphi32}
  4.    {$DEFINE Delphi4UP}
  5.    {$DEFINE Delphi5UP}
  6.    {$DEFINE Delphi6UP}
  7.    {$DEFINE Delphi7UP}
  8.    {$DEFINE Delphi8UP}
  9.    {$DEFINE Delphi9UP}
  10.    {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types in Delphi 7}
  11.    {$DEFINE Has_Int64}
  12.    {$DEFINE HAS_TYPES}
  13. {$ENDIF ver180}


Dies ist nur eine temporäre Lösung, ich hoffe, dass die Jedis da bald nachlegen.

Gruss
Jonas

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Probleme mit SDL_BIG_ENDIAN
BeitragVerfasst: Sa Nov 11, 2006 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Guten Abend (Servus, wie man bei uns sagt)

Ich bin dabei, einen Texturen-Loader mittels SDL zu schreiben. Eine Funktion, die ich unbedingt haben wollte, ist das Freistellen von Bildern, wenn sie z.B. einen schwarzen Hintergrund haben. Das soll auch bei Bildern funktionieren, die keinen Alphakanal haben. Ich habe eine solche Prozedur geschrieben (Dank an ionos und sein EasySDL), und sie funktioniert auch, z.B. für JPEG. Allerdings nur dann, wenn ich statt dem SDL_BIG_ENDIAN (den mir SDL zuweist) einen SDL_LIL_ENDIAN nehme (die Prozedur erwartet übrigens ein Bild mit 24 Bit):

Code:
  1.  
  2. //********************************************************************
  3. Procedure TOGLTexture.AddAlphaFromColor(ASource: PSDL_Surface;
  4.          Var ADestination: PSDL_Surface; AColor: TSDL_Color);
  5. Var MaskR, MaskG, MaskB, MaskA, ColorKey: Uint32;
  6.     PRed, PGreen, PBlue, PAlpha: PUInt8;
  7.     Red, Green, Blue, Alpha: UInt8;
  8.     Pixel: UInt32;
  9.     X,Y: Integer;
  10. Begin
  11.    {If SDL_BYTEORDER = SDL_BIG_ENDIAN
  12.       Then Begin
  13.          MaskR:=$ff000000;
  14.          MaskG:=$00ff0000;
  15.          MaskB:=$0000ff00;
  16.          MaskA:=$000000ff;
  17.       End
  18.       Else Begin
  19.          MaskR:=$000000ff;
  20.          MaskG:=$0000ff00;
  21.          MaskB:=$00ff0000;
  22.          MaskA:=$ff000000;
  23.       End; }
  24.  
  25.    // Force SDL_LIL_ENDIAN
  26.    MaskR:=$000000ff;
  27.    MaskG:=$0000ff00;
  28.    MaskB:=$00ff0000;
  29.    MaskA:=$ff000000;
  30.  
  31.    PRed:=@Red;
  32.    PGreen:=@Green;
  33.    PBlue:=@Blue;
  34.    PAlpha:=@Alpha;
  35.  
  36.    With ASource^ Do ADestination:= SDL_CreateRGBSurface
  37.          (SDL_SWSURFACE,W,H,32,MaskR,MaskG,MaskB,MaskA);
  38.  
  39.    For Y:= 0 To ASource.H-1 Do
  40.       For X:= 0 To ASource.W-1 Do Begin
  41.          Pixel:= SDL_GetPixel(ASource,X,Y);
  42.  
  43.          SDL_GetRGBA(Pixel,ASource.Format,PRed,PGreen,PBlue,PAlpha);
  44.  
  45.          With AColor Do If (Red=R) And (Green=G) And (Blue=B)
  46.             Then Alpha:=0;
  47.  
  48.          //Pixel:=SDL_MapRGBA(ADestination.Format,Blue,Green,Red,Alpha);
  49.          Pixel:=SDL_MapRGBA(ADestination.Format,Red,Green,Blue,Alpha);
  50.          SDL_PutPixel(ADestination,X,Y,Pixel);
  51.       End;
  52. End;
  53.  


Ich arbeite auf einem nicht mehr ganz taufrischen Laptop mit Windows XP.

Hat das vielleicht mit dem Problem im obigen Beitrag zu tun? Das hab ich ausprobiert, hat aber nichts genutzt.

Vielleicht weiß ja einer was? >Hoff<
Traude

@edit: ich habe die Zuweisung der Zeiger (PRed:=@Red...., die ja nur einmal gemacht werden muss) aus der Schleife herausgenommen.

@edit2: habe die Zeile "Pixel:=SDL_MapRGBA(ADestination.Format,Blue,Green,Red,Alpha);" richtiggestellt. Wenn man SDL_MapRGBA aufruft, sollten die Farbanteile in der richtigen Reihenfolge kommen!


Zuletzt geändert von Traude am Do Nov 23, 2006 08:11, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 12, 2006 08:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo,
Ich habe folgendes gefunden:

In der sdl.pas gibt es in Zeile 412 die Sektion "{$IFDEF IA32}", eine bedingte Kompilierung, die entscheidet, ob SDL_BIG_ENDIAN oder SDL_LIL_ENDIAN genommen wird. Es ist mir aufgefallen, weil mein Code betreffend den SDL_LIL_ENDIAN (der für mich der richtige ist) ÜBERHAUPT NICHT KOMPILIERT WURDE.

Dieses IA32 ist aber nirgends definiert - zumindest bei mir nicht.

Ich habe die Anweisung "{$DEFINE IA32}" in der Jedi-SDL.inc nachgetragen, und zwar in der Sektion "{$IFDEF Win32}" und damit funktioniert es.

Diese Lösung ist zwar auch nicht korrekt, aber ich habe wenigstens nicht in der sdl.pas herummurksen müssen.
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 12, 2006 14:57 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Mit etwas Verspätung:

Du hast vermutlich eine veraltete Jedi-SDL.inc. Dort wurde das entsprechende vergessen. Die Jedis hatten es schnell behoben, aber die Version in dem ?vorletzen? Windows DGLSDK wurde von uns leider nicht upgedatet. Dazu gibt es auch eine News wo es auch einen Link zur aktuell von uns verwendeten Jedi-SDL.inc gibt.
Ansonsten ist wie gesagt die Version im Jedi-CVS ohne diesen Fehler.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 12, 2006 16:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo i0n0s,
Ich habe mir Eure neue jedi-sdl.inc herüberkopiert und Hurra, es funktioniert! Danke für den Tip. Ich habe es allerdings nicht mit den EasySDL-Fonts ausprobiert, sondern mit meinem eigenen Code. Allerdings habe ich Codeteile aus der Unit "easySDLFont" verwendet (auf die Idee, kleine Buchstabentexturen auf eine große Fonttextur zu kleben wäre ich alleine nie gekommen ***). Der Fehler war übrigens kaum zu merken: bei einer hellgrauen Textur war eine leichte Rotverschiebung zu sehen. Interessanterweise haben meine Schriften vorher auch gut funktioniert :D , nur leider nach der Fehlerbehebung klarerweise nicht mehr. Aber da ich jetzt schon Übung habe - hab ich's schon wieder hingekriegt.
Vielen Dank für Deine Antwort,
Traude

*** @edit: das musste ich einfach noch nachtragen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 08:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo,
ich muss noch schnell etwas nachfragen: in meiner Euphorie, dass es jetzt klaglos funktioniert, habe ich etwas Wichtiges übersehen: diese bedingten Kompilierungen, die ich mir mit der plattformübergreifenden SDL eingehandelt habe.

Das ganze bedeutet doch, dass derjenige, der das Programm benutzt, es auf der Maschine kompilieren muss, die er verwendet. Das heißt, man kann keine EXE übergeben, sondern nur den Sourcecode. Das stimmt doch, oder?
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 08:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du kannst mit FPC unter Linux sowie Linux als auch Windowsbinarys erzeugen.
Ansonsten müssen es die Leute für ihr OS kompilieren.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]