CreateDIBSection klappt, und nun direkt reinzeichnen - wie?



  • Moinsen,

    also ich habe mir ein DIB folgendermaßen gebaut:

    // DISection
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biWidth = myScreenSize.right;
    bmih.biHeight = myScreenSize.bottom;
    bmih.biPlanes = 1;
    bmih.biBitCount	= 32;
    bmih.biCompression = BI_RGB;
    bmih.biSizeImage = 0; //((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
    bmih.biXPelsPerMeter = 0;
    bmih.biYPelsPerMeter = 0;
    bmih.biClrUsed = 0;
    bmih.biClrImportant = 0;
    
    myBitmap = CreateDIBSection(NULL, (BITMAPINFO *) &bmih, 0, (void**)&pBits, NULL, 0);
    

    Funktioniert hervorragend und ich kann mit folgender Funktion rein zeichnen indem ich die DIBSection mit dem Handle "myBackbuffer" verknüpfe (wird später geblittet).

    static void drawpoints(struct state *st) {
        for (int i = 0; i < st->npoints; i++) {
            SetPixelV(myBackBuffer, st->pointbuf[i].x, st->pointbuf[i].y, st->colours[st->ccolour]);
        } 
        st->npoints = 0; // Pointbuffer zurücksetzen 
    }
    

    Allerdings ist mir SetPixel() verständlicherweise zu langsam. Daher versuche ich folgendes:

    static void drawpoints(struct state *st) {
        int h2; // Hilfsvariable
    
        // Anzahl der Felder für eine Zeile berechnen (mach ich das richtig?)
        int Zeile = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3);
    
        for (int i = 0; i < st->npoints; i++) {
            h2        = Zeile * st->pointbuf[i].y + (st->pointbuf[i].x * sizeof(COLORREF));
            // das sieht schon gut aus, allerdings noch mit Verschiebungen und Artefakten
    
            pBits[h2] = RGB(000,255,255); //pBits ist der Pointer auf die Daten der DIBSection
            // obwohl weiß angegeben zeichnet mein Programm alles Blau
    	}
    
    	st->npoints = 0;   // Pointbuffer zurücksetzen
    }
    

    Also ich kann aufgrund der ausgegebene Grafik erkennen, dass ich auf den richtigen Weg bin, aber gezeichnet wird alles in BLAU und mit einigen Artefakten und Verschiebungen.
    Hat sich nicht gerade jemand spontan abgelacht über meine Vorgehensweise? Na, dann her mit den guten Ideen 😉



  • S K A N D A L Ö S!
    Ein einfaches Minuszeichen beseitigt schonmal die Artefakte und Verschiebungen! Mann, wie kann man eine API anbieten die mal "top/right" mal "bottom/right" mit positiven Werten arbeitet.

    bmih.biHeight = -myScreenSize.bottom;  
    //             ^^^
    

    Bleibt nur noch zu klären, warum ich trotz Übergabe von RGB(255,255,255) alles in blau gezeichnet bekomme!



  • timmix schrieb:

    pBits[h2] = RGB(000,255,255); //pBits ist der Pointer auf die Daten der DIBSection
    

    Weil das nicht weiß ist?



  • nicht du schrieb:

    Weil das nicht weiß ist?

    Da hast du wohl recht, aber blau ist es immer noch nicht sondern Cyan (was nicht das richtige ist!).

    So geht es:

    int offset;
       int cxScanLine = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3);
       for (int i = 0; i < st->npoints; i++) {
       offset =  (cxScanLine * st->pointbuf[i].y) + (st->pointbuf[i].x * (sizeof(BYTE)) * 4);
    
        pBits[offset]   = 0x00;  // 0x00bbggrr (!)
        pBits[offset++] = st->b[st->ccolour];
        pBits[offset++] = st->g[st->ccolour];
        pBits[offset++] = st->r[st->ccolour];
    }
    

    Richtig verstanden habe ich das noch nicht!


Anmelden zum Antworten