| #ifndef COLOR_H |
| #define COLOR_H |
| //============================================================================================== |
| // Originally written in 2020 by Peter Shirley <ptrshrl@gmail.com> |
| // |
| // To the extent possible under law, the author(s) have dedicated all copyright |
| // and related and neighboring rights to this software to the public domain |
| // worldwide. This software is distributed without any warranty. |
| // |
| // You should have received a copy (see file COPYING.txt) of the CC0 Public |
| // Domain Dedication along with this software. If not, see |
| // <http://creativecommons.org/publicdomain/zero/1.0/>. |
| // |
| // The original source code is from |
| // https://github.com/RayTracing/raytracing.github.io/tree/release/src/InOneWeekend |
| // |
| // Changes to the original code follow the following license. |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| //============================================================================================== |
| |
| #include "vec3.h" |
| |
| #include <iostream> |
| |
| using color = vec3; |
| |
| inline double linear_to_gamma(double linear_component) { |
| return sqrt(linear_component); |
| } |
| |
| void write_color(std::ostream &out, color pixel_color, int samples_per_pixel) { |
| auto r = pixel_color.x(); |
| auto g = pixel_color.y(); |
| auto b = pixel_color.z(); |
| |
| // Divide the color by the number of samples. |
| auto scale = 1.0 / samples_per_pixel; |
| r *= scale; |
| g *= scale; |
| b *= scale; |
| |
| // Apply a linear to gamma transform for gamma 2 |
| r = linear_to_gamma(r); |
| g = linear_to_gamma(g); |
| b = linear_to_gamma(b); |
| |
| // Write the translated [0,255] value of each color component. |
| static const interval intensity(0.000, 0.999); |
| out << static_cast<int>(256 * intensity.clamp(r)) << ' ' |
| << static_cast<int>(256 * intensity.clamp(g)) << ' ' |
| << static_cast<int>(256 * intensity.clamp(b)) << '\n'; |
| } |
| |
| #endif |