Skip to content

Commit

Permalink
Merge pull request #1 from FLIF-hub/master
Browse files Browse the repository at this point in the history
Update from FLIF-Hub
  • Loading branch information
psykauze committed Oct 22, 2015
2 parents e315025 + 807a0c9 commit 2fae52d
Show file tree
Hide file tree
Showing 24 changed files with 763 additions and 406 deletions.
42 changes: 29 additions & 13 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
language: c++
script: "make test"
sudo: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
- libpng12-dev
- imagemagick
install:
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
language: cpp

compiler:
- gcc
- clang

sudo: true


before_install:
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
- sudo apt-get update -qq
- sudo apt-get install g++-4.8 libpng12-dev imagemagick



env:
matrix:
- BUILDTYPE=CMAKE
- BUILDTYPE=GNUMAKE
- BUILDTYPE=ASAN
- BUILDTYPE=SHARED

script:
- if [[ "$BUILDTYPE" == "ASAN" ]] && [[ "$CXX" == "g++" ]]; then export CXX="g++-4.8" CC="gcc-4.8"; cmake -DUSE_ASAN=ON . ; make ; fi
- if [[ "$CXX" == "g++" ]]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
- if [[ "$BUILDTYPE" == "CMAKE" ]]; then cmake . ; make ; fi
- if [[ "$BUILDTYPE" == "GNUMAKE" ]]; then make ; make test ; fi
- if [[ "$BUILDTYPE" == "SHARED" ]] ; then cmake -DSHARED=ON .; make ; fi
8 changes: 5 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ CXXFLAGS := $(shell pkg-config --cflags zlib libpng)
LDFLAGS := $(shell pkg-config --libs zlib libpng)

# for running interface-test
export LD_LIBRARY_PATH=$(shell pwd)
export LD_LIBRARY_PATH=$(shell pwd):$LD_LIBRARY_PATH

FILES_H := maniac/*.h maniac/*.cpp image/*.h transform/*.h flif-enc.h flif-dec.h common.h flif_config.h fileio.h io.h io.cpp config.h
FILES_CPP := maniac/chance.cpp image/crc32k.cpp image/image.cpp image/image-png.cpp image/image-pnm.cpp image/image-pam.cpp image/image-rggb.cpp image/color_range.cpp transform/factory.cpp common.cpp flif-enc.cpp flif-dec.cpp io.cpp
Expand All @@ -11,10 +11,10 @@ flif: $(FILES_H) $(FILES_CPP) flif.cpp
$(CXX) -std=gnu++11 $(CXXFLAGS) -DNDEBUG -O3 -g0 -Wall $(FILES_CPP) flif.cpp -o flif $(LDFLAGS)

flif.prof: $(FILES_H) $(FILES_CPP) flif.cpp
$(CXX) -std=gnu++11 $(CXXFLAGS) $(LDFLAGS) -DNDEBUG -O3 -g0 -pg -Wall $(FILES_CPP) flif.cpp -o flif.prof $(LDFLAGS)
$(CXX) -std=gnu++11 $(CXXFLAGS) -DNDEBUG -O3 -g0 -pg -Wall $(FILES_CPP) flif.cpp -o flif.prof $(LDFLAGS)

flif.dbg: $(FILES_H) $(FILES_CPP) flif.cpp
$(CXX) -std=gnu++11 $(CXXFLAGS) $(LDFLAGS) -O0 -ggdb3 -Wall $(FILES_CPP) flif.cpp -o flif.dbg $(LDFLAGS)
$(CXX) -std=gnu++11 $(CXXFLAGS) -O0 -ggdb3 -Wall $(FILES_CPP) flif.cpp -o flif.dbg $(LDFLAGS)

libflif.so: $(FILES_H) $(FILES_CPP) flif.h flif-interface-private.h flif-interface.cpp
$(CXX) -std=gnu++11 $(CXXFLAGS) -DNDEBUG -O3 -g0 -Wall -shared -fPIC $(FILES_CPP) flif-interface.cpp -o libflif.so $(LDFLAGS)
Expand All @@ -25,6 +25,8 @@ libflifd.so: $(FILES_H) $(FILES_CPP) flif.h flif-interface-private.h flif-interf
viewflif: libflif.so flif.h tools/viewer.c
gcc -O2 -ggdb3 $(shell sdl2-config --cflags) $(shell sdl2-config --libs) -Wall -I. tools/viewer.c -o viewflif -L. -lflif

all: flif libflif.so viewflif

test-interface: libflifd.so flif.h tools/test.c
gcc -O0 -ggdb3 -Wall -I. tools/test.c -o test-interface -L. -lflifd

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# FLIF: Free Lossless Image Format

[![Build Status](https://travis-ci.org/FLIF-hub/FLIF.svg?branch=master)](https://travis-ci.org/FLIF-hub/FLIF)
[![Join the chat at https://gitter.im/jonsneyers/FLIF](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jonsneyers/FLIF?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)


Expand Down
10 changes: 10 additions & 0 deletions config.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@
// more repeats makes encoding more expensive, but results in better trees (smaller files)
#define TREE_LEARN_REPEATS 3

// 5 byte improvement needed before splitting a MANIAC leaf node
#define CONTEXT_TREE_SPLIT_THRESHOLD 5461*8*5

#define CONTEXT_TREE_COUNT_DIV 30
#define CONTEXT_TREE_MIN_SUBTREE_SIZE 50



/**************************************************/
Expand All @@ -36,3 +42,7 @@

// faster decoding, less compression (disable multi-scale bitchances, use 24-bit rac)
#define FAST_BUT_WORSE_COMPRESSION 1

// bounds for node counters
#define CONTEXT_TREE_MIN_COUNT 1
#define CONTEXT_TREE_MAX_COUNT 4096
202 changes: 202 additions & 0 deletions fileio.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include <stdio.h>
#include <string.h>

class FileIO
{
Expand Down Expand Up @@ -55,3 +56,204 @@ class FileIO
return name;
}
};

/*!
* Read-only IO interface for a constant memory block
*/
class BlobReader
{
private:
const uint8_t* data;
size_t data_array_size;
size_t seek_pos;
public:
BlobReader(const uint8_t* _data, size_t _data_array_size)
: data(_data)
, data_array_size(_data_array_size)
, seek_pos(0)
{
}

int read() {
int c = getc();
if(c == EOF)
return 0;
return c;
}
void write(int byte) {
// cannot write on const memory
}
bool isEOF() const {
return seek_pos >= data_array_size;
}
int ftell() const {
return seek_pos;
}
int getc() {
if(seek_pos >= data_array_size)
return EOF;
return data[seek_pos++];
}
char * gets(char *buf, int n) {
int i = 0;
const int max_write = n-1;
while(seek_pos < data_array_size && i < max_write)
buf[i++] = data[seek_pos++];
buf[n-1] = '\0';

if(i < max_write)
return 0;
else
return buf;
}
void fseek(long offset, int where) {
switch(where) {
case SEEK_SET:
seek_pos = offset;
break;
case SEEK_CUR:
seek_pos += offset;
break;
case SEEK_END:
seek_pos = long(data_array_size) + offset;
break;
}
}
const char* getName() {
return "BlobReader";
}
};

/*!
* IO interface for a growable memory block
*/
class BlobIO
{
private:
uint8_t* data;
// keeps track how large the array really is
// HINT: should only be used in the grow() function
size_t data_array_size;
// keeps track how many bytes were written
size_t bytes_used;
size_t seek_pos;

void grow(size_t necessary_size) {
if(necessary_size < data_array_size)
return;

size_t new_size = necessary_size;
// start with reasonably large array
if(new_size < 4096)
new_size = 4096;

if(new_size < data_array_size * 3 / 2)
new_size = data_array_size * 3 / 2;
uint8_t* new_data = new uint8_t[new_size];

memcpy(new_data, data, bytes_used);
// if seek_pos has been moved beyond the written bytes,
// fill the empty space with zeroes
for(size_t i = bytes_used; i < seek_pos; ++i)
new_data[i] = 0;
delete [] data;
data = new_data;
std::swap(data_array_size, new_size);
}
public:
BlobIO()
: data(0)
, data_array_size(0)
, bytes_used(0)
, seek_pos(0)
{
}

~BlobIO() {
delete [] data;
}

uint8_t* release(size_t* array_size)
{
uint8_t* ptr = data;
*array_size = bytes_used;

data = 0;
data_array_size = 0;
bytes_used = 0;
seek_pos = 0;
return ptr;
}

int read() {
int c = getc();
if(c == EOF)
return 0;
return c;
}
void write(int byte) {
fputc(byte);
}
void flush() {
// nothing to do
}
bool isEOF() const {
return seek_pos >= bytes_used;
}
int ftell() const {
return seek_pos;
}
int getc() {
if(seek_pos >= bytes_used)
return EOF;
return data[seek_pos++];
}
char * gets(char *buf, int n) {
int i = 0;
const int max_write = n-1;
while(seek_pos < bytes_used && i < max_write)
buf[i++] = data[seek_pos++];
buf[n-1] = '\0';

if(i < max_write)
return 0;
else
return buf;
}
int fputs(const char *s) {
size_t i = 0;
// null-terminated string
while(s[i])
{
grow(seek_pos + 1);
data[seek_pos++] = s[i++];
if(bytes_used < seek_pos)
bytes_used = seek_pos+1;
}
return 0;
}
int fputc(int c) {
grow(seek_pos + 1);

data[seek_pos++] = static_cast<uint8_t>(c);
if(bytes_used < seek_pos)
bytes_used = seek_pos+1;
return c;
}
void fseek(long offset, int where) {
switch(where) {
case SEEK_SET:
seek_pos = offset;
break;
case SEEK_CUR:
seek_pos += offset;
break;
case SEEK_END:
seek_pos = long(bytes_used) + offset;
break;
}
}
const char* getName() {
return "BlobIO";
}
};
Loading

0 comments on commit 2fae52d

Please sign in to comment.