Fehler im Bitmap Code
-
Hallo,
zuerst einmal alle Achtung vor diesem tollen Projekt. Ich interessiere mich seit Jahren für OS development und finde PrettyOS ist wirklich mal eine Ausnahme unter den milliarden HobbyOS Versionen.Nun zum Thema:
Ich war daran interessiert mal mit dem VBE Modus rumzuspielen. PrettyOS kam mir da gerade recht, weil es auf anhieb funktionierte.Ich habe dann double buffering implementiert, was auch nicht sonderlich schwer war und zu meiner Überraschung auch noch recht schnell :). Allerdings ist mir ein kleiner Fehler im Bitmap code aufgefallen. Leider habe ich bis jetzt noch keine Lösung gefunden.
Schaut euch mal den Cursor genauer an, bzw das Test BMP. In der rechten oberen Ecke sind immer Fehlerpixel zu sehen. Sogar in einem komplett weißen Bild werden schwarze Pixel angezeigt. Weiß jemand woher das kommt?
-
Ich hab jetzt auch noch eine weitere Frage, und zwar habe ich eine Datei auf mein Image gepackt (im RootDir) und versuche diese per fopen zu öffnen. Leider schlägt jenes, egal was ich mache fehl! In der Doku steht nur standard C syntax. Gibts da irgendwas zu beachten? Der findet meine Datei einfach nicht, der file_t pointer ist immer null :(.
-
zuerst einmal alle Achtung vor diesem tollen Projekt. Ich interessiere mich seit Jahren für OS development und finde PrettyOS ist wirklich mal eine Ausnahme unter den milliarden HobbyOS Versionen.
Zunächst mal vielen Dank für das positive Feedback.
Deinen Fragen werden wir nachgehen.
-
Dankesehr, der fopen sache bin ich selbst auf den Grund gekommen:
Durch Zufall hab ich gesehen, dass man in prettyos das Laufwerk mitangeben muss!fopen("1:/SMILE.TGA","r");
Läd also die Datei SMILE.TGA aus dem RootDir der Floppy. Gut dass ich das jetzt weiß
-
Bevor ich ins Bett gehe präsentiere ich noch eben einen von mir angepassten TGA Loader der mit PrettyOS so läuft (zumindest bei mir :))
typedef unsigned char byte; typedef struct Image_t { int width; int height; int bpp; unsigned char *data; } Image; Image* LoadTGA(char *filename) { byte TGAcompare[12]; byte header[6]; int imageSize; Image *tempImage=0; file_t *File; int t, i; tempImage =(Image*)malloc(sizeof(Image),0,"tga1"); File = fopen(filename, "r"); if (fread(TGAcompare,1,sizeof(TGAcompare),File)!=sizeof(TGAcompare)+1) return 0; if (fread(header,1,sizeof(header),File)!=sizeof(header)+1) return 0; tempImage->width = header[1] * 256 + header[0]; tempImage->height = header[3] * 256 + header[2]; tempImage->bpp = header[4]; imageSize = tempImage->width*tempImage->height*tempImage->bpp/8; tempImage->data = (byte *) malloc ( imageSize ,0,"tga2"); if (fread(tempImage->data, 1, imageSize, File) != (unsigned int)imageSize+1) { free (tempImage->data); } for (i = 0;i<imageSize;i+= tempImage->bpp/8) { t = tempImage->data[i]; tempImage->data[i] = tempImage->data[i+2]; tempImage->data[i+2] = t; } fclose (File); return tempImage; } void drawTGA(int X,int Y,Image *pic) { int x=0,y=0; BGRA_t temp; for(x=0;x<pic->width;x++) { for(y=0;y<pic->height;y++) { temp.red = pic->data[x*3 + (pic->width*y*3)]; temp.green =pic->data[x*3 + (pic->width*y*3)+1]; temp.blue =pic->data[x*3 + (pic->width*y*3)+2]; temp.alpha = 255; vbe_setPixel(x+X,(pic->height-y)+Y,temp); } } }
Das ganze lässt sich wie folgt aufrufen:
Image *test=0; test=LoadTGA("1:/TEST.TGA"); drawTGA(100,100,test);
Der Alphakanal der TGA wird nicht ausgelesen, kann man aber noch zufügen. Dann kann man noch sehr schön blenden. Vielleicht hat jemand spaß damit.
-
Danke für den Beitrag! Wenn Du Lust hast, kannst Du gerne bei uns mitmischen als Developer. Schau doch mal im IRC-Server irc.euirc.net im Channel #PrettyOS vorbei.
-
Hier der komplette TGA Header von 18 byte:
typedef struct { byte identsize; // size of ID field that follows 18 byte header (0 usually) byte colourmaptype; // type of colour map 0=none, 1=has palette byte imagetype; // type of image 0=none,1=indexed,2=rgb,3=grey,+8=rle packed short colourmapstart; // first colour map entry in palette short colourmaplength; // number of colours in palette byte colourmapbits; // number of bits per palette entry 15,16,24,32 short xstart; // image x origin short ystart; // image y origin short width; // image width in pixels short height; // image height in pixels byte bits; // image bits per pixel 8,16,24,32 byte descriptor; // image descriptor bits (vh flip bits) // pixel data follows header } TGA_HEADER