/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 | 2.09M | #define EEXEC_KEY 55665 |
28 | 511M | #define EEXEC_FACTOR 52845 |
29 | 511M | #define EEXEC_OFFSET 22719 |
30 | | |
31 | | void |
32 | | WRF_init(WRF_output * a_output, unsigned char *a_buffer, long a_buffer_size) |
33 | 2.09M | { |
34 | 2.09M | a_output->m_pos = a_buffer; |
35 | 2.09M | a_output->m_limit = a_buffer_size; |
36 | 2.09M | a_output->m_count = 0; |
37 | 2.09M | a_output->m_encrypt = false; |
38 | 2.09M | a_output->m_key = EEXEC_KEY; |
39 | 2.09M | } |
40 | | |
41 | | void |
42 | | WRF_wbyte(const gs_memory_t *memory, WRF_output * a_output, unsigned char a_byte) |
43 | 1.45G | { |
44 | 1.45G | if (a_output->m_count < a_output->m_limit && a_output->m_pos != NULL) { |
45 | 748M | if (a_output->m_encrypt) { |
46 | 511M | a_byte ^= (a_output->m_key >> 8); |
47 | 511M | a_output->m_key = |
48 | 511M | (unsigned short)((((uint64_t)a_output->m_key + a_byte) * EEXEC_FACTOR + |
49 | 511M | EEXEC_OFFSET) & 0xffff); |
50 | 511M | } |
51 | 748M | *a_output->m_pos++ = a_byte; |
52 | 748M | } |
53 | 1.45G | a_output->m_count++; |
54 | 1.45G | } |
55 | | |
56 | | void |
57 | | WRF_wtext(const gs_memory_t *memory, WRF_output * a_output, const unsigned char *a_string, long a_length) |
58 | 14.2M | { |
59 | 93.2M | while (a_length > 0) { |
60 | 79.0M | WRF_wbyte(memory, a_output, *a_string++); |
61 | 79.0M | a_length--; |
62 | 79.0M | } |
63 | 14.2M | } |
64 | | |
65 | | void |
66 | | WRF_wstring(const gs_memory_t *memory, WRF_output * a_output, const char *a_string) |
67 | 232M | { |
68 | 1.47G | while (*a_string) |
69 | 1.24G | WRF_wbyte(memory, a_output, *a_string++); |
70 | 232M | } |
71 | | |
72 | | void |
73 | | WRF_wfloat(const gs_memory_t *memory, WRF_output * a_output, double a_float) |
74 | 14.4M | { |
75 | 14.4M | char buffer[32]; |
76 | 14.4M | int l; |
77 | | |
78 | 14.4M | l = gs_snprintf(buffer, sizeof (buffer), "%f", a_float); |
79 | 14.4M | if (l > sizeof (buffer)) { |
80 | 0 | emprintf(memory, "Warning: Font real number value truncated\n"); |
81 | 0 | } |
82 | 14.4M | WRF_wstring(memory, a_output, buffer); |
83 | 14.4M | } |
84 | | |
85 | | void |
86 | | WRF_wint(const gs_memory_t *memory, WRF_output * a_output, long a_int) |
87 | 104M | { |
88 | 104M | char buffer[32]; |
89 | 104M | int l; |
90 | | |
91 | 104M | l = gs_snprintf(buffer, sizeof(buffer), "%ld", a_int); |
92 | 104M | if (l > sizeof (buffer)) { |
93 | 0 | emprintf(memory, "Warning: Font integer number value truncated\n"); |
94 | 0 | } |
95 | 104M | WRF_wstring(memory, a_output, buffer); |
96 | 104M | } |