aboutsummaryrefslogtreecommitdiffstats
path: root/src/cnki_jbig.c
diff options
context:
space:
mode:
authoryzrh <yzrh@noema.org>2020-12-31 22:36:28 +0000
committeryzrh <yzrh@noema.org>2021-01-03 03:01:28 +0000
commit1994f122cc29504862944cca1da1c5203c7e41eb (patch)
treed89e37c5f3443156116bd8476e0efc2d380acd55 /src/cnki_jbig.c
parentb20c6ad3ed930977990f3812b25b80d2ce282d79 (diff)
downloadmelon-1994f122cc29504862944cca1da1c5203c7e41eb.tar.gz
melon-1994f122cc29504862944cca1da1c5203c7e41eb.tar.zst
Decode JBIG and JPEG during HN conversion.
Diffstat (limited to 'src/cnki_jbig.c')
-rw-r--r--src/cnki_jbig.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/cnki_jbig.c b/src/cnki_jbig.c
new file mode 100644
index 0000000..02040be
--- /dev/null
+++ b/src/cnki_jbig.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2020-2021, yzrh <yzrh@noema.org>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "cnki_jbig.h"
+#include "jbig.h"
+
+int
+cnki_jbig(char **bitmap, int *bitmap_size,
+ int *bitmap_width, int *bitmap_height,
+ const char * restrict jbig, int jbig_size)
+{
+ dib_t *dib = malloc(sizeof(dib_t));
+
+ if (dib == NULL)
+ return 1;
+
+ memcpy(dib, jbig, 40);
+
+ bih_t *bih = malloc(sizeof(bih_t));
+
+ if (bih == NULL) {
+ free(dib);
+ return 1;
+ }
+
+ memset(bih, 0, sizeof(bih_t));
+
+ bih->d_l = 0;
+ bih->d = 0;
+
+ bih->p = 1;
+
+ bih->fill = 0;
+
+ bih->x_d = dib->width;
+ bih->y_d = dib->height;
+ bih->l_0 = bih->y_d / 35;
+
+ while (bih->l_0 > 128)
+ bih->l_0--;
+ if (bih->l_0 < 2)
+ bih->l_0 = 2;
+
+ bih->m_x = 8;
+ bih->m_y = 0;
+
+ bih->order |= 1 << 1;
+ bih->order |= 1 << 0;
+
+ bih->options |= 1 << 4;
+ bih->options |= 1 << 3;
+ bih->options |= 1 << 2;
+
+ bih->dptable = NULL;
+
+ int bie_size = jbig_size - 28; /* - 40 - 8 + 20 */
+ char *bie = malloc(bie_size);
+
+ if (bie == NULL) {
+ free(dib);
+ free(bih);
+ return 1;
+ }
+
+ memcpy(bie, bih, 20);
+ memcpy(bie + 20, jbig + 48, jbig_size - 48);
+
+ int ret = strdec_jbig(bitmap, bitmap_size, bie, bie_size);
+
+ if (ret == 0) {
+ *bitmap_width = bih->x_d;
+ *bitmap_height = bih->y_d;
+ }
+
+ free(dib);
+ free(bih);
+ free(bie);
+
+ if (ret != 0)
+ return 1;
+
+ return 0;
+}