GXS.FilePNG.pas 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit GXS.FilePNG;
  5. interface
  6. {$I Stage.Defines.inc}
  7. uses
  8. Winapi.OpenGL,
  9. Winapi.OpenGLext,
  10. System.Classes,
  11. System.SysUtils,
  12. GXS.Context,
  13. GXS.Graphics,
  14. Stage.TextureFormat,
  15. GXS.ApplicationFileIO;
  16. type
  17. TgxPNGImage = class(TgxBaseImage)
  18. private
  19. public
  20. class function Capabilities: TDataFileCapabilities; override;
  21. procedure LoadFromFile(const filename: string); override;
  22. procedure SaveToFile(const filename: string); override;
  23. procedure LoadFromStream(stream: TStream); override;
  24. procedure SaveToStream(stream: TStream); override;
  25. // Assigns from any Texture
  26. procedure AssignFromTexture(textureContext: TgxContext;
  27. const textureHandle: GLuint;
  28. textureTarget: TglTextureTarget;
  29. const CurrentFormat: Boolean;
  30. const intFormat: TglInternalFormat); reintroduce;
  31. end;
  32. //==============================================================
  33. implementation
  34. //==============================================================
  35. // ------------------
  36. // ------------------ TgxPNGImage ------------------
  37. // ------------------
  38. procedure TgxPNGImage.LoadFromFile(const filename: string);
  39. var
  40. fs: TStream;
  41. begin
  42. if FileStreamExists(fileName) then
  43. begin
  44. fs := TFileStream.Create(fileName, fmOpenRead);
  45. try
  46. LoadFromStream(fs);
  47. finally
  48. fs.Free;
  49. ResourceName := filename;
  50. end;
  51. end
  52. else
  53. raise EInvalidRasterFile.CreateFmt('File %s not found', [filename]);
  54. end;
  55. procedure TgxPNGImage.SaveToFile(const filename: string);
  56. var
  57. fs: TStream;
  58. begin
  59. fs := TFileStream.Create(fileName, fmOpenWrite or fmCreate);
  60. try
  61. SaveToStream(fs);
  62. finally
  63. fs.Free;
  64. end;
  65. ResourceName := filename;
  66. end;
  67. procedure TgxPNGImage.LoadFromStream(stream: TStream);
  68. begin
  69. //Do nothing
  70. end;
  71. procedure TgxPNGImage.SaveToStream(stream: TStream);
  72. begin
  73. //Do nothing
  74. end;
  75. procedure TgxPNGImage.AssignFromTexture(textureContext: TgxContext;
  76. const textureHandle: GLuint;
  77. textureTarget: TglTextureTarget;
  78. const CurrentFormat: Boolean;
  79. const intFormat: TglInternalFormat);
  80. var
  81. oldContext: TgxContext;
  82. contextActivate: Boolean;
  83. texFormat: Cardinal;
  84. residentFormat: TglInternalFormat;
  85. glTarget: GLEnum;
  86. begin
  87. if not ((textureTarget = ttTexture2D)
  88. or (textureTarget = ttTextureRect)) then
  89. Exit;
  90. oldContext := CurrentContext;
  91. contextActivate := (oldContext <> textureContext);
  92. if contextActivate then
  93. begin
  94. if Assigned(oldContext) then
  95. oldContext.Deactivate;
  96. textureContext.Activate;
  97. end;
  98. glTarget := DecodeTextureTarget(textureTarget);
  99. try
  100. textureContext.gxStates.TextureBinding[0, textureTarget] := textureHandle;
  101. fLevelCount := 0;
  102. fCubeMap := false;
  103. fTextureArray := false;
  104. // Check level existence
  105. glGetTexLevelParameteriv(glTarget, 0, GL_TEXTURE_INTERNAL_FORMAT,
  106. @texFormat);
  107. if texFormat > 1 then
  108. begin
  109. glGetTexLevelParameteriv(glTarget, 0, GL_TEXTURE_WIDTH, @FLOD[0].Width);
  110. glGetTexLevelParameteriv(glTarget, 0, GL_TEXTURE_HEIGHT, @FLOD[0].Height);
  111. FLOD[0].Depth := 0;
  112. residentFormat := OpenGLFormatToInternalFormat(texFormat);
  113. if CurrentFormat then
  114. fInternalFormat := residentFormat
  115. else
  116. fInternalFormat := intFormat;
  117. FindCompatibleDataFormat(fInternalFormat, fColorFormat, fDataType);
  118. Inc(fLevelCount);
  119. end;
  120. if fLevelCount > 0 then
  121. begin
  122. fElementSize := GetTextureElementSize(fColorFormat, fDataType);
  123. ReallocMem(FData, DataSize);
  124. glGetTexImage(glTarget, 0, fColorFormat, fDataType, fData);
  125. end
  126. else
  127. fLevelCount := 1;
  128. /// CheckOpenGLError;
  129. finally
  130. if contextActivate then
  131. begin
  132. textureContext.Deactivate;
  133. if Assigned(oldContext) then
  134. oldContext.Activate;
  135. end;
  136. end;
  137. end;
  138. class function TgxPNGImage.Capabilities: TDataFileCapabilities;
  139. begin
  140. Result := [dfcRead, dfcWrite];
  141. end;
  142. //----------------------------------------------------------
  143. initialization
  144. //----------------------------------------------------------
  145. // Register this Fileformat-Handler with GXScene
  146. RegisterRasterFormat('png', 'Portable Network Graphic', TgxPNGImage);
  147. end.