Results 1 to 7 of 7

Thread: SDL2 Help geting rgb colors

  1. #1

    Smile SDL2 Help geting rgb colors

    using free pascal 2.6.2 (32) not (64)
    with sdl2 and portaudio
    windows 7


    Im developing an audio visualizer, have gotten the oscilliscope working, but unfortunately I cannot figure out how to get the sdl_getrgb to work have no examples on the net about this( none for pascal just c which i can not make heads or tails of lol). I was able to figure out how to do it in sdl1 but Im not wanting to reprogram back to sdl1 so any one able to help me with a simple example of how to retrieve r g b color values from the x,y position in SDL2 would be great, im sure others would like to know as well. Thanks in advance to who ever can help with this. I plan to release my source code on sourceforge when it is complete.

  2. #2
    If you point us to C based example we might be able to help you translate it to Pascal.

  3. #3
    Uint32 getpixel(SDL_Surface *surface, int num)
    {/*pxl direct read access*//**1.0**/

    int bpp = surface->format->BytesPerPixel;
    /* P est l'adresse du pixel à retrouver*/
    uint8_t *p = (uint8_t *)surface->pixels + num * bpp;

    switch(bpp) {
    case 1:
    return *p;

    case 2:
    return *(Uint16 *)p;

    case 3:
    if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
    return p[0] << 16 | p[1] << 8 | p[2];
    else
    return p[0] | p[1] << 8 | p[2] << 16;

    case 4:
    return *(Uint32 *)p;

    default:
    return 0;
    }
    }

    best i could find for now... most other get_rgb sources i found were not reading from the screen i believe this is. this looks like it returns rgb if im understanding this.
    Last edited by siv@; 10-01-2015 at 07:34 AM. Reason: update

  4. #4

    Smile

    I hope the previous code works not sure how it returns the rgb, i cant find much source on sdl2's get_rgb or get_rgba..thanks again would like to use those functions but im not sure how to yet maybe someone has figured it out...any help is appreciated. If i can get the previous posted code to work then good enough for now.

  5. #5
    I can't test this code, but it seems something like:

    Code:
    function getpixel(surface: SDL_Surface; num: integer): cardinal;
    var bpp: integer;
         p: PByte;
    begin
        bpp := surface.format.BytesPerPixel;
        p := pointer(surface.pixels + num * bpp); 
        case bpp of
          1: result := p^;
          2: result := PWord(p)^;
          3: begin
            if (SDL_BYTEORDER = SDL_BIG_ENDIAN)
                result := p[0] shl 16 or p[1] shl 8 or p[2]
            else
                result := p[0] or p[1] shl 8 or p[2] shl 16;
          end;
          4: result := PCardinal(p)^;
          default: result := 0;
        end;
    end;
    edit: If you have the pixel, you can try this function
    http://www.libsdl.org/release/SDL-1....sdlgetrgb.html
    or
    http://www.libsdl.org/release/SDL-1....dlgetrgba.html
    Last edited by User137; 10-01-2015 at 11:08 AM.

  6. #6
    I had trouble compiling this didnt like sdl_surface, wanted psdl_surface, so i tried that but on the bpp := line it stops compiling said invalid types got psdl_surface expected longint so I think the translation is right the original code or the variables for the pascal headers im using are a bit different the the c version no idea. Thanks for the translation. I think im going to have to use sdl1 I cant figure out how to get the pixel for getrgb or getrgba. If i figure it out some how I will post my results here.

  7. #7
    PGDCE Developer Carver413's Avatar
    Join Date
    Jun 2010
    Location
    Spokane,WA,Usa
    Posts
    206
    Sdl surfaces are hardware excelerated and not easy to do pixel access perhaps this will provide a better option http://www.programmersranch.com/2014...l-drawing.html

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •