From 6aedd09913ffe19b5d35e202efc8769382a45b3c Mon Sep 17 00:00:00 2001 From: Matthew Jakeman Date: Fri, 20 Nov 2020 01:44:09 +1300 Subject: [PATCH] Initial Commit --- README.md | 24 + output.bmp | Bin 0 -> 1080054 bytes stb_image_write.h | 1690 +++++++++++++++++++++++++++++++++++++++++++++ tinyray.c | 450 ++++++++++++ 4 files changed, 2164 insertions(+) create mode 100644 README.md create mode 100644 output.bmp create mode 100644 stb_image_write.h create mode 100644 tinyray.c diff --git a/README.md b/README.md new file mode 100644 index 0000000..83a9bab --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# tinyray +A simple raytracer in exactly 450 lines of C + +![Output](output.bmp) + +### Features + * Sphere-Ray Intersection + * Materials + * Diffuse and Specular Lighting + * Point, Directional, and Ambient Lights + * Custom Floating-Point Vector Library + * Output to image with stb_image + * Gradient Background + * Watermark + +### Helpful Resources +I created this toy raytracer to learn about basic raytracing (and for fun, of course), taking inspiration from the following resources: + - [Gabriel Gambetta: Computer Graphics From Scratch](https://www.gabrielgambetta.com/computer-graphics-from-scratch/basic-ray-tracing.html) + - [Scratch A Pixel: Minimal Ray Tracing](https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection) + - [ssloy's tinyraytracer](https://github.com/ssloy/tinyraytracer) + +The first link is especially helpful in understanding how raytracing works from a mathematical perspective. + +**I created this for fun for the UoA ENGGEN 131 Art Challenge** diff --git a/output.bmp b/output.bmp new file mode 100644 index 0000000000000000000000000000000000000000..93ec06d80552eb5137b7d4a9a52ff6fb126be677 GIT binary patch literal 1080054 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%0DKR6uvgDeXez=)A$0VB%-CKzI7 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 literal 0 HcmV?d00001 diff --git a/stb_image_write.h b/stb_image_write.h new file mode 100644 index 0000000..95943eb --- /dev/null +++ b/stb_image_write.h @@ -0,0 +1,1690 @@ +/* stb_image_write - v1.15 - public domain - http://nothings.org/stb + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + +ABOUT: + + This header file is a library for writing images to C stdio or a callback. + + The PNG output is not optimal; it is 20-50% larger than the file + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +UNICODE: + + If compiling for Windows and you wish to use Unicode filenames, compile + with + #define STBIW_WINDOWS_UTF8 + and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert + Windows wchar_t filenames to utf8. + +USAGE: + + There are five functions, one for each image file format: + + int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + The functions create an image file defined by the parameters. The image + is a rectangle of pixels stored from left-to-right, top-to-bottom. + Each pixel contains 'comp' channels of data stored interleaved with 8-bits + per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is + monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + PNG supports writing rectangles of data even when the bytes storing rows of + data are not consecutive in memory (e.g. sub-rectangles of a larger image), + by supplying the stride between the beginning of adjacent rows. The other + formats do not. (Thus you cannot write a native-format BMP through the BMP + writer, both because it is in BGR order and because it may have padding + at the end of the line.) + + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + + HDR expects linear float data. Since the format is always 32-bit rgb(e) + data, alpha (if provided) is discarded, and for monochrome data it is + replicated across all three channels. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +#include + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +extern int stbi_write_tga_with_rle; +extern int stbi_write_png_compression_level; +extern int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); + +#ifdef STBI_WINDOWS_UTF8 +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +static int stbi__flip_vertically_on_write = 0; + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; + unsigned char buffer[64]; + int buf_used; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +#ifdef __cplusplus +#define STBIW_EXTERN extern "C" +#else +#define STBIW_EXTERN extern +#endif +STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); + +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbiw__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) + return 0; + +#if _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f = stbiw__fopen(filename, "wb"); + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__write_flush(stbi__write_context *s) +{ + if (s->buf_used) { + s->func(s->context, &s->buffer, s->buf_used); + s->buf_used = 0; + } +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write1(stbi__write_context *s, unsigned char a) +{ + if (s->buf_used + 1 > sizeof(s->buffer)) + stbiw__write_flush(s); + s->buffer[s->buf_used++] = a; +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + int n; + if (s->buf_used + 3 > sizeof(s->buffer)) + stbiw__write_flush(s); + n = s->buf_used; + s->buf_used = n+3; + s->buffer[n+0] = a; + s->buffer[n+1] = b; + s->buffer[n+2] = c; +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + stbiw__write1(s, d[comp - 1]); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + stbiw__write1(s, d[0]); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + stbiw__write1(s, d[comp - 1]); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) { + j_end = -1; j = y-1; + } else { + j_end = y; j = 0; + } + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + stbiw__write_flush(s); + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + stbiw__write1(s, header); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + stbiw__write1(s, header); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + stbiw__write_flush(s); + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef __STDC_WANT_SECURE_LIB__ + len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) { best=d; bestloc=hlist[j]; } + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } + s1 %= 65521; s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + // first loop isn't optimized since it's just one pixel + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + + f = stbiw__fopen(filename, "wb"); + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k, subsample; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + subsample = quality <= 90 ? 1 : 0; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + const unsigned char *dataR = (const unsigned char *)data; + const unsigned char *dataG = dataR + ofsG; + const unsigned char *dataB = dataR + ofsB; + int x, y, pos; + if(subsample) { + for(y = 0; y < height; y += 16) { + for(x = 0; x < width; x += 16) { + float Y[256], U[256], V[256]; + for(row = y, pos = 0; row < y+16; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+16; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + + // subsample U,V + { + float subU[64], subV[64]; + int yy, xx; + for(yy = 0, pos = 0; yy < 8; ++yy) { + for(xx = 0; xx < 8; ++xx, ++pos) { + int j = yy*32+xx*2; + subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; + subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; + } + } + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + } else { + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float Y[64], U[64], V[64]; + for(row = y, pos = 0; row < y+8; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+8; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels + 1.13 + 1.12 + 1.11 (2019-08-11) + + 1.10 (2019-02-07) + support utf8 filenames in Windows; fix warnings and platform ifdefs + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/tinyray.c b/tinyray.c new file mode 100644 index 0000000..51adaf2 --- /dev/null +++ b/tinyray.c @@ -0,0 +1,450 @@ +// ENGGEN131 (2020) - Lab 9 (5th - 9th October, 2020) +// EXERCISE SIX - Da Vinci Code +// +// tinyray.c - A raytracer in exactly 400 lines of C +// Author: Matthew Jakeman +// +// Entirely original code, inspired by the following resources: +// - https://github.com/ssloy/tinyraytracer +// - https://www.gabrielgambetta.com/computer-graphics-from-scratch/basic-ray-tracing.html +// - https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" +#include + +typedef unsigned char pixel; + +/* Minimal Floating Point Vector Maths - Author: Matthew Jakeman */ +typedef struct { + float x; + float y; + float z; +} Vec3; + +Vec3 vec3_new(float x, float y, float z) { + Vec3 vec; + vec.x = x; + vec.y = y; + vec.z = z; + return vec; +} + +Vec3 vec3_add(Vec3 a, Vec3 b) { + return vec3_new(a.x + b.x, a.y + b.y, a.z + b.z); +} + +Vec3 vec3_subtract(Vec3 a, Vec3 b) { + return vec3_new(a.x - b.x, a.y - b.y, a.z - b.z); +} + +Vec3 vec3_subtract_scalar(Vec3 a, float b) { + return vec3_new(a.x - b, a.y - b, a.z - b); +} + +Vec3 vec3_divide_scalar(Vec3 a, float b) { + return vec3_new(a.x/b, a.y/b, a.z/b); +} + +Vec3 vec3_multiply(Vec3 a, Vec3 b) { + return vec3_new(a.x*b.x, a.y*b.y, a.z*b.z); +} + +Vec3 vec3_multiply_scalar(Vec3 a, float b) { + return vec3_new(a.x*b, a.y*b, a.z*b); +} + +float vec3_dot(Vec3 a, Vec3 b) { + return a.x*b.x + a.y*b.y + a.z*b.z; +} + +float vec3_len(Vec3 v) { + return (float)sqrtf((v.x * v.x) + (v.y * v.y) + (v.z * v.z)); +} + +Vec3 vec3_normalise(Vec3 v) { + return vec3_divide_scalar(v, vec3_len(v)); // Calculate unit vector +} + +Vec3 vec3_clamp(Vec3 v, float min_value, float max_value) { + return vec3_new( + min(max(v.x, min_value), max_value), + min(max(v.y, min_value), max_value), + min(max(v.z, min_value), max_value) + ); +} +// END - vectors + +/* Struct Definitions */ +typedef Vec3 RgbColour; + +typedef struct { + RgbColour diffuse; + float specular; +} Material; + +typedef struct { + Vec3 centre; + float radius; + Material material; +} Sphere; + +typedef struct { + Vec3 origin; + Vec3 direction; +} Ray; + +typedef enum { + PointLight, + DirectionalLight, + AmbientLight +} LightType; + +typedef struct { + LightType type; + Vec3 position; // point only + Vec3 direction; // directional only + float intensity; +} Light; + +/* Globals */ +const static Vec3 Zero = {0}; +const static Vec3 Invalid = {-1, -1, -1}; +const static int FOV = 1; //3.1415/2; +const static int MAX_DIST = 1000; +const static int PROJ_DIST = 1; +const static unsigned int WIDTH = 600; +const static unsigned int HEIGHT = 600; + +/* Constructors */ +Sphere sphere_new(Vec3 centre, float radius, Material material) { + Sphere sphere = {0}; + sphere.centre = centre; + sphere.radius = radius; + sphere.material = material; + return sphere; +} + +Light light_point_new(float intensity, Vec3 position) { + Light light = {0}; + light.type = PointLight; + light.position = position; + light.intensity = intensity; + return light; +} + +Light light_ambient_new(float intensity) { + Light light = {0}; + light.type = AmbientLight; + light.intensity = intensity; + return light; +} + +Light light_directional_new(float intensity, Vec3 direction) { + Light light = {0}; + light.type = DirectionalLight; + light.direction = direction; + light.intensity = intensity; + return light; +} + +Material material_new(Vec3 diffuse, float specular) { + Material material = {0}; + material.diffuse = diffuse; + material.specular = specular; + return material; +} + +Ray ray_new(Vec3 origin, Vec3 direction) { + Ray ray; + ray.origin = origin; + ray.direction = direction; + return ray; +} + +// Lighting Compute Algorithm +// Adapted from https://www.gabrielgambetta.com/ +// +// ARGS: +// - point = point of intersection +// - normal = normal vector at point +// RETURNS: +// - intensity of light +float lighting_compute(Vec3 point, Vec3 normal, + Vec3 view, float specular, + Light *lights, int num_lights) { + + // Intensity of light for the given pixel + float intensity = 0.0f; + + // Iterate over lights + for (int i = 0; i < num_lights; i++) + { + Light *light = &lights[i]; + if (light->type == AmbientLight) + { + // Simply add ambient light to total + intensity += light->intensity; + } + else + { + Vec3 light_ray; + if (light->type == PointLight) + // Point Light: Direction of ray from light to point + light_ray = vec3_subtract(light->position, point); + else + // Directional Light: Direction + light_ray = light->direction; + + // Diffuse + float reflect = vec3_dot(normal, light_ray); + intensity += (light->intensity * reflect)/(vec3_len(normal) * vec3_len(light_ray)); + + // Specular + if (specular != -1) + { + Vec3 r = vec3_subtract(vec3_multiply_scalar(normal, 2 * vec3_dot(normal, light_ray)), light_ray); + float reflect_view_proj = vec3_dot(r, view); + if (reflect_view_proj > 0) + { + float cosine = reflect_view_proj/(vec3_len(r) * vec3_len(view)); + intensity += light->intensity * powf(cosine, specular); + } + } + } + } + + return intensity; +} + +// Sphere-Ray Intersection +// Returns 1 if intersection found, otherwise 0 +// +// ARGS: +// - sphere = sphere to intersect +// - ray = description of ray properties (e.g. direction) +// RETURNS: +// - boolean of whether ray intersected a sphere +// - [out] dist0, dist 1 = perpendicular distances to points of intersection +int do_sphere_raycast(Sphere sphere, Ray ray, float *dist0, float *dist1) { + + // Please see sphere_ray_intersection.bmp + *dist0 = 0; + *dist1 = 0; + + // Find L and tca + Vec3 L = vec3_subtract(sphere.centre, ray.origin); + float tca = vec3_dot(L, ray.direction); + + // Discard if intersection is behind origin + if (tca < 0) + return 0; + + // Find d + float d = sqrtf(vec3_dot(L, L) - tca * tca); + if (d > sphere.radius) + return 0; + + // Calculate thc using pythagoras + float thc = sqrtf(sphere.radius * sphere.radius - d * d); + + // Calculate t0 and t1 (perpendicular distance to + // the 0th and 1st intersection) + float t0 = tca - thc; + float t1 = tca + thc; + + // Ensure at least one of t0 and t1 is greater than zero + if (t0 < 0 && t1 < 0) + return 0; + + *dist0 = t0; + *dist1 = t1; + + return 1; // Intersection found +} + +// Raytrace Scene at Point +// +// ARGS: +// - origin = location of camera +// - dir = direction of projectile +// - min_t, max_t = min and max clipping planes +// - spheres, num_spheres = array of spheres to test +// - lights, num_lights = array of lights in the scene +// RETURNS: +// - rgb colour of pixel being raytraced +RgbColour raytrace(Vec3 origin, Vec3 dir, float min_t, float max_t, + Sphere *spheres, int num_spheres, + Light *lights, int num_lights) { + + // Closest sphere to screen (for depth-testing) + Sphere *closest = 0; + + // We use t_comp to store the t-depth of the closest + // sphere and compare it with other spheres to perform + // primitive depth testing (where 't' is perpendicular + // distance to the point of intersection) + float t_comp = (float)MAX_DIST; + + // Ray to test + Ray ray = ray_new(origin, dir); + + // Cycle through all spheres and depth-test + for (int i = 0; i < num_spheres; i++) + { + float dist0, dist1; + if (do_sphere_raycast(spheres[i], ray, &dist0, &dist1)) + { + // Check dist0 + if ((min_t < dist0 && dist0 < max_t) && + dist0 < t_comp) + { + t_comp = dist0; + closest = &spheres[i]; + } + + // Now check dist1 + if ((min_t < dist1 && dist1 < max_t) && + dist1 < t_comp) + { + t_comp = dist1; + closest = &spheres[i]; + } + } + } + + if (!closest) + return Invalid; + + Vec3 point = vec3_add(origin, vec3_multiply_scalar(dir, t_comp)); + Vec3 normal = vec3_normalise(vec3_subtract(point, closest->centre)); + Material material = closest->material; + + return vec3_clamp( + vec3_multiply_scalar( + material.diffuse, + lighting_compute( + point, normal, + vec3_multiply_scalar(dir, -1), + material.specular, + lights, num_lights + ) + ), + 0.0f, 255.0f // Clamp between 0 and 255 + ); +} + +// Watermark: Says "MATT J" +#define MARK_COLS 33 +#define MARK_ROWS 7 +int mark[MARK_ROWS][MARK_COLS] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0}, + {0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + {0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + {0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + {0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +}; + +// Draws a watermark on the screen using the above array +// NOTE: Make sure size and stride do not cause the function to exceed +// array bounds. This will cause a crash! +void DrawWatermark(pixel *data) { + int start_x = 20; + int start_y = 540; + int size = 3, stride = 1; + + for (int i = 0; i < MARK_COLS; i++) { + for (int j = 0; j < MARK_ROWS; j++) { + int y_corner = start_y + j*(size*2 + stride); + int x_corner = start_x + i*(size*2 + stride); + + // Draw Square + for (int x = x_corner; x < (x_corner + size); x++) { + for (int y = y_corner; y < (y_corner + size); y++) { + if (mark[j][i] == 0) { + data[(y*WIDTH + x) * 3 + 0] = (pixel)(i/(float)MARK_COLS * 255) % 180; + data[(y*WIDTH + x) * 3 + 1] = (pixel)(j/(float)MARK_ROWS * 255) % 180; + data[(y*WIDTH + x) * 3 + 2] = (pixel)240; + } + else { + data[(y*WIDTH + x) * 3 + 0] = (pixel)255; + data[(y*WIDTH + x) * 3 + 1] = (pixel)255; + data[(y*WIDTH + x) * 3 + 2] = (pixel)255; + } + } + } + } + } +} + +int main(void) +{ + pixel *data = malloc(sizeof(pixel) * 3 * WIDTH * HEIGHT); + + // Materials + Material blue = material_new(vec3_new(69, 161, 255), 500); + Material white = material_new(vec3_new(240, 240, 240), 180); + Material red = material_new(vec3_new(255, 0, 57), 10); + Material ground = material_new(vec3_new(0, 57, 89), 1000); + + // Scene + #define NUM_SPHERES 4 + Sphere spheres[NUM_SPHERES]; + spheres[0] = sphere_new(vec3_new(-0.75f, -0.2f, 6.5f), 1.5f, red); + spheres[1] = sphere_new(vec3_new(0, -1, 5), 1.0f, blue); + spheres[2] = sphere_new(vec3_new(2, -0.5, 8), 3.0f, white); + spheres[3] = sphere_new(vec3_new(0, -4001, 0), 4000, ground); + + // Lights + #define NUM_LIGHTS 3 + Light lights[NUM_LIGHTS]; + lights[0] = light_ambient_new(0.2f); + lights[1] = light_point_new(0.6f, vec3_new(-8, 1, 0)); + lights[2] = light_directional_new(0.2f, vec3_new(1, 4, -8)); + + // For non-square images (future-proofing?) + float aspect_ratio = (float)WIDTH/(float)HEIGHT; + float screen_dim = tanf(FOV / (float)2); + + Vec3 origin = Zero; + + // Render + for (int x = 0; x < WIDTH; x++) { + for (int y = 0; y < HEIGHT; y++) { + + // Background + data[(y*WIDTH + x) * 3 + 0] = (pixel)(y/(float)WIDTH * 255); + data[(y*WIDTH + x) * 3 + 1] = (pixel)(x/(float)HEIGHT * 255); + data[(y*WIDTH + x) * 3 + 2] = (pixel)160; + + // Get Pixel in World Coords + float x_world_coord = (2*(x + 0.5f)/(float)HEIGHT - 1) * screen_dim * aspect_ratio; + float y_world_coord = -(2*(y + 0.5f)/(float)WIDTH - 1) * screen_dim; + Vec3 dir = vec3_normalise(vec3_new(x_world_coord, y_world_coord, 1)); + + // Raytrace Pixel + RgbColour colour = raytrace(origin, dir, 1.0f, (float)MAX_DIST, + spheres, NUM_SPHERES, + lights, NUM_LIGHTS); + + // Draw Geometry + if (colour.x != -1) { + data[(y*WIDTH + x) * 3 + 0] = (pixel)colour.x; + data[(y*WIDTH + x) * 3 + 1] = (pixel)colour.y; + data[(y*WIDTH + x) * 3 + 2] = (pixel)colour.z; + } + } + } + + // Output + DrawWatermark(data); + + // Write to file + printf("tinyray: writing to file!"); + if (!stbi_write_bmp("output.bmp", WIDTH, HEIGHT, 3, data)) + printf("tinyray: failed to write image!"); + + return 0; +} \ No newline at end of file