|
|
@@ -245,22 +245,22 @@ unit glBitmap; |
|
|
|
// If you enable SDL_image all other libraries will be ignored! |
|
|
|
{.$DEFINE GLB_SDL_IMAGE} |
|
|
|
|
|
|
|
// activate to enable png support with the unit pngimage. You can download it from http://pngdelphi.sourceforge.net/ |
|
|
|
// PNG ///////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
// activate to enable png support with the unit pngimage -> http://pngdelphi.sourceforge.net/ |
|
|
|
// if you enable pngimage the libPNG will be ignored |
|
|
|
{.$DEFINE GLB_PNGIMAGE} |
|
|
|
|
|
|
|
// activate to use the libPNG http://www.libpng.org/ |
|
|
|
// You will need an aditional header. |
|
|
|
// http://www.opengl24.de/index.php?cat=header&file=libpng |
|
|
|
{$DEFINE GLB_LIB_PNG} |
|
|
|
// activate to use the libPNG -> http://www.libpng.org/ |
|
|
|
// You will need an aditional header -> http://www.opengl24.de/index.php?cat=header&file=libpng |
|
|
|
{.$DEFINE GLB_LIB_PNG} |
|
|
|
|
|
|
|
// JPEG //////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
// if you enable delphi jpegs the libJPEG will be ignored |
|
|
|
{.$DEFINE GLB_DELPHI_JPEG} |
|
|
|
|
|
|
|
// activateto use the libJPEG http://www.ijg.org/ |
|
|
|
// You will need an aditional header. |
|
|
|
// http://www.opengl24.de/index.php?cat=header&file=libjpeg |
|
|
|
{.$DEFINE GLB_LIB_JPEG} |
|
|
|
// activate to use the libJPEG -> http://www.ijg.org/ |
|
|
|
// You will need an aditional header -> http://www.opengl24.de/index.php?cat=header&file=libjpeg |
|
|
|
{$DEFINE GLB_LIB_JPEG} |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
@@ -1777,17 +1777,10 @@ begin |
|
|
|
result := result + [ftPNG]; |
|
|
|
{$ENDIF} |
|
|
|
|
|
|
|
(* TODO |
|
|
|
{$IFDEF GLB_SUPPORT_JPEG_WRITE} |
|
|
|
if Format in [ |
|
|
|
tfAlpha4, tfAlpha8, tfAlpha12, tfAlpha16, |
|
|
|
tfLuminance4, tfLuminance8, tfLuminance12, tfLuminance16, |
|
|
|
tfR3G3B2, tfRGB4, tfRGB5, tfRGB8, tfRGB10, tfRGB12, tfRGB16, |
|
|
|
tfDepth16, tfDepth24, tfDepth32] |
|
|
|
then |
|
|
|
if aFormat in [tfAlpha8, tfLuminance8, tfRGB8, tfBGR8] then |
|
|
|
result := result + [ftJPEG]; |
|
|
|
{$ENDIF} |
|
|
|
*) |
|
|
|
end; |
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
@@ -5543,7 +5536,7 @@ begin |
|
|
|
try |
|
|
|
// signature |
|
|
|
StreamPos := aStream.Position; |
|
|
|
aStream.Read(signature, 8); |
|
|
|
aStream.Read(signature{%H-}, 8); |
|
|
|
aStream.Position := StreamPos; |
|
|
|
|
|
|
|
if png_check_sig(@signature, 8) <> 0 then begin |
|
|
@@ -5906,6 +5899,35 @@ type |
|
|
|
DestBuffer: array [1..4096] of byte; |
|
|
|
end; |
|
|
|
|
|
|
|
procedure glBitmap_libJPEG_error_exit(cinfo: j_common_ptr); cdecl; |
|
|
|
begin |
|
|
|
//DUMMY |
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
procedure glBitmap_libJPEG_output_message(cinfo: j_common_ptr); cdecl; |
|
|
|
begin |
|
|
|
//DUMMY |
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
procedure glBitmap_libJPEG_init_source(cinfo: j_decompress_ptr); cdecl; |
|
|
|
begin |
|
|
|
//DUMMY |
|
|
|
end; |
|
|
|
|
|
|
|
procedure glBitmap_libJPEG_term_source(cinfo: j_decompress_ptr); cdecl; |
|
|
|
begin |
|
|
|
//DUMMY |
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
procedure glBitmap_libJPEG_init_destination(cinfo: j_compress_ptr); cdecl; |
|
|
|
begin |
|
|
|
//DUMMY |
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
function glBitmap_libJPEG_fill_input_buffer(cinfo: j_decompress_ptr): boolean; cdecl; |
|
|
|
var |
|
|
@@ -6024,12 +6046,14 @@ var |
|
|
|
jpeg: jpeg_decompress_struct; |
|
|
|
jpeg_err: jpeg_error_mgr; |
|
|
|
|
|
|
|
IntFormat: TglBitmapInternalFormat; |
|
|
|
IntFormat: TglBitmapFormat; |
|
|
|
pImage: pByte; |
|
|
|
TempHeight, TempWidth: Integer; |
|
|
|
|
|
|
|
pTemp: pByte; |
|
|
|
Row: Integer; |
|
|
|
|
|
|
|
FormatDesc: TFormatDescriptor; |
|
|
|
begin |
|
|
|
result := false; |
|
|
|
|
|
|
@@ -6038,18 +6062,18 @@ begin |
|
|
|
|
|
|
|
try |
|
|
|
// reading first two bytes to test file and set cursor back to begin |
|
|
|
StreamPos := Stream.Position; |
|
|
|
Stream.Read(Temp[0], 2); |
|
|
|
Stream.Position := StreamPos; |
|
|
|
StreamPos := aStream.Position; |
|
|
|
aStream.Read({%H-}Temp[0], 2); |
|
|
|
aStream.Position := StreamPos; |
|
|
|
|
|
|
|
// if Bitmap then read file. |
|
|
|
if ((Temp[0] = $FF) and (Temp[1] = $D8)) then begin |
|
|
|
FillChar(jpeg, SizeOf(jpeg_decompress_struct), $00); |
|
|
|
FillChar(jpeg_err, SizeOf(jpeg_error_mgr), $00); |
|
|
|
FillChar(jpeg{%H-}, SizeOf(jpeg_decompress_struct), $00); |
|
|
|
FillChar(jpeg_err{%H-}, SizeOf(jpeg_error_mgr), $00); |
|
|
|
|
|
|
|
// error managment |
|
|
|
jpeg.err := jpeg_std_error(@jpeg_err); |
|
|
|
jpeg_err.error_exit := glBitmap_libJPEG_error_exit; |
|
|
|
jpeg_err.error_exit := glBitmap_libJPEG_error_exit; |
|
|
|
jpeg_err.output_message := glBitmap_libJPEG_output_message; |
|
|
|
|
|
|
|
// decompression struct |
|
|
@@ -6069,7 +6093,7 @@ begin |
|
|
|
pub.bytes_in_buffer := 0; // forces fill_input_buffer on first read |
|
|
|
pub.next_input_byte := nil; // until buffer loaded |
|
|
|
|
|
|
|
SrcStream := Stream; |
|
|
|
SrcStream := aStream; |
|
|
|
end; |
|
|
|
|
|
|
|
// set global decoding state |
|
|
@@ -6083,11 +6107,11 @@ begin |
|
|
|
JCS_GRAYSCALE: |
|
|
|
begin |
|
|
|
jpeg.out_color_space := JCS_GRAYSCALE; |
|
|
|
IntFormat := ifLuminance; |
|
|
|
IntFormat := tfLuminance8; |
|
|
|
end; |
|
|
|
else |
|
|
|
jpeg.out_color_space := JCS_RGB; |
|
|
|
IntFormat := ifRGB8; |
|
|
|
IntFormat := tfRGB8; |
|
|
|
end; |
|
|
|
|
|
|
|
// reading image |
|
|
@@ -6096,14 +6120,16 @@ begin |
|
|
|
TempHeight := jpeg.output_height; |
|
|
|
TempWidth := jpeg.output_width; |
|
|
|
|
|
|
|
FormatDesc := TFormatDescriptor.Get(IntFormat); |
|
|
|
|
|
|
|
// creating new image |
|
|
|
GetMem(pImage, FormatGetImageSize(glBitmapPosition(TempWidth, TempHeight), IntFormat)); |
|
|
|
GetMem(pImage, FormatDesc.GetSize(TempWidth, TempHeight)); |
|
|
|
try |
|
|
|
pTemp := pImage; |
|
|
|
|
|
|
|
for Row := 0 to TempHeight -1 do begin |
|
|
|
jpeg_read_scanlines(@jpeg, @pTemp, 1); |
|
|
|
Inc(pTemp, Trunc(FormatGetSize(IntFormat) * TempWidth)); |
|
|
|
Inc(pTemp, FormatDesc.GetSize(TempWidth, 1)); |
|
|
|
end; |
|
|
|
|
|
|
|
// finish decompression |
|
|
@@ -6162,9 +6188,9 @@ end; |
|
|
|
{$ENDIF} |
|
|
|
|
|
|
|
{$IFDEF GLB_SUPPORT_JPEG_WRITE} |
|
|
|
{$IF DEFEFINED(GLB_LIB_JPEG)} |
|
|
|
{$IF DEFINED(GLB_LIB_JPEG)} |
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
procedure TglBitmap.SaveJPEG(Stream: TStream); |
|
|
|
procedure TglBitmap.SaveJPEG(const aStream: TStream); |
|
|
|
var |
|
|
|
jpeg: jpeg_compress_struct; |
|
|
|
jpeg_err: jpeg_error_mgr; |
|
|
@@ -6186,18 +6212,18 @@ var |
|
|
|
|
|
|
|
begin |
|
|
|
if not (ftJPEG in FormatGetSupportedFiles(Format)) then |
|
|
|
raise EglBitmapUnsupportedInternalFormat.Create('SaveJpg - ' + UNSUPPORTED_INTERNAL_FORMAT); |
|
|
|
raise EglBitmapUnsupportedFormat.Create(Format); |
|
|
|
|
|
|
|
if not init_libJPEG then |
|
|
|
raise Exception.Create('SaveJPG - unable to initialize libJPEG.'); |
|
|
|
|
|
|
|
try |
|
|
|
FillChar(jpeg, SizeOf(jpeg_compress_struct), $00); |
|
|
|
FillChar(jpeg_err, SizeOf(jpeg_error_mgr), $00); |
|
|
|
FillChar(jpeg{%H-}, SizeOf(jpeg_compress_struct), $00); |
|
|
|
FillChar(jpeg_err{%H-}, SizeOf(jpeg_error_mgr), $00); |
|
|
|
|
|
|
|
// error managment |
|
|
|
jpeg.err := jpeg_std_error(@jpeg_err); |
|
|
|
jpeg_err.error_exit := glBitmap_libJPEG_error_exit; |
|
|
|
jpeg_err.error_exit := glBitmap_libJPEG_error_exit; |
|
|
|
jpeg_err.output_message := glBitmap_libJPEG_output_message; |
|
|
|
|
|
|
|
// compression struct |
|
|
@@ -6215,21 +6241,21 @@ begin |
|
|
|
pub.next_output_byte := @DestBuffer[1]; |
|
|
|
pub.free_in_buffer := Length(DestBuffer); |
|
|
|
|
|
|
|
DestStream := Stream; |
|
|
|
DestStream := aStream; |
|
|
|
end; |
|
|
|
|
|
|
|
// very important state |
|
|
|
jpeg.global_state := CSTATE_START; |
|
|
|
jpeg.image_width := Width; |
|
|
|
jpeg.image_height := Height; |
|
|
|
case InternalFormat of |
|
|
|
ifAlpha, ifLuminance, ifDepth8: begin |
|
|
|
case Format of |
|
|
|
tfAlpha8, tfLuminance8: begin |
|
|
|
jpeg.input_components := 1; |
|
|
|
jpeg.in_color_space := JCS_GRAYSCALE; |
|
|
|
jpeg.in_color_space := JCS_GRAYSCALE; |
|
|
|
end; |
|
|
|
ifRGB8, ifBGR8: begin |
|
|
|
tfRGB8, tfBGR8: begin |
|
|
|
jpeg.input_components := 3; |
|
|
|
jpeg.in_color_space := JCS_RGB; |
|
|
|
jpeg.in_color_space := JCS_RGB; |
|
|
|
end; |
|
|
|
end; |
|
|
|
|
|
|
@@ -6238,7 +6264,7 @@ begin |
|
|
|
jpeg_start_compress(@jpeg, true); |
|
|
|
pTemp := Data; |
|
|
|
|
|
|
|
if InternalFormat = ifBGR8 then |
|
|
|
if Format = tfBGR8 then |
|
|
|
GetMem(pTemp2, fRowSize) |
|
|
|
else |
|
|
|
pTemp2 := pTemp; |
|
|
@@ -6246,7 +6272,7 @@ begin |
|
|
|
try |
|
|
|
for Row := 0 to jpeg.image_height -1 do begin |
|
|
|
// prepare row |
|
|
|
if InternalFormat = ifBGR8 then |
|
|
|
if Format = tfBGR8 then |
|
|
|
CopyRow(pTemp2, pTemp) |
|
|
|
else |
|
|
|
pTemp2 := pTemp; |
|
|
@@ -6257,7 +6283,7 @@ begin |
|
|
|
end; |
|
|
|
finally |
|
|
|
// free memory |
|
|
|
if InternalFormat = ifBGR8 then |
|
|
|
if Format = tfBGR8 then |
|
|
|
FreeMem(pTemp2); |
|
|
|
end; |
|
|
|
jpeg_finish_compress(@jpeg); |
|
|
|