1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37#include <stdint.h>
38
39#include "tinyjpeg.h"
40#include "tinyjpeg-internal.h"
41
42
43
44
45
46
47
48static void YCrCB_to_Grey_1xN(struct jdec_private *priv, int sx, int sy)
49{
50 const unsigned char *y;
51 unsigned char *p;
52 unsigned int i;
53 int offset_to_next_row;
54
55 p = priv->plane[0];
56 y = priv->Y;
57 offset_to_next_row = priv->bytes_per_row[0];
58
59 for (i = sy; i > 0; i--) {
60 memcpy(p, y, sx);
61 y += 8;
62 p += offset_to_next_row;
63 }
64}
65
66
67
68
69
70
71
72static void YCrCB_to_Grey_2xN(struct jdec_private *priv, int sx, int sy)
73{
74 const unsigned char *y;
75 unsigned char *p;
76 unsigned int i;
77 int offset_to_next_row;
78
79 p = priv->plane[0];
80 y = priv->Y;
81 offset_to_next_row = priv->bytes_per_row[0];
82
83 for (i = sy; i > 0; i--) {
84 memcpy(p, y, sx);
85 y += 16;
86 p += offset_to_next_row;
87 }
88}
89
90static int initialize_grey(struct jdec_private *priv,
91 unsigned int *bytes_per_blocklines,
92 unsigned int *bytes_per_mcu)
93{
94 if (!priv->bytes_per_row[0])
95 priv->bytes_per_row[0] = priv->width;
96 if (!priv->components[0])
97 priv->components[0] = malloc(priv->height * priv->bytes_per_row[0]);
98
99 bytes_per_blocklines[0] = priv->bytes_per_row[0] << 3;
100 bytes_per_mcu[0] = 8;
101
102 return !priv->components[0];
103}
104
105static const struct tinyjpeg_colorspace format_grey =
106 {
107 {
108 YCrCB_to_Grey_1xN,
109 YCrCB_to_Grey_1xN,
110 YCrCB_to_Grey_2xN,
111 YCrCB_to_Grey_2xN,
112 },
113 tinyjpeg_decode_mcu_1comp_table,
114 initialize_grey
115 };
116
117const tinyjpeg_colorspace_t TINYJPEG_FMT_GREY = &format_grey;
118