summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'base/wrfont.c')
-rw-r--r--base/wrfont.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/base/wrfont.c b/base/wrfont.c
new file mode 100644
index 00000000..e077e881
--- /dev/null
+++ b/base/wrfont.c
@@ -0,0 +1,95 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/*
+Support functions to serialize fonts as PostScript code that can
+then be passed to FreeType via the FAPI FreeType bridge.
+Started by Graham Asher, 9th August 2002.
+*/
+
+#include "wrfont.h"
+#include "stdio_.h"
+#include "assert_.h"
+
+#define EEXEC_KEY 55665
+#define EEXEC_FACTOR 52845
+#define EEXEC_OFFSET 22719
+
+void
+WRF_init(WRF_output * a_output, unsigned char *a_buffer, long a_buffer_size)
+{
+ a_output->m_pos = a_buffer;
+ a_output->m_limit = a_buffer_size;
+ a_output->m_count = 0;
+ a_output->m_encrypt = false;
+ a_output->m_key = EEXEC_KEY;
+}
+
+void
+WRF_wbyte(const gs_memory_t *memory, WRF_output * a_output, unsigned char a_byte)
+{
+ if (a_output->m_count < a_output->m_limit && a_output->m_pos != NULL) {
+ if (a_output->m_encrypt) {
+ a_byte ^= (a_output->m_key >> 8);
+ a_output->m_key =
+ (unsigned short)((a_output->m_key + a_byte) * EEXEC_FACTOR +
+ EEXEC_OFFSET);
+ }
+ *a_output->m_pos++ = a_byte;
+ }
+ a_output->m_count++;
+}
+
+void
+WRF_wtext(const gs_memory_t *memory, WRF_output * a_output, const unsigned char *a_string, long a_length)
+{
+ while (a_length > 0) {
+ WRF_wbyte(memory, a_output, *a_string++);
+ a_length--;
+ }
+}
+
+void
+WRF_wstring(const gs_memory_t *memory, WRF_output * a_output, const char *a_string)
+{
+ while (*a_string)
+ WRF_wbyte(memory, a_output, *a_string++);
+}
+
+void
+WRF_wfloat(const gs_memory_t *memory, WRF_output * a_output, double a_float)
+{
+ char buffer[32];
+ int l;
+
+ l = gs_snprintf(buffer, sizeof (buffer), "%f", a_float);
+ if (l > sizeof (buffer)) {
+ emprintf(memory, "Warning: Font real number value truncated\n");
+ }
+ WRF_wstring(memory, a_output, buffer);
+}
+
+void
+WRF_wint(const gs_memory_t *memory, WRF_output * a_output, long a_int)
+{
+ char buffer[32];
+ int l;
+
+ l = gs_snprintf(buffer, sizeof(buffer), "%ld", a_int);
+ if (l > sizeof (buffer)) {
+ emprintf(memory, "Warning: Font integer number value truncated\n");
+ }
+ WRF_wstring(memory, a_output, buffer);
+}