mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-09 14:13:43 +00:00
Added libpng based png loading
This commit is contained in:
parent
fe32ca8de7
commit
832568e07a
9 changed files with 115 additions and 1 deletions
|
@ -33,6 +33,10 @@ if get_option('log') == true
|
||||||
message('Enable Log')
|
message('Enable Log')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if get_option('png') == true
|
||||||
|
config_h.set10('THORVG_PNG_LOADER_SUPPORT', true)
|
||||||
|
endif
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
output: 'config.h',
|
output: 'config.h',
|
||||||
configuration: config_h
|
configuration: config_h
|
||||||
|
|
|
@ -33,6 +33,11 @@ option('examples',
|
||||||
value: false,
|
value: false,
|
||||||
description: 'Enable building examples')
|
description: 'Enable building examples')
|
||||||
|
|
||||||
|
option('png',
|
||||||
|
type: 'boolean',
|
||||||
|
value: false,
|
||||||
|
description: 'Enable libpng based png loading')
|
||||||
|
|
||||||
option('test',
|
option('test',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
value: false,
|
value: false,
|
||||||
|
|
|
@ -24,6 +24,11 @@
|
||||||
#ifdef THORVG_SVG_LOADER_SUPPORT
|
#ifdef THORVG_SVG_LOADER_SUPPORT
|
||||||
#include "tvgSvgLoader.h"
|
#include "tvgSvgLoader.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef THORVG_PNG_LOADER_SUPPORT
|
||||||
|
#include "tvgPngLoader.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "tvgRawLoader.h"
|
#include "tvgRawLoader.h"
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
@ -39,6 +44,12 @@ static Loader* _find(FileType type)
|
||||||
case FileType::Svg: {
|
case FileType::Svg: {
|
||||||
#ifdef THORVG_SVG_LOADER_SUPPORT
|
#ifdef THORVG_SVG_LOADER_SUPPORT
|
||||||
return new SvgLoader;
|
return new SvgLoader;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FileType::Png: {
|
||||||
|
#ifdef THORVG_PNG_LOADER_SUPPORT
|
||||||
|
return new PngLoader;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -58,6 +69,7 @@ static Loader* _find(const string& path)
|
||||||
{
|
{
|
||||||
auto ext = path.substr(path.find_last_of(".") + 1);
|
auto ext = path.substr(path.find_last_of(".") + 1);
|
||||||
if (!ext.compare("svg")) return _find(FileType::Svg);
|
if (!ext.compare("svg")) return _find(FileType::Svg);
|
||||||
|
if (!ext.compare("png")) return _find(FileType::Png);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include "tvgLoader.h"
|
#include "tvgLoader.h"
|
||||||
|
|
||||||
enum class FileType { Svg = 0, Raw, Unknown };
|
enum class FileType { Svg = 0, Raw, Png, Unknown };
|
||||||
|
|
||||||
struct LoaderMgr
|
struct LoaderMgr
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,6 +5,10 @@ if get_option('loaders').contains('svg') == true
|
||||||
message('Enable SVG Loader')
|
message('Enable SVG Loader')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if get_option('png') == true
|
||||||
|
subdir('png')
|
||||||
|
endif
|
||||||
|
|
||||||
subdir('raw')
|
subdir('raw')
|
||||||
|
|
||||||
loader_dep = declare_dependency(
|
loader_dep = declare_dependency(
|
||||||
|
|
9
src/loaders/png/meson.build
Executable file
9
src/loaders/png/meson.build
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
source_file = [
|
||||||
|
'tvgPngLoader.h',
|
||||||
|
'tvgPngLoader.cpp',
|
||||||
|
]
|
||||||
|
|
||||||
|
subloader_dep += [declare_dependency(
|
||||||
|
include_directories : include_directories('.'),
|
||||||
|
sources : source_file
|
||||||
|
)]
|
52
src/loaders/png/tvgPngLoader.cpp
Executable file
52
src/loaders/png/tvgPngLoader.cpp
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
#include "tvgLoaderMgr.h"
|
||||||
|
#include "tvgPngLoader.h"
|
||||||
|
// #include "png.h"
|
||||||
|
|
||||||
|
PngLoader::~PngLoader()
|
||||||
|
{
|
||||||
|
if (content) {
|
||||||
|
free((void*)content);
|
||||||
|
content = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PngLoader::open(const string& path)
|
||||||
|
{
|
||||||
|
png_image image;
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
|
||||||
|
if (!png_image_begin_read_from_file(&image, path.c_str())) return false;
|
||||||
|
w = image.width;
|
||||||
|
h = image.height;
|
||||||
|
vw = w;
|
||||||
|
vh = h;
|
||||||
|
png_bytep buffer;
|
||||||
|
image.format = PNG_FORMAT_BGRA;
|
||||||
|
buffer = static_cast<png_bytep>(malloc(PNG_IMAGE_SIZE(image)));
|
||||||
|
if (!buffer) {
|
||||||
|
// out of memory, only time when libpng doesnt free its data
|
||||||
|
png_image_free(&image);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!png_image_finish_read(&image, NULL, buffer, 0, NULL)) return false;
|
||||||
|
content = reinterpret_cast<uint32_t*>(buffer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PngLoader::read()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PngLoader::close()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint32_t* PngLoader::pixels()
|
||||||
|
{
|
||||||
|
return this->content;
|
||||||
|
}
|
22
src/loaders/png/tvgPngLoader.h
Executable file
22
src/loaders/png/tvgPngLoader.h
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef _TVG_PNG_LOADER_H_
|
||||||
|
#define _TVG_PNG_LOADER_H_
|
||||||
|
|
||||||
|
#include <png.h>
|
||||||
|
|
||||||
|
class PngLoader : public Loader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
const uint32_t* content = nullptr;
|
||||||
|
|
||||||
|
~PngLoader();
|
||||||
|
|
||||||
|
using Loader::open;
|
||||||
|
bool open(const string& path) override;
|
||||||
|
bool read() override;
|
||||||
|
bool close() override;
|
||||||
|
|
||||||
|
const uint32_t* pixels() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //_TVG_PNG_LOADER_H_
|
|
@ -19,6 +19,12 @@ subdir('bindings')
|
||||||
thread_dep = meson.get_compiler('cpp').find_library('pthread')
|
thread_dep = meson.get_compiler('cpp').find_library('pthread')
|
||||||
thorvg_lib_dep = [common_dep, loader_dep, binding_dep, thread_dep]
|
thorvg_lib_dep = [common_dep, loader_dep, binding_dep, thread_dep]
|
||||||
|
|
||||||
|
if get_option('png') == true
|
||||||
|
message('Enable libpng based png loading')
|
||||||
|
png_dep = meson.get_compiler('cpp').find_library('libpng')
|
||||||
|
thorvg_lib_dep += png_dep
|
||||||
|
endif
|
||||||
|
|
||||||
thorvg_lib = library(
|
thorvg_lib = library(
|
||||||
'thorvg',
|
'thorvg',
|
||||||
include_directories : headers,
|
include_directories : headers,
|
||||||
|
|
Loading…
Add table
Reference in a new issue