unit _PNG;

interface

uses OpenGL,pngimage, Graphics;

type
  PRGB = record        {тип для работы с цветом в битмапе}
   r,g,b:byte;
  end;
  TSline = array[0..1] of PRGB;   {линия пикселей}
  TAline = array[0..1] of byte;

function LoadPNGTexture(FileName: String; var TexIndex: Cardinal):pointer;

implementation


function GenTexture(Var pData: Pointer;Width: LongWord;Height: LongWord; var Texture: Cardinal): Boolean;
begin
 if (Assigned(pData)) then
    Result := True
  else
  begin
    Result := False;
    Halt(1);
  end;
  glGenTextures(1, @Texture);
  glBindTexture(GL_TEXTURE_2D, Texture);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  {Texture blends with object background}
//  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);  {Texture does NOT blend with object background}
//  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);  {Texture does NOT blend with object background}
//  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);  {Texture does NOT blend with object background}
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); { only first two can be used }
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); { all of the above can be used }
 // gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pData);  // Use when not wanting mipmaps to be built by openGL
end;


function LoadPNGTexture(FileName: String; var TexIndex: Cardinal):pointer;
Var
  i,j,BW,BH:integer;        {для циклов}
  png:TPNGObject;      {для работы с джепег картинками}
  P:^TSline;          {указатель для строк изображения - для прямой обработки цветов, разбиты на RGB}
  A:pByteArray;
  TA:array of byte;
  S:Pointer;
begin
 png:=TpngObject.Create;
 png.LoadFromFile(FileName);
 BW:=png.Width;
 BH:=png.Height;
 SetLength(TA,BW*BH*4);
 For j:=0 to BH-1 do {проходим все строки}
 begin
  P:=png.ScanLine[j]; {в указатель вносим начало массива - строки рисунка}
  if png.Transparent then
   A:=png.AlphaScanline[j];
  For i:=0 to BW-1 do {элементы в строке}
  begin
   TA[i*4+(BH-1-j)*BW*4+0]:=p[i].b;
   TA[i*4+(BH-1-j)*BW*4+1]:=p[i].g;
   TA[i*4+(BH-1-j)*BW*4+2]:=p[i].r;
   if png.Transparent then
    TA[i*4+(BH-1-j)*BW*4+3]:=a[i] else
    TA[i*4+(BH-1-j)*BW*4+3]:=255;
  end;
 end;
 S:=TA;
 GenTexture(S,BW,BH,TexIndex);
 png.Destroy;
end;

end.
