[SDL/cairo] Warum kann ich 3 Byte auf 4 Byte ablegen?



  • Hi,

    ich habe kein wirkliches problem, aber mich würde mal interessieren warum das hier funktioniert:

    cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 100, 100);
    
    if(format == CAIRO_FORMAT_ARGB32) {
    		argb_surface = SDL_CreateRGBSurfaceFrom(
    				cairo_image_surface_get_data(surface), 
    				cairo_image_surface_get_width(surface), 
    				cairo_image_surface_get_height(surface), 
    				32, 
    				4 * cairo_image_surface_get_width(surface), 
    				0x00ff0000, 
    				0x0000ff00, 
    				0x000000ff, 
    				0xff000000);
    	}
    	else if(format == CAIRO_FORMAT_RGB24) { // Warum brauche ich die parameter hier nicht anpassen?
    		argb_surface = SDL_CreateRGBSurfaceFrom(
    				cairo_image_surface_get_data(surface), 
    				cairo_image_surface_get_width(surface), 
    				cairo_image_surface_get_height(surface), 
    				32, // Sollte hier nicht 24 stehen?
    				4 * cairo_image_surface_get_width(surface), // und sollte hier nicht 3*... stehen?
    				0x00ff0000, 
    				0x0000ff00, 
    				0x000000ff,
    				0x00000000);
    	}
    

    Ich wollte eine cairo surface auf eine SDL_Surface abbilden. Im ersten fall (CAIRO_FORMAT_ARGB32) ist das ganze ja noch ziemlich logisch. Ich verstehe aber nicht warum der zweite fall nur so funktioniert wie es dort steht. Wenn ich es so mache wie ich in den kommentaren geschreiben habe dann kommt es zu bildfehlern. Meine frage also: Warum?

    Gruß,
    Prophet



  • ich denke, es liegt am alignment deines compilers. Prozessoren können schneller auf Adressen zugreifen, die durch 4 teilbar sind. Daher wird deine Struktur, die RGB24 darstellt auch 4 Byte groß sein, obwohl davon nur 3 byte genutzt werden.

    Aber verlass dich da nciht drauf 🙂 Das kann bei jeder implementierung anders sein. Aber vielleicht macht das cairo auch selber so, eben aus genanntem Grund.



  • Ich sollte nicht immer so vorschnell sein...

    Vielen dank für deine hilfe!


Anmelden zum Antworten