GXS.FilePGM.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. //
  2. // Graphic Scene Engine, http://glscene.org
  3. //
  4. unit GXS.FilePGM;
  5. {$I Stage.Defines.inc}
  6. interface
  7. uses
  8. System.Classes, System.SysUtils,
  9. Winapi.OpenGL, Winapi.OpenGLext,
  10. GXS.Context, GXS.Graphics, Stage.TextureFormat,
  11. GXS.ApplicationFileIO;
  12. type
  13. TgxPGMImage = class(TgxBaseImage)
  14. public
  15. class function Capabilities: TDataFileCapabilities; override;
  16. procedure LoadFromFile(const filename: string); override;
  17. procedure SaveToFile(const filename: string); override;
  18. procedure LoadFromStream(stream: TStream); override;
  19. procedure SaveToStream(stream: TStream); override;
  20. procedure AssignFromTexture(textureContext: TgxContext;
  21. const textureHandle: GLEnum; textureTarget: TgxTextureTarget;
  22. const CurrentFormat: Boolean; const intFormat: TgxInternalFormat);
  23. reintroduce;
  24. end;
  25. implementation
  26. uses
  27. GXS.CUDAUtility;
  28. // ------------------
  29. // ------------------ TgxPGMImage ------------------
  30. // ------------------
  31. // LoadFromFile
  32. //
  33. procedure TgxPGMImage.LoadFromFile(const filename: string);
  34. var
  35. w, h: Integer;
  36. cutBuffer: System.PSingle;
  37. begin
  38. if FileExists(filename) then
  39. begin
  40. if not IsCUTILInitialized then
  41. if not InitCUTIL then
  42. begin
  43. EInvalidRasterFile.Create(cCUTILFailed);
  44. exit;
  45. end;
  46. cutBuffer := nil;
  47. if cutLoadPGMf(PAnsiChar(AnsiString(filename)), cutBuffer, w, h) then
  48. begin
  49. ResourceName := filename;
  50. UnMipmap;
  51. FLOD[0].Width := w;
  52. FLOD[0].Height := h;
  53. FLOD[0].Depth := 0;
  54. fColorFormat := GL_LUMINANCE;
  55. fInternalFormat := tfLUMINANCE_FLOAT32;
  56. fDataType := GL_FLOAT;
  57. fCubeMap := false;
  58. fTextureArray := false;
  59. fElementSize := GetTextureElementSize(tfLUMINANCE_FLOAT32);
  60. ReallocMem(fData, DataSize);
  61. Move(cutBuffer^, fData^, DataSize);
  62. cutFree(cutBuffer);
  63. end;
  64. end
  65. else
  66. raise EInvalidRasterFile.CreateFmt('File %s not found', [filename]);
  67. end;
  68. // SaveToFile
  69. //
  70. procedure TgxPGMImage.SaveToFile(const filename: string);
  71. begin
  72. if not IsCUTILInitialized then
  73. if not InitCUTIL then
  74. begin
  75. EInvalidRasterFile.Create(cCUTILFailed);
  76. exit;
  77. end;
  78. if not cutSavePGMf(PAnsiChar(AnsiString(filename)), System.PSingle(fData),
  79. FLOD[0].Width, FLOD[0].Height) then
  80. raise EInvalidRasterFile.Create('Saving to file failed');
  81. end;
  82. procedure TgxPGMImage.LoadFromStream(stream: TStream);
  83. begin
  84. Assert(false, 'Stream loading not supported');
  85. end;
  86. procedure TgxPGMImage.SaveToStream(stream: TStream);
  87. begin
  88. Assert(false, 'Stream saving not supported');
  89. end;
  90. // AssignFromTexture
  91. //
  92. procedure TgxPGMImage.AssignFromTexture(textureContext: TgxContext;
  93. const textureHandle: GLEnum; textureTarget: TgxTextureTarget;
  94. const CurrentFormat: Boolean; const intFormat: TgxInternalFormat);
  95. var
  96. oldContext: TgxContext;
  97. contextActivate: Boolean;
  98. texFormat: Cardinal;
  99. residentFormat: TgxInternalFormat;
  100. glTarget: GLEnum;
  101. begin
  102. if not((textureTarget = ttTexture2D) or (textureTarget = ttTextureRect)) then
  103. exit;
  104. oldContext := CurrentVXContext;
  105. contextActivate := (oldContext <> textureContext);
  106. if contextActivate then
  107. begin
  108. if Assigned(oldContext) then
  109. oldContext.Deactivate;
  110. textureContext.Activate;
  111. end;
  112. glTarget := DecodeTextureTarget(textureTarget);
  113. try
  114. textureContext.gxStates.TextureBinding[0, textureTarget] := textureHandle;
  115. fLevelCount := 0;
  116. fCubeMap := false;
  117. fTextureArray := false;
  118. fColorFormat := GL_LUMINANCE;
  119. fDataType := GL_FLOAT;
  120. // Check level existence
  121. glGetTexLevelParameteriv(glTarget, 0, GL_TEXTURE_INTERNAL_FORMAT,
  122. @texFormat);
  123. if texFormat > 1 then
  124. begin
  125. glGetTexLevelParameteriv(glTarget, 0, GL_TEXTURE_WIDTH, @FLOD[0].Width);
  126. glGetTexLevelParameteriv(glTarget, 0, GL_TEXTURE_HEIGHT,
  127. @FLOD[0].Height);
  128. FLOD[0].Depth := 0;
  129. residentFormat := OpenGLFormatToInternalFormat(texFormat);
  130. if CurrentFormat then
  131. fInternalFormat := residentFormat
  132. else
  133. fInternalFormat := intFormat;
  134. Inc(fLevelCount);
  135. end;
  136. if fLevelCount > 0 then
  137. begin
  138. fElementSize := GetTextureElementSize(fColorFormat, fDataType);
  139. ReallocMem(fData, DataSize);
  140. glGetTexImage(glTarget, 0, fColorFormat, fDataType, fData);
  141. end
  142. else
  143. fLevelCount := 1;
  144. CheckOpenGLError;
  145. finally
  146. if contextActivate then
  147. begin
  148. textureContext.Deactivate;
  149. if Assigned(oldContext) then
  150. oldContext.Activate;
  151. end;
  152. end;
  153. end;
  154. // Capabilities
  155. //
  156. class function TgxPGMImage.Capabilities: TDataFileCapabilities;
  157. begin
  158. Result := [dfcRead, dfcWrite];
  159. end;
  160. initialization
  161. { Register this Fileformat-Handler }
  162. RegisterRasterFormat('pgm', 'Portable Graymap', TgxPGMImage);
  163. end.