PuzzleD

D Interface to libpuzzle
git clone git://xatko.vsos.ethz.ch/PuzzleD.git
Log | Files | Refs

commit 87313648cc9e42f04698ab46387545e813a65a9c
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Sun, 16 Aug 2015 13:33:23 +0200

Initial Commit.

Diffstat:
puzzle.d | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 146 insertions(+), 0 deletions(-)

diff --git a/puzzle.d b/puzzle.d @@ -0,0 +1,146 @@ +module puzzle; + +extern(C){ + struct PuzzleContext { + uint puzzle_max_width; + uint puzzle_max_height; + uint puzzle_lambdas; + double puzzle_p_ratio; + double puzzle_noise_cutoff; + double puzzle_contrast_barrier_for_cropping; + double puzzle_max_cropping_ratio; + int puzzle_enable_autocrop; + ulong magic; + }; + struct PuzzleDvec { + size_t sizeof_vec; + size_t sizeof_compressed_vec; + double *vec; + }; + + struct PuzzleCvec { + size_t sizeof_vec; + char *vec; + }; + struct PuzzleCompressedCvec { + size_t sizeof_compressed_vec; + ubyte *vec; +}; + + void + puzzle_init_context(PuzzleContext *context); + + void + puzzle_free_context(PuzzleContext *context); + + void + puzzle_init_cvec(PuzzleContext *context, PuzzleCvec *cvec); + + void + puzzle_init_dvec(PuzzleContext *context, PuzzleDvec *dvec); + + int + puzzle_fill_dvec_from_file(PuzzleContext *context, PuzzleDvec * dvec, const char *file); + + int + puzzle_fill_cvec_from_file(PuzzleContext *context, PuzzleCvec * cvec, const char *file); + + int + puzzle_fill_dvec_from_mem(PuzzleContext *context, PuzzleDvec * dvec, const void *mem, + size_t size); + + int + puzzle_fill_cvec_from_mem(PuzzleContext *context, PuzzleCvec * cvec, const void *mem, + size_t size); + + int + puzzle_fill_cvec_from_dvec(PuzzleContext *context, PuzzleCvec * cvec, + const PuzzleDvec *dvec); + + void + puzzle_free_cvec(PuzzleContext *context, PuzzleCvec *cvec); + + void + puzzle_free_dvec(PuzzleContext *context, PuzzleDvec *dvec); + + void + puzzle_init_compressed_cvec(PuzzleContext *context, + PuzzleCompressedCvec * compressed_cvec); + + void + puzzle_free_compressed_cvec(PuzzleContext *context, + PuzzleCompressedCvec * compressed_cvec); + + int + puzzle_compress_cvec(PuzzleContext *context, PuzzleCompressedCvec * compressed_cvec, + const PuzzleCvec * cvec); + + int + puzzle_uncompress_cvec(PuzzleContext *context, PuzzleCompressedCvec * compressed_cvec, + const(PuzzleCvec *) cvec); + + double + puzzle_vector_normalized_distance(PuzzleContext *context, const PuzzleCvec * cvec1, + const PuzzleCvec * cvec2, int fix_for_texts); + +} +import std.string; + +class Puzzle{ + PuzzleContext ctx; + this(){ + puzzle_init_context(&ctx); + } + ~this(){ + puzzle_free_context(&ctx); + } + PuzzleDVec dvec(){ + return PuzzleDVec(&ctx); + } + PuzzleCVec cvec(){ + return PuzzleCVec(&ctx); + } +} + +struct PuzzleDVec{ + PuzzleDvec vec; + PuzzleContext *ctx; + this(PuzzleContext *ctx){ + this.ctx=ctx; + puzzle_init_dvec(ctx,&vec); + } + ~this(){ + puzzle_free_dvec(ctx,&vec); + } + void load(string f){ + puzzle_fill_dvec_from_file(ctx, &vec, toStringz(f)); + } + void load(void mem[]){ + puzzle_fill_dvec_from_mem(ctx, &vec, cast(void*)mem, mem.length); + } + PuzzleCVec dvec(){ + PuzzleCVec cvec=PuzzleCVec(ctx); + puzzle_fill_cvec_from_dvec(ctx,&cvec.vec,&vec); + return cvec; + } +} +struct PuzzleCVec{ + PuzzleCvec vec; + PuzzleContext *ctx; + this(PuzzleContext *ctx){ + this.ctx=ctx; + puzzle_init_cvec(ctx,&vec); + } + ~this(){ + puzzle_free_cvec(ctx,&vec); + } + void load(string f){ + puzzle_fill_cvec_from_file(ctx, &vec, toStringz(f)); + } + void load(void mem[]){ + puzzle_fill_cvec_from_mem(ctx, &vec, cast(void*)mem, mem.length); + } + double compare(in ref PuzzleCVec b, bool hasText=false){ + return puzzle_vector_normalized_distance(ctx,&vec,&b.vec,(hasText) ? 1 : 0); + } +}