forked from captainjack64/hacktv
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbitmap.c
More file actions
69 lines (60 loc) · 3.02 KB
/
bitmap.c
File metadata and controls
69 lines (60 loc) · 3.02 KB
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
/* hacktv - Analogue video transmitter for the HackRF */
/*=======================================================================*/
/* Copyright 2020 Philip Heron <phil@sanslogic.co.uk> */
/* */
/* This program is free software: you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation, either version 3 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "bitmap.h"
#include <stdio.h>
#include <stdint.h>
/* Inspiration from http://tech-algorithm.com/articles/bilinear-image-scaling/ */
void resize_bitmap(uint32_t *input, uint32_t *output, int old_width, int old_height, int new_width, int new_height)
{
int a, b, c, d, x, y, index;
float x_ratio = ((float)(old_width - 1)) / new_width;
float y_ratio = ((float)(old_height - 1)) / new_height;
float x_diff, y_diff, blue, red, green, alpha;
int offset = 0 ;
for (int i = 0; i < new_height; i++)
{
for (int j = 0; j < new_width; j++)
{
x = (int)(x_ratio * j);
y = (int)(y_ratio * i);
x_diff = (x_ratio * j) - x;
y_diff = (y_ratio * i) - y;
index = (y * old_width + x);
a = input[index];
b = input[index + 1];
c = input[index + old_width];
d = input[index + old_width + 1];
/* Blue */
blue = (a & 0xFF) * ( 1- x_diff) * (1 - y_diff) + (b & 0xFF) * (x_diff) * (1 - y_diff) +
(c & 0xFF) * (y_diff) * (1 - x_diff) + (d & 0xFF) * (x_diff * y_diff);
/* Green */
green = ((a >> 8) & 0xFF) * (1-x_diff) * (1 - y_diff) + ((b >> 8) & 0xFF) * (x_diff) * (1 - y_diff) +
((c >> 8) & 0xFF) * (y_diff) * (1 - x_diff) + ((d >> 8) & 0xFF) * (x_diff * y_diff);
/* Reg */
red = ((a >> 16) & 0xFF) * (1 - x_diff) * (1 - y_diff) + ((b >> 16) & 0xFF) * (x_diff) * (1-y_diff) +
((c >> 16) & 0xFF) * (y_diff) * (1 - x_diff) + ((d >> 16) & 0xFF) * (x_diff * y_diff);
// /* Alpha */
alpha = ((a >> 24) & 0xFF) * (1-x_diff) * (1 - y_diff) + ((b >> 24) & 0xFF) * (x_diff) * (1 - y_diff) +
((c >> 24) & 0xFF) * (y_diff) * (1 - x_diff) + ((d >> 24) & 0xFF) * (x_diff * y_diff);
output[offset++] =
((((int) alpha) << 24) & 0xFF000000) |
((((int) red) << 16) & 0xFF0000) |
((((int) green) << 8) & 0xFF00) |
((((int) blue) << 0) & 0xFF);
}
}
}