 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Bimi
Anmeldungsdatum: 03.12.2007 Beiträge: 66
|
Verfasst am: 19.12.2007, 16:33 Titel: |
|
|
dreael hat Folgendes geschrieben: | Aus gutem Grund sollte man, wenn man zwischen 24 bpp und 32 bpp in Windows unter "Systemsteuerung"/"Anzeige", "Einstellungen" wählen kann, der Variante 32 bpp den Vorzug geben, weil dort ein Pixel in einem Rutsch und Speicheradresse verarbeitet werden kann.
Sonst zum Titelthema und Performance: An und für sich wäre dies ein Stück weit auch ein Fall für Typ-Casting (in C/C++ mit dem bekannten Cast-Operator "(typ *)Ausdruck" abgedeckt, in QB die gesamte MKx$()/CVx()-Funktionenfamilie), d.h. man bildet den RGB-TYPE-Record genau so ab, dass die Byte-Farbkomponenten korrekt im Speicher liegen. Falls FreeBasic über C/C++-ähnliche Pointer verfügt, müsste Typen-Casting problemlos möglich sein.
Typencasting ist aber generell kein schöner Programmierstil, wenn das Ganze möglich portierbar auf unterschiedlichen Plattformen sein soll, weil man dort doch sehr stark plattformspezifische Implementationseigenschaften ausnutzt. An dieser Stelle sind die FreeBasic-Gurus sämtlicher Plattformen nun gefragt, ob sich POINT() 100% identisch auf jeder Plattform (Winodws, Linux, UNIX, Mac usw.) verhält und nicht etwa, dass auf der einen der Rot-Anteil das niederwertigste Byte belegt, während auf einer anderen Plattform der Blauanteil oder gar Alpha-Kanal dort liegt. |
In C bietet sich die Verwendung einer UNION an:
Code: |
#define RED 0x03
#define GREEN 0x02
#define BLUE 0x01
#deinfe ALPHA 0x00
typedef union _rgbvalue {
unsigned integer intrgb;
unsigned char brgb[4];
} RGBValue;
...
RGBValue pixel;
pixel.intrgb = <irgendein 32 Bit Integer>
pixel.brgb[RED] // rotanteil
|
...damit ist auch gewährleistet das die Bytes hintereinander im Speicher liegen und ich brauche nicht casten.
Die böse Falle dabei ist nur das viele Compiler auf einer 64 Bit Plattform für int nicht mehr 32, sondern 64 Bit vorsehen und damit diese Union kippen (hatte ich erst das Problem bei einer Portierung).
Solange FreeBasic nur unter DOS, Windows und Linux x86 läuft, existiert das Byteorderproblem nicht.
Des weiteren ist die Reihenfolge eines BP32 als RGBA fest gelegt.
Windows kennt intern kein 24bpp Modus, sondern nur 32bpp. 24 Bit wurden eingestellt um die Datenmenge für die Übertragung zur Graphikhardware um 25% zu reduzieren. Damals wurde der Alphakanal nicht verwendet und konnte einfach abgeschnitten werden. Das passiet auch nicht in Windows, sondern dem Treiber der Grafikkarte. _________________ Rechtbehelf:
Rechschreibverfehlungen, Vergehen an der Deutschen Sprache sowie Stabwechselverbuchselungen unterliegen dem Urheberrecht, sind voll beabsichtigt und fördern das aufmerksame Lesen. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 07.01.2008, 17:02 Titel: |
|
|
Hmm.. ist wahrscheinlich nur ziemlich amateurhaft gedacht... aber ich stells mal als frage in den raum:
Ein Pixel hat bei 32bit farbtiefe 4byte.
in der Reihenfolge Rot, Grün, Blau, Alpha... Das haben wir ja alle schon mit der muttermilch gelernt
Wenn ich nun eine Addresse im Speicher zu einem Pixel kenne, dann kann ich diese Addresse per pointer auslesen. D.h. ich bekomme per pointer die startadresse im speicher wo ich mit der länge von 4byte den Farbwert wiederfinde.
Kann ich dann nicht mittels pointer hingehen und die einzelnen bytes aus dem speicher lesen? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.01.2008, 17:14 Titel: |
|
|
ja... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|