Skip to content

Commit

Permalink
grops: support "-UTF16-" in PostScript font name
Browse files Browse the repository at this point in the history
  • Loading branch information
t-tk committed Jun 26, 2022
1 parent b8fbd17 commit 763db1a
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 20 deletions.
69 changes: 50 additions & 19 deletions src/devices/grops/ps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,15 @@ ps_output &ps_output::put_delimiter(char c)
return *this;
}

ps_output &ps_output::put_string(const char *s, int n)
ps_output &ps_output::put_string(const CHAR *s, int n, int is_utf16)
{
int len = 0;
int i;
for (i = 0; i < n; i++) {
char c = s[i];
if (is_ascii(c) && csprint(c)) {
CHAR c = s[i];
if (is_utf16) {
len = (i+1)*4;
} else if (is_ascii(c) && csprint(c)) {
if (c == '(' || c == ')' || c == '\\')
len += 2;
else
Expand All @@ -215,7 +217,7 @@ ps_output &ps_output::put_string(const char *s, int n)
else
len += 4;
}
if (len > n*2) {
if (len > n*2 || is_utf16) {
if (col + n*2 + 2 > max_line_length && n*2 + 2 <= max_line_length) {
putc('\n', fp);
col = 0;
Expand All @@ -231,8 +233,13 @@ ps_output &ps_output::put_string(const char *s, int n)
putc('\n', fp);
col = 0;
}
fprintf(fp, "%02x", s[i] & 0377);
col += 2;
if (is_utf16) {
fprintf(fp, "%04X", s[i] & 0xFFFF);
col += 4;
} else {
fprintf(fp, "%02x", s[i] & 0377);
col += 2;
}
}
putc('>', fp);
col++;
Expand Down Expand Up @@ -527,7 +534,7 @@ class ps_printer : public printer {
int paper_length;
int equalise_spaces;
enum { SBUF_SIZE = 256 };
char sbuf[SBUF_SIZE];
CHAR sbuf[SBUF_SIZE];
int sbuf_len;
int sbuf_start_hpos;
int sbuf_vpos;
Expand Down Expand Up @@ -561,7 +568,7 @@ class ps_printer : public printer {
void set_style(const style &);
void set_space_code(unsigned char);
int set_encoding_index(ps_font *);
subencoding *set_subencoding(font *, glyph *, unsigned char *);
subencoding *set_subencoding(font *, glyph *, CHAR *);
char *get_subfont(subencoding *, const char *);
void do_exec(char *, const environment *);
void do_import(char *, const environment *);
Expand Down Expand Up @@ -655,10 +662,25 @@ int ps_printer::set_encoding_index(ps_font *f)
}

subencoding *ps_printer::set_subencoding(font *f, glyph *g,
unsigned char *codep)
CHAR *code)
{
unsigned int idx = f->get_code(g);
*codep = idx % 256;
const char *psname = f->get_internal_name();

if (psname && strstr(psname,"-UTF16-")) {
/* Unicode, convert to UTF-16 */
if (idx<0x10000) {
code[0] = idx;
code[1] = 0;
} else {
code[0] = (idx - 0x10000) / 0x400 + 0xD800;
code[1] = (idx - 0x10000) % 0x400 + 0xDC00;
}
return NULL;
}

code[0] = idx % 256;
code[1] = 0;
unsigned int num = idx >> 8;
if (num == 0)
return 0;
Expand All @@ -669,7 +691,7 @@ subencoding *ps_printer::set_subencoding(font *f, glyph *g,
if (p == 0)
p = subencodings = new subencoding(f, num, next_subencoding_index++,
subencodings);
p->glyphs[*codep] = f->get_special_device_encoding(g);
p->glyphs[*code] = f->get_special_device_encoding(g);
return p;
}

Expand All @@ -689,8 +711,8 @@ void ps_printer::set_char(glyph *g, font *f, const environment *env, int w,
{
if (g == space_glyph || invis_count > 0)
return;
unsigned char code;
subencoding *sub = set_subencoding(f, g, &code);
CHAR code[2];
subencoding *sub = set_subencoding(f, g, code);
style sty(f, sub, env->size, env->height, env->slant);
if (sty.slant != 0) {
if (sty.slant > 80 || sty.slant < -80) {
Expand All @@ -704,14 +726,16 @@ void ps_printer::set_char(glyph *g, font *f, const environment *env, int w,
&& sbuf_vpos == env->vpos
&& sbuf_color == *env->col) {
if (sbuf_end_hpos == env->hpos) {
sbuf[sbuf_len++] = code;
sbuf[sbuf_len++] = code[0];
if (code[1]>0) sbuf[sbuf_len++] = code[1];
sbuf_end_hpos += w + sbuf_kern;
return;
}
if (sbuf_len == 1 && sbuf_kern == 0) {
sbuf_kern = env->hpos - sbuf_end_hpos;
sbuf_end_hpos = env->hpos + sbuf_kern + w;
sbuf[sbuf_len++] = code;
sbuf[sbuf_len++] = code[0];
if (code[1]>0) sbuf[sbuf_len++] = code[1];
return;
}
/* If sbuf_end_hpos - sbuf_kern == env->hpos, we are better off
Expand All @@ -724,7 +748,8 @@ void ps_printer::set_char(glyph *g, font *f, const environment *env, int w,
sbuf_space_width = env->hpos - sbuf_end_hpos;
sbuf_end_hpos = env->hpos + w + sbuf_kern;
sbuf[sbuf_len++] = sbuf_space_code;
sbuf[sbuf_len++] = code;
sbuf[sbuf_len++] = code[0];
if (code[1]>0) sbuf[sbuf_len++] = code[1];
sbuf_space_count++;
return;
}
Expand All @@ -734,7 +759,8 @@ void ps_printer::set_char(glyph *g, font *f, const environment *env, int w,
if (diff == 0 || (equalise_spaces && (diff == 1 || diff == -1))) {
sbuf_end_hpos = env->hpos + w + sbuf_kern;
sbuf[sbuf_len++] = sbuf_space_code;
sbuf[sbuf_len++] = code;
sbuf[sbuf_len++] = code[0];
if (code[1]>0) sbuf[sbuf_len++] = code[1];
sbuf_space_count++;
if (diff == 1)
sbuf_space_diff_count++;
Expand All @@ -748,7 +774,8 @@ void ps_printer::set_char(glyph *g, font *f, const environment *env, int w,
flush_sbuf();
}
sbuf_len = 1;
sbuf[0] = code;
sbuf[0] = code[0];
if (code[1]>0) sbuf[sbuf_len++] = code[1];
sbuf_end_hpos = env->hpos + w;
sbuf_start_hpos = env->hpos;
sbuf_vpos = env->vpos;
Expand Down Expand Up @@ -984,6 +1011,7 @@ void ps_printer::flush_sbuf()
output_style = sbuf_style;
}
int extra_space = 0;
int is_utf16 = 0;
if (output_hpos < 0 || output_vpos < 0)
motion = ABSOLUTE;
else {
Expand Down Expand Up @@ -1015,7 +1043,10 @@ void ps_printer::flush_sbuf()
out.put_fix_number(extra_space);
if (sbuf_kern != 0)
out.put_fix_number(sbuf_kern);
out.put_string(sbuf, sbuf_len);
const char *psname = sbuf_style.f->get_internal_name();
if (psname && strstr(psname,"-UTF16-"))
is_utf16 = 1;
out.put_string(sbuf, sbuf_len, is_utf16);
char command_array[] = {'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L',
Expand Down
4 changes: 3 additions & 1 deletion src/devices/grops/ps.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */

#define CHAR unsigned short

class ps_output {
public:
ps_output(FILE *, int max_line_length);
ps_output &put_string(const char *, int);
ps_output &put_string(const CHAR *, int, int);
ps_output &put_number(int);
ps_output &put_fix_number(int);
ps_output &put_float(double);
Expand Down

0 comments on commit 763db1a

Please sign in to comment.