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);
+ }
+}