void xps_free_part(xps_context_t *ctx, xps_part_t *part) { xps_free(ctx, part->name); xps_free(ctx, part->data); xps_free(ctx, part); }
void xps_free_fixed_pages(xps_context_t *ctx) { xps_page_t *node = ctx->first_page; while (node) { xps_page_t *next = node->next; xps_free(ctx, node->name); xps_free(ctx, node); node = next; } ctx->first_page = NULL; ctx->last_page = NULL; }
void xps_free_fixed_documents(xps_context_t *ctx) { xps_document_t *node = ctx->first_fixdoc; while (node) { xps_document_t *next = node->next; xps_free(ctx, node->name); xps_free(ctx, node); node = next; } ctx->first_fixdoc = NULL; ctx->last_fixdoc = NULL; }
static void on_text(void *zp, char *buf, int len) { xps_parser_t *parser = zp; xps_context_t *ctx = parser->ctx; char *atts[3]; int i; if (parser->error) return; for (i = 0; i < len; i++) { if (!is_xml_space(buf[i])) { char *tmp = xps_alloc(ctx, len + 1); if (!tmp) { parser->error = "out of memory"; return; } atts[0] = ""; atts[1] = tmp; atts[2] = NULL; memcpy(tmp, buf, len); tmp[len] = 0; on_open_tag(zp, "", atts); on_close_tag(zp, ""); xps_free(ctx, tmp); return; } } }
void xps_free_font(xps_context_t *ctx, xps_font_t *font) { if (font->font) { gs_font_finalize(ctx->memory, font->font); gs_free_object(ctx->memory, font->font, "font object"); } xps_free(ctx, font); }
void xps_free_item(xps_context_t *ctx, xps_item_t *item) { xps_item_t *next; while (item) { next = item->next; if (item->down) xps_free_item(ctx, item->down); xps_free(ctx, item); item = next; } }
xps_part_t * xps_new_part(xps_context_t *ctx, char *name, int size) { xps_part_t *part; part = xps_alloc(ctx, sizeof(xps_part_t)); if (!part) { gs_throw(gs_error_VMerror, "out of memory: xps_new_part\n"); return NULL; } part->name = xps_strdup(ctx, name); part->size = size; part->data = xps_alloc(ctx, size); if (!part->data) { xps_free(ctx, part); gs_throw(gs_error_VMerror, "out of memory: xps_new_part\n"); return NULL; } return part; }
int xps_decode_jpegxr(xps_context_t *ctx, byte *buf, int len, xps_image_t *output) { FILE *file; char *name = xps_alloc(ctx, gp_file_name_sizeof); struct state state; jxr_container_t container; jxr_image_t image; int offset, alpha_offset; int rc; if (!name) { return gs_throw(gs_error_VMerror, "cannot allocate scratch file name buffer"); } memset(output, 0, sizeof(*output)); file = gp_open_scratch_file(ctx->memory, "jpegxr-scratch-", name, "wb+"); if (!file) { xps_free(ctx, name); return gs_throw(gs_error_invalidfileaccess, "cannot open scratch file"); } rc = fwrite(buf, 1, len, file); if (rc != len) { xps_free(ctx, name); return gs_throw(gs_error_invalidfileaccess, "cannot write to scratch file"); } fseek(file, 0, SEEK_SET); container = jxr_create_container(); rc = jxr_read_image_container(container, file); if (rc < 0) { xps_free(ctx, name); return gs_throw1(-1, "jxr_read_image_container: %s", jxr_error_string(rc)); } offset = jxrc_image_offset(container, 0); alpha_offset = jxrc_alpha_offset(container, 0); output->xres = jxrc_width_resolution(container, 0); output->yres = jxrc_height_resolution(container, 0); image = jxr_create_input(); jxr_set_PROFILE_IDC(image, 111); jxr_set_LEVEL_IDC(image, 255); jxr_set_pixel_format(image, jxrc_image_pixelformat(container, 0)); jxr_set_container_parameters(image, jxrc_image_pixelformat(container, 0), jxrc_image_width(container, 0), jxrc_image_height(container, 0), jxrc_alpha_offset(container, 0), jxrc_image_band_presence(container, 0), jxrc_alpha_band_presence(container, 0), 0); jxr_set_block_output(image, xps_decode_jpegxr_block); state.ctx = ctx; state.output = output; jxr_set_user_data(image, &state); fseek(file, offset, SEEK_SET); rc = jxr_read_image_bitstream(image, file); if (rc < 0) { xps_free(ctx, name); return gs_throw1(-1, "jxr_read_image_bitstream: %s", jxr_error_string(rc)); } jxr_destroy(image); if (alpha_offset > 0) { image = jxr_create_input(); jxr_set_PROFILE_IDC(image, 111); jxr_set_LEVEL_IDC(image, 255); jxr_set_pixel_format(image, jxrc_image_pixelformat(container, 0)); jxr_set_container_parameters(image, jxrc_image_pixelformat(container, 0), jxrc_image_width(container, 0), jxrc_image_height(container, 0), jxrc_alpha_offset(container, 0), jxrc_image_band_presence(container, 0), jxrc_alpha_band_presence(container, 0), 0); jxr_set_block_output(image, xps_decode_jpegxr_alpha_block); state.ctx = ctx; state.output = output; jxr_set_user_data(image, &state); fseek(file, alpha_offset, SEEK_SET); rc = jxr_read_image_bitstream(image, file); if (rc < 0) { xps_free(ctx, name); return gs_throw1(-1, "jxr_read_image_bitstream: %s", jxr_error_string(rc)); } jxr_destroy(image); } jxr_destroy_container(container); fclose(file); unlink(name); xps_free(ctx, name); return gs_okay; }