2020-12-08 18:40:34 +01:00
|
|
|
|
|
|
|
; pngwio.asm - functions for data output
|
|
|
|
|
|
|
|
; Last changed in libpng 1.6.24 [August 4, 2016]
|
|
|
|
; Copyright (c) 1998-2002,2004,2006-2014,2016 Glenn Randers-Pehrson
|
|
|
|
; (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
|
|
|
; (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
|
|
|
|
|
|
|
; This code is released under the libpng license.
|
|
|
|
; For conditions of distribution and use, see the disclaimer
|
|
|
|
; and license in png.inc
|
|
|
|
|
|
|
|
; This file provides a location for all output. Users who need
|
|
|
|
; special handling are expected to write functions that have the same
|
|
|
|
; arguments as these and perform similar functions, but that possibly
|
|
|
|
; use different output methods. Note that you shouldn't change these
|
|
|
|
; functions, but rather write replacement functions and then change
|
|
|
|
; them at run time with png_set_write_fn(...).
|
|
|
|
|
|
|
|
|
|
|
|
; Write the data to whatever output you are using. The default routine
|
|
|
|
; writes to a file pointer. Note that this routine sometimes gets called
|
|
|
|
; with very small lengths, so you should implement some kind of simple
|
|
|
|
; buffering if you are using unbuffered writes. This should never be asked
|
|
|
|
; to write more than 64K on a 16-bit machine.
|
|
|
|
|
|
|
|
;void (png_structrp png_ptr, bytep data, png_size_t length)
|
|
|
|
align 4
|
|
|
|
proc png_write_data uses edi, png_ptr:dword, p2data:dword, length:dword
|
|
|
|
; NOTE: write_data_fn must not change the buffer!
|
|
|
|
mov edi,[png_ptr]
|
|
|
|
cmp dword[edi+png_struct.write_data_fn],0
|
|
|
|
je @f ;if (..!=0)
|
|
|
|
stdcall dword[edi+png_struct.write_data_fn], edi, [p2data], [length]
|
|
|
|
jmp .end_f
|
|
|
|
@@: ;else
|
|
|
|
png_error edi, 'Call to NULL write function'
|
|
|
|
.end_f:
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
; This is the function that does the actual writing of data. If you are
|
|
|
|
; not writing to a standard C stream, you should create a replacement
|
|
|
|
; write_data function and use it at run time with png_set_write_fn(), rather
|
|
|
|
; than changing the library.
|
|
|
|
|
|
|
|
;void (png_structp png_ptr, bytep data, png_size_t length)
|
|
|
|
align 4
|
|
|
|
proc png_default_write_data uses eax edi, png_ptr:dword, p2data:dword, length:dword
|
|
|
|
; png_size_t check;
|
|
|
|
|
|
|
|
mov edi,[png_ptr]
|
|
|
|
cmp edi,0
|
|
|
|
je .end_f ;if (..==0) return
|
|
|
|
|
|
|
|
; check = fwrite(p2data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
|
|
|
|
|
|
|
|
; if (check != length)
|
|
|
|
; png_error(png_ptr, "Write Error");
|
|
|
|
.end_f:
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
; This function is called to output any data pending writing (normally
|
|
|
|
; to disk). After png_flush is called, there should be no data pending
|
|
|
|
; writing in any buffers.
|
|
|
|
|
|
|
|
;void (png_structrp png_ptr)
|
|
|
|
align 4
|
|
|
|
proc png_flush uses edi, png_ptr:dword
|
|
|
|
mov edi,[png_ptr]
|
|
|
|
cmp dword[edi+png_struct.output_flush_fn],0
|
|
|
|
je @f ;if (..!=..)
|
|
|
|
stdcall dword[edi+png_struct.output_flush_fn],edi
|
|
|
|
@@:
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
;void (png_structp png_ptr)
|
|
|
|
align 4
|
|
|
|
proc png_default_flush uses eax edi, png_ptr:dword
|
|
|
|
mov edi,[png_ptr]
|
|
|
|
cmp edi,0
|
|
|
|
je @f ;if (..==0) return
|
|
|
|
;;; stdcall fflush, [edi+png_struct.io_ptr]
|
|
|
|
@@:
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
; This function allows the application to supply new output functions for
|
|
|
|
; libpng if standard C streams aren't being used.
|
|
|
|
|
|
|
|
; This function takes as its arguments:
|
|
|
|
; png_ptr - pointer to a png output data structure
|
|
|
|
; io_ptr - pointer to user supplied structure containing info about
|
|
|
|
; the output functions. May be NULL.
|
|
|
|
; write_data_fn - pointer to a new output function that takes as its
|
|
|
|
; arguments a pointer to a png_struct, a pointer to
|
|
|
|
; data to be written, and a 32-bit unsigned int that is
|
|
|
|
; the number of bytes to be written. The new write
|
|
|
|
; function should call png_error(png_ptr, "Error msg")
|
|
|
|
; to exit and output any fatal error messages. May be
|
|
|
|
; NULL, in which case libpng's default function will
|
|
|
|
; be used.
|
|
|
|
; flush_data_fn - pointer to a new flush function that takes as its
|
|
|
|
; arguments a pointer to a png_struct. After a call to
|
|
|
|
; the flush function, there should be no data in any buffers
|
|
|
|
; or pending transmission. If the output method doesn't do
|
|
|
|
; any buffering of output, a function prototype must still be
|
|
|
|
; supplied although it doesn't have to do anything. If
|
|
|
|
; PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
|
|
|
|
; time, output_flush_fn will be ignored, although it must be
|
|
|
|
; supplied for compatibility. May be NULL, in which case
|
|
|
|
; libpng's default function will be used, if
|
|
|
|
; PNG_WRITE_FLUSH_SUPPORTED is defined. This is not
|
|
|
|
; a good idea if io_ptr does not point to a standard
|
|
|
|
; *FILE structure.
|
|
|
|
|
|
|
|
;void (png_structrp png_ptr, voidp io_ptr,
|
|
|
|
; png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
|
|
|
|
align 4
|
|
|
|
proc png_set_write_fn uses eax edi, png_ptr:dword, io_ptr:dword, write_data_fn:dword, output_flush_fn:dword
|
|
|
|
mov edi,[png_ptr]
|
|
|
|
cmp edi,0
|
|
|
|
je .end_f ;if (..==0) return
|
|
|
|
|
|
|
|
mov eax,[io_ptr]
|
|
|
|
mov [edi+png_struct.io_ptr],eax
|
|
|
|
|
|
|
|
if PNG_STDIO_SUPPORTED eq 1
|
|
|
|
mov eax,png_default_write_data ;else
|
|
|
|
cmp dword[write_data_fn],0
|
|
|
|
je @f ;if (..!=0)
|
|
|
|
mov eax,[write_data_fn]
|
|
|
|
@@:
|
|
|
|
else
|
|
|
|
mov eax,[write_data_fn]
|
|
|
|
end if
|
|
|
|
mov [edi+png_struct.write_data_fn],eax
|
|
|
|
|
|
|
|
if PNG_WRITE_FLUSH_SUPPORTED eq 1
|
|
|
|
if PNG_STDIO_SUPPORTED eq 1
|
|
|
|
mov eax,[png_default_flush] ;else
|
|
|
|
cmp dword[output_flush_fn],0
|
|
|
|
je @f ;if (..!=0)
|
|
|
|
mov eax,[output_flush_fn]
|
|
|
|
@@:
|
|
|
|
else
|
|
|
|
mov eax,[output_flush_fn]
|
|
|
|
end if
|
|
|
|
mov [edi+png_struct.output_flush_fn],eax
|
|
|
|
end if ;WRITE_FLUSH
|
|
|
|
|
|
|
|
if PNG_READ_SUPPORTED eq 1
|
|
|
|
; It is an error to read while writing a png file
|
|
|
|
cmp dword[edi+png_struct.read_data_fn],0
|
|
|
|
je @f ;if (..!=0)
|
|
|
|
mov dword[edi+png_struct.read_data_fn], 0
|
|
|
|
|
|
|
|
png_warning edi, <'Can',39,'t set both read_data_fn and write_data_fn in the same structure'>
|
|
|
|
@@:
|
|
|
|
end if
|
|
|
|
.end_f:
|
|
|
|
ret
|
|
|
|
endp
|