Skip to content

Instantly share code, notes, and snippets.

@Leowbattle
Created April 8, 2023 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Leowbattle/da14838be4fd3d0bb3cbb0c78ec70e54 to your computer and use it in GitHub Desktop.
Save Leowbattle/da14838be4fd3d0bb3cbb0c78ec70e54 to your computer and use it in GitHub Desktop.
#include <stdint.h>
#include <math.h>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
struct rgb {
uint8_t r;
uint8_t g;
uint8_t b;
};
rgb sample(rgb* data, int w, int h, float u, float v) {
u *= w;
v *= h;
if (u < 0.5f) {
if (v < 0.5f) {
return data[0];
}
else if (v > h - 0.5f) {
return data[(h - 1) * w];
}
else {
rgb a = data[(int)(v - 0.5f) * w];
rgb b = data[(int)(v + 0.5f) * w];
float r = a.r + (b.r - a.r) * (v - (floorf(v - 0.5f) + 0.5f));
float g = a.g + (b.g - a.g) * (v - (floorf(v - 0.5f) + 0.5f));
float B = a.b + (b.b - a.b) * (v - (floorf(v - 0.5f) + 0.5f));
return { (uint8_t)r, (uint8_t)g, (uint8_t)B };
}
}
else if (u > w - 0.5f) {
if (v < 0.5f) {
return data[w - 1];
}
else if (v > h - 0.5f) {
return data[(h - 1) * w + w - 1];
}
else {
rgb a = data[(int)(v - 0.5f) * w + w - 1];
rgb b = data[(int)(v + 0.5f) * w + w - 1];
float r = a.r + (b.r - a.r) * (v - (floorf(v - 0.5f) + 0.5f));
float g = a.g + (b.g - a.g) * (v - (floorf(v - 0.5f) + 0.5f));
float B = a.b + (b.b - a.b) * (v - (floorf(v - 0.5f) + 0.5f));
return { (uint8_t)r, (uint8_t)g, (uint8_t)B };
}
}
else {
if (v < 0.5f) {
rgb a = data[(int)(u - 0.5f)];
rgb b = data[(int)(u + 0.5f)];
float r = a.r + (b.r - a.r) * (u - (floorf(u - 0.5f) + 0.5f));
float g = a.g + (b.g - a.g) * (u - (floorf(u - 0.5f) + 0.5f));
float B = a.b + (b.b - a.b) * (u - (floorf(u - 0.5f) + 0.5f));
return { (uint8_t)r, (uint8_t)g, (uint8_t)B };
}
else if (v > h - 0.5f) {
rgb a = data[(h - 1) * w + (int)(u - 0.5f)];
rgb b = data[(h - 1) * w + (int)(u + 0.5f)];
float r = a.r + (b.r - a.r) * (u - (floorf(u - 0.5f) + 0.5f));
float g = a.g + (b.g - a.g) * (u - (floorf(u - 0.5f) + 0.5f));
float B = a.b + (b.b - a.b) * (u - (floorf(u - 0.5f) + 0.5f));
return { (uint8_t)r, (uint8_t)g, (uint8_t)B };
}
else {
rgb a = data[(int)(v - 0.5f) * w + (int)(u - 0.5f)];
rgb b = data[(int)(v + 0.5f) * w + (int)(u - 0.5f)];
float r1 = a.r + (b.r - a.r) * (v - (floorf(v - 0.5f) + 0.5f));
float g1 = a.g + (b.g - a.g) * (v - (floorf(v - 0.5f) + 0.5f));
float b1 = a.b + (b.b - a.b) * (v - (floorf(v - 0.5f) + 0.5f));
a = data[(int)(v - 0.5f) * w + (int)(u + 0.5f)];
b = data[(int)(v + 0.5f) * w + (int)(u + 0.5f)];
float r2 = a.r + (b.r - a.r) * (v - (floorf(v - 0.5f) + 0.5f));
float g2 = a.g + (b.g - a.g) * (v - (floorf(v - 0.5f) + 0.5f));
float b2 = a.b + (b.b - a.b) * (v - (floorf(v - 0.5f) + 0.5f));
float r = r1 + (r2 - r1) * (u - (floorf(u - 0.5f) + 0.5f));
float g = g1 + (g2 - g1) * (u - (floorf(u - 0.5f) + 0.5f));
float B = b1 + (b2 - b1) * (u - (floorf(u - 0.5f) + 0.5f));
return { (uint8_t)r, (uint8_t)g, (uint8_t)B };
}
}
}
float remap(float x, float a1, float b1, float a2, float b2) {
float t = (x - a1) / (b1 - a1);
return a2 + t * (b2 - a2);
}
int main() {
const int w = 3;
const int h = 3;
rgb pixels[w * h]{
{255,0,0},{0,255,0},{0,0,255},
{0,255,0},{0,0,255},{255,0,0},
{0,0,255},{255,0,0},{0,255,0},
};
int w2 = 512;
rgb* pixels2 = new rgb[w2 * w2];
for (int i = 0; i < w2; i++) {
float v = remap(i, 0, w2 - 1, 0, 1);
for (int j = 0; j < w2; j++) {
float u = remap(j, 0, w2 - 1, 0, 1);
rgb c = sample(pixels, w, h, u, v);
pixels2[i * w2 + j] = c;
}
}
stbi_write_png("out1.png", w, h, 3, pixels, w * 3);
stbi_write_png("out2.png", w2, w2, 3, pixels2, w2 * 3);
delete[] pixels2;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment