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 :(.


  • Mod

    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.


  • Mod

    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
    

Anmelden zum Antworten