static int x_tile_generate_map(TileTab *t, NhGtkProgressWindow *w) { struct proxycb_get_glyph_mapping_res *glyph_map; struct proxy_tilemap *tile_map; struct _x_tile_generate_map_pulse *pulse; glyph_map = nh_proxy_cache_get_glyph_mapping(GTK_WIDGET(w)); if (!glyph_map) { pline("Cannot get glyph mapping."); return 0; } no_glyph = glyph_map->no_glyph; nh_gtk_progress_window_complete_stage(w); tile_map = x_tile_load_tilemap(t, w); if (!tile_map) { proxy_cb_free_glyph_mapping(glyph_map); return 0; } nh_gtk_progress_window_complete_stage(w); total_tiles_used = tile_map->no_tiles; tiles_per_row = ceil_sqrt(total_tiles_used); tiles_per_col = (total_tiles_used + tiles_per_row - 1) / tiles_per_row; pulse = g_new(struct _x_tile_generate_map_pulse, 1); pulse->count = 0; pulse->length = proxy_glyph_map_get_length(glyph_map); pulse->step = pulse->length >= 100 ? pulse->length / 100 : 1; pulse->w = w; GTK_glyph2tile = proxy_map_glyph2tile(glyph_map, tile_map, x_tile_generate_map_pulse, pulse); g_free(pulse); proxy_cb_free_glyph_mapping(glyph_map); proxy_free_tilemap(tile_map); nh_gtk_progress_window_complete_stage(w); return 1; }
static int x_tile_load_map(TileTab *t, NhGtkProgressWindow *w) { int retval, rv; NhExtXdr xdr; NhExtIO *io; if (x_tile_loadmap.io) { nhext_xdrio_create(&xdr, x_tile_loadmap.io, NHEXT_XDR_DECODE); retval = nhext_xdr_int(&xdr, &total_tiles_used); tiles_per_row = ceil_sqrt(total_tiles_used); tiles_per_col = (total_tiles_used + tiles_per_row - 1) / tiles_per_row; retval &= nhext_xdr_array(&xdr, (char **)>K_glyph2tile, &no_glyph, (unsigned int)-1, sizeof(short), nhext_xdr_short); nhext_xdr_destroy(&xdr); GTK_io_close(x_tile_loadmap.io); if (!retval) { free(GTK_glyph2tile); GTK_glyph2tile = NULL; } else nh_gtk_progress_window_complete_stage(w); } if (!GTK_glyph2tile) { retval = x_tile_generate_map(t, w); if (retval) { io = GTK_io_open(x_tile_loadmap.file, NHEXT_IO_WRONLY); if (io) { nhext_xdrio_create(&xdr, io, NHEXT_XDR_ENCODE); rv = nhext_xdr_int(&xdr, &total_tiles_used); rv &= nhext_xdr_array(&xdr, (char **)>K_glyph2tile, &no_glyph, (unsigned int)-1, sizeof(short), nhext_xdr_short); nhext_xdr_destroy(&xdr); GTK_io_close(io); if (!rv) remove(x_tile_loadmap.file); } } } free(x_tile_loadmap.file); return retval; }
static void lvdo_dec_frame(unsigned char *payload, size_t payloadlen, const unsigned char *frame, unsigned int blocksize, unsigned int quantizer, unsigned int qmin, unsigned int qmax, unsigned int width, unsigned int height, int verbose, double *in, double *out, const fftw_plan plan, const unsigned int *zigzag_reverse) { unsigned int payloadi = 0, blocki, blockj, pixeli, pixelj; unsigned int lastbyte = 0, availbit = 0; for(blocki = 0; blocki*blocksize < height; blocki++) for(blockj = 0; blockj*blocksize < width; blockj++) { for(pixeli = 0; pixeli < blocksize; pixeli++) for(pixelj = 0; pixelj < blocksize; pixelj++) in[pixeli*blocksize+pixelj] = (signed char) (frame[(blocki*blocksize+pixeli)*width+(blockj*blocksize+pixelj)] ^ 0x80)*(int) ceil_sqrt(qmax-qmin)/(blocksize*2*0.84375); fftw_execute(plan); out[0] /= 2; for(pixeli = 1; pixeli < blocksize; pixeli++) out[pixeli] *= M_SQRT1_2; for(pixeli = blocksize; pixeli < blocksize*blocksize; pixeli += blocksize) out[pixeli] *= M_SQRT1_2; if(verbose) print_block_double(out, blocksize); for(pixeli = qmin; pixeli < qmax; pixeli++) { lastbyte |= prevent_byte_overflow(round((out[zigzag_reverse[pixeli]]+128)/(1<<quantizer)))<<availbit; availbit += 8-quantizer; if(availbit > 7) { if(payloadi != payloadlen) payload[payloadi++] = (unsigned char) lastbyte; lastbyte >>= 8; availbit -= 8; } } } }