aboutsummaryrefslogtreecommitdiffstats
path: root/inter.c
blob: f85be23654273446610d7804014227f08a859607 (plain)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "pcd.h"

int
pcd_inter_m2(struct PCD_IMAGE *img)
{
    register unsigned char *src, *dest;
    register int    x;
    int             y;
    int             left = img->left >> (img->res - 3);
    int             top = img->top >> (img->res - 3);
    int             width = img->width >> (img->res - 3);
    int             height = img->height >> (img->res - 3);

    src = img->mmap + pcd_img_start[3] +
	(pcd_def_width[3] >> 1) * 3 * top;

    for (y = 0; y < height; y += 2) {
	/* luma */
	src += left;
	for (dest = img->luma[y << 1], x = 0; x < width - 1; x++) {
	    *(dest++) = src[x], *(dest++) = (src[x] + src[x + 1] + 1) >> 1;
	}
	*(dest++) = src[x], *(dest++) = src[x];
	src += pcd_def_width[3];
	for (dest = img->luma[(y << 1) + 2], x = 0; x < width - 1; x++) {
	    *(dest++) = src[x], *(dest++) = (src[x] + src[x + 1] + 1) >> 1;
	}
	*(dest++) = src[x], *(dest++) = src[x];
	src += pcd_def_width[3] - left;

	/* chroma */
	src += left >> 1;
	for (dest = img->blue[y], x = 0; x < (width >> 1) - 1; x++) {
	    *(dest++) = src[x], *(dest++) = (src[x] + src[x + 1] + 1) >> 1;
	}
	*(dest++) = src[x], *(dest++) = src[x];
	src += pcd_def_width[3] >> 1;
	for (dest = img->red[y], x = 0; x < (width >> 1) - 1; x++) {
	    *(dest++) = src[x], *(dest++) = (src[x] + src[x + 1] + 1) >> 1;
	}
	*(dest++) = src[x], *(dest++) = src[x];
	src += (pcd_def_width[3] - left) >> 1;
    }
    return 0;
}

int
pcd_inter_pixels(unsigned char **data, int width, int height)
{
    register unsigned char *src, *dest;
    register int    x;
    int             y;

    for (y = height - 2; y >= 0; y -= 2) {
	src = data[y >> 1];
	dest = data[y];
	dest[width - 2] = dest[width - 1] = src[(width >> 1) - 1];
	for (x = width - 4; x >= 0; x -= 2) {
	    dest[x] = src[x >> 1];
	    dest[x + 1] = (src[x >> 1] + src[(x >> 1) + 1] + 1) >> 1;
	}
    }
    return 0;
}

int
pcd_inter_lines(unsigned char **data, int width, int height)
{
    register unsigned char *src1, *src2, *dest;
    register int    x;
    int             y;

    for (y = 0; y < height - 2; y += 2) {
	src1 = data[y];
	dest = data[y + 1];
	src2 = data[y + 2];
	for (x = 0; x < width - 2; x += 2) {
	    dest[x] = (src1[x] + src2[x] + 1) >> 1;
	    dest[x + 1] = (src1[x] + src2[x] + src1[x + 2] + src2[x + 2] + 2) >> 2;
	}
	dest[x] = dest[x + 1] = (src1[x] + src2[x] + 1) >> 1;
    }
    src1 = data[y];
    dest = data[y + 1];
    for (x = 0; x < width - 2; x += 2) {
	dest[x] = src1[x];
	dest[x + 1] = (src1[x] + src1[x + 2] + 1) >> 1;
    }
    dest[x] = dest[x + 1] = src1[x];
    return 0;
}