with GID, ada.Calendar; package body openGL.Images is function fetch_Image (Stream : in Ada.Streams.Stream_IO.Stream_Access; try_TGA : in Boolean) return openGL.Image is the_GID_Image : GID.Image_descriptor; next_Frame : Ada.Calendar.Day_Duration := 0.0; begin GID.Load_image_header (the_GID_Image, Stream.all, try_TGA); declare Image_Width : constant Positive := GID.Pixel_Width (the_GID_Image); Image_Height : constant Positive := GID.Pixel_height (the_GID_Image); the_Image : openGL.Image (1 .. Index_t (Image_Height), 1 .. Index_t (Image_Width)); procedure Load_raw_image is subtype Primary_color_range is GL.glUByte; Row, Col : Index_t; procedure set_X_Y (x, y : Natural) is begin Col := Index_t (X + 1); Row := Index_t (Y + 1); end set_X_Y; procedure put_Pixel (Red, Green, Blue : primary_Color_Range; Alpha : primary_Color_Range) is use type GL.glUByte, Real; pragma Warnings (Off, Alpha); -- Alpha is just ignored. begin the_Image (Row, Col) := (Red, Green, Blue); if Col = Index_t (Image_Width) then -- GID requires us to look to next pixel on the right for next time. Row := Row + 1; Col := 1; else Col := Col + 1; end if; end put_Pixel; procedure Feedback (Percents : Natural) is null; procedure Load_image is new GID.load_Image_contents (primary_Color_Range, set_X_Y, put_Pixel, Feedback, GID.fast); begin load_Image (the_GID_Image, next_Frame); end load_raw_Image; begin load_raw_Image; return the_Image; end; end fetch_Image; end openGL.Images;