class EL_PNG_IMAGE_FILE
File for reading and writing Cairo image surfaces from PNG format graphical files
note
description: "File for reading and writing Cairo image surfaces from PNG format graphical files"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2022-11-15 19:56:05 GMT (Tuesday 15th November 2022)"
revision: "6"
class
EL_PNG_IMAGE_FILE
inherit
RAW_FILE
export
{NONE} all
{ANY} close, is_open_read, is_open_write, open_read, open_write, count
redefine
make_with_name
end
EL_SHARED_IMAGE_UTILS_API
EL_C_CALLABLE
rename
make as make_callable
end
create
make_with_path, make_with_name, make_open_read, make_open_write
feature {NONE} -- Initialization
make_with_name (file_path: READABLE_STRING_GENERAL)
do
Precursor (file_path)
make_callable
create data.share_from_pointer (default_pointer, 0)
end
feature -- Basic operations
put_image (cairo_surface: POINTER)
require
open_write: is_open_write
local
callback: like new_callback
do
set_callback_routine ($on_append_data)
callback := new_callback
Image_utils.save_cairo_image (cairo_surface, pointer_to_c_callbacks_struct)
callback.release
end
read_cairo_surface: POINTER
require
open_read: is_open_read
local
callback: like new_callback
do
set_callback_routine ($on_read_data_block)
callback := new_callback
Result := Image_utils.read_cairo_image (pointer_to_c_callbacks_struct)
callback.release
end
render_svg_of_width (svg_uri: EL_FILE_URI_PATH; svg_utf_8_xml: STRING; width, background_color: INTEGER)
require
open_write: is_open_write
do
render_svg (svg_uri, svg_utf_8_xml, width, Undefined_dimension, background_color)
end
render_svg_of_height (svg_uri: EL_FILE_URI_PATH; svg_utf_8_xml: STRING; height, background_color: INTEGER)
require
open_write: is_open_write
do
render_svg (svg_uri, svg_utf_8_xml, Undefined_dimension, height, background_color)
end
render_svg (svg_uri: EL_FILE_URI_PATH; svg_utf_8_xml: STRING; width, height, background_color: INTEGER)
require
open_write: is_open_write
is_width_conversion: width > 0 implies height = Undefined_dimension
is_height_conversion: height > 0 implies width = Undefined_dimension
local
image_data: MANAGED_POINTER; callback: like new_callback
do
image_data := Image_utils.new_svg_image_data (svg_uri, svg_utf_8_xml)
set_callback_routine ($on_append_data)
callback := new_callback
last_render_succeeded := Image_utils.render_svg (
image_data.item, pointer_to_c_callbacks_struct, width, height, background_color
)
callback.release
ensure
succeeded: last_render_succeeded
end
feature -- Status query
last_render_succeeded: BOOLEAN
feature {NONE} -- Implementation
set_callback_routine (routine: POINTER)
do
Call_back_routines [1] := routine
end
on_append_data (data_ptr: POINTER; nb_bytes: INTEGER)
do
data.set_from_pointer (data_ptr, nb_bytes)
put_managed_pointer (data, 0, nb_bytes)
end
on_read_data_block (is_eof_ptr, data_ptr: POINTER; nb_bytes: INTEGER)
do
if end_of_file then
data.set_from_pointer (is_eof_ptr, {PLATFORM}.Integer_32_bytes)
data.put_integer_32 (1, 0)
else
data.set_from_pointer (data_ptr, nb_bytes)
read_to_managed_pointer (data, 0, nb_bytes)
end
end
data: MANAGED_POINTER
feature {NONE} -- Constants
Call_back_routines: ARRAY [POINTER]
-- redefine with addresses of frozen procedures
once
Result := << default_pointer >>
end
feature -- Constants
Undefined_dimension: INTEGER
once
Result := Image_utils.Undefined_dimension
end
end