/src/ghostpdl/base/wrfont.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright (C) 2001-2024 Artifex Software, Inc. |
2 | | All Rights Reserved. |
3 | | |
4 | | This software is provided AS-IS with no warranty, either express or |
5 | | implied. |
6 | | |
7 | | This software is distributed under license and may not be copied, |
8 | | modified or distributed except as expressly authorized under the terms |
9 | | of the license contained in the file LICENSE in this distribution. |
10 | | |
11 | | Refer to licensing information at http://www.artifex.com or contact |
12 | | Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, |
13 | | CA 94129, USA, for further information. |
14 | | */ |
15 | | |
16 | | /* |
17 | | Support functions to serialize fonts as PostScript code that can |
18 | | then be passed to FreeType via the FAPI FreeType bridge. |
19 | | Started by Graham Asher, 9th August 2002. |
20 | | */ |
21 | | |
22 | | #include "wrfont.h" |
23 | | #include "stdio_.h" |
24 | | #include "assert_.h" |
25 | | #include "stdint_.h" |
26 | | |
27 | 82.6k | #define EEXEC_KEY 55665 |
28 | 20.5M | #define EEXEC_FACTOR 52845 |
29 | 20.5M | #define EEXEC_OFFSET 22719 |
30 | | |
31 | | void |
32 | | WRF_init(WRF_output * a_output, unsigned char *a_buffer, long a_buffer_size) |
33 | 82.6k | { |
34 | 82.6k | a_output->m_pos = a_buffer; |
35 | 82.6k | a_output->m_limit = a_buffer_size; |
36 | 82.6k | a_output->m_count = 0; |
37 | 82.6k | a_output->m_encrypt = false; |
38 | 82.6k | a_output->m_key = EEXEC_KEY; |
39 | 82.6k | } |
40 | | |
41 | | void |
42 | | WRF_wbyte(const gs_memory_t *memory, WRF_output * a_output, unsigned char a_byte) |
43 | 58.2M | { |
44 | 58.2M | if (a_output->m_count < a_output->m_limit && a_output->m_pos != NULL) { |
45 | 30.0M | if (a_output->m_encrypt) { |
46 | 20.5M | a_byte ^= (a_output->m_key >> 8); |
47 | 20.5M | a_output->m_key = |
48 | 20.5M | (unsigned short)((((uint64_t)a_output->m_key + a_byte) * EEXEC_FACTOR + |
49 | 20.5M | EEXEC_OFFSET) & 0xffff); |
50 | 20.5M | } |
51 | 30.0M | *a_output->m_pos++ = a_byte; |
52 | 30.0M | } |
53 | 58.2M | a_output->m_count++; |
54 | 58.2M | } |
55 | | |
56 | | void |
57 | | WRF_wtext(const gs_memory_t *memory, WRF_output * a_output, const unsigned char *a_string, long a_length) |
58 | 662k | { |
59 | 4.20M | while (a_length > 0) { |
60 | 3.54M | WRF_wbyte(memory, a_output, *a_string++); |
61 | 3.54M | a_length--; |
62 | 3.54M | } |
63 | 662k | } |
64 | | |
65 | | void |
66 | | WRF_wstring(const gs_memory_t *memory, WRF_output * a_output, const char *a_string) |
67 | 9.37M | { |
68 | 58.9M | while (*a_string) |
69 | 49.5M | WRF_wbyte(memory, a_output, *a_string++); |
70 | 9.37M | } |
71 | | |
72 | | void |
73 | | WRF_wfloat(const gs_memory_t *memory, WRF_output * a_output, double a_float) |
74 | 569k | { |
75 | 569k | char buffer[32]; |
76 | 569k | int l; |
77 | | |
78 | 569k | l = gs_snprintf(buffer, sizeof (buffer), "%f", a_float); |
79 | 569k | if (l > sizeof (buffer)) { |
80 | 0 | emprintf(memory, "Warning: Font real number value truncated\n"); |
81 | 0 | } |
82 | 569k | WRF_wstring(memory, a_output, buffer); |
83 | 569k | } |
84 | | |
85 | | void |
86 | | WRF_wint(const gs_memory_t *memory, WRF_output * a_output, long a_int) |
87 | 4.29M | { |
88 | 4.29M | char buffer[32]; |
89 | 4.29M | int l; |
90 | | |
91 | 4.29M | l = gs_snprintf(buffer, sizeof(buffer), "%ld", a_int); |
92 | 4.29M | if (l > sizeof (buffer)) { |
93 | 0 | emprintf(memory, "Warning: Font integer number value truncated\n"); |
94 | 0 | } |
95 | 4.29M | WRF_wstring(memory, a_output, buffer); |
96 | 4.29M | } |