static void on_im_generic_profile_keyword(deark *c, lctx *d, struct text_chunk_ctx *tcc, struct de_stringreaderdata *srd) { char typestr[32]; tcc->is_im_generic_profile = 1; tcc->im_generic_profile_type = 0; tcc->im_generic_profile_type_name = NULL; tcc->suppress_debugstr = 1; de_bytes_to_printable_sz((const u8*)(srd->sz+17), de_strlen(srd->sz+17), typestr, sizeof(typestr), 0, DE_ENCODING_ASCII); if(!de_strcmp(typestr, "8bim")) { tcc->im_generic_profile_type = PROFILETYPE_8BIM; tcc->im_generic_profile_type_name = "Photoshop"; } else if(!de_strcmp(typestr, "iptc")) { tcc->im_generic_profile_type = PROFILETYPE_IPTC; tcc->im_generic_profile_type_name = "IPTC"; } else if(!de_strcmp(typestr, "xmp")) { tcc->im_generic_profile_type = PROFILETYPE_XMP; tcc->im_generic_profile_type_name = "XMP"; } else if(!de_strcmp(typestr, "icc")) { tcc->im_generic_profile_type = PROFILETYPE_ICC; tcc->im_generic_profile_type_name = "ICC"; } else { if(c->extract_level<2) { tcc->suppress_debugstr = 0; } } }
// Emit a raw string. Does not force a paragraph to be open. // Updates pinfo->xpos (assumes 1 byte per char). // For xpos, handles the case where sz ends with a newline, but does not // handle internal newlines. static void do_emit_raw_sz(deark *c, lctx *d, struct para_info *pinfo, const char *sz) { size_t sz_len = de_strlen(sz); if(sz_len<1) return; dbuf_write(d->html_outf, (const u8*)sz, (i64)sz_len); if(sz[sz_len-1]=='\n') { pinfo->xpos = 0; } else { pinfo->xpos += (int)sz_len; } }
static void handler_iccp(deark *c, lctx *d, struct handler_params *hp) { u8 cmpr_type; dbuf *f = NULL; struct de_stringreaderdata *prof_name_srd = NULL; de_finfo *fi = NULL; char prof_name2[100]; size_t prof_name2_strlen; i64 pos = hp->dpos; prof_name_srd = dbuf_read_string(c->infile, pos, 80, 80, DE_CONVFLAG_STOP_AT_NUL, DE_ENCODING_LATIN1); if(!prof_name_srd->found_nul) goto done; de_dbg(c, "profile name: \"%s\"", ucstring_getpsz_d(prof_name_srd->str)); pos += prof_name_srd->bytes_consumed; // Our working copy, to use as part of the filename. de_strlcpy(prof_name2, prof_name_srd->sz, sizeof(prof_name2)); if(!de_strcasecmp(prof_name2, "icc") || !de_strcasecmp(prof_name2, "icc profile")) { prof_name2[0] = '\0'; // Ignore generic name. } prof_name2_strlen = de_strlen(prof_name2); if(prof_name2_strlen>=5) { if(de_sz_has_ext(prof_name2, "icc")) { // If the name already ends in ".icc", chop it off so that we don't end // up with a double ".icc.icc" file extension. prof_name2[prof_name2_strlen-4] = '\0'; } } cmpr_type = de_getbyte_p(&pos); if(cmpr_type!=0) return; fi = de_finfo_create(c); if(c->filenames_from_file && prof_name2[0]) de_finfo_set_name_from_sz(c, fi, prof_name2, 0, DE_ENCODING_LATIN1); f = dbuf_create_output_file(c, "icc", fi, DE_CREATEFLAG_IS_AUX); de_decompress_deflate(c->infile, pos, hp->dlen - pos, f, 0, NULL, d->is_CgBI ? 0 : DE_DEFLATEFLAG_ISZLIB); done: dbuf_close(f); de_finfo_destroy(c, fi); de_destroy_stringreaderdata(c, prof_name_srd); }
int ucstring_strcmp(de_ucstring *s, const char *s2, int encoding) { size_t s2len; char *tmpbuf; int ret; if(!s && !s2) return 0; if(!s || !s2) return 1; s2len = de_strlen(s2); tmpbuf = de_malloc(s->c, s2len+1); ucstring_to_sz(s, tmpbuf, s2len+1, encoding); ret = de_strcmp(tmpbuf, tmpbuf); de_free(s->c, tmpbuf); return ret; }
// (xpos,ypos) is the lower-right corner // (or the bottom-center, if hcenter==1). static void draw_number(deark *c, de_bitmap *img, struct de_bitmap_font *dfont, i64 n, i64 xpos1, i64 ypos1, unsigned int flags) { char buf[32]; i64 len; i64 i; i64 xpos_start; i64 xpos, ypos; if(flags & DNFLAG_HEX) { if(flags & DNFLAG_LEADING_ZEROES) de_snprintf(buf, sizeof(buf), "%04X", (unsigned int)n); else de_snprintf(buf, sizeof(buf), "%X", (unsigned int)n); } else { de_snprintf(buf, sizeof(buf), "%u", (unsigned int)n); } len = (i64)de_strlen(buf); if(flags & DNFLAG_HCENTER) xpos_start = xpos1-(dfont->nominal_width*len)/2; else xpos_start = xpos1-dfont->nominal_width*len; // Make sure number doesn't go beyond the image if(xpos_start + dfont->nominal_width*len > img->width) { xpos_start = img->width - dfont->nominal_width*len; } for(i=len-1; i>=0; i--) { xpos = xpos_start + dfont->nominal_width*i; ypos = ypos1-dfont->nominal_height; de_font_paint_character_cp(c, img, dfont, buf[i], xpos, ypos, DE_MAKE_GRAY(255), 0, DE_PAINTFLAG_TRNSBKGD); } }
void ucstring_append_sz(de_ucstring *s, const char *sz, int encoding) { de_int64 len; len = (de_int64)de_strlen(sz); ucstring_append_bytes(s, (const de_byte*)sz, len, 0, encoding); }
static void de_run_unifont_hex(deark *c, de_module_params *mparams) { struct de_bitmap_font *font = NULL; i64 char_array_numalloc = 0; char linebuf[256]; struct de_linereader *lr = NULL; int ok = 0; font = de_create_bitmap_font(c); font->has_unicode_codepoints = 1; font->prefer_unicode = 1; font->nominal_height = 16; char_array_numalloc = 1024; font->char_array = de_mallocarray(c, char_array_numalloc, sizeof(struct de_bitmap_font_char)); lr = de_linereader_create(c, c->infile); while(de_linereader_readnextline(c, lr, linebuf, sizeof(linebuf), 0)) { i64 idx; struct de_bitmap_font_char *ch; i64 fdata_len; char *dptr; // Pointer into linebuf, to the char after the ":" if(font->num_chars>=17*65536) goto done; idx = font->num_chars; if(idx >= char_array_numalloc) { i64 new_numalloc = char_array_numalloc*2; font->char_array = de_reallocarray(c, font->char_array, char_array_numalloc, sizeof(struct de_bitmap_font_char), new_numalloc); char_array_numalloc = new_numalloc; } ch = &font->char_array[idx]; dptr = de_strchr(linebuf, ':'); if(!dptr) goto done; *dptr = '\0'; dptr++; fdata_len = (i64)de_strlen(dptr); ch->codepoint_unicode = (i32)de_strtoll(linebuf, NULL, 16); if(ch->codepoint_unicode<0 || ch->codepoint_unicode>=17*65536) goto done; ch->width = (int)((fdata_len/32)*8); ch->height = 16; de_dbg2(c, "char[%d] U+%04X %d"DE_CHAR_TIMES"%d", (int)font->num_chars, (unsigned int)ch->codepoint_unicode, ch->width, ch->height); if(ch->width<8 || ch->width>32) goto done; ch->rowspan = (ch->width+7)/8; ch->bitmap = de_malloc(c, ch->rowspan * ch->height); decode_fontdata(c, dptr, ch); font->num_chars++; if(ch->width > font->nominal_width) { font->nominal_width = ch->width; } } de_dbg(c, "number of characters: %d", (int)font->num_chars); if(font->num_chars<1) goto done; if(font->nominal_width<1) goto done; de_font_bitmap_font_to_image(c, font, NULL, 0); ok = 1; done: if(!ok) { de_err(c, "Error parsing HEX font file (offset %"I64_FMT")", lr->f_pos); } de_linereader_destroy(c, lr); if(font) { if(font->char_array) { i64 k; for(k=0; k<font->num_chars; k++) { de_free(c, font->char_array[k].bitmap); } de_free(c, font->char_array); } font->char_array = NULL; de_destroy_bitmap_font(c, font); } }