-
-
Save kelbon/eedb4c093abf5c1d00a7cd332ae250f1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#ifndef INCLUDE_BITMAP_IMAGE_HPP | |
#define INCLUDE_BITMAP_IMAGE_HPP | |
#include <algorithm> | |
#include <cmath> | |
#include <cstdlib> | |
#include <cstring> | |
#include <fstream> | |
#include <iostream> | |
#include <iterator> | |
#include <limits> | |
#include <string> | |
#include <vector> | |
class bitmap_image | |
{ | |
public: | |
enum channel_mode { | |
rgb_mode = 0, | |
bgr_mode = 1 | |
}; | |
enum color_plane { | |
blue_plane = 0, | |
green_plane = 1, | |
red_plane = 2 | |
}; | |
struct rgb_t | |
{ | |
unsigned char red; | |
unsigned char green; | |
unsigned char blue; | |
}; | |
bitmap_image() | |
: file_name_(""), | |
width_(0), | |
height_(0), | |
row_increment_(0), | |
bytes_per_pixel_(3), | |
channel_mode_(bgr_mode) | |
{} | |
bitmap_image(const std::string& filename) | |
: file_name_(filename), | |
width_(0), | |
height_(0), | |
row_increment_(0), | |
bytes_per_pixel_(0), | |
channel_mode_(bgr_mode) | |
{ | |
load_bitmap(); | |
} | |
bitmap_image(const unsigned int width, const unsigned int height) | |
: file_name_(""), | |
width_(width), | |
height_(height), | |
row_increment_(0), | |
bytes_per_pixel_(3), | |
channel_mode_(bgr_mode) | |
{ | |
create_bitmap(); | |
} | |
bitmap_image(const bitmap_image& image) | |
: file_name_(image.file_name_), | |
width_(image.width_), | |
height_(image.height_), | |
row_increment_(0), | |
bytes_per_pixel_(3), | |
channel_mode_(bgr_mode) | |
{ | |
create_bitmap(); | |
data_ = image.data_; | |
} | |
bitmap_image& operator=(const bitmap_image& image) | |
{ | |
if (this != &image) | |
{ | |
file_name_ = image.file_name_; | |
bytes_per_pixel_ = image.bytes_per_pixel_; | |
width_ = image.width_; | |
height_ = image.height_; | |
row_increment_ = 0; | |
channel_mode_ = image.channel_mode_; | |
create_bitmap(); | |
data_ = image.data_; | |
} | |
return *this; | |
} | |
inline bool operator!() | |
{ | |
return (data_.size() == 0) || | |
(width_ == 0) || | |
(height_ == 0) || | |
(row_increment_ == 0); | |
} | |
inline void clear(const unsigned char v = 0x00) | |
{ | |
std::fill(data_.begin(), data_.end(), v); | |
} | |
inline unsigned char red_channel(const unsigned int x, const unsigned int y) const | |
{ | |
return data_[(y * row_increment_) + (x * bytes_per_pixel_ + 2)]; | |
} | |
inline unsigned char green_channel(const unsigned int x, const unsigned int y) const | |
{ | |
return data_[(y * row_increment_) + (x * bytes_per_pixel_ + 1)]; | |
} | |
inline unsigned char blue_channel(const unsigned int x, const unsigned int y) const | |
{ | |
return data_[(y * row_increment_) + (x * bytes_per_pixel_ + 0)]; | |
} | |
inline void red_channel(const unsigned int x, const unsigned int y, const unsigned char value) | |
{ | |
data_[(y * row_increment_) + (x * bytes_per_pixel_ + 2)] = value; | |
} | |
inline void green_channel(const unsigned int x, const unsigned int y, const unsigned char value) | |
{ | |
data_[(y * row_increment_) + (x * bytes_per_pixel_ + 1)] = value; | |
} | |
inline void blue_channel(const unsigned int x, const unsigned int y, const unsigned char value) | |
{ | |
data_[(y * row_increment_) + (x * bytes_per_pixel_ + 0)] = value; | |
} | |
inline unsigned char* row(unsigned int row_index) const | |
{ | |
return const_cast<unsigned char*>(&data_[(row_index * row_increment_)]); | |
} | |
inline void get_pixel(const unsigned int x, const unsigned int y, | |
unsigned char& red, | |
unsigned char& green, | |
unsigned char& blue) const | |
{ | |
const unsigned int y_offset = y * row_increment_; | |
const unsigned int x_offset = x * bytes_per_pixel_; | |
const unsigned int offset = y_offset + x_offset; | |
blue = data_[offset + 0]; | |
green = data_[offset + 1]; | |
red = data_[offset + 2]; | |
} | |
template <typename RGB> | |
inline void get_pixel(const unsigned int x, const unsigned int y, RGB& colour) const | |
{ | |
get_pixel(x, y, colour.red, colour.green, colour.blue); | |
} | |
inline rgb_t get_pixel(const unsigned int x, const unsigned int y) const | |
{ | |
rgb_t colour; | |
get_pixel(x, y, colour.red, colour.green, colour.blue); | |
return colour; | |
} | |
inline void set_pixel(const unsigned int x, const unsigned int y, | |
const unsigned char red, | |
const unsigned char green, | |
const unsigned char blue) | |
{ | |
const unsigned int y_offset = y * row_increment_; | |
const unsigned int x_offset = x * bytes_per_pixel_; | |
const unsigned int offset = y_offset + x_offset; | |
data_[offset + 0] = blue; | |
data_[offset + 1] = green; | |
data_[offset + 2] = red; | |
} | |
template <typename RGB> | |
inline void set_pixel(const unsigned int x, const unsigned int y, const RGB& colour) | |
{ | |
set_pixel(x, y, colour.red, colour.green, colour.blue); | |
} | |
inline bool copy_from(const bitmap_image& image) | |
{ | |
if ( | |
(image.height_ != height_) || | |
(image.width_ != width_) | |
) | |
{ | |
return false; | |
} | |
data_ = image.data_; | |
return true; | |
} | |
inline bool copy_from(const bitmap_image& source_image, | |
const unsigned int& x_offset, | |
const unsigned int& y_offset) | |
{ | |
if ((x_offset + source_image.width_) > width_) { return false; } | |
if ((y_offset + source_image.height_) > height_) { return false; } | |
for (unsigned int y = 0; y < source_image.height_; ++y) | |
{ | |
unsigned char* itr1 = row(y + y_offset) + x_offset * bytes_per_pixel_; | |
const unsigned char* itr2 = source_image.row(y); | |
const unsigned char* itr2_end = itr2 + source_image.width_ * bytes_per_pixel_; | |
std::copy(itr2, itr2_end, itr1); | |
} | |
return true; | |
} | |
inline bool region(const unsigned int& x, | |
const unsigned int& y, | |
const unsigned int& width, | |
const unsigned int& height, | |
bitmap_image& dest_image) const | |
{ | |
if ((x + width) > width_) { return false; } | |
if ((y + height) > height_) { return false; } | |
if ( | |
(dest_image.width_ < width_) || | |
(dest_image.height_ < height_) | |
) | |
{ | |
dest_image.setwidth_height(width, height); | |
} | |
for (unsigned int r = 0; r < height; ++r) | |
{ | |
unsigned char* itr1 = row(r + y) + x * bytes_per_pixel_; | |
unsigned char* itr1_end = itr1 + (width * bytes_per_pixel_); | |
unsigned char* itr2 = dest_image.row(r); | |
std::copy(itr1, itr1_end, itr2); | |
} | |
return true; | |
} | |
inline bool roi_from_center(const unsigned int& cx, | |
const unsigned int& cy, | |
const unsigned int& width, | |
const unsigned int& height, | |
bitmap_image& dest_image) const | |
{ | |
return region(cx - (width / 2), cy - (height / 2), | |
width, height, | |
dest_image); | |
} | |
inline bool set_region(const unsigned int& x, | |
const unsigned int& y, | |
const unsigned int& width, | |
const unsigned int& height, | |
const unsigned char& value) | |
{ | |
if ((x + width) > width_) { return false; } | |
if ((y + height) > height_) { return false; } | |
for (unsigned int r = 0; r < height; ++r) | |
{ | |
unsigned char* itr = row(r + y) + x * bytes_per_pixel_; | |
unsigned char* itr_end = itr + (width * bytes_per_pixel_); | |
std::fill(itr, itr_end, value); | |
} | |
return true; | |
} | |
inline bool set_region(const unsigned int& x, | |
const unsigned int& y, | |
const unsigned int& width, | |
const unsigned int& height, | |
const color_plane color, | |
const unsigned char& value) | |
{ | |
if ((x + width) > width_) { return false; } | |
if ((y + height) > height_) { return false; } | |
const unsigned int color_plane_offset = offset(color); | |
for (unsigned int r = 0; r < height; ++r) | |
{ | |
unsigned char* itr = row(r + y) + x * bytes_per_pixel_ + color_plane_offset; | |
unsigned char* itr_end = itr + (width * bytes_per_pixel_); | |
while (itr != itr_end) | |
{ | |
*itr = value; | |
itr += bytes_per_pixel_; | |
} | |
} | |
return true; | |
} | |
inline bool set_region(const unsigned int& x, | |
const unsigned int& y, | |
const unsigned int& width, | |
const unsigned int& height, | |
const unsigned char& red, | |
const unsigned char& green, | |
const unsigned char& blue) | |
{ | |
if ((x + width) > width_) { return false; } | |
if ((y + height) > height_) { return false; } | |
for (unsigned int r = 0; r < height; ++r) | |
{ | |
unsigned char* itr = row(r + y) + x * bytes_per_pixel_; | |
unsigned char* itr_end = itr + (width * bytes_per_pixel_); | |
while (itr != itr_end) | |
{ | |
*(itr++) = blue; | |
*(itr++) = green; | |
*(itr++) = red; | |
} | |
} | |
return true; | |
} | |
void reflective_image(bitmap_image& image, const bool include_diagnols = false) | |
{ | |
image.setwidth_height(3 * width_, 3 * height_, true); | |
image.copy_from(*this, width_, height_); | |
vertical_flip(); | |
image.copy_from(*this, width_, 0); | |
image.copy_from(*this, width_, 2 * height_); | |
vertical_flip(); | |
horizontal_flip(); | |
image.copy_from(*this, 0, height_); | |
image.copy_from(*this, 2 * width_, height_); | |
horizontal_flip(); | |
if (include_diagnols) | |
{ | |
bitmap_image tile = *this; | |
tile.vertical_flip(); | |
tile.horizontal_flip(); | |
image.copy_from(tile, 0, 0); | |
image.copy_from(tile, 2 * width_, 0); | |
image.copy_from(tile, 2 * width_, 2 * height_); | |
image.copy_from(tile, 0, 2 * height_); | |
} | |
} | |
inline unsigned int width() const | |
{ | |
return width_; | |
} | |
inline unsigned int height() const | |
{ | |
return height_; | |
} | |
inline unsigned int bytes_per_pixel() const | |
{ | |
return bytes_per_pixel_; | |
} | |
inline unsigned int pixel_count() const | |
{ | |
return width_ * height_; | |
} | |
inline void setwidth_height(const unsigned int width, | |
const unsigned int height, | |
const bool clear = false) | |
{ | |
data_.clear(); | |
width_ = width; | |
height_ = height; | |
create_bitmap(); | |
if (clear) | |
{ | |
std::fill(data_.begin(), data_.end(), static_cast<unsigned char>(0x00)); | |
} | |
} | |
void save_image(const std::string& file_name) const | |
{ | |
std::ofstream stream(file_name.c_str(), std::ios::binary); | |
if (!stream) | |
{ | |
std::cerr << "bitmap_image::save_image(): Error - Could not open file " | |
<< file_name << " for writing!" << std::endl; | |
return; | |
} | |
bitmap_information_header bih; | |
bih.width = width_; | |
bih.height = height_; | |
bih.bit_count = static_cast<unsigned short>(bytes_per_pixel_ << 3); | |
bih.clr_important = 0; | |
bih.clr_used = 0; | |
bih.compression = 0; | |
bih.planes = 1; | |
bih.size = bih.struct_size(); | |
bih.x_pels_per_meter = 0; | |
bih.y_pels_per_meter = 0; | |
bih.size_image = (((bih.width * bytes_per_pixel_) + 3) & 0x0000FFFC) * bih.height; | |
bitmap_file_header bfh; | |
bfh.type = 19778; | |
bfh.size = bfh.struct_size() + bih.struct_size() + bih.size_image; | |
bfh.reserved1 = 0; | |
bfh.reserved2 = 0; | |
bfh.off_bits = bih.struct_size() + bfh.struct_size(); | |
write_bfh(stream, bfh); | |
write_bih(stream, bih); | |
unsigned int padding = (4 - ((3 * width_) % 4)) % 4; | |
char padding_data[4] = { 0x00, 0x00, 0x00, 0x00 }; | |
for (unsigned int i = 0; i < height_; ++i) | |
{ | |
const unsigned char* data_ptr = &data_[(row_increment_ * (height_ - i - 1))]; | |
stream.write(reinterpret_cast<const char*>(data_ptr), sizeof(unsigned char)* bytes_per_pixel_* width_); | |
stream.write(padding_data, padding); | |
} | |
stream.close(); | |
} | |
inline void set_all_ith_bits_low(const unsigned int bitr_index) | |
{ | |
unsigned char mask = static_cast<unsigned char>(~(1 << bitr_index)); | |
for (unsigned char* itr = data(); itr != end(); ++itr) | |
{ | |
*itr &= mask; | |
} | |
} | |
inline void set_all_ith_bits_high(const unsigned int bitr_index) | |
{ | |
unsigned char mask = static_cast<unsigned char>(1 << bitr_index); | |
for (unsigned char* itr = data(); itr != end(); ++itr) | |
{ | |
*itr |= mask; | |
} | |
} | |
inline void set_all_ith_channels(const unsigned int& channel, const unsigned char& value) | |
{ | |
for (unsigned char* itr = (data() + channel); itr < end(); itr += bytes_per_pixel_) | |
{ | |
*itr = value; | |
} | |
} | |
inline void set_channel(const color_plane color, const unsigned char& value) | |
{ | |
for (unsigned char* itr = (data() + offset(color)); itr < end(); itr += bytes_per_pixel_) | |
{ | |
*itr = value; | |
} | |
} | |
inline void ror_channel(const color_plane color, const unsigned int& ror) | |
{ | |
for (unsigned char* itr = (data() + offset(color)); itr < end(); itr += bytes_per_pixel_) | |
{ | |
*itr = static_cast<unsigned char>(((*itr) >> ror) | ((*itr) << (8 - ror))); | |
} | |
} | |
inline void set_all_channels(const unsigned char& value) | |
{ | |
for (unsigned char* itr = data(); itr < end(); ) | |
{ | |
*(itr++) = value; | |
} | |
} | |
inline void set_all_channels(const unsigned char& r_value, | |
const unsigned char& g_value, | |
const unsigned char& b_value) | |
{ | |
for (unsigned char* itr = (data() + 0); itr < end(); itr += bytes_per_pixel_) | |
{ | |
*(itr + 0) = b_value; | |
*(itr + 1) = g_value; | |
*(itr + 2) = r_value; | |
} | |
} | |
inline void invert_color_planes() | |
{ | |
for (unsigned char* itr = data(); itr < end(); *itr = ~(*itr), ++itr); | |
} | |
inline void add_to_color_plane(const color_plane color, const unsigned char& value) | |
{ | |
for (unsigned char* itr = (data() + offset(color)); itr < end(); itr += bytes_per_pixel_) | |
{ | |
(*itr) += value; | |
} | |
} | |
inline void convert_to_grayscale() | |
{ | |
double r_scaler = 0.299; | |
double g_scaler = 0.587; | |
double b_scaler = 0.114; | |
if (rgb_mode == channel_mode_) | |
{ | |
std::swap(r_scaler, b_scaler); | |
} | |
for (unsigned char* itr = data(); itr < end(); ) | |
{ | |
unsigned char gray_value = static_cast<unsigned char> | |
( | |
(r_scaler * (*(itr + 2))) + | |
(g_scaler * (*(itr + 1))) + | |
(b_scaler * (*(itr + 0))) | |
); | |
*(itr++) = gray_value; | |
*(itr++) = gray_value; | |
*(itr++) = gray_value; | |
} | |
} | |
inline const unsigned char* data() const | |
{ | |
return data_.data(); | |
} | |
inline unsigned char* data() | |
{ | |
return const_cast<unsigned char*>(data_.data()); | |
} | |
inline void bgr_to_rgb() | |
{ | |
if ((bgr_mode == channel_mode_) && (3 == bytes_per_pixel_)) | |
{ | |
reverse_channels(); | |
channel_mode_ = rgb_mode; | |
} | |
} | |
inline void rgb_to_bgr() | |
{ | |
if ((rgb_mode == channel_mode_) && (3 == bytes_per_pixel_)) | |
{ | |
reverse_channels(); | |
channel_mode_ = bgr_mode; | |
} | |
} | |
inline void reverse() | |
{ | |
unsigned char* itr1 = data(); | |
unsigned char* itr2 = end() - bytes_per_pixel_; | |
while (itr1 < itr2) | |
{ | |
for (std::size_t i = 0; i < bytes_per_pixel_; ++i) | |
{ | |
unsigned char* citr1 = itr1 + i; | |
unsigned char* citr2 = itr2 + i; | |
std::swap(*citr1, *citr2); | |
} | |
itr1 += bytes_per_pixel_; | |
itr2 -= bytes_per_pixel_; | |
} | |
} | |
inline void horizontal_flip() | |
{ | |
for (unsigned int y = 0; y < height_; ++y) | |
{ | |
unsigned char* itr1 = row(y); | |
unsigned char* itr2 = itr1 + row_increment_ - bytes_per_pixel_; | |
while (itr1 < itr2) | |
{ | |
for (unsigned int i = 0; i < bytes_per_pixel_; ++i) | |
{ | |
unsigned char* p1 = (itr1 + i); | |
unsigned char* p2 = (itr2 + i); | |
std::swap(*p1, *p2); | |
} | |
itr1 += bytes_per_pixel_; | |
itr2 -= bytes_per_pixel_; | |
} | |
} | |
} | |
inline void vertical_flip() | |
{ | |
for (unsigned int y = 0; y < (height_ / 2); ++y) | |
{ | |
unsigned char* itr1 = row(y); | |
unsigned char* itr2 = row(height_ - y - 1); | |
for (std::size_t x = 0; x < row_increment_; ++x) | |
{ | |
std::swap(*(itr1 + x), *(itr2 + x)); | |
} | |
} | |
} | |
inline void export_color_plane(const color_plane color, unsigned char* image) | |
{ | |
for (unsigned char* itr = (data() + offset(color)); itr < end(); ++image, itr += bytes_per_pixel_) | |
{ | |
(*image) = (*itr); | |
} | |
} | |
inline void export_color_plane(const color_plane color, bitmap_image& image) | |
{ | |
if ( | |
(width_ != image.width_) || | |
(height_ != image.height_) | |
) | |
{ | |
image.setwidth_height(width_, height_); | |
} | |
image.clear(); | |
unsigned char* itr1 = (data() + offset(color)); | |
unsigned char* itr1_end = end(); | |
unsigned char* itr2 = (image.data() + offset(color)); | |
while (itr1 < itr1_end) | |
{ | |
(*itr2) = (*itr1); | |
itr1 += bytes_per_pixel_; | |
itr2 += bytes_per_pixel_; | |
} | |
} | |
inline void export_response_image(const color_plane color, double* response_image) | |
{ | |
double* resp_itr = response_image; | |
for (unsigned char* itr = (data() + offset(color)); itr < end(); ++response_image, itr += bytes_per_pixel_) | |
{ | |
*(resp_itr++) = (1.0 * (*itr)) / 256.0; | |
} | |
} | |
inline void export_gray_scale_response_image(double* response_image) const | |
{ | |
double* resp_itr = response_image; | |
for (const unsigned char* itr = data(); itr < end(); itr += bytes_per_pixel_) | |
{ | |
unsigned char gray_value = static_cast<unsigned char> | |
( | |
(0.299 * (*(itr + 2))) + | |
(0.587 * (*(itr + 1))) + | |
(0.114 * (*(itr + 0))) | |
); | |
*(resp_itr++) = (1.0 * gray_value) / 256.0; | |
} | |
} | |
inline void export_rgb(double* red, double* green, double* blue) const | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (const unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
(*blue) = (1.0 * (*(itr++))) / 256.0; | |
(*green) = (1.0 * (*(itr++))) / 256.0; | |
(*red) = (1.0 * (*(itr++))) / 256.0; | |
} | |
} | |
inline void export_rgb(float* red, float* green, float* blue) const | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (const unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
(*blue) = (1.0f * (*(itr++))) / 256.0f; | |
(*green) = (1.0f * (*(itr++))) / 256.0f; | |
(*red) = (1.0f * (*(itr++))) / 256.0f; | |
} | |
} | |
inline void export_rgb(unsigned char* red, unsigned char* green, unsigned char* blue) const | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (const unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
(*blue) = *(itr++); | |
(*green) = *(itr++); | |
(*red) = *(itr++); | |
} | |
} | |
inline void export_ycbcr(double* y, double* cb, double* cr) const | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (const unsigned char* itr = data(); itr < end(); ++y, ++cb, ++cr) | |
{ | |
const double blue = (1.0 * (*(itr++))); | |
const double green = (1.0 * (*(itr++))); | |
const double red = (1.0 * (*(itr++))); | |
(*y) = clamp<double>(16.0 + (1.0 / 256.0) * (65.738 * red + 129.057 * green + 25.064 * blue), 1.0, 254); | |
(*cb) = clamp<double>(128.0 + (1.0 / 256.0) * (-37.945 * red - 74.494 * green + 112.439 * blue), 1.0, 254); | |
(*cr) = clamp<double>(128.0 + (1.0 / 256.0) * (112.439 * red - 94.154 * green - 18.285 * blue), 1.0, 254); | |
} | |
} | |
inline void export_rgb_normal(double* red, double* green, double* blue) const | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (const unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
(*blue) = (1.0 * (*(itr++))); | |
(*green) = (1.0 * (*(itr++))); | |
(*red) = (1.0 * (*(itr++))); | |
} | |
} | |
inline void export_rgb_normal(float* red, float* green, float* blue) const | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (const unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
(*blue) = (1.0f * (*(itr++))); | |
(*green) = (1.0f * (*(itr++))); | |
(*red) = (1.0f * (*(itr++))); | |
} | |
} | |
inline void import_rgb(double* red, double* green, double* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = static_cast<unsigned char>(256.0 * (*blue)); | |
*(itr++) = static_cast<unsigned char>(256.0 * (*green)); | |
*(itr++) = static_cast<unsigned char>(256.0 * (*red)); | |
} | |
} | |
inline void import_rgb(float* red, float* green, float* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = static_cast<unsigned char>(256.0f * (*blue)); | |
*(itr++) = static_cast<unsigned char>(256.0f * (*green)); | |
*(itr++) = static_cast<unsigned char>(256.0f * (*red)); | |
} | |
} | |
inline void import_rgb(unsigned char* red, unsigned char* green, unsigned char* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = (*blue); | |
*(itr++) = (*green); | |
*(itr++) = (*red); | |
} | |
} | |
inline void import_ycbcr(double* y, double* cb, double* cr) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++y, ++cb, ++cr) | |
{ | |
double y_ = (*y); | |
double cb_ = (*cb); | |
double cr_ = (*cr); | |
*(itr++) = static_cast<unsigned char>(clamp((298.082 * y_ + 516.412 * cb_) / 256.0 - 276.836, 0.0, 255.0)); | |
*(itr++) = static_cast<unsigned char>(clamp((298.082 * y_ - 100.291 * cb_ - 208.120 * cr_) / 256.0 + 135.576, 0.0, 255.0)); | |
*(itr++) = static_cast<unsigned char>(clamp((298.082 * y_ + 408.583 * cr_) / 256.0 - 222.921, 0.0, 255.0)); | |
} | |
} | |
inline void import_gray_scale_clamped(double* gray) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++gray) | |
{ | |
unsigned char c = static_cast<unsigned char>(clamp<double>(256.0 * (*gray), 0.0, 255.0)); | |
*(itr + 0) = c; | |
*(itr + 1) = c; | |
*(itr + 2) = c; | |
itr += 3; | |
} | |
} | |
inline void import_rgb_clamped(double* red, double* green, double* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = static_cast<unsigned char>(clamp<double>(256.0 * (*blue), 0.0, 255.0)); | |
*(itr++) = static_cast<unsigned char>(clamp<double>(256.0 * (*green), 0.0, 255.0)); | |
*(itr++) = static_cast<unsigned char>(clamp<double>(256.0 * (*red), 0.0, 255.0)); | |
} | |
} | |
inline void import_rgb_clamped(float* red, float* green, float* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = static_cast<unsigned char>(clamp<double>(256.0f * (*blue), 0.0, 255.0)); | |
*(itr++) = static_cast<unsigned char>(clamp<double>(256.0f * (*green), 0.0, 255.0)); | |
*(itr++) = static_cast<unsigned char>(clamp<double>(256.0f * (*red), 0.0, 255.0)); | |
} | |
} | |
inline void import_rgb_normal(double* red, double* green, double* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = static_cast<unsigned char>(*blue); | |
*(itr++) = static_cast<unsigned char>(*green); | |
*(itr++) = static_cast<unsigned char>(*red); | |
} | |
} | |
inline void import_rgb_normal(float* red, float* green, float* blue) | |
{ | |
if (bgr_mode != channel_mode_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); ++red, ++green, ++blue) | |
{ | |
*(itr++) = static_cast<unsigned char>(*blue); | |
*(itr++) = static_cast<unsigned char>(*green); | |
*(itr++) = static_cast<unsigned char>(*red); | |
} | |
} | |
inline void subsample(bitmap_image& dest) const | |
{ | |
/* | |
Half sub-sample of original image. | |
*/ | |
unsigned int w = 0; | |
unsigned int h = 0; | |
bool odd_width = false; | |
bool odd_height = false; | |
if (0 == (width_ % 2)) | |
w = width_ / 2; | |
else | |
{ | |
w = 1 + (width_ / 2); | |
odd_width = true; | |
} | |
if (0 == (height_ % 2)) | |
h = height_ / 2; | |
else | |
{ | |
h = 1 + (height_ / 2); | |
odd_height = true; | |
} | |
unsigned int horizontal_upper = (odd_width) ? (w - 1) : w; | |
unsigned int vertical_upper = (odd_height) ? (h - 1) : h; | |
dest.setwidth_height(w, h); | |
dest.clear(); | |
unsigned char* s_itr[3]; | |
const unsigned char* itr1[3]; | |
const unsigned char* itr2[3]; | |
s_itr[0] = dest.data() + 0; | |
s_itr[1] = dest.data() + 1; | |
s_itr[2] = dest.data() + 2; | |
itr1[0] = data() + 0; | |
itr1[1] = data() + 1; | |
itr1[2] = data() + 2; | |
itr2[0] = data() + row_increment_ + 0; | |
itr2[1] = data() + row_increment_ + 1; | |
itr2[2] = data() + row_increment_ + 2; | |
unsigned int total = 0; | |
for (unsigned int j = 0; j < vertical_upper; ++j) | |
{ | |
for (unsigned int i = 0; i < horizontal_upper; ++i) | |
{ | |
for (unsigned int k = 0; k < bytes_per_pixel_; s_itr[k] += bytes_per_pixel_, ++k) | |
{ | |
total = 0; | |
total += *(itr1[k]); | |
total += *(itr1[k]); | |
total += *(itr2[k]); | |
total += *(itr2[k]); | |
itr1[k] += bytes_per_pixel_; | |
itr1[k] += bytes_per_pixel_; | |
itr2[k] += bytes_per_pixel_; | |
itr2[k] += bytes_per_pixel_; | |
*(s_itr[k]) = static_cast<unsigned char>(total >> 2); | |
} | |
} | |
if (odd_width) | |
{ | |
for (unsigned int k = 0; k < bytes_per_pixel_; s_itr[k] += bytes_per_pixel_, ++k) | |
{ | |
total = 0; | |
total += *(itr1[k]); | |
total += *(itr2[k]); | |
itr1[k] += bytes_per_pixel_; | |
itr2[k] += bytes_per_pixel_; | |
*(s_itr[k]) = static_cast<unsigned char>(total >> 1); | |
} | |
} | |
for (unsigned int k = 0; k < bytes_per_pixel_; ++k) | |
{ | |
itr1[k] += row_increment_; | |
} | |
if (j != (vertical_upper - 1)) | |
{ | |
for (unsigned int k = 0; k < bytes_per_pixel_; ++k) | |
{ | |
itr2[k] += row_increment_; | |
} | |
} | |
} | |
if (odd_height) | |
{ | |
for (unsigned int i = 0; i < horizontal_upper; ++i) | |
{ | |
for (unsigned int k = 0; k < bytes_per_pixel_; s_itr[k] += bytes_per_pixel_, ++k) | |
{ | |
total = 0; | |
total += *(itr1[k]); | |
total += *(itr2[k]); | |
itr1[k] += bytes_per_pixel_; | |
itr2[k] += bytes_per_pixel_; | |
*(s_itr[k]) = static_cast<unsigned char>(total >> 1); | |
} | |
} | |
if (odd_width) | |
{ | |
for (unsigned int k = 0; k < bytes_per_pixel_; ++k) | |
{ | |
(*(s_itr[k])) = *(itr1[k]); | |
} | |
} | |
} | |
} | |
inline void upsample(bitmap_image& dest) const | |
{ | |
/* | |
2x up-sample of original image. | |
*/ | |
dest.setwidth_height(2 * width_, 2 * height_); | |
dest.clear(); | |
const unsigned char* s_itr[3]; | |
unsigned char* itr1[3]; | |
unsigned char* itr2[3]; | |
s_itr[0] = data() + 0; | |
s_itr[1] = data() + 1; | |
s_itr[2] = data() + 2; | |
itr1[0] = dest.data() + 0; | |
itr1[1] = dest.data() + 1; | |
itr1[2] = dest.data() + 2; | |
itr2[0] = dest.data() + dest.row_increment_ + 0; | |
itr2[1] = dest.data() + dest.row_increment_ + 1; | |
itr2[2] = dest.data() + dest.row_increment_ + 2; | |
for (unsigned int j = 0; j < height_; ++j) | |
{ | |
for (unsigned int i = 0; i < width_; ++i) | |
{ | |
for (unsigned int k = 0; k < bytes_per_pixel_; s_itr[k] += bytes_per_pixel_, ++k) | |
{ | |
*(itr1[k]) = *(s_itr[k]); itr1[k] += bytes_per_pixel_; | |
*(itr1[k]) = *(s_itr[k]); itr1[k] += bytes_per_pixel_; | |
*(itr2[k]) = *(s_itr[k]); itr2[k] += bytes_per_pixel_; | |
*(itr2[k]) = *(s_itr[k]); itr2[k] += bytes_per_pixel_; | |
} | |
} | |
for (unsigned int k = 0; k < bytes_per_pixel_; ++k) | |
{ | |
itr1[k] += dest.row_increment_; | |
itr2[k] += dest.row_increment_; | |
} | |
} | |
} | |
inline void alpha_blend(const double& alpha, const bitmap_image& image) | |
{ | |
if ( | |
(image.width_ != width_) || | |
(image.height_ != height_) | |
) | |
{ | |
return; | |
} | |
if ((alpha < 0.0) || (alpha > 1.0)) | |
{ | |
return; | |
} | |
unsigned char* itr1 = data(); | |
const unsigned char* itr1_end = end(); | |
const unsigned char* itr2 = image.data(); | |
double alpha_compliment = 1.0 - alpha; | |
while (itr1 != itr1_end) | |
{ | |
*(itr1) = static_cast<unsigned char>((alpha * (*itr2)) + (alpha_compliment * (*itr1))); | |
++itr1; | |
++itr2; | |
} | |
} | |
inline double psnr(const bitmap_image& image) | |
{ | |
if ( | |
(image.width_ != width_) || | |
(image.height_ != height_) | |
) | |
{ | |
return 0.0; | |
} | |
const unsigned char* itr1 = data(); | |
const unsigned char* itr2 = image.data(); | |
double mse = 0.0; | |
while (itr1 != end()) | |
{ | |
const double v = (static_cast<double>(*itr1) - static_cast<double>(*itr2)); | |
mse += v * v; | |
++itr1; | |
++itr2; | |
} | |
if (mse <= 0.0000001) | |
{ | |
return 1000000.0; | |
} | |
else | |
{ | |
mse /= (3.0 * width_ * height_); | |
return 20.0 * std::log10(255.0 / std::sqrt(mse)); | |
} | |
} | |
inline double psnr(const unsigned int& x, | |
const unsigned int& y, | |
const bitmap_image& image) | |
{ | |
if ((x + image.width()) > width_) { return 0.0; } | |
if ((y + image.height()) > height_) { return 0.0; } | |
double mse = 0.0; | |
const unsigned int height = image.height(); | |
const unsigned int width = image.width(); | |
for (unsigned int r = 0; r < height; ++r) | |
{ | |
const unsigned char* itr1 = row(r + y) + x * bytes_per_pixel_; | |
const unsigned char* itr1_end = itr1 + (width * bytes_per_pixel_); | |
const unsigned char* itr2 = image.row(r); | |
while (itr1 != itr1_end) | |
{ | |
double v = (static_cast<double>(*itr1) - static_cast<double>(*itr2)); | |
mse += v * v; | |
++itr1; | |
++itr2; | |
} | |
} | |
if (mse <= 0.0000001) | |
{ | |
return 1000000.0; | |
} | |
else | |
{ | |
mse /= (3.0 * image.width() * image.height()); | |
return 20.0 * std::log10(255.0 / std::sqrt(mse)); | |
} | |
} | |
inline void histogram(const color_plane color, double hist[256]) const | |
{ | |
std::fill(hist, hist + 256, 0.0); | |
for (const unsigned char* itr = (data() + offset(color)); itr < end(); itr += bytes_per_pixel_) | |
{ | |
++hist[(*itr)]; | |
} | |
} | |
inline void histogram_normalized(const color_plane color, double hist[256]) const | |
{ | |
histogram(color, hist); | |
double* h_itr = hist; | |
const double* h_end = hist + 256; | |
const double pixel_count = static_cast<double>(width_ * height_); | |
while (h_end != h_itr) | |
{ | |
*(h_itr++) /= pixel_count; | |
} | |
} | |
inline unsigned int offset(const color_plane color) const | |
{ | |
switch (channel_mode_) | |
{ | |
case rgb_mode: { | |
switch (color) | |
{ | |
case red_plane: return 0; | |
case green_plane: return 1; | |
case blue_plane: return 2; | |
default: return std::numeric_limits<unsigned int>::max(); | |
} | |
} | |
case bgr_mode: { | |
switch (color) | |
{ | |
case red_plane: return 2; | |
case green_plane: return 1; | |
case blue_plane: return 0; | |
default: return std::numeric_limits<unsigned int>::max(); | |
} | |
} | |
default: return std::numeric_limits<unsigned int>::max(); | |
} | |
} | |
inline void incremental() | |
{ | |
unsigned char current_color = 0; | |
for (unsigned char* itr = data(); itr < end();) | |
{ | |
(*itr++) = (current_color); | |
(*itr++) = (current_color); | |
(*itr++) = (current_color); | |
++current_color; | |
} | |
} | |
inline void reverse_channels() | |
{ | |
if (3 != bytes_per_pixel_) | |
return; | |
for (unsigned char* itr = data(); itr < end(); itr += bytes_per_pixel_) | |
{ | |
std::swap(*(itr + 0), *(itr + 2)); | |
} | |
} | |
private: | |
inline const unsigned char* end() const | |
{ | |
return data_.data() + data_.size(); | |
} | |
inline unsigned char* end() | |
{ | |
return const_cast<unsigned char*>(data() + data_.size()); | |
} | |
struct bitmap_file_header | |
{ | |
unsigned short type; | |
unsigned int size; | |
unsigned short reserved1; | |
unsigned short reserved2; | |
unsigned int off_bits; | |
unsigned int struct_size() const | |
{ | |
return sizeof(type) + | |
sizeof(size) + | |
sizeof(reserved1) + | |
sizeof(reserved2) + | |
sizeof(off_bits); | |
} | |
void clear() | |
{ | |
std::memset(this, 0x00, sizeof(bitmap_file_header)); | |
} | |
}; | |
struct bitmap_information_header | |
{ | |
unsigned int size; | |
unsigned int width; | |
unsigned int height; | |
unsigned short planes; | |
unsigned short bit_count; | |
unsigned int compression; | |
unsigned int size_image; | |
unsigned int x_pels_per_meter; | |
unsigned int y_pels_per_meter; | |
unsigned int clr_used; | |
unsigned int clr_important; | |
unsigned int struct_size() const | |
{ | |
return sizeof(size) + | |
sizeof(width) + | |
sizeof(height) + | |
sizeof(planes) + | |
sizeof(bit_count) + | |
sizeof(compression) + | |
sizeof(size_image) + | |
sizeof(x_pels_per_meter) + | |
sizeof(y_pels_per_meter) + | |
sizeof(clr_used) + | |
sizeof(clr_important); | |
} | |
void clear() | |
{ | |
std::memset(this, 0x00, sizeof(bitmap_information_header)); | |
} | |
}; | |
inline bool big_endian() const | |
{ | |
unsigned int v = 0x01; | |
return (1 != reinterpret_cast<char*>(&v)[0]); | |
} | |
inline unsigned short flip(const unsigned short& v) const | |
{ | |
return ((v >> 8) | (v << 8)); | |
} | |
inline unsigned int flip(const unsigned int& v) const | |
{ | |
return ( | |
((v & 0xFF000000) >> 0x18) | | |
((v & 0x000000FF) << 0x18) | | |
((v & 0x00FF0000) >> 0x08) | | |
((v & 0x0000FF00) << 0x08) | |
); | |
} | |
template <typename T> | |
inline void read_from_stream(std::ifstream& stream, T& t) | |
{ | |
stream.read(reinterpret_cast<char*>(&t), sizeof(T)); | |
} | |
template <typename T> | |
inline void write_to_stream(std::ofstream& stream, const T& t) const | |
{ | |
stream.write(reinterpret_cast<const char*>(&t), sizeof(T)); | |
} | |
inline void read_bfh(std::ifstream& stream, bitmap_file_header& bfh) | |
{ | |
read_from_stream(stream, bfh.type); | |
read_from_stream(stream, bfh.size); | |
read_from_stream(stream, bfh.reserved1); | |
read_from_stream(stream, bfh.reserved2); | |
read_from_stream(stream, bfh.off_bits); | |
if (big_endian()) | |
{ | |
bfh.type = flip(bfh.type); | |
bfh.size = flip(bfh.size); | |
bfh.reserved1 = flip(bfh.reserved1); | |
bfh.reserved2 = flip(bfh.reserved2); | |
bfh.off_bits = flip(bfh.off_bits); | |
} | |
} | |
inline void write_bfh(std::ofstream& stream, const bitmap_file_header& bfh) const | |
{ | |
if (big_endian()) | |
{ | |
write_to_stream(stream, flip(bfh.type)); | |
write_to_stream(stream, flip(bfh.size)); | |
write_to_stream(stream, flip(bfh.reserved1)); | |
write_to_stream(stream, flip(bfh.reserved2)); | |
write_to_stream(stream, flip(bfh.off_bits)); | |
} | |
else | |
{ | |
write_to_stream(stream, bfh.type); | |
write_to_stream(stream, bfh.size); | |
write_to_stream(stream, bfh.reserved1); | |
write_to_stream(stream, bfh.reserved2); | |
write_to_stream(stream, bfh.off_bits); | |
} | |
} | |
inline void read_bih(std::ifstream& stream, bitmap_information_header& bih) | |
{ | |
read_from_stream(stream, bih.size); | |
read_from_stream(stream, bih.width); | |
read_from_stream(stream, bih.height); | |
read_from_stream(stream, bih.planes); | |
read_from_stream(stream, bih.bit_count); | |
read_from_stream(stream, bih.compression); | |
read_from_stream(stream, bih.size_image); | |
read_from_stream(stream, bih.x_pels_per_meter); | |
read_from_stream(stream, bih.y_pels_per_meter); | |
read_from_stream(stream, bih.clr_used); | |
read_from_stream(stream, bih.clr_important); | |
if (big_endian()) | |
{ | |
bih.size = flip(bih.size); | |
bih.width = flip(bih.width); | |
bih.height = flip(bih.height); | |
bih.planes = flip(bih.planes); | |
bih.bit_count = flip(bih.bit_count); | |
bih.compression = flip(bih.compression); | |
bih.size_image = flip(bih.size_image); | |
bih.x_pels_per_meter = flip(bih.x_pels_per_meter); | |
bih.y_pels_per_meter = flip(bih.y_pels_per_meter); | |
bih.clr_used = flip(bih.clr_used); | |
bih.clr_important = flip(bih.clr_important); | |
} | |
} | |
inline void write_bih(std::ofstream& stream, const bitmap_information_header& bih) const | |
{ | |
if (big_endian()) | |
{ | |
write_to_stream(stream, flip(bih.size)); | |
write_to_stream(stream, flip(bih.width)); | |
write_to_stream(stream, flip(bih.height)); | |
write_to_stream(stream, flip(bih.planes)); | |
write_to_stream(stream, flip(bih.bit_count)); | |
write_to_stream(stream, flip(bih.compression)); | |
write_to_stream(stream, flip(bih.size_image)); | |
write_to_stream(stream, flip(bih.x_pels_per_meter)); | |
write_to_stream(stream, flip(bih.y_pels_per_meter)); | |
write_to_stream(stream, flip(bih.clr_used)); | |
write_to_stream(stream, flip(bih.clr_important)); | |
} | |
else | |
{ | |
write_to_stream(stream, bih.size); | |
write_to_stream(stream, bih.width); | |
write_to_stream(stream, bih.height); | |
write_to_stream(stream, bih.planes); | |
write_to_stream(stream, bih.bit_count); | |
write_to_stream(stream, bih.compression); | |
write_to_stream(stream, bih.size_image); | |
write_to_stream(stream, bih.x_pels_per_meter); | |
write_to_stream(stream, bih.y_pels_per_meter); | |
write_to_stream(stream, bih.clr_used); | |
write_to_stream(stream, bih.clr_important); | |
} | |
} | |
inline std::size_t file_size(const std::string& file_name) const | |
{ | |
std::ifstream file(file_name.c_str(), std::ios::in | std::ios::binary); | |
if (!file) return 0; | |
file.seekg(0, std::ios::end); | |
return static_cast<std::size_t>(file.tellg()); | |
} | |
void create_bitmap() | |
{ | |
row_increment_ = width_ * bytes_per_pixel_; | |
data_.resize(height_ * row_increment_); | |
} | |
void load_bitmap() | |
{ | |
std::ifstream stream(file_name_.c_str(), std::ios::binary); | |
if (!stream) | |
{ | |
std::cerr << "bitmap_image::load_bitmap() ERROR: bitmap_image - " | |
<< "file " << file_name_ << " not found!" << std::endl; | |
return; | |
} | |
width_ = 0; | |
height_ = 0; | |
bitmap_file_header bfh; | |
bitmap_information_header bih; | |
bfh.clear(); | |
bih.clear(); | |
read_bfh(stream, bfh); | |
read_bih(stream, bih); | |
if (bfh.type != 19778) | |
{ | |
std::cerr << "bitmap_image::load_bitmap() ERROR: bitmap_image - " | |
<< "Invalid type value " << bfh.type << " expected 19778." << std::endl; | |
bfh.clear(); | |
bih.clear(); | |
stream.close(); | |
return; | |
} | |
if (bih.bit_count != 24) | |
{ | |
std::cerr << "bitmap_image::load_bitmap() ERROR: bitmap_image - " | |
<< "Invalid bit depth " << bih.bit_count << " expected 24." << std::endl; | |
bfh.clear(); | |
bih.clear(); | |
stream.close(); | |
return; | |
} | |
if (bih.size != bih.struct_size()) | |
{ | |
std::cerr << "bitmap_image::load_bitmap() ERROR: bitmap_image - " | |
<< "Invalid BIH size " << bih.size | |
<< " expected " << bih.struct_size() << std::endl; | |
bfh.clear(); | |
bih.clear(); | |
stream.close(); | |
return; | |
} | |
width_ = bih.width; | |
height_ = bih.height; | |
bytes_per_pixel_ = bih.bit_count >> 3; | |
unsigned int padding = (4 - ((3 * width_) % 4)) % 4; | |
char padding_data[4] = { 0x00, 0x00, 0x00, 0x00 }; | |
std::size_t bitmap_file_size = file_size(file_name_); | |
std::size_t bitmap_logical_size = (height_ * width_ * bytes_per_pixel_) + | |
(height_ * padding) + | |
bih.struct_size() + | |
bfh.struct_size(); | |
if (bitmap_file_size != bitmap_logical_size) | |
{ | |
std::cerr << "bitmap_image::load_bitmap() ERROR: bitmap_image - " | |
<< "Mismatch between logical and physical sizes of bitmap. " | |
<< "Logical: " << bitmap_logical_size << " " | |
<< "Physical: " << bitmap_file_size << std::endl; | |
bfh.clear(); | |
bih.clear(); | |
stream.close(); | |
return; | |
} | |
create_bitmap(); | |
for (unsigned int i = 0; i < height_; ++i) | |
{ | |
unsigned char* data_ptr = row(height_ - i - 1); // read in inverted row order | |
stream.read(reinterpret_cast<char*>(data_ptr), sizeof(char)* bytes_per_pixel_* width_); | |
stream.read(padding_data, padding); | |
} | |
} | |
template <typename T> | |
inline T clamp(const T& v, const T& lower_range, const T& upper_range) const | |
{ | |
if (v < lower_range) | |
return lower_range; | |
else if (v > upper_range) | |
return upper_range; | |
else | |
return v; | |
} | |
std::string file_name_; | |
unsigned int width_; | |
unsigned int height_; | |
unsigned int row_increment_; | |
unsigned int bytes_per_pixel_; | |
channel_mode channel_mode_; | |
std::vector<unsigned char> data_; | |
}; | |
typedef bitmap_image::rgb_t rgb_t; | |
inline bool operator==(const rgb_t& c0, const rgb_t& c1) | |
{ | |
return (c0.red == c1.red) && | |
(c0.green == c1.green) && | |
(c0.blue == c1.blue); | |
} | |
inline bool operator!=(const rgb_t& c0, const rgb_t& c1) | |
{ | |
return (c0.red != c1.red) || | |
(c0.green != c1.green) || | |
(c0.blue != c1.blue); | |
} | |
inline std::size_t hamming_distance(const rgb_t& c0, const rgb_t& c1) | |
{ | |
std::size_t result = 0; | |
if (c0.red != c1.red) ++result; | |
if (c0.green != c1.green) ++result; | |
if (c0.blue != c1.blue) ++result; | |
return result; | |
} | |
inline rgb_t make_colour(const unsigned int& red, const unsigned int& green, const unsigned int& blue) | |
{ | |
rgb_t result; | |
result.red = static_cast<unsigned char>(red); | |
result.green = static_cast<unsigned char>(green); | |
result.blue = static_cast<unsigned char>(blue); | |
return result; | |
} | |
template <typename OutputIterator> | |
inline void generate_colours(const std::size_t& steps, const rgb_t c0, const rgb_t& c1, OutputIterator out) | |
{ | |
double dr = ((double)c1.red - (double)c0.red) / steps; | |
double dg = ((double)c1.green - (double)c0.green) / steps; | |
double db = ((double)c1.blue - (double)c0.blue) / steps; | |
for (std::size_t i = 0; i < steps; ++i) | |
{ | |
rgb_t c; | |
c.red = static_cast<unsigned char>(c0.red + (i * dr)); | |
c.green = static_cast<unsigned char>(c0.green + (i * dg)); | |
c.blue = static_cast<unsigned char>(c0.blue + (i * db)); | |
*(out++) = c; | |
} | |
} | |
template <typename ResponseImage, typename Palette> | |
inline std::size_t convert_rsp_to_image(const ResponseImage& resp_image, const Palette& palette, bitmap_image& image) | |
{ | |
if ( | |
(resp_image.width() > image.width()) || | |
(resp_image.height() > image.height()) | |
) | |
return 0; | |
for (std::size_t y = 0; y < resp_image.height(); ++y) | |
{ | |
for (std::size_t x = 0; x < resp_image.width(); ++x) | |
{ | |
const double v = resp_image(x, y); | |
unsigned int index = static_cast<unsigned int>((v < 0) ? 0 : v > (palette.size()) ? (palette.size() - 1) : v); | |
image.set_pixel(x, y, palette[index]); | |
} | |
} | |
return (resp_image.width() * resp_image.height()); | |
} | |
inline void rgb_to_ycbcr(const unsigned int& length, double* red, double* green, double* blue, | |
double* y, double* cb, double* cr) | |
{ | |
unsigned int i = 0; | |
while (i < length) | |
{ | |
(*y) = 16.0 + (65.481 * (*red) + 128.553 * (*green) + 24.966 * (*blue)); | |
(*cb) = 128.0 + (-37.797 * (*red) + -74.203 * (*green) + 112.000 * (*blue)); | |
(*cr) = 128.0 + (112.000 * (*red) + -93.786 * (*green) - 18.214 * (*blue)); | |
++i; | |
++red; ++green; ++blue; | |
++y; ++cb; ++cr; | |
} | |
} | |
inline void ycbcr_to_rgb(const unsigned int& length, double* y, double* cb, double* cr, | |
double* red, double* green, double* blue) | |
{ | |
unsigned int i = 0; | |
while (i < length) | |
{ | |
double y_ = (*y) - 16.0; | |
double cb_ = (*cb) - 128.0; | |
double cr_ = (*cr) - 128.0; | |
(*red) = 0.000456621 * y_ + 0.00625893 * cr_; | |
(*green) = 0.000456621 * y_ - 0.00153632 * cb_ - 0.00318811 * cr_; | |
(*blue) = 0.000456621 * y_ + 0.00791071 * cb_; | |
++i; | |
++red; ++green; ++blue; | |
++y; ++cb; ++cr; | |
} | |
} | |
inline void subsample(const unsigned int& width, | |
const unsigned int& height, | |
const double* source, | |
unsigned int& w, | |
unsigned int& h, | |
double*& dest) | |
{ | |
/* Single channel. */ | |
w = 0; | |
h = 0; | |
bool odd_width = false; | |
bool odd_height = false; | |
if (0 == (width % 2)) | |
w = width / 2; | |
else | |
{ | |
w = 1 + (width / 2); | |
odd_width = true; | |
} | |
if (0 == (height % 2)) | |
h = height / 2; | |
else | |
{ | |
h = 1 + (height / 2); | |
odd_height = true; | |
} | |
unsigned int horizontal_upper = (odd_width) ? w - 1 : w; | |
unsigned int vertical_upper = (odd_height) ? h - 1 : h; | |
dest = new double[w * h]; | |
double* s_itr = dest; | |
const double* itr1 = source; | |
const double* itr2 = source + width; | |
for (unsigned int j = 0; j < vertical_upper; ++j) | |
{ | |
for (unsigned int i = 0; i < horizontal_upper; ++i, ++s_itr) | |
{ | |
(*s_itr) = *(itr1++); | |
(*s_itr) += *(itr1++); | |
(*s_itr) += *(itr2++); | |
(*s_itr) += *(itr2++); | |
(*s_itr) /= 4.0; | |
} | |
if (odd_width) | |
{ | |
(*(s_itr++)) = ((*itr1++) + (*itr2++)) / 2.0; | |
} | |
itr1 += width; | |
if (j != (vertical_upper - 1)) | |
{ | |
itr2 += width; | |
} | |
} | |
if (odd_height) | |
{ | |
for (unsigned int i = 0; i < horizontal_upper; ++i, ++s_itr) | |
{ | |
(*s_itr) += (*(itr1++)); | |
(*s_itr) += (*(itr1++)); | |
(*s_itr) /= 2.0; | |
} | |
if (odd_width) | |
{ | |
(*(s_itr++)) = (*itr1); | |
} | |
} | |
} | |
inline void upsample(const unsigned int& width, | |
const unsigned int& height, | |
const double* source, | |
unsigned int& w, | |
unsigned int& h, | |
double*& dest) | |
{ | |
/* Single channel. */ | |
w = 2 * width; | |
h = 2 * height; | |
dest = new double[w * h]; | |
const double* s_itr = source; | |
double* itr1 = dest; | |
double* itr2 = dest + w; | |
for (unsigned int j = 0; j < height; ++j) | |
{ | |
for (unsigned int i = 0; i < width; ++i, ++s_itr) | |
{ | |
*(itr1++) = (*s_itr); | |
*(itr1++) = (*s_itr); | |
*(itr2++) = (*s_itr); | |
*(itr2++) = (*s_itr); | |
} | |
itr1 += w; | |
itr2 += w; | |
} | |
} | |
inline void checkered_pattern(const unsigned int x_width, | |
const unsigned int y_width, | |
const unsigned char value, | |
const bitmap_image::color_plane color, | |
bitmap_image& image) | |
{ | |
if ( | |
(x_width >= image.width()) || | |
(y_width >= image.height()) | |
) | |
{ | |
return; | |
} | |
bool setter_x = false; | |
bool setter_y = true; | |
const unsigned int color_plane_offset = image.offset(color); | |
const unsigned int height = image.height(); | |
const unsigned int width = image.width(); | |
for (unsigned int y = 0; y < height; ++y) | |
{ | |
if (0 == (y % y_width)) | |
{ | |
setter_y = !setter_y; | |
} | |
unsigned char* row = image.row(y) + color_plane_offset; | |
for (unsigned int x = 0; x < width; ++x, row += image.bytes_per_pixel()) | |
{ | |
if (0 == (x % x_width)) | |
{ | |
setter_x = !setter_x; | |
} | |
if (setter_x ^ setter_y) | |
{ | |
*row = value; | |
} | |
} | |
} | |
} | |
inline void checkered_pattern(const unsigned int x_width, | |
const unsigned int y_width, | |
const unsigned char red, | |
const unsigned char green, | |
const unsigned char blue, | |
bitmap_image& image) | |
{ | |
if ( | |
(x_width >= image.width()) || | |
(y_width >= image.height()) | |
) | |
{ | |
return; | |
} | |
bool setter_x = false; | |
bool setter_y = true; | |
const unsigned int height = image.height(); | |
const unsigned int width = image.width(); | |
for (unsigned int y = 0; y < height; ++y) | |
{ | |
if (0 == (y % y_width)) | |
{ | |
setter_y = !setter_y; | |
} | |
unsigned char* row = image.row(y); | |
for (unsigned int x = 0; x < width; ++x, row += image.bytes_per_pixel()) | |
{ | |
if (0 == (x % x_width)) | |
{ | |
setter_x = !setter_x; | |
} | |
if (setter_x ^ setter_y) | |
{ | |
*(row + 0) = blue; | |
*(row + 1) = green; | |
*(row + 2) = red; | |
} | |
} | |
} | |
} | |
inline void plasma(bitmap_image& image, | |
const double& x, const double& y, | |
const double& width, const double& height, | |
const double& c1, const double& c2, | |
const double& c3, const double& c4, | |
const double& roughness = 3.0, | |
const rgb_t colormap[] = 0) | |
{ | |
// Note: c1,c2,c3,c4 -> [0.0,1.0] | |
const double half_width = (width / 2.0); | |
const double half_height = (height / 2.0); | |
if ((width >= 1.0) || (height >= 1.0)) | |
{ | |
const double corner1 = (c1 + c2) / 2.0; | |
const double corner2 = (c2 + c3) / 2.0; | |
const double corner3 = (c3 + c4) / 2.0; | |
const double corner4 = (c4 + c1) / 2.0; | |
double center = (c1 + c2 + c3 + c4) / 4.0 + | |
((1.0 * ::rand() / (1.0 * RAND_MAX)) - 0.5) * // should use a better rng | |
((1.0 * half_width + half_height) / (image.width() + image.height()) * roughness); | |
center = std::min<double>(std::max<double>(0.0, center), 1.0); | |
plasma(image, x, y, half_width, half_height, c1, corner1, center, corner4, roughness, colormap); | |
plasma(image, x + half_width, y, half_width, half_height, corner1, c2, corner2, center, roughness, colormap); | |
plasma(image, x + half_width, y + half_height, half_width, half_height, center, corner2, c3, corner3, roughness, colormap); | |
plasma(image, x, y + half_height, half_width, half_height, corner4, center, corner3, c4, roughness, colormap); | |
} | |
else | |
{ | |
rgb_t color = colormap[static_cast<unsigned int>(1000.0 * ((c1 + c2 + c3 + c4) / 4.0)) % 1000]; | |
image.set_pixel(static_cast<unsigned int>(x), static_cast<unsigned int>(y), color); | |
} | |
} | |
inline void plasma(bitmap_image& image, | |
const double& c1, const double& c2, | |
const double& c3, const double& c4, | |
const double& roughness = 3.0, | |
const rgb_t colormap[] = 0) | |
{ | |
plasma | |
( | |
image, 0, 0, image.width(), image.height(), | |
c1, c2, c3, c4, | |
roughness, colormap | |
); | |
} | |
inline double psnr_region(const unsigned int& x, const unsigned int& y, | |
const unsigned int& width, const unsigned int& height, | |
const bitmap_image& image1, const bitmap_image& image2) | |
{ | |
if ( | |
(image1.width() != image2.width()) || | |
(image1.height() != image2.height()) | |
) | |
{ | |
return 0.0; | |
} | |
if ((x + width) > image1.width()) { return 0.0; } | |
if ((y + height) > image1.height()) { return 0.0; } | |
double mse = 0.0; | |
for (unsigned int r = 0; r < height; ++r) | |
{ | |
const unsigned char* itr1 = image1.row(r + y) + x * image1.bytes_per_pixel(); | |
const unsigned char* itr1_end = itr1 + (width * image1.bytes_per_pixel()); | |
const unsigned char* itr2 = image2.row(r + y) + x * image2.bytes_per_pixel(); | |
while (itr1 != itr1_end) | |
{ | |
double v = (static_cast<double>(*itr1) - static_cast<double>(*itr2)); | |
mse += v * v; | |
++itr1; | |
++itr2; | |
} | |
} | |
if (mse <= 0.0000001) | |
{ | |
return 1000000.0; | |
} | |
else | |
{ | |
mse /= (3.0 * width * height); | |
return 20.0 * std::log10(255.0 / std::sqrt(mse)); | |
} | |
} | |
inline void hierarchical_psnr_r(const double& x, const double& y, | |
const double& width, const double& height, | |
const bitmap_image& image1, | |
bitmap_image& image2, | |
const double& threshold, | |
const rgb_t colormap[]) | |
{ | |
if ((width <= 4.0) || (height <= 4.0)) | |
{ | |
const double psnr = psnr_region | |
( | |
static_cast<unsigned int>(x), | |
static_cast<unsigned int>(y), | |
static_cast<unsigned int>(width), | |
static_cast<unsigned int>(height), | |
image1, image2 | |
); | |
if (psnr < threshold) | |
{ | |
rgb_t c = colormap[static_cast<unsigned int>(1000.0 * (1.0 - (psnr / threshold)))]; | |
image2.set_region | |
( | |
static_cast<unsigned int>(x), | |
static_cast<unsigned int>(y), | |
static_cast<unsigned int>(width + 1), | |
static_cast<unsigned int>(height + 1), | |
c.red, c.green, c.blue | |
); | |
} | |
} | |
else | |
{ | |
const double half_width = (width / 2.0); | |
const double half_height = (height / 2.0); | |
hierarchical_psnr_r(x, y, half_width, half_height, image1, image2, threshold, colormap); | |
hierarchical_psnr_r(x + half_width, y, half_width, half_height, image1, image2, threshold, colormap); | |
hierarchical_psnr_r(x + half_width, y + half_height, half_width, half_height, image1, image2, threshold, colormap); | |
hierarchical_psnr_r(x, y + half_height, half_width, half_height, image1, image2, threshold, colormap); | |
} | |
} | |
inline void hierarchical_psnr(bitmap_image& image1, bitmap_image& image2, const double threshold, const rgb_t colormap[]) | |
{ | |
if ( | |
(image1.width() != image2.width()) || | |
(image1.height() != image2.height()) | |
) | |
{ | |
return; | |
} | |
const double psnr = psnr_region | |
( | |
0, 0, image1.width(), image1.height(), | |
image1, image2 | |
); | |
if (psnr < threshold) | |
{ | |
hierarchical_psnr_r | |
( | |
0, 0, image1.width(), image1.height(), | |
image1, image2, | |
threshold, | |
colormap | |
); | |
} | |
} | |
class image_drawer | |
{ | |
public: | |
image_drawer(bitmap_image& image) | |
: image_(image), | |
pen_width_(1), | |
pen_color_red_(0), | |
pen_color_green_(0), | |
pen_color_blue_(0) | |
{} | |
void rectangle(int x1, int y1, int x2, int y2) | |
{ | |
line_segment(x1, y1, x2, y1); | |
line_segment(x2, y1, x2, y2); | |
line_segment(x2, y2, x1, y2); | |
line_segment(x1, y2, x1, y1); | |
} | |
void triangle(int x1, int y1, int x2, int y2, int x3, int y3) | |
{ | |
line_segment(x1, y1, x2, y2); | |
line_segment(x2, y2, x3, y3); | |
line_segment(x3, y3, x1, y1); | |
} | |
void quadix(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) | |
{ | |
line_segment(x1, y1, x2, y2); | |
line_segment(x2, y2, x3, y3); | |
line_segment(x3, y3, x4, y4); | |
line_segment(x4, y4, x1, y1); | |
} | |
void line_segment(int x1, int y1, int x2, int y2) | |
{ | |
int steep = 0; | |
int sx = ((x2 - x1) > 0) ? 1 : -1; | |
int sy = ((y2 - y1) > 0) ? 1 : -1; | |
int dx = abs(x2 - x1); | |
int dy = abs(y2 - y1); | |
if (dy > dx) | |
{ | |
std::swap(x1, y1); | |
std::swap(dx, dy); | |
std::swap(sx, sy); | |
steep = 1; | |
} | |
int e = 2 * dy - dx; | |
for (int i = 0; i < dx; ++i) | |
{ | |
if (steep) | |
plot_pen_pixel(y1, x1); | |
else | |
plot_pen_pixel(x1, y1); | |
while (e >= 0) | |
{ | |
y1 += sy; | |
e -= (dx << 1); | |
} | |
x1 += sx; | |
e += (dy << 1); | |
} | |
plot_pen_pixel(x2, y2); | |
} | |
void horiztonal_line_segment(int x1, int x2, int y) | |
{ | |
if (x1 > x2) | |
{ | |
std::swap(x1, x2); | |
} | |
for (int i = 0; i < (x2 - x1); ++i) | |
{ | |
plot_pen_pixel(x1 + i, y); | |
} | |
} | |
void vertical_line_segment(int y1, int y2, int x) | |
{ | |
if (y1 > y2) | |
{ | |
std::swap(y1, y2); | |
} | |
for (int i = 0; i < (y2 - y1); ++i) | |
{ | |
plot_pen_pixel(x, y1 + i); | |
} | |
} | |
void ellipse(int centerx, int centery, int a, int b) | |
{ | |
int t1 = a * a; | |
int t2 = t1 << 1; | |
int t3 = t2 << 1; | |
int t4 = b * b; | |
int t5 = t4 << 1; | |
int t6 = t5 << 1; | |
int t7 = a * t5; | |
int t8 = t7 << 1; | |
int t9 = 0; | |
int d1 = t2 - t7 + (t4 >> 1); | |
int d2 = (t1 >> 1) - t8 + t5; | |
int x = a; | |
int y = 0; | |
int negative_tx = centerx - x; | |
int positive_tx = centerx + x; | |
int negative_ty = centery - y; | |
int positive_ty = centery + y; | |
while (d2 < 0) | |
{ | |
plot_pen_pixel(positive_tx, positive_ty); | |
plot_pen_pixel(positive_tx, negative_ty); | |
plot_pen_pixel(negative_tx, positive_ty); | |
plot_pen_pixel(negative_tx, negative_ty); | |
++y; | |
t9 = t9 + t3; | |
if (d1 < 0) | |
{ | |
d1 = d1 + t9 + t2; | |
d2 = d2 + t9; | |
} | |
else | |
{ | |
x--; | |
t8 = t8 - t6; | |
d1 = d1 + (t9 + t2 - t8); | |
d2 = d2 + (t9 + t5 - t8); | |
negative_tx = centerx - x; | |
positive_tx = centerx + x; | |
} | |
negative_ty = centery - y; | |
positive_ty = centery + y; | |
} | |
do | |
{ | |
plot_pen_pixel(positive_tx, positive_ty); | |
plot_pen_pixel(positive_tx, negative_ty); | |
plot_pen_pixel(negative_tx, positive_ty); | |
plot_pen_pixel(negative_tx, negative_ty); | |
x--; | |
t8 = t8 - t6; | |
if (d2 < 0) | |
{ | |
++y; | |
t9 = t9 + t3; | |
d2 = d2 + (t9 + t5 - t8); | |
negative_ty = centery - y; | |
positive_ty = centery + y; | |
} | |
else | |
d2 = d2 + (t5 - t8); | |
negative_tx = centerx - x; | |
positive_tx = centerx + x; | |
} while (x >= 0); | |
} | |
void circle(int centerx, int centery, int radius) | |
{ | |
int x = 0; | |
int d = (1 - radius) << 1; | |
while (radius >= 0) | |
{ | |
plot_pen_pixel(centerx + x, centery + radius); | |
plot_pen_pixel(centerx + x, centery - radius); | |
plot_pen_pixel(centerx - x, centery + radius); | |
plot_pen_pixel(centerx - x, centery - radius); | |
if ((d + radius) > 0) | |
d -= ((--radius) << 1) - 1; | |
if (x > d) | |
d += ((++x) << 1) + 1; | |
} | |
} | |
void plot_pen_pixel(int x, int y) | |
{ | |
switch (pen_width_) | |
{ | |
case 1: plot_pixel(x, y); | |
break; | |
case 2: { | |
plot_pixel(x, y); | |
plot_pixel(x + 1, y); | |
plot_pixel(x + 1, y + 1); | |
plot_pixel(x, y + 1); | |
} | |
break; | |
case 3: { | |
plot_pixel(x, y - 1); | |
plot_pixel(x - 1, y - 1); | |
plot_pixel(x + 1, y - 1); | |
plot_pixel(x, y); | |
plot_pixel(x - 1, y); | |
plot_pixel(x + 1, y); | |
plot_pixel(x, y + 1); | |
plot_pixel(x - 1, y + 1); | |
plot_pixel(x + 1, y + 1); | |
} | |
break; | |
default: plot_pixel(x, y); | |
break; | |
} | |
} | |
void plot_pixel(int x, int y) | |
{ | |
if ( | |
(x < 0) || | |
(y < 0) || | |
(x >= static_cast<int>(image_.width())) || | |
(y >= static_cast<int>(image_.height())) | |
) | |
return; | |
image_.set_pixel(x, y, pen_color_red_, pen_color_green_, pen_color_blue_); | |
} | |
void pen_width(const unsigned int& width) | |
{ | |
if ((width > 0) && (width < 4)) | |
{ | |
pen_width_ = width; | |
} | |
} | |
void pen_color(const unsigned char& red, | |
const unsigned char& green, | |
const unsigned char& blue) | |
{ | |
pen_color_red_ = red; | |
pen_color_green_ = green; | |
pen_color_blue_ = blue; | |
} | |
template <typename RGB> | |
void pen_color(const RGB colour) | |
{ | |
pen_color_red_ = colour.red; | |
pen_color_green_ = colour.green; | |
pen_color_blue_ = colour.blue; | |
} | |
private: | |
image_drawer(const image_drawer& id); | |
image_drawer& operator =(const image_drawer& id); | |
bitmap_image& image_; | |
unsigned int pen_width_; | |
unsigned char pen_color_red_; | |
unsigned char pen_color_green_; | |
unsigned char pen_color_blue_; | |
}; | |
class cartesian_canvas | |
{ | |
public: | |
cartesian_canvas(const double x_length, const double y_length) | |
: width_div2_(0.0), | |
height_div2_(0.0), | |
min_x_(0.0), | |
min_y_(0.0), | |
max_x_(0.0), | |
max_y_(0.0), | |
draw_(image_) | |
{ | |
setup_canvas(x_length, y_length); | |
} | |
inline bool operator!() | |
{ | |
return !image_; | |
} | |
void rectangle(double x1, double y1, double x2, double y2) | |
{ | |
line_segment(x1, y1, x2, y1); | |
line_segment(x2, y1, x2, y2); | |
line_segment(x2, y2, x1, y2); | |
line_segment(x1, y2, x1, y1); | |
} | |
void triangle(double x1, double y1, double x2, double y2, double x3, double y3) | |
{ | |
line_segment(x1, y1, x2, y2); | |
line_segment(x2, y2, x3, y3); | |
line_segment(x3, y3, x1, y1); | |
} | |
void quadix(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) | |
{ | |
line_segment(x1, y1, x2, y2); | |
line_segment(x2, y2, x3, y3); | |
line_segment(x3, y3, x4, y4); | |
line_segment(x4, y4, x1, y1); | |
} | |
void line_segment(double x1, double y1, double x2, double y2) | |
{ | |
if (clip(x1, y1, x2, y2)) | |
{ | |
const int sc_x1 = static_cast<int>(cart_to_screen_x(x1)); | |
const int sc_x2 = static_cast<int>(cart_to_screen_x(x2)); | |
const int sc_y1 = static_cast<int>(cart_to_screen_y(y1)); | |
const int sc_y2 = static_cast<int>(cart_to_screen_y(y2)); | |
draw_.line_segment(sc_x1, sc_y1, sc_x2, sc_y2); | |
} | |
} | |
void horiztonal_line_segment(double x1, double x2, double y) | |
{ | |
x1 = clamp_x(x1); | |
x2 = clamp_x(x2); | |
y = clamp_y(y); | |
const int sc_x1 = static_cast<int>(cart_to_screen_x(x1)); | |
const int sc_x2 = static_cast<int>(cart_to_screen_x(x2)); | |
const int sc_y = static_cast<int>(cart_to_screen_y(y)); | |
draw_.horiztonal_line_segment(sc_x1, sc_x2, sc_y); | |
} | |
void vertical_line_segment(double y1, double y2, double x) | |
{ | |
y1 = clamp_y(y1); | |
y2 = clamp_y(y2); | |
x = clamp_x(x); | |
const int sc_y1 = static_cast<int>(cart_to_screen_y(y1)); | |
const int sc_y2 = static_cast<int>(cart_to_screen_y(y2)); | |
const int sc_x = static_cast<int>(cart_to_screen_x(x)); | |
draw_.vertical_line_segment(sc_y1, sc_y2, sc_x); | |
} | |
void ellipse(double centerx, double centery, double a, double b) | |
{ | |
const int sc_cx = static_cast<int>(cart_to_screen_x(centerx)); | |
const int sc_cy = static_cast<int>(cart_to_screen_y(centery)); | |
draw_.ellipse(sc_cx, sc_cy, static_cast<int>(a), static_cast<int>(b)); | |
} | |
void circle(double centerx, double centery, double radius) | |
{ | |
const int sc_cx = static_cast<int>(cart_to_screen_x(centerx)); | |
const int sc_cy = static_cast<int>(cart_to_screen_y(centery)); | |
draw_.circle(sc_cx, sc_cy, static_cast<int>(radius)); | |
} | |
void fill_rectangle(double x1, double y1, double x2, double y2) | |
{ | |
if (y1 > y2) | |
std::swap(y1, y2); | |
for (double y = y1; y <= y2; y += 0.5) | |
{ | |
line_segment(x1, y, x2, y); | |
} | |
} | |
void fill_triangle(double x1, double y1, double x2, double y2, double x3, double y3) | |
{ | |
typedef std::pair<double, double> point_t; | |
std::vector<point_t> p; | |
p.push_back(std::make_pair(x1, y1)); | |
p.push_back(std::make_pair(x2, y2)); | |
p.push_back(std::make_pair(x3, y3)); | |
if (p[0].second > p[1].second) | |
std::swap(p[0], p[1]); | |
if (p[0].second > p[2].second) | |
std::swap(p[0], p[2]); | |
if (p[1].second > p[2].second) | |
std::swap(p[1], p[2]); | |
class draw_modes | |
{ | |
private: | |
cartesian_canvas& canvas; | |
// Needed for incompetent and broken msvc compiler versions | |
#ifdef _MSC_VER | |
#pragma warning(push) | |
#pragma warning(disable: 4822) | |
#endif | |
draw_modes& operator=(const draw_modes&); | |
#ifdef _MSC_VER | |
#pragma warning(pop) | |
#endif | |
public: | |
draw_modes(cartesian_canvas& c) | |
: canvas(c) | |
{} | |
void bottom(const point_t& p0, const point_t& p1, const point_t& p2) | |
{ | |
const double m0 = (p1.first - p0.first) / (2.0 * (p1.second - p0.second)); | |
const double m1 = (p2.first - p0.first) / (2.0 * (p2.second - p0.second)); | |
double x0 = p0.first; | |
double x1 = p0.first; | |
for (double y = p0.second; y <= p1.second; y += 0.5) | |
{ | |
canvas.horiztonal_line_segment(x0, x1, y); | |
x0 += m0; | |
x1 += m1; | |
} | |
} | |
void top(const point_t& p0, const point_t& p1, const point_t& p2) | |
{ | |
const double m0 = (p2.first - p0.first) / (2.0 * (p2.second - p0.second)); | |
const double m1 = (p2.first - p1.first) / (2.0 * (p2.second - p1.second)); | |
double x0 = p2.first; | |
double x1 = p2.first; | |
for (double y = p2.second; y >= p0.second; y -= 0.5) | |
{ | |
canvas.horiztonal_line_segment(x0, x1, y); | |
x0 -= m0; | |
x1 -= m1; | |
} | |
} | |
}; | |
draw_modes dm(*this); | |
const double eps = 0.00001; | |
if (std::abs(p[1].second - p[2].second) < eps) | |
dm.bottom(p[0], p[1], p[2]); | |
else if (std::abs(p[0].second - p[1].second) < eps) | |
dm.top(p[0], p[1], p[2]); | |
else | |
{ | |
point_t p3; | |
p3.first = (p[0].first + ((p[1].second - p[0].second) / (p[2].second - p[0].second)) * (p[2].first - p[0].first)); | |
p3.second = p[1].second; | |
dm.bottom(p[0], p[1], p3); | |
dm.top(p[1], p3, p[2]); | |
} | |
} | |
void fill_quadix(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) | |
{ | |
fill_triangle(x1, y1, x2, y2, x3, y3); | |
fill_triangle(x1, y1, x3, y3, x4, y4); | |
} | |
void fill_circle(double cx, double cy, double radius) | |
{ | |
const double delta = 1.0; | |
double x = radius; | |
double y = 0.0; | |
double dx = delta - (2.0 * delta * radius); | |
double dy = 0.0; | |
double dr = 0.0; | |
while (x >= y) | |
{ | |
for (double i = cx - x; i <= cx + x; i += delta) | |
{ | |
horiztonal_line_segment(cx - x, cx + x, cy + y); | |
horiztonal_line_segment(cx - x, cx + x, cy - y); | |
} | |
for (double i = cx - y; i <= cx + y; i += delta) | |
{ | |
horiztonal_line_segment(cx - y, cx + y, cy + x); | |
horiztonal_line_segment(cx - y, cx + y, cy - x); | |
} | |
y += delta; | |
dr += dy; | |
dy += 2.0 * delta; | |
if ((2.0 * delta * dr + dx) > 0) | |
{ | |
x -= delta; | |
dr += dx; | |
dx += 2.0 * delta; | |
} | |
} | |
} | |
void plot_pen_pixel(double x, double y) | |
{ | |
if ((x < min_x_) || (x > max_x_)) return; | |
if ((y < min_y_) || (y > max_y_)) return; | |
const int sc_x = static_cast<int>(cart_to_screen_x(x)); | |
const int sc_y = static_cast<int>(cart_to_screen_y(y)); | |
draw_.plot_pen_pixel(sc_x, sc_y); | |
} | |
void plot_pixel(double x, double y) | |
{ | |
if ((x < min_x_) || (x > max_x_)) return; | |
if ((y < min_y_) || (y > max_y_)) return; | |
const int sc_x = static_cast<int>(cart_to_screen_x(x)); | |
const int sc_y = static_cast<int>(cart_to_screen_y(y)); | |
draw_.plot_pixel(sc_x, sc_y); | |
} | |
void pen_width(const unsigned int& width) | |
{ | |
draw_.pen_width(width); | |
} | |
void pen_color(const unsigned char& red, | |
const unsigned char& green, | |
const unsigned char& blue) | |
{ | |
draw_.pen_color(red, green, blue); | |
} | |
template <typename RGB> | |
void pen_color(const RGB colour) | |
{ | |
draw_.pen_color(colour); | |
} | |
const bitmap_image& image() const | |
{ | |
return image_; | |
} | |
bitmap_image& image() | |
{ | |
return image_; | |
} | |
void set_widthheight(const double x_length, const double y_length) | |
{ | |
setup_canvas(x_length, y_length); | |
} | |
double min_x() const { return min_x_; } | |
double min_y() const { return min_y_; } | |
double max_x() const { return max_x_; } | |
double max_y() const { return max_y_; } | |
private: | |
void setup_canvas(const double x_length, const double y_length) | |
{ | |
if ((x_length < 2.0) || (y_length < 2.0)) | |
return; | |
width_div2_ = x_length / 2.0; | |
height_div2_ = y_length / 2.0; | |
min_x_ = -width_div2_; | |
min_y_ = -height_div2_; | |
max_x_ = width_div2_; | |
max_y_ = height_div2_; | |
image_.setwidth_height(static_cast<unsigned int>(x_length) + 1, static_cast<unsigned int>(y_length) + 1); | |
image_.clear(0xFF); | |
} | |
double clamp_x(const double& x) | |
{ | |
if (x < min_x_) return min_x_; | |
else if (x > max_x_) return max_x_; | |
else return x; | |
} | |
double clamp_y(const double& y) | |
{ | |
if (y < min_y_) return min_y_; | |
else if (y > max_y_) return max_y_; | |
else return y; | |
} | |
double cart_to_screen_x(const double& x) | |
{ | |
return x + width_div2_; | |
} | |
double cart_to_screen_y(const double& y) | |
{ | |
return height_div2_ - y; | |
} | |
enum clip_code | |
{ | |
e_clip_bottom = 1, | |
e_clip_top = 2, | |
e_clip_left = 4, | |
e_clip_right = 8 | |
}; | |
int out_code( | |
const double& x, const double& y, | |
const double& x1, const double& y1, | |
const double& x2, const double& y2 | |
) | |
{ | |
int result = 0; | |
if (y < y1) result |= e_clip_bottom; | |
else if (y > y2) result |= e_clip_top; | |
if (x < x1) result |= e_clip_left; | |
else if (x > x2) result |= e_clip_right; | |
return result; | |
} | |
bool clip(double& x1, double& y1, double& x2, double& y2) | |
{ | |
bool result = false; | |
double x = 0.0; | |
double y = 0.0; | |
int outcode0 = out_code(x1, y1, min_x_, min_y_, max_x_, max_y_); | |
int outcode1 = out_code(x2, y2, min_x_, min_y_, max_x_, max_y_); | |
int outcodeout = 0; | |
while ((outcode0 != 0) || (outcode1 != 0)) | |
{ | |
if ((outcode0 & outcode1) != 0) | |
return result; | |
else | |
{ | |
if (outcode0 != 0) | |
outcodeout = outcode0; | |
else | |
outcodeout = outcode1; | |
double dx = (x2 - x1); | |
double dy = (y2 - y1); | |
if ((outcodeout & e_clip_bottom) == e_clip_bottom) | |
{ | |
x = x1 + dx * (min_y_ - y1) / dy; | |
y = min_y_; | |
} | |
else if ((outcodeout & e_clip_top) == e_clip_top) | |
{ | |
x = x1 + dx * (max_y_ - y1) / dy; | |
y = max_y_; | |
} | |
else if ((outcodeout & e_clip_right) == e_clip_right) | |
{ | |
y = y1 + dy * (max_x_ - x1) / dx; | |
x = max_x_; | |
} | |
else if ((outcodeout & e_clip_left) == e_clip_left) | |
{ | |
y = y1 + dy * (min_x_ - x1) / dx; | |
x = min_x_; | |
} | |
if (outcodeout == outcode0) | |
{ | |
x1 = x; | |
y1 = y; | |
outcode0 = out_code(x1, y1, min_x_, min_y_, max_x_, max_y_); | |
} | |
else | |
{ | |
x2 = x; | |
y2 = y; | |
outcode1 = out_code(x2, y2, min_x_, min_y_, max_x_, max_y_); | |
} | |
} | |
} | |
return true; | |
} | |
cartesian_canvas(const cartesian_canvas&); | |
cartesian_canvas operator=(const cartesian_canvas&); | |
double width_div2_; | |
double height_div2_; | |
double min_x_; | |
double min_y_; | |
double max_x_; | |
double max_y_; | |
bitmap_image image_; | |
image_drawer draw_; | |
}; | |
inline rgb_t convert_wave_length_nm_to_rgb(const double wave_length_nm) | |
{ | |
// Credits: Dan Bruton http://www.physics.sfasu.edu/astro/color.html | |
double red = 0.0; | |
double green = 0.0; | |
double blue = 0.0; | |
if ((380.0 <= wave_length_nm) && (wave_length_nm <= 439.0)) | |
{ | |
red = -(wave_length_nm - 440.0) / (440.0 - 380.0); | |
green = 0.0; | |
blue = 1.0; | |
} | |
else if ((440.0 <= wave_length_nm) && (wave_length_nm <= 489.0)) | |
{ | |
red = 0.0; | |
green = (wave_length_nm - 440.0) / (490.0 - 440.0); | |
blue = 1.0; | |
} | |
else if ((490.0 <= wave_length_nm) && (wave_length_nm <= 509.0)) | |
{ | |
red = 0.0; | |
green = 1.0; | |
blue = -(wave_length_nm - 510.0) / (510.0 - 490.0); | |
} | |
else if ((510.0 <= wave_length_nm) && (wave_length_nm <= 579.0)) | |
{ | |
red = (wave_length_nm - 510.0) / (580.0 - 510.0); | |
green = 1.0; | |
blue = 0.0; | |
} | |
else if ((580.0 <= wave_length_nm) && (wave_length_nm <= 644.0)) | |
{ | |
red = 1.0; | |
green = -(wave_length_nm - 645.0) / (645.0 - 580.0); | |
blue = 0.0; | |
} | |
else if ((645.0 <= wave_length_nm) && (wave_length_nm <= 780.0)) | |
{ | |
red = 1.0; | |
green = 0.0; | |
blue = 0.0; | |
} | |
double factor = 0.0; | |
if ((380.0 <= wave_length_nm) && (wave_length_nm <= 419.0)) | |
factor = 0.3 + 0.7 * (wave_length_nm - 380.0) / (420.0 - 380.0); | |
else if ((420.0 <= wave_length_nm) && (wave_length_nm <= 700.0)) | |
factor = 1.0; | |
else if ((701.0 <= wave_length_nm) && (wave_length_nm <= 780.0)) | |
factor = 0.3 + 0.7 * (780.0 - wave_length_nm) / (780.0 - 700.0); | |
else | |
factor = 0.0; | |
rgb_t result; | |
const double gamma = 0.8; | |
const double intensity_max = 255.0; | |
#define round(d) std::floor(d + 0.5) | |
result.red = static_cast<unsigned char>((red == 0.0) ? red : round(intensity_max * std::pow(red * factor, gamma))); | |
result.green = static_cast<unsigned char>((green == 0.0) ? green : round(intensity_max * std::pow(green * factor, gamma))); | |
result.blue = static_cast<unsigned char>((blue == 0.0) ? blue : round(intensity_max * std::pow(blue * factor, gamma))); | |
#undef round | |
return result; | |
} | |
inline double weighted_distance(const unsigned char r0, const unsigned char g0, const unsigned char b0, | |
const unsigned char r1, const unsigned char g1, const unsigned char b1) | |
{ | |
const double diff_r = /*0.30 */ (r0 - r1); | |
const double diff_g = /*0.59 */ (g0 - g1); | |
const double diff_b = /*0.11 */ (b0 - b1); | |
return std::sqrt((diff_r * diff_r) + (diff_g * diff_g) + (diff_b * diff_b)); | |
} | |
inline double weighted_distance(const rgb_t c0, const rgb_t c1) | |
{ | |
return weighted_distance(c0.red, c0.green, c0.blue, | |
c1.red, c1.green, c1.blue); | |
} | |
template <typename Iterator> | |
inline rgb_t find_nearest_color(const rgb_t& c, const Iterator begin, const Iterator end) | |
{ | |
if (0 == std::distance(begin, end)) | |
return c; | |
double min_d = std::numeric_limits<double>::max(); | |
rgb_t result = *begin; | |
for (Iterator itr = begin; itr != end; ++itr) | |
{ | |
if (c == (*itr)) | |
{ | |
return (*itr); | |
} | |
double curr_d = weighted_distance(c, *itr); | |
if (curr_d < min_d) | |
{ | |
min_d = curr_d; | |
result = *itr; | |
} | |
} | |
return result; | |
} | |
template <template <typename, typename> class Sequence, | |
typename Allocator> | |
inline rgb_t find_nearest_color(const rgb_t& c, const Sequence<rgb_t, Allocator>& seq) | |
{ | |
return find_nearest_color(c, seq.begin(), seq.end()); | |
} | |
template <std::size_t N> | |
inline rgb_t find_nearest_color(const rgb_t& c, const rgb_t(&colors)[N]) | |
{ | |
return find_nearest_color(c, colors, colors + N); | |
} | |
inline double find_nearest_wave_length(const rgb_t& c, const double increment = 0.001) | |
{ | |
const double max_wave_length = 800.0; //800nm | |
double min_wave_length = 0.0; | |
double min_d = std::numeric_limits<double>::max(); | |
for (double i = 0.0; i < max_wave_length; i += increment) | |
{ | |
const rgb_t curr_rgb = convert_wave_length_nm_to_rgb(i); | |
if (c == curr_rgb) | |
{ | |
return i; | |
} | |
const double curr_d = weighted_distance(c, curr_rgb); | |
if (curr_d <= min_d) | |
{ | |
min_wave_length = i; | |
min_d = curr_d; | |
} | |
} | |
return min_wave_length; | |
} | |
template <typename T> | |
class response_image | |
{ | |
public: | |
response_image(const std::size_t& width, const std::size_t& height, const T null = T(0)) | |
: width_(width), | |
height_(height), | |
null_(null) | |
{ | |
data_.resize(width_ * height_); | |
} | |
std::size_t width() const { return width_; } | |
std::size_t height() const { return height_; } | |
void set_all(const T& t) | |
{ | |
std::fill_n(data_.begin(), data_.size(), t); | |
} | |
const T& operator()(const std::size_t& x, const std::size_t& y) const | |
{ | |
if (y >= height_) return null_; | |
if (x >= width_) return null_; | |
return data_[width_ * y + x]; | |
} | |
T& operator()(const std::size_t& x, const std::size_t& y) | |
{ | |
if (y >= height_) return null_; | |
if (x >= width_) return null_; | |
return data_[width_ * y + x]; | |
} | |
bool valid(const std::size_t& x, const std::size_t& y) | |
{ | |
return ((x < width_) || (y < height_)); | |
} | |
void inc_all(const T& v) | |
{ | |
for (std::size_t i = 0; i < data_.size(); ++i) | |
{ | |
data_[i] += v; | |
} | |
} | |
void mul_all(const T& v) | |
{ | |
for (std::size_t i = 0; i < data_.size(); ++i) | |
{ | |
data_[i] *= v; | |
} | |
} | |
T* row(const std::size_t& row_index) | |
{ | |
if (row_index < height_) | |
return &data_[width_ * row_index]; | |
else | |
return reinterpret_cast<T*>(0); | |
} | |
const T* row(const std::size_t& row_index) const | |
{ | |
if (row_index < height_) | |
return data_[width_ * row_index]; | |
else | |
return reinterpret_cast<T*>(0); | |
} | |
private: | |
std::size_t width_; | |
std::size_t height_; | |
std::vector<T> data_; | |
T null_; | |
}; | |
inline void sobel_operator(const bitmap_image& src_image, | |
bitmap_image& dst_image, | |
const double threshold = 0.0) | |
{ | |
typedef double T; | |
response_image<T> im0(src_image.width(), src_image.height(), 0.0); | |
response_image<T> im1(src_image.width(), src_image.height(), 0.0); | |
src_image.export_gray_scale_response_image(&im0(0, 0)); | |
for (std::size_t y = 1; y < im0.height() - 1; ++y) | |
{ | |
const T* itr0 = im0.row(y - 1); | |
const T* itr1 = im0.row(y); | |
const T* itr2 = im0.row(y + 1); | |
T* out = im1.row(y) + 1; | |
for (std::size_t x = 1; x < im0.width() - 1; ++x) | |
{ | |
const T c0 = *(itr0 + x - 1); const T c1 = *(itr0 + x); const T c2 = *(itr0 + x + 1); | |
const T c3 = *(itr1 + x - 1); /*const T c4 = *(itr1 + x);*/ const T c5 = *(itr1 + x + 1); | |
const T c6 = *(itr2 + x - 1); const T c7 = *(itr2 + x); const T c8 = *(itr2 + x + 1); | |
const T gx = (2.0 * (c5 - c3)) + (c2 - c0) + (c8 - c6); | |
const T gy = (2.0 * (c1 - c7)) + (c0 - c6) + (c2 - c8); | |
*(out++) = std::sqrt((gx * gx) + (gy * gy)); | |
} | |
} | |
if (threshold > 0.0) | |
{ | |
const T* end = im1.row(0) + (im1.width() * im1.height()); | |
for (T* itr = im1.row(0); itr != end; ++itr) | |
{ | |
T& v = *itr; | |
if (v <= threshold) v = 0; | |
} | |
} | |
dst_image.setwidth_height | |
( | |
static_cast<unsigned int>(im1.width()), | |
static_cast<unsigned int>(im1.height()) | |
); | |
dst_image.import_gray_scale_clamped(&im1(0, 0)); | |
} | |
enum palette_name | |
{ | |
e_red, e_scarlet, e_vermilion, e_tangelo, e_orange, | |
e_gamboge, e_amber, e_gold, e_yellow, e_apple_green, | |
e_lime_green, e_spring_bud, e_chartreuse_green, e_pistachio, e_harlequin, | |
e_sap_green, e_green, e_emerald_green, e_malachite_green, e_sea_green, | |
e_spring_green, e_aquamarine, e_turquoise, e_opal, e_cyan, | |
e_arctic_blue, e_cerulean, e_cornflower_blue, e_azure, e_cobalt_blue, | |
e_sapphire_blue, e_phthalo_blue, e_blue, e_persian_blue, e_indigo, | |
e_blue_violet, e_violet, e_purple, e_mulberry, e_heliotrope, | |
e_magenta, e_orchid, e_fuchsia, e_cerise, e_rose, | |
e_raspberry, e_crimson, e_amaranth, e_white, e_black | |
}; | |
const rgb_t palette_colormap[] = { | |
{255, 0, 0}, {255, 31, 0}, {255, 63, 0}, {255, 95, 0}, {255, 127, 0}, | |
{255, 159, 0}, {255, 191, 0}, {255, 223, 0}, {255, 255, 0}, {223, 255, 0}, | |
{191, 255, 0}, {159, 255, 0}, {127, 255, 0}, { 95, 255, 0}, { 63, 255, 0}, | |
{ 31, 255, 0}, { 0, 255, 0}, { 0, 255, 31}, { 0, 255, 63}, { 0, 255, 95}, | |
{ 0, 255, 127}, { 0, 255, 159}, { 0, 255, 191}, { 0, 255, 223}, { 0, 255, 255}, | |
{ 0, 223, 255}, { 0, 191, 255}, { 0, 159, 255}, { 0, 127, 255}, { 0, 95, 255}, | |
{ 0, 63, 255}, { 0, 31, 255}, { 0, 0, 255}, { 31, 0, 255}, { 63, 0, 255}, | |
{ 95, 0, 255}, {127, 0, 255}, {159, 0, 255}, {191, 0, 255}, {223, 0, 255}, | |
{255, 0, 255}, {255, 0, 223}, {255, 0, 191}, {255, 0, 159}, {255, 0, 127}, | |
{255, 0, 95}, {255, 0, 63}, {255, 0, 31}, {255, 255, 255}, { 0, 0, 0} | |
}; | |
const rgb_t autumn_colormap[1000] = { | |
{255, 0, 0}, {255, 0, 0}, {255, 1, 0}, {255, 1, 0}, {255, 1, 0}, | |
{255, 1, 0}, {255, 2, 0}, {255, 2, 0}, {255, 2, 0}, {255, 2, 0}, | |
{255, 3, 0}, {255, 3, 0}, {255, 3, 0}, {255, 3, 0}, {255, 4, 0}, | |
{255, 4, 0}, {255, 4, 0}, {255, 4, 0}, {255, 5, 0}, {255, 5, 0}, | |
{255, 5, 0}, {255, 5, 0}, {255, 6, 0}, {255, 6, 0}, {255, 6, 0}, | |
{255, 6, 0}, {255, 7, 0}, {255, 7, 0}, {255, 7, 0}, {255, 7, 0}, | |
{255, 8, 0}, {255, 8, 0}, {255, 8, 0}, {255, 8, 0}, {255, 9, 0}, | |
{255, 9, 0}, {255, 9, 0}, {255, 9, 0}, {255, 10, 0}, {255, 10, 0}, | |
{255, 10, 0}, {255, 10, 0}, {255, 11, 0}, {255, 11, 0}, {255, 11, 0}, | |
{255, 11, 0}, {255, 12, 0}, {255, 12, 0}, {255, 12, 0}, {255, 13, 0}, | |
{255, 13, 0}, {255, 13, 0}, {255, 13, 0}, {255, 14, 0}, {255, 14, 0}, | |
{255, 14, 0}, {255, 14, 0}, {255, 15, 0}, {255, 15, 0}, {255, 15, 0}, | |
{255, 15, 0}, {255, 16, 0}, {255, 16, 0}, {255, 16, 0}, {255, 16, 0}, | |
{255, 17, 0}, {255, 17, 0}, {255, 17, 0}, {255, 17, 0}, {255, 18, 0}, | |
{255, 18, 0}, {255, 18, 0}, {255, 18, 0}, {255, 19, 0}, {255, 19, 0}, | |
{255, 19, 0}, {255, 19, 0}, {255, 20, 0}, {255, 20, 0}, {255, 20, 0}, | |
{255, 20, 0}, {255, 21, 0}, {255, 21, 0}, {255, 21, 0}, {255, 21, 0}, | |
{255, 22, 0}, {255, 22, 0}, {255, 22, 0}, {255, 22, 0}, {255, 23, 0}, | |
{255, 23, 0}, {255, 23, 0}, {255, 23, 0}, {255, 24, 0}, {255, 24, 0}, | |
{255, 24, 0}, {255, 25, 0}, {255, 25, 0}, {255, 25, 0}, {255, 25, 0}, | |
{255, 26, 0}, {255, 26, 0}, {255, 26, 0}, {255, 26, 0}, {255, 27, 0}, | |
{255, 27, 0}, {255, 27, 0}, {255, 27, 0}, {255, 28, 0}, {255, 28, 0}, | |
{255, 28, 0}, {255, 28, 0}, {255, 29, 0}, {255, 29, 0}, {255, 29, 0}, | |
{255, 29, 0}, {255, 30, 0}, {255, 30, 0}, {255, 30, 0}, {255, 30, 0}, | |
{255, 31, 0}, {255, 31, 0}, {255, 31, 0}, {255, 31, 0}, {255, 32, 0}, | |
{255, 32, 0}, {255, 32, 0}, {255, 32, 0}, {255, 33, 0}, {255, 33, 0}, | |
{255, 33, 0}, {255, 33, 0}, {255, 34, 0}, {255, 34, 0}, {255, 34, 0}, | |
{255, 34, 0}, {255, 35, 0}, {255, 35, 0}, {255, 35, 0}, {255, 35, 0}, | |
{255, 36, 0}, {255, 36, 0}, {255, 36, 0}, {255, 37, 0}, {255, 37, 0}, | |
{255, 37, 0}, {255, 37, 0}, {255, 38, 0}, {255, 38, 0}, {255, 38, 0}, | |
{255, 38, 0}, {255, 39, 0}, {255, 39, 0}, {255, 39, 0}, {255, 39, 0}, | |
{255, 40, 0}, {255, 40, 0}, {255, 40, 0}, {255, 40, 0}, {255, 41, 0}, | |
{255, 41, 0}, {255, 41, 0}, {255, 41, 0}, {255, 42, 0}, {255, 42, 0}, | |
{255, 42, 0}, {255, 42, 0}, {255, 43, 0}, {255, 43, 0}, {255, 43, 0}, | |
{255, 43, 0}, {255, 44, 0}, {255, 44, 0}, {255, 44, 0}, {255, 44, 0}, | |
{255, 45, 0}, {255, 45, 0}, {255, 45, 0}, {255, 45, 0}, {255, 46, 0}, | |
{255, 46, 0}, {255, 46, 0}, {255, 46, 0}, {255, 47, 0}, {255, 47, 0}, | |
{255, 47, 0}, {255, 47, 0}, {255, 48, 0}, {255, 48, 0}, {255, 48, 0}, | |
{255, 48, 0}, {255, 49, 0}, {255, 49, 0}, {255, 49, 0}, {255, 50, 0}, | |
{255, 50, 0}, {255, 50, 0}, {255, 50, 0}, {255, 51, 0}, {255, 51, 0}, | |
{255, 51, 0}, {255, 51, 0}, {255, 52, 0}, {255, 52, 0}, {255, 52, 0}, | |
{255, 52, 0}, {255, 53, 0}, {255, 53, 0}, {255, 53, 0}, {255, 53, 0}, | |
{255, 54, 0}, {255, 54, 0}, {255, 54, 0}, {255, 54, 0}, {255, 55, 0}, | |
{255, 55, 0}, {255, 55, 0}, {255, 55, 0}, {255, 56, 0}, {255, 56, 0}, | |
{255, 56, 0}, {255, 56, 0}, {255, 57, 0}, {255, 57, 0}, {255, 57, 0}, | |
{255, 57, 0}, {255, 58, 0}, {255, 58, 0}, {255, 58, 0}, {255, 58, 0}, | |
{255, 59, 0}, {255, 59, 0}, {255, 59, 0}, {255, 59, 0}, {255, 60, 0}, | |
{255, 60, 0}, {255, 60, 0}, {255, 60, 0}, {255, 61, 0}, {255, 61, 0}, | |
{255, 61, 0}, {255, 62, 0}, {255, 62, 0}, {255, 62, 0}, {255, 62, 0}, | |
{255, 63, 0}, {255, 63, 0}, {255, 63, 0}, {255, 63, 0}, {255, 64, 0}, | |
{255, 64, 0}, {255, 64, 0}, {255, 64, 0}, {255, 65, 0}, {255, 65, 0}, | |
{255, 65, 0}, {255, 65, 0}, {255, 66, 0}, {255, 66, 0}, {255, 66, 0}, | |
{255, 66, 0}, {255, 67, 0}, {255, 67, 0}, {255, 67, 0}, {255, 67, 0}, | |
{255, 68, 0}, {255, 68, 0}, {255, 68, 0}, {255, 68, 0}, {255, 69, 0}, | |
{255, 69, 0}, {255, 69, 0}, {255, 69, 0}, {255, 70, 0}, {255, 70, 0}, | |
{255, 70, 0}, {255, 70, 0}, {255, 71, 0}, {255, 71, 0}, {255, 71, 0}, | |
{255, 71, 0}, {255, 72, 0}, {255, 72, 0}, {255, 72, 0}, {255, 72, 0}, | |
{255, 73, 0}, {255, 73, 0}, {255, 73, 0}, {255, 74, 0}, {255, 74, 0}, | |
{255, 74, 0}, {255, 74, 0}, {255, 75, 0}, {255, 75, 0}, {255, 75, 0}, | |
{255, 75, 0}, {255, 76, 0}, {255, 76, 0}, {255, 76, 0}, {255, 76, 0}, | |
{255, 77, 0}, {255, 77, 0}, {255, 77, 0}, {255, 77, 0}, {255, 78, 0}, | |
{255, 78, 0}, {255, 78, 0}, {255, 78, 0}, {255, 79, 0}, {255, 79, 0}, | |
{255, 79, 0}, {255, 79, 0}, {255, 80, 0}, {255, 80, 0}, {255, 80, 0}, | |
{255, 80, 0}, {255, 81, 0}, {255, 81, 0}, {255, 81, 0}, {255, 81, 0}, | |
{255, 82, 0}, {255, 82, 0}, {255, 82, 0}, {255, 82, 0}, {255, 83, 0}, | |
{255, 83, 0}, {255, 83, 0}, {255, 83, 0}, {255, 84, 0}, {255, 84, 0}, | |
{255, 84, 0}, {255, 84, 0}, {255, 85, 0}, {255, 85, 0}, {255, 85, 0}, | |
{255, 86, 0}, {255, 86, 0}, {255, 86, 0}, {255, 86, 0}, {255, 87, 0}, | |
{255, 87, 0}, {255, 87, 0}, {255, 87, 0}, {255, 88, 0}, {255, 88, 0}, | |
{255, 88, 0}, {255, 88, 0}, {255, 89, 0}, {255, 89, 0}, {255, 89, 0}, | |
{255, 89, 0}, {255, 90, 0}, {255, 90, 0}, {255, 90, 0}, {255, 90, 0}, | |
{255, 91, 0}, {255, 91, 0}, {255, 91, 0}, {255, 91, 0}, {255, 92, 0}, | |
{255, 92, 0}, {255, 92, 0}, {255, 92, 0}, {255, 93, 0}, {255, 93, 0}, | |
{255, 93, 0}, {255, 93, 0}, {255, 94, 0}, {255, 94, 0}, {255, 94, 0}, | |
{255, 94, 0}, {255, 95, 0}, {255, 95, 0}, {255, 95, 0}, {255, 95, 0}, | |
{255, 96, 0}, {255, 96, 0}, {255, 96, 0}, {255, 96, 0}, {255, 97, 0}, | |
{255, 97, 0}, {255, 97, 0}, {255, 98, 0}, {255, 98, 0}, {255, 98, 0}, | |
{255, 98, 0}, {255, 99, 0}, {255, 99, 0}, {255, 99, 0}, {255, 99, 0}, | |
{255, 100, 0}, {255, 100, 0}, {255, 100, 0}, {255, 100, 0}, {255, 101, 0}, | |
{255, 101, 0}, {255, 101, 0}, {255, 101, 0}, {255, 102, 0}, {255, 102, 0}, | |
{255, 102, 0}, {255, 102, 0}, {255, 103, 0}, {255, 103, 0}, {255, 103, 0}, | |
{255, 103, 0}, {255, 104, 0}, {255, 104, 0}, {255, 104, 0}, {255, 104, 0}, | |
{255, 105, 0}, {255, 105, 0}, {255, 105, 0}, {255, 105, 0}, {255, 106, 0}, | |
{255, 106, 0}, {255, 106, 0}, {255, 106, 0}, {255, 107, 0}, {255, 107, 0}, | |
{255, 107, 0}, {255, 107, 0}, {255, 108, 0}, {255, 108, 0}, {255, 108, 0}, | |
{255, 108, 0}, {255, 109, 0}, {255, 109, 0}, {255, 109, 0}, {255, 110, 0}, | |
{255, 110, 0}, {255, 110, 0}, {255, 110, 0}, {255, 111, 0}, {255, 111, 0}, | |
{255, 111, 0}, {255, 111, 0}, {255, 112, 0}, {255, 112, 0}, {255, 112, 0}, | |
{255, 112, 0}, {255, 113, 0}, {255, 113, 0}, {255, 113, 0}, {255, 113, 0}, | |
{255, 114, 0}, {255, 114, 0}, {255, 114, 0}, {255, 114, 0}, {255, 115, 0}, | |
{255, 115, 0}, {255, 115, 0}, {255, 115, 0}, {255, 116, 0}, {255, 116, 0}, | |
{255, 116, 0}, {255, 116, 0}, {255, 117, 0}, {255, 117, 0}, {255, 117, 0}, | |
{255, 117, 0}, {255, 118, 0}, {255, 118, 0}, {255, 118, 0}, {255, 118, 0}, | |
{255, 119, 0}, {255, 119, 0}, {255, 119, 0}, {255, 119, 0}, {255, 120, 0}, | |
{255, 120, 0}, {255, 120, 0}, {255, 120, 0}, {255, 121, 0}, {255, 121, 0}, | |
{255, 121, 0}, {255, 122, 0}, {255, 122, 0}, {255, 122, 0}, {255, 122, 0}, | |
{255, 123, 0}, {255, 123, 0}, {255, 123, 0}, {255, 123, 0}, {255, 124, 0}, | |
{255, 124, 0}, {255, 124, 0}, {255, 124, 0}, {255, 125, 0}, {255, 125, 0}, | |
{255, 125, 0}, {255, 125, 0}, {255, 126, 0}, {255, 126, 0}, {255, 126, 0}, | |
{255, 126, 0}, {255, 127, 0}, {255, 127, 0}, {255, 127, 0}, {255, 127, 0}, | |
{255, 128, 0}, {255, 128, 0}, {255, 128, 0}, {255, 128, 0}, {255, 129, 0}, | |
{255, 129, 0}, {255, 129, 0}, {255, 129, 0}, {255, 130, 0}, {255, 130, 0}, | |
{255, 130, 0}, {255, 130, 0}, {255, 131, 0}, {255, 131, 0}, {255, 131, 0}, | |
{255, 131, 0}, {255, 132, 0}, {255, 132, 0}, {255, 132, 0}, {255, 132, 0}, | |
{255, 133, 0}, {255, 133, 0}, {255, 133, 0}, {255, 133, 0}, {255, 134, 0}, | |
{255, 134, 0}, {255, 134, 0}, {255, 135, 0}, {255, 135, 0}, {255, 135, 0}, | |
{255, 135, 0}, {255, 136, 0}, {255, 136, 0}, {255, 136, 0}, {255, 136, 0}, | |
{255, 137, 0}, {255, 137, 0}, {255, 137, 0}, {255, 137, 0}, {255, 138, 0}, | |
{255, 138, 0}, {255, 138, 0}, {255, 138, 0}, {255, 139, 0}, {255, 139, 0}, | |
{255, 139, 0}, {255, 139, 0}, {255, 140, 0}, {255, 140, 0}, {255, 140, 0}, | |
{255, 140, 0}, {255, 141, 0}, {255, 141, 0}, {255, 141, 0}, {255, 141, 0}, | |
{255, 142, 0}, {255, 142, 0}, {255, 142, 0}, {255, 142, 0}, {255, 143, 0}, | |
{255, 143, 0}, {255, 143, 0}, {255, 143, 0}, {255, 144, 0}, {255, 144, 0}, | |
{255, 144, 0}, {255, 144, 0}, {255, 145, 0}, {255, 145, 0}, {255, 145, 0}, | |
{255, 145, 0}, {255, 146, 0}, {255, 146, 0}, {255, 146, 0}, {255, 147, 0}, | |
{255, 147, 0}, {255, 147, 0}, {255, 147, 0}, {255, 148, 0}, {255, 148, 0}, | |
{255, 148, 0}, {255, 148, 0}, {255, 149, 0}, {255, 149, 0}, {255, 149, 0}, | |
{255, 149, 0}, {255, 150, 0}, {255, 150, 0}, {255, 150, 0}, {255, 150, 0}, | |
{255, 151, 0}, {255, 151, 0}, {255, 151, 0}, {255, 151, 0}, {255, 152, 0}, | |
{255, 152, 0}, {255, 152, 0}, {255, 152, 0}, {255, 153, 0}, {255, 153, 0}, | |
{255, 153, 0}, {255, 153, 0}, {255, 154, 0}, {255, 154, 0}, {255, 154, 0}, | |
{255, 154, 0}, {255, 155, 0}, {255, 155, 0}, {255, 155, 0}, {255, 155, 0}, | |
{255, 156, 0}, {255, 156, 0}, {255, 156, 0}, {255, 156, 0}, {255, 157, 0}, | |
{255, 157, 0}, {255, 157, 0}, {255, 157, 0}, {255, 158, 0}, {255, 158, 0}, | |
{255, 158, 0}, {255, 159, 0}, {255, 159, 0}, {255, 159, 0}, {255, 159, 0}, | |
{255, 160, 0}, {255, 160, 0}, {255, 160, 0}, {255, 160, 0}, {255, 161, 0}, | |
{255, 161, 0}, {255, 161, 0}, {255, 161, 0}, {255, 162, 0}, {255, 162, 0}, | |
{255, 162, 0}, {255, 162, 0}, {255, 163, 0}, {255, 163, 0}, {255, 163, 0}, | |
{255, 163, 0}, {255, 164, 0}, {255, 164, 0}, {255, 164, 0}, {255, 164, 0}, | |
{255, 165, 0}, {255, 165, 0}, {255, 165, 0}, {255, 165, 0}, {255, 166, 0}, | |
{255, 166, 0}, {255, 166, 0}, {255, 166, 0}, {255, 167, 0}, {255, 167, 0}, | |
{255, 167, 0}, {255, 167, 0}, {255, 168, 0}, {255, 168, 0}, {255, 168, 0}, | |
{255, 168, 0}, {255, 169, 0}, {255, 169, 0}, {255, 169, 0}, {255, 169, 0}, | |
{255, 170, 0}, {255, 170, 0}, {255, 170, 0}, {255, 171, 0}, {255, 171, 0}, | |
{255, 171, 0}, {255, 171, 0}, {255, 172, 0}, {255, 172, 0}, {255, 172, 0}, | |
{255, 172, 0}, {255, 173, 0}, {255, 173, 0}, {255, 173, 0}, {255, 173, 0}, | |
{255, 174, 0}, {255, 174, 0}, {255, 174, 0}, {255, 174, 0}, {255, 175, 0}, | |
{255, 175, 0}, {255, 175, 0}, {255, 175, 0}, {255, 176, 0}, {255, 176, 0}, | |
{255, 176, 0}, {255, 176, 0}, {255, 177, 0}, {255, 177, 0}, {255, 177, 0}, | |
{255, 177, 0}, {255, 178, 0}, {255, 178, 0}, {255, 178, 0}, {255, 178, 0}, | |
{255, 179, 0}, {255, 179, 0}, {255, 179, 0}, {255, 179, 0}, {255, 180, 0}, | |
{255, 180, 0}, {255, 180, 0}, {255, 180, 0}, {255, 181, 0}, {255, 181, 0}, | |
{255, 181, 0}, {255, 181, 0}, {255, 182, 0}, {255, 182, 0}, {255, 182, 0}, | |
{255, 183, 0}, {255, 183, 0}, {255, 183, 0}, {255, 183, 0}, {255, 184, 0}, | |
{255, 184, 0}, {255, 184, 0}, {255, 184, 0}, {255, 185, 0}, {255, 185, 0}, | |
{255, 185, 0}, {255, 185, 0}, {255, 186, 0}, {255, 186, 0}, {255, 186, 0}, | |
{255, 186, 0}, {255, 187, 0}, {255, 187, 0}, {255, 187, 0}, {255, 187, 0}, | |
{255, 188, 0}, {255, 188, 0}, {255, 188, 0}, {255, 188, 0}, {255, 189, 0}, | |
{255, 189, 0}, {255, 189, 0}, {255, 189, 0}, {255, 190, 0}, {255, 190, 0}, | |
{255, 190, 0}, {255, 190, 0}, {255, 191, 0}, {255, 191, 0}, {255, 191, 0}, | |
{255, 191, 0}, {255, 192, 0}, {255, 192, 0}, {255, 192, 0}, {255, 192, 0}, | |
{255, 193, 0}, {255, 193, 0}, {255, 193, 0}, {255, 193, 0}, {255, 194, 0}, | |
{255, 194, 0}, {255, 194, 0}, {255, 195, 0}, {255, 195, 0}, {255, 195, 0}, | |
{255, 195, 0}, {255, 196, 0}, {255, 196, 0}, {255, 196, 0}, {255, 196, 0}, | |
{255, 197, 0}, {255, 197, 0}, {255, 197, 0}, {255, 197, 0}, {255, 198, 0}, | |
{255, 198, 0}, {255, 198, 0}, {255, 198, 0}, {255, 199, 0}, {255, 199, 0}, | |
{255, 199, 0}, {255, 199, 0}, {255, 200, 0}, {255, 200, 0}, {255, 200, 0}, | |
{255, 200, 0}, {255, 201, 0}, {255, 201, 0}, {255, 201, 0}, {255, 201, 0}, | |
{255, 202, 0}, {255, 202, 0}, {255, 202, 0}, {255, 202, 0}, {255, 203, 0}, | |
{255, 203, 0}, {255, 203, 0}, {255, 203, 0}, {255, 204, 0}, {255, 204, 0}, | |
{255, 204, 0}, {255, 204, 0}, {255, 205, 0}, {255, 205, 0}, {255, 205, 0}, | |
{255, 205, 0}, {255, 206, 0}, {255, 206, 0}, {255, 206, 0}, {255, 207, 0}, | |
{255, 207, 0}, {255, 207, 0}, {255, 207, 0}, {255, 208, 0}, {255, 208, 0}, | |
{255, 208, 0}, {255, 208, 0}, {255, 209, 0}, {255, 209, 0}, {255, 209, 0}, | |
{255, 209, 0}, {255, 210, 0}, {255, 210, 0}, {255, 210, 0}, {255, 210, 0}, | |
{255, 211, 0}, {255, 211, 0}, {255, 211, 0}, {255, 211, 0}, {255, 212, 0}, | |
{255, 212, 0}, {255, 212, 0}, {255, 212, 0}, {255, 213, 0}, {255, 213, 0}, | |
{255, 213, 0}, {255, 213, 0}, {255, 214, 0}, {255, 214, 0}, {255, 214, 0}, | |
{255, 214, 0}, {255, 215, 0}, {255, 215, 0}, {255, 215, 0}, {255, 215, 0}, | |
{255, 216, 0}, {255, 216, 0}, {255, 216, 0}, {255, 216, 0}, {255, 217, 0}, | |
{255, 217, 0}, {255, 217, 0}, {255, 217, 0}, {255, 218, 0}, {255, 218, 0}, | |
{255, 218, 0}, {255, 218, 0}, {255, 219, 0}, {255, 219, 0}, {255, 219, 0}, | |
{255, 220, 0}, {255, 220, 0}, {255, 220, 0}, {255, 220, 0}, {255, 221, 0}, | |
{255, 221, 0}, {255, 221, 0}, {255, 221, 0}, {255, 222, 0}, {255, 222, 0}, | |
{255, 222, 0}, {255, 222, 0}, {255, 223, 0}, {255, 223, 0}, {255, 223, 0}, | |
{255, 223, 0}, {255, 224, 0}, {255, 224, 0}, {255, 224, 0}, {255, 224, 0}, | |
{255, 225, 0}, {255, 225, 0}, {255, 225, 0}, {255, 225, 0}, {255, 226, 0}, | |
{255, 226, 0}, {255, 226, 0}, {255, 226, 0}, {255, 227, 0}, {255, 227, 0}, | |
{255, 227, 0}, {255, 227, 0}, {255, 228, 0}, {255, 228, 0}, {255, 228, 0}, | |
{255, 228, 0}, {255, 229, 0}, {255, 229, 0}, {255, 229, 0}, {255, 229, 0}, | |
{255, 230, 0}, {255, 230, 0}, {255, 230, 0}, {255, 230, 0}, {255, 231, 0}, | |
{255, 231, 0}, {255, 231, 0}, {255, 232, 0}, {255, 232, 0}, {255, 232, 0}, | |
{255, 232, 0}, {255, 233, 0}, {255, 233, 0}, {255, 233, 0}, {255, 233, 0}, | |
{255, 234, 0}, {255, 234, 0}, {255, 234, 0}, {255, 234, 0}, {255, 235, 0}, | |
{255, 235, 0}, {255, 235, 0}, {255, 235, 0}, {255, 236, 0}, {255, 236, 0}, | |
{255, 236, 0}, {255, 236, 0}, {255, 237, 0}, {255, 237, 0}, {255, 237, 0}, | |
{255, 237, 0}, {255, 238, 0}, {255, 238, 0}, {255, 238, 0}, {255, 238, 0}, | |
{255, 239, 0}, {255, 239, 0}, {255, 239, 0}, {255, 239, 0}, {255, 240, 0}, | |
{255, 240, 0}, {255, 240, 0}, {255, 240, 0}, {255, 241, 0}, {255, 241, 0}, | |
{255, 241, 0}, {255, 241, 0}, {255, 242, 0}, {255, 242, 0}, {255, 242, 0}, | |
{255, 242, 0}, {255, 243, 0}, {255, 243, 0}, {255, 243, 0}, {255, 244, 0}, | |
{255, 244, 0}, {255, 244, 0}, {255, 244, 0}, {255, 245, 0}, {255, 245, 0}, | |
{255, 245, 0}, {255, 245, 0}, {255, 246, 0}, {255, 246, 0}, {255, 246, 0}, | |
{255, 246, 0}, {255, 247, 0}, {255, 247, 0}, {255, 247, 0}, {255, 247, 0}, | |
{255, 248, 0}, {255, 248, 0}, {255, 248, 0}, {255, 248, 0}, {255, 249, 0}, | |
{255, 249, 0}, {255, 249, 0}, {255, 249, 0}, {255, 250, 0}, {255, 250, 0}, | |
{255, 250, 0}, {255, 250, 0}, {255, 251, 0}, {255, 251, 0}, {255, 251, 0}, | |
{255, 251, 0}, {255, 252, 0}, {255, 252, 0}, {255, 252, 0}, {255, 252, 0}, | |
{255, 253, 0}, {255, 253, 0}, {255, 253, 0}, {255, 253, 0}, {255, 254, 0}, | |
{255, 254, 0}, {255, 254, 0}, {255, 254, 0}, {255, 255, 0}, {255, 255, 0} | |
}; | |
const rgb_t copper_colormap[1000] = { | |
{ 0, 0, 0}, { 0, 0, 0}, { 1, 0, 0}, { 1, 1, 0}, { 1, 1, 1}, | |
{ 2, 1, 1}, { 2, 1, 1}, { 2, 1, 1}, { 3, 2, 1}, { 3, 2, 1}, | |
{ 3, 2, 1}, { 4, 2, 1}, { 4, 2, 2}, { 4, 3, 2}, { 4, 3, 2}, | |
{ 5, 3, 2}, { 5, 3, 2}, { 5, 3, 2}, { 6, 4, 2}, { 6, 4, 2}, | |
{ 6, 4, 3}, { 7, 4, 3}, { 7, 4, 3}, { 7, 5, 3}, { 8, 5, 3}, | |
{ 8, 5, 3}, { 8, 5, 3}, { 9, 5, 3}, { 9, 6, 4}, { 9, 6, 4}, | |
{ 10, 6, 4}, { 10, 6, 4}, { 10, 6, 4}, { 11, 7, 4}, { 11, 7, 4}, | |
{ 11, 7, 4}, { 11, 7, 5}, { 12, 7, 5}, { 12, 8, 5}, { 12, 8, 5}, | |
{ 13, 8, 5}, { 13, 8, 5}, { 13, 8, 5}, { 14, 9, 5}, { 14, 9, 6}, | |
{ 14, 9, 6}, { 15, 9, 6}, { 15, 9, 6}, { 15, 10, 6}, { 16, 10, 6}, | |
{ 16, 10, 6}, { 16, 10, 6}, { 17, 10, 7}, { 17, 11, 7}, { 17, 11, 7}, | |
{ 18, 11, 7}, { 18, 11, 7}, { 18, 11, 7}, { 19, 12, 7}, { 19, 12, 7}, | |
{ 19, 12, 8}, { 19, 12, 8}, { 20, 12, 8}, { 20, 13, 8}, { 20, 13, 8}, | |
{ 21, 13, 8}, { 21, 13, 8}, { 21, 13, 9}, { 22, 14, 9}, { 22, 14, 9}, | |
{ 22, 14, 9}, { 23, 14, 9}, { 23, 14, 9}, { 23, 15, 9}, { 24, 15, 9}, | |
{ 24, 15, 10}, { 24, 15, 10}, { 25, 15, 10}, { 25, 16, 10}, { 25, 16, 10}, | |
{ 26, 16, 10}, { 26, 16, 10}, { 26, 16, 10}, { 26, 17, 11}, { 27, 17, 11}, | |
{ 27, 17, 11}, { 27, 17, 11}, { 28, 17, 11}, { 28, 18, 11}, { 28, 18, 11}, | |
{ 29, 18, 11}, { 29, 18, 12}, { 29, 18, 12}, { 30, 19, 12}, { 30, 19, 12}, | |
{ 30, 19, 12}, { 31, 19, 12}, { 31, 19, 12}, { 31, 20, 12}, { 32, 20, 13}, | |
{ 32, 20, 13}, { 32, 20, 13}, { 33, 20, 13}, { 33, 21, 13}, { 33, 21, 13}, | |
{ 34, 21, 13}, { 34, 21, 13}, { 34, 21, 14}, { 34, 22, 14}, { 35, 22, 14}, | |
{ 35, 22, 14}, { 35, 22, 14}, { 36, 22, 14}, { 36, 23, 14}, { 36, 23, 14}, | |
{ 37, 23, 15}, { 37, 23, 15}, { 37, 23, 15}, { 38, 24, 15}, { 38, 24, 15}, | |
{ 38, 24, 15}, { 39, 24, 15}, { 39, 24, 15}, { 39, 25, 16}, { 40, 25, 16}, | |
{ 40, 25, 16}, { 40, 25, 16}, { 41, 25, 16}, { 41, 26, 16}, { 41, 26, 16}, | |
{ 41, 26, 17}, { 42, 26, 17}, { 42, 26, 17}, { 42, 27, 17}, { 43, 27, 17}, | |
{ 43, 27, 17}, { 43, 27, 17}, { 44, 27, 17}, { 44, 28, 18}, { 44, 28, 18}, | |
{ 45, 28, 18}, { 45, 28, 18}, { 45, 28, 18}, { 46, 29, 18}, { 46, 29, 18}, | |
{ 46, 29, 18}, { 47, 29, 19}, { 47, 29, 19}, { 47, 30, 19}, { 48, 30, 19}, | |
{ 48, 30, 19}, { 48, 30, 19}, { 48, 30, 19}, { 49, 31, 19}, { 49, 31, 20}, | |
{ 49, 31, 20}, { 50, 31, 20}, { 50, 31, 20}, { 50, 32, 20}, { 51, 32, 20}, | |
{ 51, 32, 20}, { 51, 32, 20}, { 52, 32, 21}, { 52, 33, 21}, { 52, 33, 21}, | |
{ 53, 33, 21}, { 53, 33, 21}, { 53, 33, 21}, { 54, 34, 21}, { 54, 34, 21}, | |
{ 54, 34, 22}, { 55, 34, 22}, { 55, 34, 22}, { 55, 34, 22}, { 56, 35, 22}, | |
{ 56, 35, 22}, { 56, 35, 22}, { 56, 35, 22}, { 57, 35, 23}, { 57, 36, 23}, | |
{ 57, 36, 23}, { 58, 36, 23}, { 58, 36, 23}, { 58, 36, 23}, { 59, 37, 23}, | |
{ 59, 37, 23}, { 59, 37, 24}, { 60, 37, 24}, { 60, 37, 24}, { 60, 38, 24}, | |
{ 61, 38, 24}, { 61, 38, 24}, { 61, 38, 24}, { 62, 38, 25}, { 62, 39, 25}, | |
{ 62, 39, 25}, { 63, 39, 25}, { 63, 39, 25}, { 63, 39, 25}, { 63, 40, 25}, | |
{ 64, 40, 25}, { 64, 40, 26}, { 64, 40, 26}, { 65, 40, 26}, { 65, 41, 26}, | |
{ 65, 41, 26}, { 66, 41, 26}, { 66, 41, 26}, { 66, 41, 26}, { 67, 42, 27}, | |
{ 67, 42, 27}, { 67, 42, 27}, { 68, 42, 27}, { 68, 42, 27}, { 68, 43, 27}, | |
{ 69, 43, 27}, { 69, 43, 27}, { 69, 43, 28}, { 70, 43, 28}, { 70, 44, 28}, | |
{ 70, 44, 28}, { 71, 44, 28}, { 71, 44, 28}, { 71, 44, 28}, { 71, 45, 28}, | |
{ 72, 45, 29}, { 72, 45, 29}, { 72, 45, 29}, { 73, 45, 29}, { 73, 46, 29}, | |
{ 73, 46, 29}, { 74, 46, 29}, { 74, 46, 29}, { 74, 46, 30}, { 75, 47, 30}, | |
{ 75, 47, 30}, { 75, 47, 30}, { 76, 47, 30}, { 76, 47, 30}, { 76, 48, 30}, | |
{ 77, 48, 30}, { 77, 48, 31}, { 77, 48, 31}, { 78, 48, 31}, { 78, 49, 31}, | |
{ 78, 49, 31}, { 78, 49, 31}, { 79, 49, 31}, { 79, 49, 31}, { 79, 50, 32}, | |
{ 80, 50, 32}, { 80, 50, 32}, { 80, 50, 32}, { 81, 50, 32}, { 81, 51, 32}, | |
{ 81, 51, 32}, { 82, 51, 33}, { 82, 51, 33}, { 82, 51, 33}, { 83, 52, 33}, | |
{ 83, 52, 33}, { 83, 52, 33}, { 84, 52, 33}, { 84, 52, 33}, { 84, 53, 34}, | |
{ 85, 53, 34}, { 85, 53, 34}, { 85, 53, 34}, { 86, 53, 34}, { 86, 54, 34}, | |
{ 86, 54, 34}, { 86, 54, 34}, { 87, 54, 35}, { 87, 54, 35}, { 87, 55, 35}, | |
{ 88, 55, 35}, { 88, 55, 35}, { 88, 55, 35}, { 89, 55, 35}, { 89, 56, 35}, | |
{ 89, 56, 36}, { 90, 56, 36}, { 90, 56, 36}, { 90, 56, 36}, { 91, 57, 36}, | |
{ 91, 57, 36}, { 91, 57, 36}, { 92, 57, 36}, { 92, 57, 37}, { 92, 58, 37}, | |
{ 93, 58, 37}, { 93, 58, 37}, { 93, 58, 37}, { 93, 58, 37}, { 94, 59, 37}, | |
{ 94, 59, 37}, { 94, 59, 38}, { 95, 59, 38}, { 95, 59, 38}, { 95, 60, 38}, | |
{ 96, 60, 38}, { 96, 60, 38}, { 96, 60, 38}, { 97, 60, 38}, { 97, 61, 39}, | |
{ 97, 61, 39}, { 98, 61, 39}, { 98, 61, 39}, { 98, 61, 39}, { 99, 62, 39}, | |
{ 99, 62, 39}, { 99, 62, 39}, {100, 62, 40}, {100, 62, 40}, {100, 63, 40}, | |
{101, 63, 40}, {101, 63, 40}, {101, 63, 40}, {101, 63, 40}, {102, 64, 41}, | |
{102, 64, 41}, {102, 64, 41}, {103, 64, 41}, {103, 64, 41}, {103, 65, 41}, | |
{104, 65, 41}, {104, 65, 41}, {104, 65, 42}, {105, 65, 42}, {105, 66, 42}, | |
{105, 66, 42}, {106, 66, 42}, {106, 66, 42}, {106, 66, 42}, {107, 67, 42}, | |
{107, 67, 43}, {107, 67, 43}, {108, 67, 43}, {108, 67, 43}, {108, 68, 43}, | |
{108, 68, 43}, {109, 68, 43}, {109, 68, 43}, {109, 68, 44}, {110, 69, 44}, | |
{110, 69, 44}, {110, 69, 44}, {111, 69, 44}, {111, 69, 44}, {111, 70, 44}, | |
{112, 70, 44}, {112, 70, 45}, {112, 70, 45}, {113, 70, 45}, {113, 71, 45}, | |
{113, 71, 45}, {114, 71, 45}, {114, 71, 45}, {114, 71, 45}, {115, 72, 46}, | |
{115, 72, 46}, {115, 72, 46}, {116, 72, 46}, {116, 72, 46}, {116, 73, 46}, | |
{116, 73, 46}, {117, 73, 46}, {117, 73, 47}, {117, 73, 47}, {118, 74, 47}, | |
{118, 74, 47}, {118, 74, 47}, {119, 74, 47}, {119, 74, 47}, {119, 75, 47}, | |
{120, 75, 48}, {120, 75, 48}, {120, 75, 48}, {121, 75, 48}, {121, 76, 48}, | |
{121, 76, 48}, {122, 76, 48}, {122, 76, 49}, {122, 76, 49}, {123, 77, 49}, | |
{123, 77, 49}, {123, 77, 49}, {123, 77, 49}, {124, 77, 49}, {124, 78, 49}, | |
{124, 78, 50}, {125, 78, 50}, {125, 78, 50}, {125, 78, 50}, {126, 79, 50}, | |
{126, 79, 50}, {126, 79, 50}, {127, 79, 50}, {127, 79, 51}, {127, 80, 51}, | |
{128, 80, 51}, {128, 80, 51}, {128, 80, 51}, {129, 80, 51}, {129, 81, 51}, | |
{129, 81, 51}, {130, 81, 52}, {130, 81, 52}, {130, 81, 52}, {130, 82, 52}, | |
{131, 82, 52}, {131, 82, 52}, {131, 82, 52}, {132, 82, 52}, {132, 83, 53}, | |
{132, 83, 53}, {133, 83, 53}, {133, 83, 53}, {133, 83, 53}, {134, 84, 53}, | |
{134, 84, 53}, {134, 84, 53}, {135, 84, 54}, {135, 84, 54}, {135, 85, 54}, | |
{136, 85, 54}, {136, 85, 54}, {136, 85, 54}, {137, 85, 54}, {137, 86, 54}, | |
{137, 86, 55}, {138, 86, 55}, {138, 86, 55}, {138, 86, 55}, {138, 87, 55}, | |
{139, 87, 55}, {139, 87, 55}, {139, 87, 55}, {140, 87, 56}, {140, 88, 56}, | |
{140, 88, 56}, {141, 88, 56}, {141, 88, 56}, {141, 88, 56}, {142, 89, 56}, | |
{142, 89, 57}, {142, 89, 57}, {143, 89, 57}, {143, 89, 57}, {143, 90, 57}, | |
{144, 90, 57}, {144, 90, 57}, {144, 90, 57}, {145, 90, 58}, {145, 91, 58}, | |
{145, 91, 58}, {145, 91, 58}, {146, 91, 58}, {146, 91, 58}, {146, 92, 58}, | |
{147, 92, 58}, {147, 92, 59}, {147, 92, 59}, {148, 92, 59}, {148, 93, 59}, | |
{148, 93, 59}, {149, 93, 59}, {149, 93, 59}, {149, 93, 59}, {150, 94, 60}, | |
{150, 94, 60}, {150, 94, 60}, {151, 94, 60}, {151, 94, 60}, {151, 95, 60}, | |
{152, 95, 60}, {152, 95, 60}, {152, 95, 61}, {153, 95, 61}, {153, 96, 61}, | |
{153, 96, 61}, {153, 96, 61}, {154, 96, 61}, {154, 96, 61}, {154, 97, 61}, | |
{155, 97, 62}, {155, 97, 62}, {155, 97, 62}, {156, 97, 62}, {156, 98, 62}, | |
{156, 98, 62}, {157, 98, 62}, {157, 98, 62}, {157, 98, 63}, {158, 99, 63}, | |
{158, 99, 63}, {158, 99, 63}, {159, 99, 63}, {159, 99, 63}, {159, 100, 63}, | |
{160, 100, 63}, {160, 100, 64}, {160, 100, 64}, {160, 100, 64}, {161, 101, 64}, | |
{161, 101, 64}, {161, 101, 64}, {162, 101, 64}, {162, 101, 65}, {162, 101, 65}, | |
{163, 102, 65}, {163, 102, 65}, {163, 102, 65}, {164, 102, 65}, {164, 102, 65}, | |
{164, 103, 65}, {165, 103, 66}, {165, 103, 66}, {165, 103, 66}, {166, 103, 66}, | |
{166, 104, 66}, {166, 104, 66}, {167, 104, 66}, {167, 104, 66}, {167, 104, 67}, | |
{168, 105, 67}, {168, 105, 67}, {168, 105, 67}, {168, 105, 67}, {169, 105, 67}, | |
{169, 106, 67}, {169, 106, 67}, {170, 106, 68}, {170, 106, 68}, {170, 106, 68}, | |
{171, 107, 68}, {171, 107, 68}, {171, 107, 68}, {172, 107, 68}, {172, 107, 68}, | |
{172, 108, 69}, {173, 108, 69}, {173, 108, 69}, {173, 108, 69}, {174, 108, 69}, | |
{174, 109, 69}, {174, 109, 69}, {175, 109, 69}, {175, 109, 70}, {175, 109, 70}, | |
{175, 110, 70}, {176, 110, 70}, {176, 110, 70}, {176, 110, 70}, {177, 110, 70}, | |
{177, 111, 70}, {177, 111, 71}, {178, 111, 71}, {178, 111, 71}, {178, 111, 71}, | |
{179, 112, 71}, {179, 112, 71}, {179, 112, 71}, {180, 112, 71}, {180, 112, 72}, | |
{180, 113, 72}, {181, 113, 72}, {181, 113, 72}, {181, 113, 72}, {182, 113, 72}, | |
{182, 114, 72}, {182, 114, 73}, {183, 114, 73}, {183, 114, 73}, {183, 114, 73}, | |
{183, 115, 73}, {184, 115, 73}, {184, 115, 73}, {184, 115, 73}, {185, 115, 74}, | |
{185, 116, 74}, {185, 116, 74}, {186, 116, 74}, {186, 116, 74}, {186, 116, 74}, | |
{187, 117, 74}, {187, 117, 74}, {187, 117, 75}, {188, 117, 75}, {188, 117, 75}, | |
{188, 118, 75}, {189, 118, 75}, {189, 118, 75}, {189, 118, 75}, {190, 118, 75}, | |
{190, 119, 76}, {190, 119, 76}, {190, 119, 76}, {191, 119, 76}, {191, 119, 76}, | |
{191, 120, 76}, {192, 120, 76}, {192, 120, 76}, {192, 120, 77}, {193, 120, 77}, | |
{193, 121, 77}, {193, 121, 77}, {194, 121, 77}, {194, 121, 77}, {194, 121, 77}, | |
{195, 122, 77}, {195, 122, 78}, {195, 122, 78}, {196, 122, 78}, {196, 122, 78}, | |
{196, 123, 78}, {197, 123, 78}, {197, 123, 78}, {197, 123, 78}, {198, 123, 79}, | |
{198, 124, 79}, {198, 124, 79}, {198, 124, 79}, {199, 124, 79}, {199, 124, 79}, | |
{199, 125, 79}, {200, 125, 79}, {200, 125, 80}, {200, 125, 80}, {201, 125, 80}, | |
{201, 126, 80}, {201, 126, 80}, {202, 126, 80}, {202, 126, 80}, {202, 126, 81}, | |
{203, 127, 81}, {203, 127, 81}, {203, 127, 81}, {204, 127, 81}, {204, 127, 81}, | |
{204, 128, 81}, {205, 128, 81}, {205, 128, 82}, {205, 128, 82}, {205, 128, 82}, | |
{206, 129, 82}, {206, 129, 82}, {206, 129, 82}, {207, 129, 82}, {207, 129, 82}, | |
{207, 130, 83}, {208, 130, 83}, {208, 130, 83}, {208, 130, 83}, {209, 130, 83}, | |
{209, 131, 83}, {209, 131, 83}, {210, 131, 83}, {210, 131, 84}, {210, 131, 84}, | |
{211, 132, 84}, {211, 132, 84}, {211, 132, 84}, {212, 132, 84}, {212, 132, 84}, | |
{212, 133, 84}, {212, 133, 85}, {213, 133, 85}, {213, 133, 85}, {213, 133, 85}, | |
{214, 134, 85}, {214, 134, 85}, {214, 134, 85}, {215, 134, 85}, {215, 134, 86}, | |
{215, 135, 86}, {216, 135, 86}, {216, 135, 86}, {216, 135, 86}, {217, 135, 86}, | |
{217, 136, 86}, {217, 136, 86}, {218, 136, 87}, {218, 136, 87}, {218, 136, 87}, | |
{219, 137, 87}, {219, 137, 87}, {219, 137, 87}, {220, 137, 87}, {220, 137, 87}, | |
{220, 138, 88}, {220, 138, 88}, {221, 138, 88}, {221, 138, 88}, {221, 138, 88}, | |
{222, 139, 88}, {222, 139, 88}, {222, 139, 89}, {223, 139, 89}, {223, 139, 89}, | |
{223, 140, 89}, {224, 140, 89}, {224, 140, 89}, {224, 140, 89}, {225, 140, 89}, | |
{225, 141, 90}, {225, 141, 90}, {226, 141, 90}, {226, 141, 90}, {226, 141, 90}, | |
{227, 142, 90}, {227, 142, 90}, {227, 142, 90}, {227, 142, 91}, {228, 142, 91}, | |
{228, 143, 91}, {228, 143, 91}, {229, 143, 91}, {229, 143, 91}, {229, 143, 91}, | |
{230, 144, 91}, {230, 144, 92}, {230, 144, 92}, {231, 144, 92}, {231, 144, 92}, | |
{231, 145, 92}, {232, 145, 92}, {232, 145, 92}, {232, 145, 92}, {233, 145, 93}, | |
{233, 146, 93}, {233, 146, 93}, {234, 146, 93}, {234, 146, 93}, {234, 146, 93}, | |
{235, 147, 93}, {235, 147, 93}, {235, 147, 94}, {235, 147, 94}, {236, 147, 94}, | |
{236, 148, 94}, {236, 148, 94}, {237, 148, 94}, {237, 148, 94}, {237, 148, 94}, | |
{238, 149, 95}, {238, 149, 95}, {238, 149, 95}, {239, 149, 95}, {239, 149, 95}, | |
{239, 150, 95}, {240, 150, 95}, {240, 150, 95}, {240, 150, 96}, {241, 150, 96}, | |
{241, 151, 96}, {241, 151, 96}, {242, 151, 96}, {242, 151, 96}, {242, 151, 96}, | |
{242, 152, 97}, {243, 152, 97}, {243, 152, 97}, {243, 152, 97}, {244, 152, 97}, | |
{244, 153, 97}, {244, 153, 97}, {245, 153, 97}, {245, 153, 98}, {245, 153, 98}, | |
{246, 154, 98}, {246, 154, 98}, {246, 154, 98}, {247, 154, 98}, {247, 154, 98}, | |
{247, 155, 98}, {248, 155, 99}, {248, 155, 99}, {248, 155, 99}, {249, 155, 99}, | |
{249, 156, 99}, {249, 156, 99}, {250, 156, 99}, {250, 156, 99}, {250, 156, 100}, | |
{250, 157, 100}, {251, 157, 100}, {251, 157, 100}, {251, 157, 100}, {252, 157, 100}, | |
{252, 158, 100}, {252, 158, 100}, {253, 158, 101}, {253, 158, 101}, {253, 158, 101}, | |
{253, 159, 101}, {253, 159, 101}, {254, 159, 101}, {254, 159, 101}, {254, 159, 101}, | |
{254, 160, 102}, {254, 160, 102}, {254, 160, 102}, {254, 160, 102}, {254, 160, 102}, | |
{255, 161, 102}, {255, 161, 102}, {255, 161, 102}, {255, 161, 103}, {255, 161, 103}, | |
{255, 162, 103}, {255, 162, 103}, {255, 162, 103}, {255, 162, 103}, {255, 162, 103}, | |
{255, 163, 103}, {255, 163, 104}, {255, 163, 104}, {255, 163, 104}, {255, 163, 104}, | |
{255, 164, 104}, {255, 164, 104}, {255, 164, 104}, {255, 164, 105}, {255, 164, 105}, | |
{255, 165, 105}, {255, 165, 105}, {255, 165, 105}, {255, 165, 105}, {255, 165, 105}, | |
{255, 166, 105}, {255, 166, 106}, {255, 166, 106}, {255, 166, 106}, {255, 166, 106}, | |
{255, 167, 106}, {255, 167, 106}, {255, 167, 106}, {255, 167, 106}, {255, 167, 107}, | |
{255, 168, 107}, {255, 168, 107}, {255, 168, 107}, {255, 168, 107}, {255, 168, 107}, | |
{255, 168, 107}, {255, 169, 107}, {255, 169, 108}, {255, 169, 108}, {255, 169, 108}, | |
{255, 169, 108}, {255, 170, 108}, {255, 170, 108}, {255, 170, 108}, {255, 170, 108}, | |
{255, 170, 109}, {255, 171, 109}, {255, 171, 109}, {255, 171, 109}, {255, 171, 109}, | |
{255, 171, 109}, {255, 172, 109}, {255, 172, 109}, {255, 172, 110}, {255, 172, 110}, | |
{255, 172, 110}, {255, 173, 110}, {255, 173, 110}, {255, 173, 110}, {255, 173, 110}, | |
{255, 173, 110}, {255, 174, 111}, {255, 174, 111}, {255, 174, 111}, {255, 174, 111}, | |
{255, 174, 111}, {255, 175, 111}, {255, 175, 111}, {255, 175, 111}, {255, 175, 112}, | |
{255, 175, 112}, {255, 176, 112}, {255, 176, 112}, {255, 176, 112}, {255, 176, 112}, | |
{255, 176, 112}, {255, 177, 113}, {255, 177, 113}, {255, 177, 113}, {255, 177, 113}, | |
{255, 177, 113}, {255, 178, 113}, {255, 178, 113}, {255, 178, 113}, {255, 178, 114}, | |
{255, 178, 114}, {255, 179, 114}, {255, 179, 114}, {255, 179, 114}, {255, 179, 114}, | |
{255, 179, 114}, {255, 180, 114}, {255, 180, 115}, {255, 180, 115}, {255, 180, 115}, | |
{255, 180, 115}, {255, 181, 115}, {255, 181, 115}, {255, 181, 115}, {255, 181, 115}, | |
{255, 181, 116}, {255, 182, 116}, {255, 182, 116}, {255, 182, 116}, {255, 182, 116}, | |
{255, 182, 116}, {255, 183, 116}, {255, 183, 116}, {255, 183, 117}, {255, 183, 117}, | |
{255, 183, 117}, {255, 184, 117}, {255, 184, 117}, {255, 184, 117}, {255, 184, 117}, | |
{255, 184, 117}, {255, 185, 118}, {255, 185, 118}, {255, 185, 118}, {255, 185, 118}, | |
{255, 185, 118}, {255, 186, 118}, {255, 186, 118}, {255, 186, 118}, {255, 186, 119}, | |
{255, 186, 119}, {255, 187, 119}, {255, 187, 119}, {255, 187, 119}, {255, 187, 119}, | |
{255, 187, 119}, {255, 188, 119}, {255, 188, 120}, {255, 188, 120}, {255, 188, 120}, | |
{255, 188, 120}, {255, 189, 120}, {255, 189, 120}, {255, 189, 120}, {255, 189, 121}, | |
{255, 189, 121}, {255, 190, 121}, {255, 190, 121}, {255, 190, 121}, {255, 190, 121}, | |
{255, 190, 121}, {255, 191, 121}, {255, 191, 122}, {255, 191, 122}, {255, 191, 122}, | |
{255, 191, 122}, {255, 192, 122}, {255, 192, 122}, {255, 192, 122}, {255, 192, 122}, | |
{255, 192, 123}, {255, 193, 123}, {255, 193, 123}, {255, 193, 123}, {255, 193, 123}, | |
{255, 193, 123}, {255, 194, 123}, {255, 194, 123}, {255, 194, 124}, {255, 194, 124}, | |
{255, 194, 124}, {255, 195, 124}, {255, 195, 124}, {255, 195, 124}, {255, 195, 124}, | |
{255, 195, 124}, {255, 196, 125}, {255, 196, 125}, {255, 196, 125}, {255, 196, 125}, | |
{255, 196, 125}, {255, 197, 125}, {255, 197, 125}, {255, 197, 125}, {255, 197, 126}, | |
{255, 197, 126}, {255, 198, 126}, {255, 198, 126}, {255, 198, 126}, {255, 198, 126}, | |
{255, 198, 126}, {255, 199, 126}, {255, 199, 127}, {255, 199, 127}, {255, 199, 127} | |
}; | |
const rgb_t gray_colormap[1000] = { | |
{255, 255, 255}, {255, 255, 255}, {254, 254, 254}, {254, 254, 254}, {254, 254, 254}, | |
{254, 254, 254}, {253, 253, 253}, {253, 253, 253}, {253, 253, 253}, {253, 253, 253}, | |
{252, 252, 252}, {252, 252, 252}, {252, 252, 252}, {252, 252, 252}, {251, 251, 251}, | |
{251, 251, 251}, {251, 251, 251}, {251, 251, 251}, {250, 250, 250}, {250, 250, 250}, | |
{250, 250, 250}, {250, 250, 250}, {249, 249, 249}, {249, 249, 249}, {249, 249, 249}, | |
{249, 249, 249}, {248, 248, 248}, {248, 248, 248}, {248, 248, 248}, {248, 248, 248}, | |
{247, 247, 247}, {247, 247, 247}, {247, 247, 247}, {247, 247, 247}, {246, 246, 246}, | |
{246, 246, 246}, {246, 246, 246}, {246, 246, 246}, {245, 245, 245}, {245, 245, 245}, | |
{245, 245, 245}, {245, 245, 245}, {244, 244, 244}, {244, 244, 244}, {244, 244, 244}, | |
{244, 244, 244}, {243, 243, 243}, {243, 243, 243}, {243, 243, 243}, {242, 242, 242}, | |
{242, 242, 242}, {242, 242, 242}, {242, 242, 242}, {241, 241, 241}, {241, 241, 241}, | |
{241, 241, 241}, {241, 241, 241}, {240, 240, 240}, {240, 240, 240}, {240, 240, 240}, | |
{240, 240, 240}, {239, 239, 239}, {239, 239, 239}, {239, 239, 239}, {239, 239, 239}, | |
{238, 238, 238}, {238, 238, 238}, {238, 238, 238}, {238, 238, 238}, {237, 237, 237}, | |
{237, 237, 237}, {237, 237, 237}, {237, 237, 237}, {236, 236, 236}, {236, 236, 236}, | |
{236, 236, 236}, {236, 236, 236}, {235, 235, 235}, {235, 235, 235}, {235, 235, 235}, | |
{235, 235, 235}, {234, 234, 234}, {234, 234, 234}, {234, 234, 234}, {234, 234, 234}, | |
{233, 233, 233}, {233, 233, 233}, {233, 233, 233}, {233, 233, 233}, {232, 232, 232}, | |
{232, 232, 232}, {232, 232, 232}, {232, 232, 232}, {231, 231, 231}, {231, 231, 231}, | |
{231, 231, 231}, {230, 230, 230}, {230, 230, 230}, {230, 230, 230}, {230, 230, 230}, | |
{229, 229, 229}, {229, 229, 229}, {229, 229, 229}, {229, 229, 229}, {228, 228, 228}, | |
{228, 228, 228}, {228, 228, 228}, {228, 228, 228}, {227, 227, 227}, {227, 227, 227}, | |
{227, 227, 227}, {227, 227, 227}, {226, 226, 226}, {226, 226, 226}, {226, 226, 226}, | |
{226, 226, 226}, {225, 225, 225}, {225, 225, 225}, {225, 225, 225}, {225, 225, 225}, | |
{224, 224, 224}, {224, 224, 224}, {224, 224, 224}, {224, 224, 224}, {223, 223, 223}, | |
{223, 223, 223}, {223, 223, 223}, {223, 223, 223}, {222, 222, 222}, {222, 222, 222}, | |
{222, 222, 222}, {222, 222, 222}, {221, 221, 221}, {221, 221, 221}, {221, 221, 221}, | |
{221, 221, 221}, {220, 220, 220}, {220, 220, 220}, {220, 220, 220}, {220, 220, 220}, | |
{219, 219, 219}, {219, 219, 219}, {219, 219, 219}, {218, 218, 218}, {218, 218, 218}, | |
{218, 218, 218}, {218, 218, 218}, {217, 217, 217}, {217, 217, 217}, {217, 217, 217}, | |
{217, 217, 217}, {216, 216, 216}, {216, 216, 216}, {216, 216, 216}, {216, 216, 216}, | |
{215, 215, 215}, {215, 215, 215}, {215, 215, 215}, {215, 215, 215}, {214, 214, 214}, | |
{214, 214, 214}, {214, 214, 214}, {214, 214, 214}, {213, 213, 213}, {213, 213, 213}, | |
{213, 213, 213}, {213, 213, 213}, {212, 212, 212}, {212, 212, 212}, {212, 212, 212}, | |
{212, 212, 212}, {211, 211, 211}, {211, 211, 211}, {211, 211, 211}, {211, 211, 211}, | |
{210, 210, 210}, {210, 210, 210}, {210, 210, 210}, {210, 210, 210}, {209, 209, 209}, | |
{209, 209, 209}, {209, 209, 209}, {209, 209, 209}, {208, 208, 208}, {208, 208, 208}, | |
{208, 208, 208}, {208, 208, 208}, {207, 207, 207}, {207, 207, 207}, {207, 207, 207}, | |
{207, 207, 207}, {206, 206, 206}, {206, 206, 206}, {206, 206, 206}, {205, 205, 205}, | |
{205, 205, 205}, {205, 205, 205}, {205, 205, 205}, {204, 204, 204}, {204, 204, 204}, | |
{204, 204, 204}, {204, 204, 204}, {203, 203, 203}, {203, 203, 203}, {203, 203, 203}, | |
{203, 203, 203}, {202, 202, 202}, {202, 202, 202}, {202, 202, 202}, {202, 202, 202}, | |
{201, 201, 201}, {201, 201, 201}, {201, 201, 201}, {201, 201, 201}, {200, 200, 200}, | |
{200, 200, 200}, {200, 200, 200}, {200, 200, 200}, {199, 199, 199}, {199, 199, 199}, | |
{199, 199, 199}, {199, 199, 199}, {198, 198, 198}, {198, 198, 198}, {198, 198, 198}, | |
{198, 198, 198}, {197, 197, 197}, {197, 197, 197}, {197, 197, 197}, {197, 197, 197}, | |
{196, 196, 196}, {196, 196, 196}, {196, 196, 196}, {196, 196, 196}, {195, 195, 195}, | |
{195, 195, 195}, {195, 195, 195}, {195, 195, 195}, {194, 194, 194}, {194, 194, 194}, | |
{194, 194, 194}, {193, 193, 193}, {193, 193, 193}, {193, 193, 193}, {193, 193, 193}, | |
{192, 192, 192}, {192, 192, 192}, {192, 192, 192}, {192, 192, 192}, {191, 191, 191}, | |
{191, 191, 191}, {191, 191, 191}, {191, 191, 191}, {190, 190, 190}, {190, 190, 190}, | |
{190, 190, 190}, {190, 190, 190}, {189, 189, 189}, {189, 189, 189}, {189, 189, 189}, | |
{189, 189, 189}, {188, 188, 188}, {188, 188, 188}, {188, 188, 188}, {188, 188, 188}, | |
{187, 187, 187}, {187, 187, 187}, {187, 187, 187}, {187, 187, 187}, {186, 186, 186}, | |
{186, 186, 186}, {186, 186, 186}, {186, 186, 186}, {185, 185, 185}, {185, 185, 185}, | |
{185, 185, 185}, {185, 185, 185}, {184, 184, 184}, {184, 184, 184}, {184, 184, 184}, | |
{184, 184, 184}, {183, 183, 183}, {183, 183, 183}, {183, 183, 183}, {183, 183, 183}, | |
{182, 182, 182}, {182, 182, 182}, {182, 182, 182}, {181, 181, 181}, {181, 181, 181}, | |
{181, 181, 181}, {181, 181, 181}, {180, 180, 180}, {180, 180, 180}, {180, 180, 180}, | |
{180, 180, 180}, {179, 179, 179}, {179, 179, 179}, {179, 179, 179}, {179, 179, 179}, | |
{178, 178, 178}, {178, 178, 178}, {178, 178, 178}, {178, 178, 178}, {177, 177, 177}, | |
{177, 177, 177}, {177, 177, 177}, {177, 177, 177}, {176, 176, 176}, {176, 176, 176}, | |
{176, 176, 176}, {176, 176, 176}, {175, 175, 175}, {175, 175, 175}, {175, 175, 175}, | |
{175, 175, 175}, {174, 174, 174}, {174, 174, 174}, {174, 174, 174}, {174, 174, 174}, | |
{173, 173, 173}, {173, 173, 173}, {173, 173, 173}, {173, 173, 173}, {172, 172, 172}, | |
{172, 172, 172}, {172, 172, 172}, {172, 172, 172}, {171, 171, 171}, {171, 171, 171}, | |
{171, 171, 171}, {171, 171, 171}, {170, 170, 170}, {170, 170, 170}, {170, 170, 170}, | |
{169, 169, 169}, {169, 169, 169}, {169, 169, 169}, {169, 169, 169}, {168, 168, 168}, | |
{168, 168, 168}, {168, 168, 168}, {168, 168, 168}, {167, 167, 167}, {167, 167, 167}, | |
{167, 167, 167}, {167, 167, 167}, {166, 166, 166}, {166, 166, 166}, {166, 166, 166}, | |
{166, 166, 166}, {165, 165, 165}, {165, 165, 165}, {165, 165, 165}, {165, 165, 165}, | |
{164, 164, 164}, {164, 164, 164}, {164, 164, 164}, {164, 164, 164}, {163, 163, 163}, | |
{163, 163, 163}, {163, 163, 163}, {163, 163, 163}, {162, 162, 162}, {162, 162, 162}, | |
{162, 162, 162}, {162, 162, 162}, {161, 161, 161}, {161, 161, 161}, {161, 161, 161}, | |
{161, 161, 161}, {160, 160, 160}, {160, 160, 160}, {160, 160, 160}, {160, 160, 160}, | |
{159, 159, 159}, {159, 159, 159}, {159, 159, 159}, {159, 159, 159}, {158, 158, 158}, | |
{158, 158, 158}, {158, 158, 158}, {157, 157, 157}, {157, 157, 157}, {157, 157, 157}, | |
{157, 157, 157}, {156, 156, 156}, {156, 156, 156}, {156, 156, 156}, {156, 156, 156}, | |
{155, 155, 155}, {155, 155, 155}, {155, 155, 155}, {155, 155, 155}, {154, 154, 154}, | |
{154, 154, 154}, {154, 154, 154}, {154, 154, 154}, {153, 153, 153}, {153, 153, 153}, | |
{153, 153, 153}, {153, 153, 153}, {152, 152, 152}, {152, 152, 152}, {152, 152, 152}, | |
{152, 152, 152}, {151, 151, 151}, {151, 151, 151}, {151, 151, 151}, {151, 151, 151}, | |
{150, 150, 150}, {150, 150, 150}, {150, 150, 150}, {150, 150, 150}, {149, 149, 149}, | |
{149, 149, 149}, {149, 149, 149}, {149, 149, 149}, {148, 148, 148}, {148, 148, 148}, | |
{148, 148, 148}, {148, 148, 148}, {147, 147, 147}, {147, 147, 147}, {147, 147, 147}, | |
{147, 147, 147}, {146, 146, 146}, {146, 146, 146}, {146, 146, 146}, {145, 145, 145}, | |
{145, 145, 145}, {145, 145, 145}, {145, 145, 145}, {144, 144, 144}, {144, 144, 144}, | |
{144, 144, 144}, {144, 144, 144}, {143, 143, 143}, {143, 143, 143}, {143, 143, 143}, | |
{143, 143, 143}, {142, 142, 142}, {142, 142, 142}, {142, 142, 142}, {142, 142, 142}, | |
{141, 141, 141}, {141, 141, 141}, {141, 141, 141}, {141, 141, 141}, {140, 140, 140}, | |
{140, 140, 140}, {140, 140, 140}, {140, 140, 140}, {139, 139, 139}, {139, 139, 139}, | |
{139, 139, 139}, {139, 139, 139}, {138, 138, 138}, {138, 138, 138}, {138, 138, 138}, | |
{138, 138, 138}, {137, 137, 137}, {137, 137, 137}, {137, 137, 137}, {137, 137, 137}, | |
{136, 136, 136}, {136, 136, 136}, {136, 136, 136}, {136, 136, 136}, {135, 135, 135}, | |
{135, 135, 135}, {135, 135, 135}, {135, 135, 135}, {134, 134, 134}, {134, 134, 134}, | |
{134, 134, 134}, {133, 133, 133}, {133, 133, 133}, {133, 133, 133}, {133, 133, 133}, | |
{132, 132, 132}, {132, 132, 132}, {132, 132, 132}, {132, 132, 132}, {131, 131, 131}, | |
{131, 131, 131}, {131, 131, 131}, {131, 131, 131}, {130, 130, 130}, {130, 130, 130}, | |
{130, 130, 130}, {130, 130, 130}, {129, 129, 129}, {129, 129, 129}, {129, 129, 129}, | |
{129, 129, 129}, {128, 128, 128}, {128, 128, 128}, {128, 128, 128}, {128, 128, 128}, | |
{127, 127, 127}, {127, 127, 127}, {127, 127, 127}, {127, 127, 127}, {126, 126, 126}, | |
{126, 126, 126}, {126, 126, 126}, {126, 126, 126}, {125, 125, 125}, {125, 125, 125}, | |
{125, 125, 125}, {125, 125, 125}, {124, 124, 124}, {124, 124, 124}, {124, 124, 124}, | |
{124, 124, 124}, {123, 123, 123}, {123, 123, 123}, {123, 123, 123}, {123, 123, 123}, | |
{122, 122, 122}, {122, 122, 122}, {122, 122, 122}, {122, 122, 122}, {121, 121, 121}, | |
{121, 121, 121}, {121, 121, 121}, {120, 120, 120}, {120, 120, 120}, {120, 120, 120}, | |
{120, 120, 120}, {119, 119, 119}, {119, 119, 119}, {119, 119, 119}, {119, 119, 119}, | |
{118, 118, 118}, {118, 118, 118}, {118, 118, 118}, {118, 118, 118}, {117, 117, 117}, | |
{117, 117, 117}, {117, 117, 117}, {117, 117, 117}, {116, 116, 116}, {116, 116, 116}, | |
{116, 116, 116}, {116, 116, 116}, {115, 115, 115}, {115, 115, 115}, {115, 115, 115}, | |
{115, 115, 115}, {114, 114, 114}, {114, 114, 114}, {114, 114, 114}, {114, 114, 114}, | |
{113, 113, 113}, {113, 113, 113}, {113, 113, 113}, {113, 113, 113}, {112, 112, 112}, | |
{112, 112, 112}, {112, 112, 112}, {112, 112, 112}, {111, 111, 111}, {111, 111, 111}, | |
{111, 111, 111}, {111, 111, 111}, {110, 110, 110}, {110, 110, 110}, {110, 110, 110}, | |
{110, 110, 110}, {109, 109, 109}, {109, 109, 109}, {109, 109, 109}, {108, 108, 108}, | |
{108, 108, 108}, {108, 108, 108}, {108, 108, 108}, {107, 107, 107}, {107, 107, 107}, | |
{107, 107, 107}, {107, 107, 107}, {106, 106, 106}, {106, 106, 106}, {106, 106, 106}, | |
{106, 106, 106}, {105, 105, 105}, {105, 105, 105}, {105, 105, 105}, {105, 105, 105}, | |
{104, 104, 104}, {104, 104, 104}, {104, 104, 104}, {104, 104, 104}, {103, 103, 103}, | |
{103, 103, 103}, {103, 103, 103}, {103, 103, 103}, {102, 102, 102}, {102, 102, 102}, | |
{102, 102, 102}, {102, 102, 102}, {101, 101, 101}, {101, 101, 101}, {101, 101, 101}, | |
{101, 101, 101}, {100, 100, 100}, {100, 100, 100}, {100, 100, 100}, {100, 100, 100}, | |
{ 99, 99, 99}, { 99, 99, 99}, { 99, 99, 99}, { 99, 99, 99}, { 98, 98, 98}, | |
{ 98, 98, 98}, { 98, 98, 98}, { 98, 98, 98}, { 97, 97, 97}, { 97, 97, 97}, | |
{ 97, 97, 97}, { 96, 96, 96}, { 96, 96, 96}, { 96, 96, 96}, { 96, 96, 96}, | |
{ 95, 95, 95}, { 95, 95, 95}, { 95, 95, 95}, { 95, 95, 95}, { 94, 94, 94}, | |
{ 94, 94, 94}, { 94, 94, 94}, { 94, 94, 94}, { 93, 93, 93}, { 93, 93, 93}, | |
{ 93, 93, 93}, { 93, 93, 93}, { 92, 92, 92}, { 92, 92, 92}, { 92, 92, 92}, | |
{ 92, 92, 92}, { 91, 91, 91}, { 91, 91, 91}, { 91, 91, 91}, { 91, 91, 91}, | |
{ 90, 90, 90}, { 90, 90, 90}, { 90, 90, 90}, { 90, 90, 90}, { 89, 89, 89}, | |
{ 89, 89, 89}, { 89, 89, 89}, { 89, 89, 89}, { 88, 88, 88}, { 88, 88, 88}, | |
{ 88, 88, 88}, { 88, 88, 88}, { 87, 87, 87}, { 87, 87, 87}, { 87, 87, 87}, | |
{ 87, 87, 87}, { 86, 86, 86}, { 86, 86, 86}, { 86, 86, 86}, { 86, 86, 86}, | |
{ 85, 85, 85}, { 85, 85, 85}, { 85, 85, 85}, { 84, 84, 84}, { 84, 84, 84}, | |
{ 84, 84, 84}, { 84, 84, 84}, { 83, 83, 83}, { 83, 83, 83}, { 83, 83, 83}, | |
{ 83, 83, 83}, { 82, 82, 82}, { 82, 82, 82}, { 82, 82, 82}, { 82, 82, 82}, | |
{ 81, 81, 81}, { 81, 81, 81}, { 81, 81, 81}, { 81, 81, 81}, { 80, 80, 80}, | |
{ 80, 80, 80}, { 80, 80, 80}, { 80, 80, 80}, { 79, 79, 79}, { 79, 79, 79}, | |
{ 79, 79, 79}, { 79, 79, 79}, { 78, 78, 78}, { 78, 78, 78}, { 78, 78, 78}, | |
{ 78, 78, 78}, { 77, 77, 77}, { 77, 77, 77}, { 77, 77, 77}, { 77, 77, 77}, | |
{ 76, 76, 76}, { 76, 76, 76}, { 76, 76, 76}, { 76, 76, 76}, { 75, 75, 75}, | |
{ 75, 75, 75}, { 75, 75, 75}, { 75, 75, 75}, { 74, 74, 74}, { 74, 74, 74}, | |
{ 74, 74, 74}, { 74, 74, 74}, { 73, 73, 73}, { 73, 73, 73}, { 73, 73, 73}, | |
{ 72, 72, 72}, { 72, 72, 72}, { 72, 72, 72}, { 72, 72, 72}, { 71, 71, 71}, | |
{ 71, 71, 71}, { 71, 71, 71}, { 71, 71, 71}, { 70, 70, 70}, { 70, 70, 70}, | |
{ 70, 70, 70}, { 70, 70, 70}, { 69, 69, 69}, { 69, 69, 69}, { 69, 69, 69}, | |
{ 69, 69, 69}, { 68, 68, 68}, { 68, 68, 68}, { 68, 68, 68}, { 68, 68, 68}, | |
{ 67, 67, 67}, { 67, 67, 67}, { 67, 67, 67}, { 67, 67, 67}, { 66, 66, 66}, | |
{ 66, 66, 66}, { 66, 66, 66}, { 66, 66, 66}, { 65, 65, 65}, { 65, 65, 65}, | |
{ 65, 65, 65}, { 65, 65, 65}, { 64, 64, 64}, { 64, 64, 64}, { 64, 64, 64}, | |
{ 64, 64, 64}, { 63, 63, 63}, { 63, 63, 63}, { 63, 63, 63}, { 63, 63, 63}, | |
{ 62, 62, 62}, { 62, 62, 62}, { 62, 62, 62}, { 62, 62, 62}, { 61, 61, 61}, | |
{ 61, 61, 61}, { 61, 61, 61}, { 60, 60, 60}, { 60, 60, 60}, { 60, 60, 60}, | |
{ 60, 60, 60}, { 59, 59, 59}, { 59, 59, 59}, { 59, 59, 59}, { 59, 59, 59}, | |
{ 58, 58, 58}, { 58, 58, 58}, { 58, 58, 58}, { 58, 58, 58}, { 57, 57, 57}, | |
{ 57, 57, 57}, { 57, 57, 57}, { 57, 57, 57}, { 56, 56, 56}, { 56, 56, 56}, | |
{ 56, 56, 56}, { 56, 56, 56}, { 55, 55, 55}, { 55, 55, 55}, { 55, 55, 55}, | |
{ 55, 55, 55}, { 54, 54, 54}, { 54, 54, 54}, { 54, 54, 54}, { 54, 54, 54}, | |
{ 53, 53, 53}, { 53, 53, 53}, { 53, 53, 53}, { 53, 53, 53}, { 52, 52, 52}, | |
{ 52, 52, 52}, { 52, 52, 52}, { 52, 52, 52}, { 51, 51, 51}, { 51, 51, 51}, | |
{ 51, 51, 51}, { 51, 51, 51}, { 50, 50, 50}, { 50, 50, 50}, { 50, 50, 50}, | |
{ 50, 50, 50}, { 49, 49, 49}, { 49, 49, 49}, { 49, 49, 49}, { 48, 48, 48}, | |
{ 48, 48, 48}, { 48, 48, 48}, { 48, 48, 48}, { 47, 47, 47}, { 47, 47, 47}, | |
{ 47, 47, 47}, { 47, 47, 47}, { 46, 46, 46}, { 46, 46, 46}, { 46, 46, 46}, | |
{ 46, 46, 46}, { 45, 45, 45}, { 45, 45, 45}, { 45, 45, 45}, { 45, 45, 45}, | |
{ 44, 44, 44}, { 44, 44, 44}, { 44, 44, 44}, { 44, 44, 44}, { 43, 43, 43}, | |
{ 43, 43, 43}, { 43, 43, 43}, { 43, 43, 43}, { 42, 42, 42}, { 42, 42, 42}, | |
{ 42, 42, 42}, { 42, 42, 42}, { 41, 41, 41}, { 41, 41, 41}, { 41, 41, 41}, | |
{ 41, 41, 41}, { 40, 40, 40}, { 40, 40, 40}, { 40, 40, 40}, { 40, 40, 40}, | |
{ 39, 39, 39}, { 39, 39, 39}, { 39, 39, 39}, { 39, 39, 39}, { 38, 38, 38}, | |
{ 38, 38, 38}, { 38, 38, 38}, { 38, 38, 38}, { 37, 37, 37}, { 37, 37, 37}, | |
{ 37, 37, 37}, { 37, 37, 37}, { 36, 36, 36}, { 36, 36, 36}, { 36, 36, 36}, | |
{ 35, 35, 35}, { 35, 35, 35}, { 35, 35, 35}, { 35, 35, 35}, { 34, 34, 34}, | |
{ 34, 34, 34}, { 34, 34, 34}, { 34, 34, 34}, { 33, 33, 33}, { 33, 33, 33}, | |
{ 33, 33, 33}, { 33, 33, 33}, { 32, 32, 32}, { 32, 32, 32}, { 32, 32, 32}, | |
{ 32, 32, 32}, { 31, 31, 31}, { 31, 31, 31}, { 31, 31, 31}, { 31, 31, 31}, | |
{ 30, 30, 30}, { 30, 30, 30}, { 30, 30, 30}, { 30, 30, 30}, { 29, 29, 29}, | |
{ 29, 29, 29}, { 29, 29, 29}, { 29, 29, 29}, { 28, 28, 28}, { 28, 28, 28}, | |
{ 28, 28, 28}, { 28, 28, 28}, { 27, 27, 27}, { 27, 27, 27}, { 27, 27, 27}, | |
{ 27, 27, 27}, { 26, 26, 26}, { 26, 26, 26}, { 26, 26, 26}, { 26, 26, 26}, | |
{ 25, 25, 25}, { 25, 25, 25}, { 25, 25, 25}, { 25, 25, 25}, { 24, 24, 24}, | |
{ 24, 24, 24}, { 24, 24, 24}, { 23, 23, 23}, { 23, 23, 23}, { 23, 23, 23}, | |
{ 23, 23, 23}, { 22, 22, 22}, { 22, 22, 22}, { 22, 22, 22}, { 22, 22, 22}, | |
{ 21, 21, 21}, { 21, 21, 21}, { 21, 21, 21}, { 21, 21, 21}, { 20, 20, 20}, | |
{ 20, 20, 20}, { 20, 20, 20}, { 20, 20, 20}, { 19, 19, 19}, { 19, 19, 19}, | |
{ 19, 19, 19}, { 19, 19, 19}, { 18, 18, 18}, { 18, 18, 18}, { 18, 18, 18}, | |
{ 18, 18, 18}, { 17, 17, 17}, { 17, 17, 17}, { 17, 17, 17}, { 17, 17, 17}, | |
{ 16, 16, 16}, { 16, 16, 16}, { 16, 16, 16}, { 16, 16, 16}, { 15, 15, 15}, | |
{ 15, 15, 15}, { 15, 15, 15}, { 15, 15, 15}, { 14, 14, 14}, { 14, 14, 14}, | |
{ 14, 14, 14}, { 14, 14, 14}, { 13, 13, 13}, { 13, 13, 13}, { 13, 13, 13}, | |
{ 13, 13, 13}, { 12, 12, 12}, { 12, 12, 12}, { 12, 12, 12}, { 11, 11, 11}, | |
{ 11, 11, 11}, { 11, 11, 11}, { 11, 11, 11}, { 10, 10, 10}, { 10, 10, 10}, | |
{ 10, 10, 10}, { 10, 10, 10}, { 9, 9, 9}, { 9, 9, 9}, { 9, 9, 9}, | |
{ 9, 9, 9}, { 8, 8, 8}, { 8, 8, 8}, { 8, 8, 8}, { 8, 8, 8}, | |
{ 7, 7, 7}, { 7, 7, 7}, { 7, 7, 7}, { 7, 7, 7}, { 6, 6, 6}, | |
{ 6, 6, 6}, { 6, 6, 6}, { 6, 6, 6}, { 5, 5, 5}, { 5, 5, 5}, | |
{ 5, 5, 5}, { 5, 5, 5}, { 4, 4, 4}, { 4, 4, 4}, { 4, 4, 4}, | |
{ 4, 4, 4}, { 3, 3, 3}, { 3, 3, 3}, { 3, 3, 3}, { 3, 3, 3}, | |
{ 2, 2, 2}, { 2, 2, 2}, { 2, 2, 2}, { 2, 2, 2}, { 1, 1, 1}, | |
{ 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, { 0, 0, 0}, { 0, 0, 0} | |
}; | |
const rgb_t hot_colormap[1000] = { | |
{ 11, 0, 0}, { 11, 0, 0}, { 12, 0, 0}, { 13, 0, 0}, { 13, 0, 0}, | |
{ 14, 0, 0}, { 15, 0, 0}, { 15, 0, 0}, { 16, 0, 0}, { 17, 0, 0}, | |
{ 17, 0, 0}, { 18, 0, 0}, { 19, 0, 0}, { 19, 0, 0}, { 20, 0, 0}, | |
{ 21, 0, 0}, { 21, 0, 0}, { 22, 0, 0}, { 23, 0, 0}, { 23, 0, 0}, | |
{ 24, 0, 0}, { 25, 0, 0}, { 25, 0, 0}, { 26, 0, 0}, { 27, 0, 0}, | |
{ 27, 0, 0}, { 28, 0, 0}, { 29, 0, 0}, { 29, 0, 0}, { 30, 0, 0}, | |
{ 31, 0, 0}, { 31, 0, 0}, { 32, 0, 0}, { 33, 0, 0}, { 33, 0, 0}, | |
{ 34, 0, 0}, { 35, 0, 0}, { 35, 0, 0}, { 36, 0, 0}, { 37, 0, 0}, | |
{ 37, 0, 0}, { 38, 0, 0}, { 39, 0, 0}, { 39, 0, 0}, { 40, 0, 0}, | |
{ 41, 0, 0}, { 41, 0, 0}, { 42, 0, 0}, { 43, 0, 0}, { 43, 0, 0}, | |
{ 44, 0, 0}, { 45, 0, 0}, { 45, 0, 0}, { 46, 0, 0}, { 47, 0, 0}, | |
{ 47, 0, 0}, { 48, 0, 0}, { 49, 0, 0}, { 49, 0, 0}, { 50, 0, 0}, | |
{ 51, 0, 0}, { 51, 0, 0}, { 52, 0, 0}, { 53, 0, 0}, { 54, 0, 0}, | |
{ 54, 0, 0}, { 55, 0, 0}, { 56, 0, 0}, { 56, 0, 0}, { 57, 0, 0}, | |
{ 58, 0, 0}, { 58, 0, 0}, { 59, 0, 0}, { 60, 0, 0}, { 60, 0, 0}, | |
{ 61, 0, 0}, { 62, 0, 0}, { 62, 0, 0}, { 63, 0, 0}, { 64, 0, 0}, | |
{ 64, 0, 0}, { 65, 0, 0}, { 66, 0, 0}, { 66, 0, 0}, { 67, 0, 0}, | |
{ 68, 0, 0}, { 68, 0, 0}, { 69, 0, 0}, { 70, 0, 0}, { 70, 0, 0}, | |
{ 71, 0, 0}, { 72, 0, 0}, { 72, 0, 0}, { 73, 0, 0}, { 74, 0, 0}, | |
{ 74, 0, 0}, { 75, 0, 0}, { 76, 0, 0}, { 76, 0, 0}, { 77, 0, 0}, | |
{ 78, 0, 0}, { 78, 0, 0}, { 79, 0, 0}, { 80, 0, 0}, { 80, 0, 0}, | |
{ 81, 0, 0}, { 82, 0, 0}, { 82, 0, 0}, { 83, 0, 0}, { 84, 0, 0}, | |
{ 84, 0, 0}, { 85, 0, 0}, { 86, 0, 0}, { 86, 0, 0}, { 87, 0, 0}, | |
{ 88, 0, 0}, { 88, 0, 0}, { 89, 0, 0}, { 90, 0, 0}, { 90, 0, 0}, | |
{ 91, 0, 0}, { 92, 0, 0}, { 92, 0, 0}, { 93, 0, 0}, { 94, 0, 0}, | |
{ 94, 0, 0}, { 95, 0, 0}, { 96, 0, 0}, { 96, 0, 0}, { 97, 0, 0}, | |
{ 98, 0, 0}, { 98, 0, 0}, { 99, 0, 0}, {100, 0, 0}, {100, 0, 0}, | |
{101, 0, 0}, {102, 0, 0}, {102, 0, 0}, {103, 0, 0}, {104, 0, 0}, | |
{104, 0, 0}, {105, 0, 0}, {106, 0, 0}, {106, 0, 0}, {107, 0, 0}, | |
{108, 0, 0}, {108, 0, 0}, {109, 0, 0}, {110, 0, 0}, {110, 0, 0}, | |
{111, 0, 0}, {112, 0, 0}, {112, 0, 0}, {113, 0, 0}, {114, 0, 0}, | |
{114, 0, 0}, {115, 0, 0}, {116, 0, 0}, {116, 0, 0}, {117, 0, 0}, | |
{118, 0, 0}, {119, 0, 0}, {119, 0, 0}, {120, 0, 0}, {121, 0, 0}, | |
{121, 0, 0}, {122, 0, 0}, {123, 0, 0}, {123, 0, 0}, {124, 0, 0}, | |
{125, 0, 0}, {125, 0, 0}, {126, 0, 0}, {127, 0, 0}, {127, 0, 0}, | |
{128, 0, 0}, {129, 0, 0}, {129, 0, 0}, {130, 0, 0}, {131, 0, 0}, | |
{131, 0, 0}, {132, 0, 0}, {133, 0, 0}, {133, 0, 0}, {134, 0, 0}, | |
{135, 0, 0}, {135, 0, 0}, {136, 0, 0}, {137, 0, 0}, {137, 0, 0}, | |
{138, 0, 0}, {139, 0, 0}, {139, 0, 0}, {140, 0, 0}, {141, 0, 0}, | |
{141, 0, 0}, {142, 0, 0}, {143, 0, 0}, {143, 0, 0}, {144, 0, 0}, | |
{145, 0, 0}, {145, 0, 0}, {146, 0, 0}, {147, 0, 0}, {147, 0, 0}, | |
{148, 0, 0}, {149, 0, 0}, {149, 0, 0}, {150, 0, 0}, {151, 0, 0}, | |
{151, 0, 0}, {152, 0, 0}, {153, 0, 0}, {153, 0, 0}, {154, 0, 0}, | |
{155, 0, 0}, {155, 0, 0}, {156, 0, 0}, {157, 0, 0}, {157, 0, 0}, | |
{158, 0, 0}, {159, 0, 0}, {159, 0, 0}, {160, 0, 0}, {161, 0, 0}, | |
{161, 0, 0}, {162, 0, 0}, {163, 0, 0}, {163, 0, 0}, {164, 0, 0}, | |
{165, 0, 0}, {165, 0, 0}, {166, 0, 0}, {167, 0, 0}, {167, 0, 0}, | |
{168, 0, 0}, {169, 0, 0}, {169, 0, 0}, {170, 0, 0}, {171, 0, 0}, | |
{171, 0, 0}, {172, 0, 0}, {173, 0, 0}, {173, 0, 0}, {174, 0, 0}, | |
{175, 0, 0}, {175, 0, 0}, {176, 0, 0}, {177, 0, 0}, {177, 0, 0}, | |
{178, 0, 0}, {179, 0, 0}, {179, 0, 0}, {180, 0, 0}, {181, 0, 0}, | |
{181, 0, 0}, {182, 0, 0}, {183, 0, 0}, {183, 0, 0}, {184, 0, 0}, | |
{185, 0, 0}, {186, 0, 0}, {186, 0, 0}, {187, 0, 0}, {188, 0, 0}, | |
{188, 0, 0}, {189, 0, 0}, {190, 0, 0}, {190, 0, 0}, {191, 0, 0}, | |
{192, 0, 0}, {192, 0, 0}, {193, 0, 0}, {194, 0, 0}, {194, 0, 0}, | |
{195, 0, 0}, {196, 0, 0}, {196, 0, 0}, {197, 0, 0}, {198, 0, 0}, | |
{198, 0, 0}, {199, 0, 0}, {200, 0, 0}, {200, 0, 0}, {201, 0, 0}, | |
{202, 0, 0}, {202, 0, 0}, {203, 0, 0}, {204, 0, 0}, {204, 0, 0}, | |
{205, 0, 0}, {206, 0, 0}, {206, 0, 0}, {207, 0, 0}, {208, 0, 0}, | |
{208, 0, 0}, {209, 0, 0}, {210, 0, 0}, {210, 0, 0}, {211, 0, 0}, | |
{212, 0, 0}, {212, 0, 0}, {213, 0, 0}, {214, 0, 0}, {214, 0, 0}, | |
{215, 0, 0}, {216, 0, 0}, {216, 0, 0}, {217, 0, 0}, {218, 0, 0}, | |
{218, 0, 0}, {219, 0, 0}, {220, 0, 0}, {220, 0, 0}, {221, 0, 0}, | |
{222, 0, 0}, {222, 0, 0}, {223, 0, 0}, {224, 0, 0}, {224, 0, 0}, | |
{225, 0, 0}, {226, 0, 0}, {226, 0, 0}, {227, 0, 0}, {228, 0, 0}, | |
{228, 0, 0}, {229, 0, 0}, {230, 0, 0}, {230, 0, 0}, {231, 0, 0}, | |
{232, 0, 0}, {232, 0, 0}, {233, 0, 0}, {234, 0, 0}, {234, 0, 0}, | |
{235, 0, 0}, {236, 0, 0}, {236, 0, 0}, {237, 0, 0}, {238, 0, 0}, | |
{238, 0, 0}, {239, 0, 0}, {240, 0, 0}, {240, 0, 0}, {241, 0, 0}, | |
{242, 0, 0}, {242, 0, 0}, {243, 0, 0}, {244, 0, 0}, {244, 0, 0}, | |
{245, 0, 0}, {246, 0, 0}, {246, 0, 0}, {247, 0, 0}, {248, 0, 0}, | |
{248, 0, 0}, {249, 0, 0}, {250, 0, 0}, {251, 0, 0}, {251, 0, 0}, | |
{252, 0, 0}, {253, 0, 0}, {253, 0, 0}, {254, 0, 0}, {255, 0, 0}, | |
{255, 0, 0}, {255, 1, 0}, {255, 2, 0}, {255, 2, 0}, {255, 3, 0}, | |
{255, 4, 0}, {255, 4, 0}, {255, 5, 0}, {255, 6, 0}, {255, 6, 0}, | |
{255, 7, 0}, {255, 8, 0}, {255, 8, 0}, {255, 9, 0}, {255, 10, 0}, | |
{255, 10, 0}, {255, 11, 0}, {255, 12, 0}, {255, 12, 0}, {255, 13, 0}, | |
{255, 14, 0}, {255, 14, 0}, {255, 15, 0}, {255, 16, 0}, {255, 16, 0}, | |
{255, 17, 0}, {255, 18, 0}, {255, 18, 0}, {255, 19, 0}, {255, 20, 0}, | |
{255, 20, 0}, {255, 21, 0}, {255, 22, 0}, {255, 22, 0}, {255, 23, 0}, | |
{255, 24, 0}, {255, 24, 0}, {255, 25, 0}, {255, 26, 0}, {255, 26, 0}, | |
{255, 27, 0}, {255, 28, 0}, {255, 28, 0}, {255, 29, 0}, {255, 30, 0}, | |
{255, 30, 0}, {255, 31, 0}, {255, 32, 0}, {255, 32, 0}, {255, 33, 0}, | |
{255, 34, 0}, {255, 34, 0}, {255, 35, 0}, {255, 36, 0}, {255, 36, 0}, | |
{255, 37, 0}, {255, 38, 0}, {255, 38, 0}, {255, 39, 0}, {255, 40, 0}, | |
{255, 40, 0}, {255, 41, 0}, {255, 42, 0}, {255, 42, 0}, {255, 43, 0}, | |
{255, 44, 0}, {255, 44, 0}, {255, 45, 0}, {255, 46, 0}, {255, 46, 0}, | |
{255, 47, 0}, {255, 48, 0}, {255, 48, 0}, {255, 49, 0}, {255, 50, 0}, | |
{255, 50, 0}, {255, 51, 0}, {255, 52, 0}, {255, 52, 0}, {255, 53, 0}, | |
{255, 54, 0}, {255, 54, 0}, {255, 55, 0}, {255, 56, 0}, {255, 56, 0}, | |
{255, 57, 0}, {255, 58, 0}, {255, 58, 0}, {255, 59, 0}, {255, 60, 0}, | |
{255, 60, 0}, {255, 61, 0}, {255, 62, 0}, {255, 63, 0}, {255, 63, 0}, | |
{255, 64, 0}, {255, 65, 0}, {255, 65, 0}, {255, 66, 0}, {255, 67, 0}, | |
{255, 67, 0}, {255, 68, 0}, {255, 69, 0}, {255, 69, 0}, {255, 70, 0}, | |
{255, 71, 0}, {255, 71, 0}, {255, 72, 0}, {255, 73, 0}, {255, 73, 0}, | |
{255, 74, 0}, {255, 75, 0}, {255, 75, 0}, {255, 76, 0}, {255, 77, 0}, | |
{255, 77, 0}, {255, 78, 0}, {255, 79, 0}, {255, 79, 0}, {255, 80, 0}, | |
{255, 81, 0}, {255, 81, 0}, {255, 82, 0}, {255, 83, 0}, {255, 83, 0}, | |
{255, 84, 0}, {255, 85, 0}, {255, 85, 0}, {255, 86, 0}, {255, 87, 0}, | |
{255, 87, 0}, {255, 88, 0}, {255, 89, 0}, {255, 89, 0}, {255, 90, 0}, | |
{255, 91, 0}, {255, 91, 0}, {255, 92, 0}, {255, 93, 0}, {255, 93, 0}, | |
{255, 94, 0}, {255, 95, 0}, {255, 95, 0}, {255, 96, 0}, {255, 97, 0}, | |
{255, 97, 0}, {255, 98, 0}, {255, 99, 0}, {255, 99, 0}, {255, 100, 0}, | |
{255, 101, 0}, {255, 101, 0}, {255, 102, 0}, {255, 103, 0}, {255, 103, 0}, | |
{255, 104, 0}, {255, 105, 0}, {255, 105, 0}, {255, 106, 0}, {255, 107, 0}, | |
{255, 107, 0}, {255, 108, 0}, {255, 109, 0}, {255, 109, 0}, {255, 110, 0}, | |
{255, 111, 0}, {255, 111, 0}, {255, 112, 0}, {255, 113, 0}, {255, 113, 0}, | |
{255, 114, 0}, {255, 115, 0}, {255, 115, 0}, {255, 116, 0}, {255, 117, 0}, | |
{255, 117, 0}, {255, 118, 0}, {255, 119, 0}, {255, 119, 0}, {255, 120, 0}, | |
{255, 121, 0}, {255, 121, 0}, {255, 122, 0}, {255, 123, 0}, {255, 123, 0}, | |
{255, 124, 0}, {255, 125, 0}, {255, 125, 0}, {255, 126, 0}, {255, 127, 0}, | |
{255, 128, 0}, {255, 128, 0}, {255, 129, 0}, {255, 130, 0}, {255, 130, 0}, | |
{255, 131, 0}, {255, 132, 0}, {255, 132, 0}, {255, 133, 0}, {255, 134, 0}, | |
{255, 134, 0}, {255, 135, 0}, {255, 136, 0}, {255, 136, 0}, {255, 137, 0}, | |
{255, 138, 0}, {255, 138, 0}, {255, 139, 0}, {255, 140, 0}, {255, 140, 0}, | |
{255, 141, 0}, {255, 142, 0}, {255, 142, 0}, {255, 143, 0}, {255, 144, 0}, | |
{255, 144, 0}, {255, 145, 0}, {255, 146, 0}, {255, 146, 0}, {255, 147, 0}, | |
{255, 148, 0}, {255, 148, 0}, {255, 149, 0}, {255, 150, 0}, {255, 150, 0}, | |
{255, 151, 0}, {255, 152, 0}, {255, 152, 0}, {255, 153, 0}, {255, 154, 0}, | |
{255, 154, 0}, {255, 155, 0}, {255, 156, 0}, {255, 156, 0}, {255, 157, 0}, | |
{255, 158, 0}, {255, 158, 0}, {255, 159, 0}, {255, 160, 0}, {255, 160, 0}, | |
{255, 161, 0}, {255, 162, 0}, {255, 162, 0}, {255, 163, 0}, {255, 164, 0}, | |
{255, 164, 0}, {255, 165, 0}, {255, 166, 0}, {255, 166, 0}, {255, 167, 0}, | |
{255, 168, 0}, {255, 168, 0}, {255, 169, 0}, {255, 170, 0}, {255, 170, 0}, | |
{255, 171, 0}, {255, 172, 0}, {255, 172, 0}, {255, 173, 0}, {255, 174, 0}, | |
{255, 174, 0}, {255, 175, 0}, {255, 176, 0}, {255, 176, 0}, {255, 177, 0}, | |
{255, 178, 0}, {255, 178, 0}, {255, 179, 0}, {255, 180, 0}, {255, 180, 0}, | |
{255, 181, 0}, {255, 182, 0}, {255, 182, 0}, {255, 183, 0}, {255, 184, 0}, | |
{255, 184, 0}, {255, 185, 0}, {255, 186, 0}, {255, 186, 0}, {255, 187, 0}, | |
{255, 188, 0}, {255, 188, 0}, {255, 189, 0}, {255, 190, 0}, {255, 190, 0}, | |
{255, 191, 0}, {255, 192, 0}, {255, 192, 0}, {255, 193, 0}, {255, 194, 0}, | |
{255, 195, 0}, {255, 195, 0}, {255, 196, 0}, {255, 197, 0}, {255, 197, 0}, | |
{255, 198, 0}, {255, 199, 0}, {255, 199, 0}, {255, 200, 0}, {255, 201, 0}, | |
{255, 201, 0}, {255, 202, 0}, {255, 203, 0}, {255, 203, 0}, {255, 204, 0}, | |
{255, 205, 0}, {255, 205, 0}, {255, 206, 0}, {255, 207, 0}, {255, 207, 0}, | |
{255, 208, 0}, {255, 209, 0}, {255, 209, 0}, {255, 210, 0}, {255, 211, 0}, | |
{255, 211, 0}, {255, 212, 0}, {255, 213, 0}, {255, 213, 0}, {255, 214, 0}, | |
{255, 215, 0}, {255, 215, 0}, {255, 216, 0}, {255, 217, 0}, {255, 217, 0}, | |
{255, 218, 0}, {255, 219, 0}, {255, 219, 0}, {255, 220, 0}, {255, 221, 0}, | |
{255, 221, 0}, {255, 222, 0}, {255, 223, 0}, {255, 223, 0}, {255, 224, 0}, | |
{255, 225, 0}, {255, 225, 0}, {255, 226, 0}, {255, 227, 0}, {255, 227, 0}, | |
{255, 228, 0}, {255, 229, 0}, {255, 229, 0}, {255, 230, 0}, {255, 231, 0}, | |
{255, 231, 0}, {255, 232, 0}, {255, 233, 0}, {255, 233, 0}, {255, 234, 0}, | |
{255, 235, 0}, {255, 235, 0}, {255, 236, 0}, {255, 237, 0}, {255, 237, 0}, | |
{255, 238, 0}, {255, 239, 0}, {255, 239, 0}, {255, 240, 0}, {255, 241, 0}, | |
{255, 241, 0}, {255, 242, 0}, {255, 243, 0}, {255, 243, 0}, {255, 244, 0}, | |
{255, 245, 0}, {255, 245, 0}, {255, 246, 0}, {255, 247, 0}, {255, 247, 0}, | |
{255, 248, 0}, {255, 249, 0}, {255, 249, 0}, {255, 250, 0}, {255, 251, 0}, | |
{255, 251, 0}, {255, 252, 0}, {255, 253, 0}, {255, 253, 0}, {255, 254, 0}, | |
{255, 255, 0}, {255, 255, 1}, {255, 255, 2}, {255, 255, 3}, {255, 255, 4}, | |
{255, 255, 5}, {255, 255, 6}, {255, 255, 7}, {255, 255, 8}, {255, 255, 9}, | |
{255, 255, 10}, {255, 255, 11}, {255, 255, 12}, {255, 255, 13}, {255, 255, 14}, | |
{255, 255, 15}, {255, 255, 16}, {255, 255, 17}, {255, 255, 18}, {255, 255, 19}, | |
{255, 255, 20}, {255, 255, 21}, {255, 255, 22}, {255, 255, 23}, {255, 255, 24}, | |
{255, 255, 25}, {255, 255, 26}, {255, 255, 27}, {255, 255, 28}, {255, 255, 29}, | |
{255, 255, 30}, {255, 255, 31}, {255, 255, 32}, {255, 255, 33}, {255, 255, 34}, | |
{255, 255, 35}, {255, 255, 36}, {255, 255, 37}, {255, 255, 38}, {255, 255, 39}, | |
{255, 255, 40}, {255, 255, 41}, {255, 255, 42}, {255, 255, 43}, {255, 255, 44}, | |
{255, 255, 45}, {255, 255, 46}, {255, 255, 47}, {255, 255, 48}, {255, 255, 49}, | |
{255, 255, 50}, {255, 255, 51}, {255, 255, 52}, {255, 255, 53}, {255, 255, 54}, | |
{255, 255, 55}, {255, 255, 56}, {255, 255, 57}, {255, 255, 58}, {255, 255, 59}, | |
{255, 255, 60}, {255, 255, 61}, {255, 255, 62}, {255, 255, 63}, {255, 255, 64}, | |
{255, 255, 65}, {255, 255, 66}, {255, 255, 67}, {255, 255, 68}, {255, 255, 69}, | |
{255, 255, 70}, {255, 255, 71}, {255, 255, 72}, {255, 255, 73}, {255, 255, 74}, | |
{255, 255, 75}, {255, 255, 76}, {255, 255, 77}, {255, 255, 78}, {255, 255, 79}, | |
{255, 255, 80}, {255, 255, 81}, {255, 255, 82}, {255, 255, 83}, {255, 255, 84}, | |
{255, 255, 85}, {255, 255, 86}, {255, 255, 87}, {255, 255, 88}, {255, 255, 89}, | |
{255, 255, 90}, {255, 255, 91}, {255, 255, 92}, {255, 255, 93}, {255, 255, 94}, | |
{255, 255, 95}, {255, 255, 96}, {255, 255, 97}, {255, 255, 98}, {255, 255, 99}, | |
{255, 255, 100}, {255, 255, 101}, {255, 255, 102}, {255, 255, 103}, {255, 255, 104}, | |
{255, 255, 105}, {255, 255, 106}, {255, 255, 107}, {255, 255, 108}, {255, 255, 109}, | |
{255, 255, 110}, {255, 255, 111}, {255, 255, 112}, {255, 255, 113}, {255, 255, 114}, | |
{255, 255, 115}, {255, 255, 116}, {255, 255, 117}, {255, 255, 118}, {255, 255, 119}, | |
{255, 255, 120}, {255, 255, 121}, {255, 255, 122}, {255, 255, 123}, {255, 255, 124}, | |
{255, 255, 125}, {255, 255, 126}, {255, 255, 127}, {255, 255, 128}, {255, 255, 129}, | |
{255, 255, 130}, {255, 255, 131}, {255, 255, 132}, {255, 255, 133}, {255, 255, 134}, | |
{255, 255, 135}, {255, 255, 136}, {255, 255, 137}, {255, 255, 138}, {255, 255, 139}, | |
{255, 255, 140}, {255, 255, 141}, {255, 255, 142}, {255, 255, 143}, {255, 255, 144}, | |
{255, 255, 145}, {255, 255, 146}, {255, 255, 147}, {255, 255, 148}, {255, 255, 149}, | |
{255, 255, 150}, {255, 255, 151}, {255, 255, 152}, {255, 255, 153}, {255, 255, 154}, | |
{255, 255, 155}, {255, 255, 157}, {255, 255, 158}, {255, 255, 159}, {255, 255, 160}, | |
{255, 255, 161}, {255, 255, 162}, {255, 255, 163}, {255, 255, 164}, {255, 255, 165}, | |
{255, 255, 166}, {255, 255, 167}, {255, 255, 168}, {255, 255, 169}, {255, 255, 170}, | |
{255, 255, 171}, {255, 255, 172}, {255, 255, 173}, {255, 255, 174}, {255, 255, 175}, | |
{255, 255, 176}, {255, 255, 177}, {255, 255, 178}, {255, 255, 179}, {255, 255, 180}, | |
{255, 255, 181}, {255, 255, 182}, {255, 255, 183}, {255, 255, 184}, {255, 255, 185}, | |
{255, 255, 186}, {255, 255, 187}, {255, 255, 188}, {255, 255, 189}, {255, 255, 190}, | |
{255, 255, 191}, {255, 255, 192}, {255, 255, 193}, {255, 255, 194}, {255, 255, 195}, | |
{255, 255, 196}, {255, 255, 197}, {255, 255, 198}, {255, 255, 199}, {255, 255, 200}, | |
{255, 255, 201}, {255, 255, 202}, {255, 255, 203}, {255, 255, 204}, {255, 255, 205}, | |
{255, 255, 206}, {255, 255, 207}, {255, 255, 208}, {255, 255, 209}, {255, 255, 210}, | |
{255, 255, 211}, {255, 255, 212}, {255, 255, 213}, {255, 255, 214}, {255, 255, 215}, | |
{255, 255, 216}, {255, 255, 217}, {255, 255, 218}, {255, 255, 219}, {255, 255, 220}, | |
{255, 255, 221}, {255, 255, 222}, {255, 255, 223}, {255, 255, 224}, {255, 255, 225}, | |
{255, 255, 226}, {255, 255, 227}, {255, 255, 228}, {255, 255, 229}, {255, 255, 230}, | |
{255, 255, 231}, {255, 255, 232}, {255, 255, 233}, {255, 255, 234}, {255, 255, 235}, | |
{255, 255, 236}, {255, 255, 237}, {255, 255, 238}, {255, 255, 239}, {255, 255, 240}, | |
{255, 255, 241}, {255, 255, 242}, {255, 255, 243}, {255, 255, 244}, {255, 255, 245}, | |
{255, 255, 246}, {255, 255, 247}, {255, 255, 248}, {255, 255, 249}, {255, 255, 250}, | |
{255, 255, 251}, {255, 255, 252}, {255, 255, 253}, {255, 255, 254}, {255, 255, 255} | |
}; | |
const rgb_t hsv_colormap[1000] = { | |
{255, 0, 0}, {255, 2, 0}, {255, 3, 0}, {255, 5, 0}, {255, 6, 0}, | |
{255, 8, 0}, {255, 9, 0}, {255, 11, 0}, {255, 12, 0}, {255, 14, 0}, | |
{255, 15, 0}, {255, 17, 0}, {255, 18, 0}, {255, 20, 0}, {255, 21, 0}, | |
{255, 23, 0}, {255, 24, 0}, {255, 26, 0}, {255, 27, 0}, {255, 29, 0}, | |
{255, 30, 0}, {255, 32, 0}, {255, 33, 0}, {255, 35, 0}, {255, 36, 0}, | |
{255, 38, 0}, {255, 39, 0}, {255, 41, 0}, {255, 42, 0}, {255, 44, 0}, | |
{255, 45, 0}, {255, 47, 0}, {255, 48, 0}, {255, 50, 0}, {255, 51, 0}, | |
{255, 53, 0}, {255, 54, 0}, {255, 56, 0}, {255, 57, 0}, {255, 59, 0}, | |
{255, 60, 0}, {255, 62, 0}, {255, 63, 0}, {255, 65, 0}, {255, 66, 0}, | |
{255, 68, 0}, {255, 69, 0}, {255, 71, 0}, {255, 72, 0}, {255, 74, 0}, | |
{255, 75, 0}, {255, 77, 0}, {255, 78, 0}, {255, 80, 0}, {255, 81, 0}, | |
{255, 83, 0}, {255, 84, 0}, {255, 86, 0}, {255, 87, 0}, {255, 89, 0}, | |
{255, 90, 0}, {255, 92, 0}, {255, 93, 0}, {255, 95, 0}, {255, 96, 0}, | |
{255, 98, 0}, {255, 100, 0}, {255, 101, 0}, {255, 103, 0}, {255, 104, 0}, | |
{255, 106, 0}, {255, 107, 0}, {255, 109, 0}, {255, 110, 0}, {255, 112, 0}, | |
{255, 113, 0}, {255, 115, 0}, {255, 116, 0}, {255, 118, 0}, {255, 119, 0}, | |
{255, 121, 0}, {255, 122, 0}, {255, 124, 0}, {255, 125, 0}, {255, 127, 0}, | |
{255, 128, 0}, {255, 130, 0}, {255, 131, 0}, {255, 133, 0}, {255, 134, 0}, | |
{255, 136, 0}, {255, 137, 0}, {255, 139, 0}, {255, 140, 0}, {255, 142, 0}, | |
{255, 143, 0}, {255, 145, 0}, {255, 146, 0}, {255, 148, 0}, {255, 149, 0}, | |
{255, 151, 0}, {255, 152, 0}, {255, 154, 0}, {255, 155, 0}, {255, 157, 0}, | |
{255, 158, 0}, {255, 160, 0}, {255, 161, 0}, {255, 163, 0}, {255, 164, 0}, | |
{255, 166, 0}, {255, 167, 0}, {255, 169, 0}, {255, 170, 0}, {255, 172, 0}, | |
{255, 173, 0}, {255, 175, 0}, {255, 176, 0}, {255, 178, 0}, {255, 179, 0}, | |
{255, 181, 0}, {255, 182, 0}, {255, 184, 0}, {255, 185, 0}, {255, 187, 0}, | |
{255, 188, 0}, {255, 190, 0}, {255, 191, 0}, {255, 193, 0}, {255, 194, 0}, | |
{255, 196, 0}, {255, 197, 0}, {255, 199, 0}, {255, 201, 0}, {255, 202, 0}, | |
{255, 204, 0}, {255, 205, 0}, {255, 207, 0}, {255, 208, 0}, {255, 210, 0}, | |
{255, 211, 0}, {255, 213, 0}, {255, 214, 0}, {255, 216, 0}, {255, 217, 0}, | |
{255, 219, 0}, {255, 220, 0}, {255, 222, 0}, {255, 223, 0}, {255, 225, 0}, | |
{255, 226, 0}, {255, 228, 0}, {255, 229, 0}, {255, 231, 0}, {255, 232, 0}, | |
{255, 234, 0}, {255, 235, 0}, {255, 237, 0}, {255, 238, 0}, {255, 239, 0}, | |
{254, 240, 0}, {254, 242, 0}, {253, 243, 0}, {253, 244, 0}, {252, 245, 0}, | |
{252, 246, 0}, {251, 247, 0}, {251, 248, 0}, {250, 249, 0}, {250, 250, 0}, | |
{249, 251, 0}, {249, 252, 0}, {248, 253, 0}, {248, 254, 0}, {247, 255, 0}, | |
{246, 255, 0}, {245, 255, 0}, {243, 255, 0}, {242, 255, 0}, {240, 255, 0}, | |
{239, 255, 0}, {237, 255, 0}, {236, 255, 0}, {234, 255, 0}, {233, 255, 0}, | |
{231, 255, 0}, {230, 255, 0}, {228, 255, 0}, {227, 255, 0}, {225, 255, 0}, | |
{224, 255, 0}, {222, 255, 0}, {221, 255, 0}, {219, 255, 0}, {218, 255, 0}, | |
{216, 255, 0}, {215, 255, 0}, {213, 255, 0}, {211, 255, 0}, {210, 255, 0}, | |
{208, 255, 0}, {207, 255, 0}, {205, 255, 0}, {204, 255, 0}, {202, 255, 0}, | |
{201, 255, 0}, {199, 255, 0}, {198, 255, 0}, {196, 255, 0}, {195, 255, 0}, | |
{193, 255, 0}, {192, 255, 0}, {190, 255, 0}, {189, 255, 0}, {187, 255, 0}, | |
{186, 255, 0}, {184, 255, 0}, {183, 255, 0}, {181, 255, 0}, {180, 255, 0}, | |
{178, 255, 0}, {177, 255, 0}, {175, 255, 0}, {174, 255, 0}, {172, 255, 0}, | |
{171, 255, 0}, {169, 255, 0}, {168, 255, 0}, {166, 255, 0}, {165, 255, 0}, | |
{163, 255, 0}, {162, 255, 0}, {160, 255, 0}, {159, 255, 0}, {157, 255, 0}, | |
{156, 255, 0}, {154, 255, 0}, {153, 255, 0}, {151, 255, 0}, {150, 255, 0}, | |
{148, 255, 0}, {147, 255, 0}, {145, 255, 0}, {144, 255, 0}, {142, 255, 0}, | |
{141, 255, 0}, {139, 255, 0}, {138, 255, 0}, {136, 255, 0}, {135, 255, 0}, | |
{133, 255, 0}, {132, 255, 0}, {130, 255, 0}, {129, 255, 0}, {127, 255, 0}, | |
{126, 255, 0}, {124, 255, 0}, {123, 255, 0}, {121, 255, 0}, {120, 255, 0}, | |
{118, 255, 0}, {117, 255, 0}, {115, 255, 0}, {114, 255, 0}, {112, 255, 0}, | |
{110, 255, 0}, {109, 255, 0}, {107, 255, 0}, {106, 255, 0}, {104, 255, 0}, | |
{103, 255, 0}, {101, 255, 0}, {100, 255, 0}, { 98, 255, 0}, { 97, 255, 0}, | |
{ 95, 255, 0}, { 94, 255, 0}, { 92, 255, 0}, { 91, 255, 0}, { 89, 255, 0}, | |
{ 88, 255, 0}, { 86, 255, 0}, { 85, 255, 0}, { 83, 255, 0}, { 82, 255, 0}, | |
{ 80, 255, 0}, { 79, 255, 0}, { 77, 255, 0}, { 76, 255, 0}, { 74, 255, 0}, | |
{ 73, 255, 0}, { 71, 255, 0}, { 70, 255, 0}, { 68, 255, 0}, { 67, 255, 0}, | |
{ 65, 255, 0}, { 64, 255, 0}, { 62, 255, 0}, { 61, 255, 0}, { 59, 255, 0}, | |
{ 58, 255, 0}, { 56, 255, 0}, { 55, 255, 0}, { 53, 255, 0}, { 52, 255, 0}, | |
{ 50, 255, 0}, { 49, 255, 0}, { 47, 255, 0}, { 46, 255, 0}, { 44, 255, 0}, | |
{ 43, 255, 0}, { 41, 255, 0}, { 40, 255, 0}, { 38, 255, 0}, { 37, 255, 0}, | |
{ 35, 255, 0}, { 34, 255, 0}, { 32, 255, 0}, { 31, 255, 0}, { 29, 255, 0}, | |
{ 28, 255, 0}, { 26, 255, 0}, { 25, 255, 0}, { 23, 255, 0}, { 22, 255, 0}, | |
{ 20, 255, 0}, { 19, 255, 0}, { 17, 255, 0}, { 16, 255, 0}, { 14, 255, 0}, | |
{ 12, 255, 0}, { 11, 255, 0}, { 9, 255, 0}, { 8, 255, 0}, { 7, 255, 1}, | |
{ 7, 255, 2}, { 6, 255, 3}, { 6, 255, 4}, { 5, 255, 5}, { 5, 255, 6}, | |
{ 4, 255, 7}, { 4, 255, 8}, { 3, 255, 9}, { 3, 255, 10}, { 2, 255, 11}, | |
{ 2, 255, 12}, { 1, 255, 13}, { 1, 255, 14}, { 0, 255, 15}, { 0, 255, 16}, | |
{ 0, 255, 18}, { 0, 255, 19}, { 0, 255, 21}, { 0, 255, 22}, { 0, 255, 24}, | |
{ 0, 255, 25}, { 0, 255, 27}, { 0, 255, 28}, { 0, 255, 30}, { 0, 255, 31}, | |
{ 0, 255, 33}, { 0, 255, 34}, { 0, 255, 36}, { 0, 255, 37}, { 0, 255, 39}, | |
{ 0, 255, 40}, { 0, 255, 42}, { 0, 255, 43}, { 0, 255, 45}, { 0, 255, 46}, | |
{ 0, 255, 48}, { 0, 255, 49}, { 0, 255, 51}, { 0, 255, 52}, { 0, 255, 54}, | |
{ 0, 255, 55}, { 0, 255, 57}, { 0, 255, 58}, { 0, 255, 60}, { 0, 255, 61}, | |
{ 0, 255, 63}, { 0, 255, 64}, { 0, 255, 66}, { 0, 255, 67}, { 0, 255, 69}, | |
{ 0, 255, 70}, { 0, 255, 72}, { 0, 255, 73}, { 0, 255, 75}, { 0, 255, 76}, | |
{ 0, 255, 78}, { 0, 255, 79}, { 0, 255, 81}, { 0, 255, 82}, { 0, 255, 84}, | |
{ 0, 255, 86}, { 0, 255, 87}, { 0, 255, 89}, { 0, 255, 90}, { 0, 255, 92}, | |
{ 0, 255, 93}, { 0, 255, 95}, { 0, 255, 96}, { 0, 255, 98}, { 0, 255, 99}, | |
{ 0, 255, 101}, { 0, 255, 102}, { 0, 255, 104}, { 0, 255, 105}, { 0, 255, 107}, | |
{ 0, 255, 108}, { 0, 255, 110}, { 0, 255, 111}, { 0, 255, 113}, { 0, 255, 114}, | |
{ 0, 255, 116}, { 0, 255, 117}, { 0, 255, 119}, { 0, 255, 120}, { 0, 255, 122}, | |
{ 0, 255, 123}, { 0, 255, 125}, { 0, 255, 126}, { 0, 255, 128}, { 0, 255, 129}, | |
{ 0, 255, 131}, { 0, 255, 132}, { 0, 255, 134}, { 0, 255, 135}, { 0, 255, 137}, | |
{ 0, 255, 138}, { 0, 255, 140}, { 0, 255, 141}, { 0, 255, 143}, { 0, 255, 144}, | |
{ 0, 255, 146}, { 0, 255, 147}, { 0, 255, 149}, { 0, 255, 150}, { 0, 255, 152}, | |
{ 0, 255, 153}, { 0, 255, 155}, { 0, 255, 156}, { 0, 255, 158}, { 0, 255, 159}, | |
{ 0, 255, 161}, { 0, 255, 162}, { 0, 255, 164}, { 0, 255, 165}, { 0, 255, 167}, | |
{ 0, 255, 168}, { 0, 255, 170}, { 0, 255, 171}, { 0, 255, 173}, { 0, 255, 174}, | |
{ 0, 255, 176}, { 0, 255, 177}, { 0, 255, 179}, { 0, 255, 180}, { 0, 255, 182}, | |
{ 0, 255, 183}, { 0, 255, 185}, { 0, 255, 187}, { 0, 255, 188}, { 0, 255, 190}, | |
{ 0, 255, 191}, { 0, 255, 193}, { 0, 255, 194}, { 0, 255, 196}, { 0, 255, 197}, | |
{ 0, 255, 199}, { 0, 255, 200}, { 0, 255, 202}, { 0, 255, 203}, { 0, 255, 205}, | |
{ 0, 255, 206}, { 0, 255, 208}, { 0, 255, 209}, { 0, 255, 211}, { 0, 255, 212}, | |
{ 0, 255, 214}, { 0, 255, 215}, { 0, 255, 217}, { 0, 255, 218}, { 0, 255, 220}, | |
{ 0, 255, 221}, { 0, 255, 223}, { 0, 255, 224}, { 0, 255, 226}, { 0, 255, 227}, | |
{ 0, 255, 229}, { 0, 255, 230}, { 0, 255, 232}, { 0, 255, 233}, { 0, 255, 235}, | |
{ 0, 255, 236}, { 0, 255, 238}, { 0, 255, 239}, { 0, 255, 241}, { 0, 255, 242}, | |
{ 0, 255, 244}, { 0, 255, 245}, { 0, 255, 247}, { 0, 255, 248}, { 0, 255, 250}, | |
{ 0, 255, 251}, { 0, 255, 253}, { 0, 255, 254}, { 0, 254, 255}, { 0, 253, 255}, | |
{ 0, 251, 255}, { 0, 250, 255}, { 0, 248, 255}, { 0, 247, 255}, { 0, 245, 255}, | |
{ 0, 244, 255}, { 0, 242, 255}, { 0, 241, 255}, { 0, 239, 255}, { 0, 238, 255}, | |
{ 0, 236, 255}, { 0, 235, 255}, { 0, 233, 255}, { 0, 232, 255}, { 0, 230, 255}, | |
{ 0, 229, 255}, { 0, 227, 255}, { 0, 225, 255}, { 0, 224, 255}, { 0, 222, 255}, | |
{ 0, 221, 255}, { 0, 219, 255}, { 0, 218, 255}, { 0, 216, 255}, { 0, 215, 255}, | |
{ 0, 213, 255}, { 0, 212, 255}, { 0, 210, 255}, { 0, 209, 255}, { 0, 207, 255}, | |
{ 0, 206, 255}, { 0, 204, 255}, { 0, 203, 255}, { 0, 201, 255}, { 0, 200, 255}, | |
{ 0, 198, 255}, { 0, 197, 255}, { 0, 195, 255}, { 0, 194, 255}, { 0, 192, 255}, | |
{ 0, 191, 255}, { 0, 189, 255}, { 0, 188, 255}, { 0, 186, 255}, { 0, 185, 255}, | |
{ 0, 183, 255}, { 0, 182, 255}, { 0, 180, 255}, { 0, 179, 255}, { 0, 177, 255}, | |
{ 0, 176, 255}, { 0, 174, 255}, { 0, 173, 255}, { 0, 171, 255}, { 0, 170, 255}, | |
{ 0, 168, 255}, { 0, 167, 255}, { 0, 165, 255}, { 0, 164, 255}, { 0, 162, 255}, | |
{ 0, 161, 255}, { 0, 159, 255}, { 0, 158, 255}, { 0, 156, 255}, { 0, 155, 255}, | |
{ 0, 153, 255}, { 0, 152, 255}, { 0, 150, 255}, { 0, 149, 255}, { 0, 147, 255}, | |
{ 0, 146, 255}, { 0, 144, 255}, { 0, 143, 255}, { 0, 141, 255}, { 0, 140, 255}, | |
{ 0, 138, 255}, { 0, 137, 255}, { 0, 135, 255}, { 0, 134, 255}, { 0, 132, 255}, | |
{ 0, 131, 255}, { 0, 129, 255}, { 0, 128, 255}, { 0, 126, 255}, { 0, 124, 255}, | |
{ 0, 123, 255}, { 0, 121, 255}, { 0, 120, 255}, { 0, 118, 255}, { 0, 117, 255}, | |
{ 0, 115, 255}, { 0, 114, 255}, { 0, 112, 255}, { 0, 111, 255}, { 0, 109, 255}, | |
{ 0, 108, 255}, { 0, 106, 255}, { 0, 105, 255}, { 0, 103, 255}, { 0, 102, 255}, | |
{ 0, 100, 255}, { 0, 99, 255}, { 0, 97, 255}, { 0, 96, 255}, { 0, 94, 255}, | |
{ 0, 93, 255}, { 0, 91, 255}, { 0, 90, 255}, { 0, 88, 255}, { 0, 87, 255}, | |
{ 0, 85, 255}, { 0, 84, 255}, { 0, 82, 255}, { 0, 81, 255}, { 0, 79, 255}, | |
{ 0, 78, 255}, { 0, 76, 255}, { 0, 75, 255}, { 0, 73, 255}, { 0, 72, 255}, | |
{ 0, 70, 255}, { 0, 69, 255}, { 0, 67, 255}, { 0, 66, 255}, { 0, 64, 255}, | |
{ 0, 63, 255}, { 0, 61, 255}, { 0, 60, 255}, { 0, 58, 255}, { 0, 57, 255}, | |
{ 0, 55, 255}, { 0, 54, 255}, { 0, 52, 255}, { 0, 51, 255}, { 0, 49, 255}, | |
{ 0, 48, 255}, { 0, 46, 255}, { 0, 45, 255}, { 0, 43, 255}, { 0, 42, 255}, | |
{ 0, 40, 255}, { 0, 39, 255}, { 0, 37, 255}, { 0, 36, 255}, { 0, 34, 255}, | |
{ 0, 33, 255}, { 0, 31, 255}, { 0, 30, 255}, { 0, 28, 255}, { 0, 26, 255}, | |
{ 0, 25, 255}, { 0, 23, 255}, { 0, 22, 255}, { 0, 20, 255}, { 0, 19, 255}, | |
{ 0, 17, 255}, { 0, 16, 255}, { 1, 15, 255}, { 1, 14, 255}, { 2, 13, 255}, | |
{ 2, 12, 255}, { 3, 11, 255}, { 3, 10, 255}, { 4, 9, 255}, { 4, 8, 255}, | |
{ 5, 7, 255}, { 5, 6, 255}, { 6, 5, 255}, { 6, 4, 255}, { 7, 3, 255}, | |
{ 7, 2, 255}, { 8, 1, 255}, { 8, 0, 255}, { 10, 0, 255}, { 11, 0, 255}, | |
{ 13, 0, 255}, { 14, 0, 255}, { 16, 0, 255}, { 17, 0, 255}, { 19, 0, 255}, | |
{ 20, 0, 255}, { 22, 0, 255}, { 23, 0, 255}, { 25, 0, 255}, { 26, 0, 255}, | |
{ 28, 0, 255}, { 29, 0, 255}, { 31, 0, 255}, { 32, 0, 255}, { 34, 0, 255}, | |
{ 35, 0, 255}, { 37, 0, 255}, { 38, 0, 255}, { 40, 0, 255}, { 41, 0, 255}, | |
{ 43, 0, 255}, { 44, 0, 255}, { 46, 0, 255}, { 47, 0, 255}, { 49, 0, 255}, | |
{ 50, 0, 255}, { 52, 0, 255}, { 53, 0, 255}, { 55, 0, 255}, { 56, 0, 255}, | |
{ 58, 0, 255}, { 59, 0, 255}, { 61, 0, 255}, { 62, 0, 255}, { 64, 0, 255}, | |
{ 65, 0, 255}, { 67, 0, 255}, { 68, 0, 255}, { 70, 0, 255}, { 72, 0, 255}, | |
{ 73, 0, 255}, { 75, 0, 255}, { 76, 0, 255}, { 78, 0, 255}, { 79, 0, 255}, | |
{ 81, 0, 255}, { 82, 0, 255}, { 84, 0, 255}, { 85, 0, 255}, { 87, 0, 255}, | |
{ 88, 0, 255}, { 90, 0, 255}, { 91, 0, 255}, { 93, 0, 255}, { 94, 0, 255}, | |
{ 96, 0, 255}, { 97, 0, 255}, { 99, 0, 255}, {100, 0, 255}, {102, 0, 255}, | |
{103, 0, 255}, {105, 0, 255}, {106, 0, 255}, {108, 0, 255}, {109, 0, 255}, | |
{111, 0, 255}, {112, 0, 255}, {114, 0, 255}, {115, 0, 255}, {117, 0, 255}, | |
{118, 0, 255}, {120, 0, 255}, {121, 0, 255}, {123, 0, 255}, {124, 0, 255}, | |
{126, 0, 255}, {127, 0, 255}, {129, 0, 255}, {130, 0, 255}, {132, 0, 255}, | |
{133, 0, 255}, {135, 0, 255}, {136, 0, 255}, {138, 0, 255}, {139, 0, 255}, | |
{141, 0, 255}, {142, 0, 255}, {144, 0, 255}, {145, 0, 255}, {147, 0, 255}, | |
{148, 0, 255}, {150, 0, 255}, {151, 0, 255}, {153, 0, 255}, {154, 0, 255}, | |
{156, 0, 255}, {157, 0, 255}, {159, 0, 255}, {160, 0, 255}, {162, 0, 255}, | |
{163, 0, 255}, {165, 0, 255}, {166, 0, 255}, {168, 0, 255}, {169, 0, 255}, | |
{171, 0, 255}, {173, 0, 255}, {174, 0, 255}, {176, 0, 255}, {177, 0, 255}, | |
{179, 0, 255}, {180, 0, 255}, {182, 0, 255}, {183, 0, 255}, {185, 0, 255}, | |
{186, 0, 255}, {188, 0, 255}, {189, 0, 255}, {191, 0, 255}, {192, 0, 255}, | |
{194, 0, 255}, {195, 0, 255}, {197, 0, 255}, {198, 0, 255}, {200, 0, 255}, | |
{201, 0, 255}, {203, 0, 255}, {204, 0, 255}, {206, 0, 255}, {207, 0, 255}, | |
{209, 0, 255}, {210, 0, 255}, {212, 0, 255}, {213, 0, 255}, {215, 0, 255}, | |
{216, 0, 255}, {218, 0, 255}, {219, 0, 255}, {221, 0, 255}, {222, 0, 255}, | |
{224, 0, 255}, {225, 0, 255}, {227, 0, 255}, {228, 0, 255}, {230, 0, 255}, | |
{231, 0, 255}, {233, 0, 255}, {234, 0, 255}, {236, 0, 255}, {237, 0, 255}, | |
{239, 0, 255}, {240, 0, 255}, {242, 0, 255}, {243, 0, 255}, {245, 0, 255}, | |
{246, 0, 255}, {247, 0, 254}, {248, 0, 253}, {248, 0, 252}, {249, 0, 251}, | |
{249, 0, 250}, {250, 0, 249}, {250, 0, 248}, {251, 0, 247}, {251, 0, 246}, | |
{252, 0, 245}, {252, 0, 244}, {253, 0, 243}, {253, 0, 242}, {254, 0, 241}, | |
{254, 0, 240}, {255, 0, 239}, {255, 0, 238}, {255, 0, 236}, {255, 0, 235}, | |
{255, 0, 233}, {255, 0, 232}, {255, 0, 230}, {255, 0, 229}, {255, 0, 227}, | |
{255, 0, 226}, {255, 0, 224}, {255, 0, 223}, {255, 0, 221}, {255, 0, 220}, | |
{255, 0, 218}, {255, 0, 217}, {255, 0, 215}, {255, 0, 214}, {255, 0, 212}, | |
{255, 0, 211}, {255, 0, 209}, {255, 0, 208}, {255, 0, 206}, {255, 0, 205}, | |
{255, 0, 203}, {255, 0, 202}, {255, 0, 200}, {255, 0, 199}, {255, 0, 197}, | |
{255, 0, 196}, {255, 0, 194}, {255, 0, 193}, {255, 0, 191}, {255, 0, 190}, | |
{255, 0, 188}, {255, 0, 187}, {255, 0, 185}, {255, 0, 184}, {255, 0, 182}, | |
{255, 0, 181}, {255, 0, 179}, {255, 0, 178}, {255, 0, 176}, {255, 0, 175}, | |
{255, 0, 173}, {255, 0, 172}, {255, 0, 170}, {255, 0, 169}, {255, 0, 167}, | |
{255, 0, 166}, {255, 0, 164}, {255, 0, 163}, {255, 0, 161}, {255, 0, 160}, | |
{255, 0, 158}, {255, 0, 157}, {255, 0, 155}, {255, 0, 154}, {255, 0, 152}, | |
{255, 0, 151}, {255, 0, 149}, {255, 0, 148}, {255, 0, 146}, {255, 0, 145}, | |
{255, 0, 143}, {255, 0, 141}, {255, 0, 140}, {255, 0, 138}, {255, 0, 137}, | |
{255, 0, 135}, {255, 0, 134}, {255, 0, 132}, {255, 0, 131}, {255, 0, 129}, | |
{255, 0, 128}, {255, 0, 126}, {255, 0, 125}, {255, 0, 123}, {255, 0, 122}, | |
{255, 0, 120}, {255, 0, 119}, {255, 0, 117}, {255, 0, 116}, {255, 0, 114}, | |
{255, 0, 113}, {255, 0, 111}, {255, 0, 110}, {255, 0, 108}, {255, 0, 107}, | |
{255, 0, 105}, {255, 0, 104}, {255, 0, 102}, {255, 0, 101}, {255, 0, 99}, | |
{255, 0, 98}, {255, 0, 96}, {255, 0, 95}, {255, 0, 93}, {255, 0, 92}, | |
{255, 0, 90}, {255, 0, 89}, {255, 0, 87}, {255, 0, 86}, {255, 0, 84}, | |
{255, 0, 83}, {255, 0, 81}, {255, 0, 80}, {255, 0, 78}, {255, 0, 77}, | |
{255, 0, 75}, {255, 0, 74}, {255, 0, 72}, {255, 0, 71}, {255, 0, 69}, | |
{255, 0, 68}, {255, 0, 66}, {255, 0, 65}, {255, 0, 63}, {255, 0, 62}, | |
{255, 0, 60}, {255, 0, 59}, {255, 0, 57}, {255, 0, 56}, {255, 0, 54}, | |
{255, 0, 53}, {255, 0, 51}, {255, 0, 50}, {255, 0, 48}, {255, 0, 47}, | |
{255, 0, 45}, {255, 0, 44}, {255, 0, 42}, {255, 0, 40}, {255, 0, 39}, | |
{255, 0, 37}, {255, 0, 36}, {255, 0, 34}, {255, 0, 33}, {255, 0, 31}, | |
{255, 0, 30}, {255, 0, 28}, {255, 0, 27}, {255, 0, 25}, {255, 0, 24} | |
}; | |
const rgb_t jet_colormap[1000] = { | |
{ 29, 0, 102}, { 23, 0, 107}, { 17, 0, 112}, { 12, 0, 117}, { 6, 0, 122}, | |
{ 0, 0, 127}, { 0, 0, 128}, { 0, 0, 129}, { 0, 0, 129}, { 0, 0, 130}, | |
{ 0, 0, 131}, { 0, 0, 132}, { 0, 0, 133}, { 0, 0, 133}, { 0, 0, 134}, | |
{ 0, 0, 135}, { 0, 0, 136}, { 0, 0, 137}, { 0, 0, 138}, { 0, 0, 140}, | |
{ 0, 0, 141}, { 0, 0, 142}, { 0, 0, 143}, { 0, 0, 145}, { 0, 0, 146}, | |
{ 0, 0, 147}, { 0, 0, 148}, { 0, 0, 150}, { 0, 0, 151}, { 0, 0, 152}, | |
{ 0, 0, 153}, { 0, 0, 154}, { 0, 0, 156}, { 0, 0, 157}, { 0, 0, 158}, | |
{ 0, 0, 159}, { 0, 0, 160}, { 0, 0, 161}, { 0, 0, 163}, { 0, 0, 164}, | |
{ 0, 0, 165}, { 0, 0, 166}, { 0, 0, 168}, { 0, 0, 169}, { 0, 0, 170}, | |
{ 0, 0, 171}, { 0, 0, 173}, { 0, 0, 174}, { 0, 0, 175}, { 0, 0, 176}, | |
{ 0, 0, 178}, { 0, 0, 179}, { 0, 0, 180}, { 0, 0, 181}, { 0, 0, 183}, | |
{ 0, 0, 184}, { 0, 0, 185}, { 0, 0, 186}, { 0, 0, 188}, { 0, 0, 189}, | |
{ 0, 0, 190}, { 0, 0, 191}, { 0, 0, 193}, { 0, 0, 194}, { 0, 0, 195}, | |
{ 0, 0, 196}, { 0, 0, 197}, { 0, 0, 198}, { 0, 0, 200}, { 0, 0, 201}, | |
{ 0, 0, 202}, { 0, 0, 203}, { 0, 0, 204}, { 0, 0, 206}, { 0, 0, 207}, | |
{ 0, 0, 208}, { 0, 0, 209}, { 0, 0, 211}, { 0, 0, 212}, { 0, 0, 213}, | |
{ 0, 0, 214}, { 0, 0, 216}, { 0, 0, 217}, { 0, 0, 218}, { 0, 0, 219}, | |
{ 0, 0, 221}, { 0, 0, 222}, { 0, 0, 223}, { 0, 0, 225}, { 0, 0, 226}, | |
{ 0, 0, 227}, { 0, 0, 228}, { 0, 0, 230}, { 0, 0, 231}, { 0, 0, 232}, | |
{ 0, 0, 233}, { 0, 0, 234}, { 0, 0, 234}, { 0, 0, 235}, { 0, 0, 236}, | |
{ 0, 0, 237}, { 0, 0, 238}, { 0, 0, 239}, { 0, 0, 239}, { 0, 0, 240}, | |
{ 0, 0, 241}, { 0, 0, 242}, { 0, 0, 243}, { 0, 0, 244}, { 0, 0, 246}, | |
{ 0, 0, 247}, { 0, 0, 248}, { 0, 0, 249}, { 0, 0, 250}, { 0, 0, 251}, | |
{ 0, 0, 253}, { 0, 0, 254}, { 0, 0, 254}, { 0, 0, 254}, { 0, 0, 254}, | |
{ 0, 0, 254}, { 0, 0, 254}, { 0, 0, 255}, { 0, 0, 255}, { 0, 0, 255}, | |
{ 0, 0, 255}, { 0, 0, 255}, { 0, 0, 255}, { 0, 1, 255}, { 0, 1, 255}, | |
{ 0, 2, 255}, { 0, 3, 255}, { 0, 3, 255}, { 0, 4, 255}, { 0, 5, 255}, | |
{ 0, 6, 255}, { 0, 6, 255}, { 0, 7, 255}, { 0, 8, 255}, { 0, 9, 255}, | |
{ 0, 10, 255}, { 0, 11, 255}, { 0, 12, 255}, { 0, 13, 255}, { 0, 14, 255}, | |
{ 0, 15, 255}, { 0, 16, 255}, { 0, 17, 255}, { 0, 18, 255}, { 0, 19, 255}, | |
{ 0, 21, 255}, { 0, 22, 255}, { 0, 23, 255}, { 0, 24, 255}, { 0, 25, 255}, | |
{ 0, 26, 255}, { 0, 27, 255}, { 0, 28, 255}, { 0, 29, 255}, { 0, 30, 255}, | |
{ 0, 31, 255}, { 0, 32, 255}, { 0, 34, 255}, { 0, 35, 255}, { 0, 36, 255}, | |
{ 0, 37, 255}, { 0, 38, 255}, { 0, 39, 255}, { 0, 40, 255}, { 0, 41, 255}, | |
{ 0, 42, 255}, { 0, 43, 255}, { 0, 44, 255}, { 0, 45, 255}, { 0, 46, 255}, | |
{ 0, 48, 255}, { 0, 49, 255}, { 0, 50, 255}, { 0, 51, 255}, { 0, 52, 255}, | |
{ 0, 53, 255}, { 0, 54, 255}, { 0, 55, 255}, { 0, 56, 255}, { 0, 57, 255}, | |
{ 0, 58, 255}, { 0, 58, 255}, { 0, 59, 255}, { 0, 60, 255}, { 0, 60, 255}, | |
{ 0, 61, 255}, { 0, 62, 255}, { 0, 63, 255}, { 0, 63, 255}, { 0, 64, 255}, | |
{ 0, 65, 255}, { 0, 66, 255}, { 0, 67, 255}, { 0, 68, 255}, { 0, 69, 255}, | |
{ 0, 71, 255}, { 0, 72, 255}, { 0, 73, 255}, { 0, 74, 255}, { 0, 75, 255}, | |
{ 0, 76, 255}, { 0, 77, 255}, { 0, 78, 255}, { 0, 79, 255}, { 0, 80, 255}, | |
{ 0, 81, 255}, { 0, 82, 255}, { 0, 84, 255}, { 0, 85, 255}, { 0, 86, 255}, | |
{ 0, 87, 255}, { 0, 88, 255}, { 0, 89, 255}, { 0, 90, 255}, { 0, 91, 255}, | |
{ 0, 92, 255}, { 0, 93, 255}, { 0, 94, 255}, { 0, 95, 255}, { 0, 96, 255}, | |
{ 0, 98, 255}, { 0, 99, 255}, { 0, 100, 255}, { 0, 101, 255}, { 0, 102, 255}, | |
{ 0, 103, 255}, { 0, 104, 255}, { 0, 105, 255}, { 0, 106, 255}, { 0, 107, 255}, | |
{ 0, 108, 255}, { 0, 109, 255}, { 0, 111, 255}, { 0, 112, 255}, { 0, 113, 255}, | |
{ 0, 114, 255}, { 0, 115, 255}, { 0, 116, 255}, { 0, 117, 255}, { 0, 118, 255}, | |
{ 0, 119, 255}, { 0, 120, 255}, { 0, 121, 255}, { 0, 122, 255}, { 0, 123, 255}, | |
{ 0, 125, 255}, { 0, 126, 255}, { 0, 127, 255}, { 0, 128, 255}, { 0, 129, 255}, | |
{ 0, 130, 255}, { 0, 131, 255}, { 0, 132, 255}, { 0, 133, 255}, { 0, 134, 255}, | |
{ 0, 135, 255}, { 0, 136, 255}, { 0, 138, 255}, { 0, 139, 255}, { 0, 140, 255}, | |
{ 0, 141, 255}, { 0, 142, 255}, { 0, 143, 255}, { 0, 144, 255}, { 0, 145, 255}, | |
{ 0, 146, 255}, { 0, 147, 255}, { 0, 148, 255}, { 0, 149, 255}, { 0, 150, 255}, | |
{ 0, 150, 255}, { 0, 151, 255}, { 0, 152, 255}, { 0, 153, 255}, { 0, 153, 255}, | |
{ 0, 154, 255}, { 0, 155, 255}, { 0, 155, 255}, { 0, 156, 255}, { 0, 157, 255}, | |
{ 0, 158, 255}, { 0, 159, 255}, { 0, 161, 255}, { 0, 162, 255}, { 0, 163, 255}, | |
{ 0, 164, 255}, { 0, 165, 255}, { 0, 166, 255}, { 0, 167, 255}, { 0, 168, 255}, | |
{ 0, 169, 255}, { 0, 170, 255}, { 0, 171, 255}, { 0, 172, 255}, { 0, 173, 255}, | |
{ 0, 175, 255}, { 0, 176, 255}, { 0, 177, 255}, { 0, 178, 255}, { 0, 179, 255}, | |
{ 0, 180, 255}, { 0, 181, 255}, { 0, 182, 255}, { 0, 183, 255}, { 0, 184, 255}, | |
{ 0, 185, 255}, { 0, 186, 255}, { 0, 188, 255}, { 0, 189, 255}, { 0, 190, 255}, | |
{ 0, 191, 255}, { 0, 192, 255}, { 0, 193, 255}, { 0, 194, 255}, { 0, 195, 255}, | |
{ 0, 196, 255}, { 0, 197, 255}, { 0, 198, 255}, { 0, 199, 255}, { 0, 200, 255}, | |
{ 0, 202, 255}, { 0, 203, 255}, { 0, 204, 255}, { 0, 205, 255}, { 0, 206, 255}, | |
{ 0, 207, 255}, { 0, 208, 255}, { 0, 209, 255}, { 0, 210, 255}, { 0, 211, 255}, | |
{ 0, 212, 255}, { 0, 213, 255}, { 0, 215, 255}, { 0, 216, 255}, { 0, 217, 255}, | |
{ 0, 218, 254}, { 0, 219, 253}, { 0, 220, 252}, { 0, 221, 252}, { 0, 222, 251}, | |
{ 0, 223, 250}, { 0, 224, 250}, { 0, 225, 249}, { 0, 226, 248}, { 0, 227, 247}, | |
{ 0, 229, 247}, { 1, 230, 246}, { 2, 231, 245}, { 3, 232, 244}, { 3, 233, 243}, | |
{ 4, 234, 242}, { 5, 235, 241}, { 5, 236, 240}, { 6, 237, 239}, { 7, 238, 238}, | |
{ 8, 239, 238}, { 8, 240, 237}, { 9, 241, 236}, { 10, 242, 236}, { 10, 242, 235}, | |
{ 11, 243, 235}, { 11, 244, 234}, { 12, 245, 234}, { 13, 245, 233}, { 13, 246, 232}, | |
{ 14, 247, 232}, { 15, 247, 231}, { 15, 248, 231}, { 16, 249, 230}, { 17, 249, 229}, | |
{ 18, 250, 228}, { 18, 251, 227}, { 19, 251, 226}, { 20, 252, 225}, { 21, 253, 224}, | |
{ 22, 253, 224}, { 23, 254, 223}, { 23, 254, 222}, { 24, 255, 221}, { 25, 255, 220}, | |
{ 26, 255, 219}, { 27, 255, 218}, { 28, 255, 218}, { 29, 255, 217}, { 30, 255, 216}, | |
{ 30, 255, 215}, { 31, 255, 214}, { 32, 255, 214}, { 33, 255, 213}, { 34, 255, 212}, | |
{ 35, 255, 211}, { 36, 255, 210}, { 37, 255, 209}, { 38, 255, 208}, { 39, 255, 207}, | |
{ 39, 255, 207}, { 40, 255, 206}, { 41, 255, 205}, { 42, 255, 204}, { 43, 255, 203}, | |
{ 44, 255, 202}, { 45, 255, 201}, { 46, 255, 200}, { 47, 255, 199}, { 48, 255, 198}, | |
{ 48, 255, 198}, { 49, 255, 197}, { 50, 255, 196}, { 51, 255, 195}, { 52, 255, 194}, | |
{ 53, 255, 193}, { 54, 255, 192}, { 55, 255, 191}, { 55, 255, 191}, { 56, 255, 190}, | |
{ 57, 255, 189}, { 58, 255, 188}, { 59, 255, 187}, { 60, 255, 186}, { 60, 255, 186}, | |
{ 61, 255, 185}, { 62, 255, 184}, { 63, 255, 183}, { 64, 255, 182}, { 65, 255, 181}, | |
{ 65, 255, 181}, { 66, 255, 180}, { 67, 255, 179}, { 68, 255, 178}, { 69, 255, 177}, | |
{ 70, 255, 176}, { 71, 255, 175}, { 72, 255, 174}, { 73, 255, 173}, { 74, 255, 172}, | |
{ 74, 255, 172}, { 75, 255, 171}, { 76, 255, 170}, { 77, 255, 169}, { 78, 255, 168}, | |
{ 79, 255, 167}, { 80, 255, 166}, { 81, 255, 165}, { 82, 255, 164}, { 83, 255, 163}, | |
{ 83, 255, 163}, { 84, 255, 162}, { 84, 255, 162}, { 85, 255, 161}, { 85, 255, 161}, | |
{ 86, 255, 160}, { 87, 255, 159}, { 87, 255, 159}, { 88, 255, 158}, { 88, 255, 158}, | |
{ 89, 255, 157}, { 89, 255, 157}, { 90, 255, 156}, { 91, 255, 155}, { 92, 255, 154}, | |
{ 93, 255, 153}, { 94, 255, 152}, { 95, 255, 151}, { 96, 255, 150}, { 97, 255, 149}, | |
{ 97, 255, 149}, { 98, 255, 148}, { 99, 255, 147}, {100, 255, 146}, {101, 255, 145}, | |
{102, 255, 144}, {102, 255, 143}, {103, 255, 142}, {104, 255, 141}, {105, 255, 140}, | |
{106, 255, 140}, {107, 255, 139}, {107, 255, 138}, {108, 255, 137}, {109, 255, 136}, | |
{110, 255, 135}, {111, 255, 134}, {112, 255, 134}, {113, 255, 133}, {114, 255, 132}, | |
{114, 255, 131}, {115, 255, 130}, {116, 255, 130}, {117, 255, 129}, {118, 255, 128}, | |
{119, 255, 127}, {120, 255, 126}, {121, 255, 125}, {122, 255, 124}, {123, 255, 123}, | |
{123, 255, 123}, {124, 255, 122}, {125, 255, 121}, {126, 255, 120}, {127, 255, 119}, | |
{128, 255, 118}, {129, 255, 117}, {130, 255, 116}, {130, 255, 115}, {131, 255, 114}, | |
{132, 255, 114}, {133, 255, 113}, {134, 255, 112}, {134, 255, 111}, {135, 255, 110}, | |
{136, 255, 109}, {137, 255, 108}, {138, 255, 107}, {139, 255, 107}, {140, 255, 106}, | |
{140, 255, 105}, {141, 255, 104}, {142, 255, 103}, {143, 255, 102}, {144, 255, 102}, | |
{145, 255, 101}, {146, 255, 100}, {147, 255, 99}, {148, 255, 98}, {149, 255, 97}, | |
{149, 255, 97}, {150, 255, 96}, {151, 255, 95}, {152, 255, 94}, {153, 255, 93}, | |
{154, 255, 92}, {155, 255, 91}, {156, 255, 90}, {157, 255, 89}, {157, 255, 89}, | |
{158, 255, 88}, {158, 255, 88}, {159, 255, 87}, {159, 255, 87}, {160, 255, 86}, | |
{161, 255, 85}, {161, 255, 85}, {162, 255, 84}, {162, 255, 84}, {163, 255, 83}, | |
{163, 255, 83}, {164, 255, 82}, {165, 255, 81}, {166, 255, 80}, {167, 255, 79}, | |
{168, 255, 78}, {169, 255, 77}, {170, 255, 76}, {171, 255, 75}, {172, 255, 74}, | |
{172, 255, 74}, {173, 255, 73}, {174, 255, 72}, {175, 255, 71}, {176, 255, 70}, | |
{177, 255, 69}, {178, 255, 68}, {179, 255, 67}, {180, 255, 66}, {181, 255, 65}, | |
{181, 255, 65}, {182, 255, 64}, {183, 255, 63}, {184, 255, 62}, {185, 255, 61}, | |
{186, 255, 60}, {186, 255, 60}, {187, 255, 59}, {188, 255, 58}, {189, 255, 57}, | |
{190, 255, 56}, {191, 255, 55}, {191, 255, 55}, {192, 255, 54}, {193, 255, 53}, | |
{194, 255, 52}, {195, 255, 51}, {196, 255, 50}, {197, 255, 49}, {198, 255, 48}, | |
{198, 255, 48}, {199, 255, 47}, {200, 255, 46}, {201, 255, 45}, {202, 255, 44}, | |
{203, 255, 43}, {204, 255, 42}, {205, 255, 41}, {206, 255, 40}, {207, 255, 39}, | |
{207, 255, 39}, {208, 255, 38}, {209, 255, 37}, {210, 255, 36}, {211, 255, 35}, | |
{212, 255, 34}, {213, 255, 33}, {214, 255, 32}, {214, 255, 31}, {215, 255, 30}, | |
{216, 255, 30}, {217, 255, 29}, {218, 255, 28}, {218, 255, 27}, {219, 255, 26}, | |
{220, 255, 25}, {221, 255, 24}, {222, 255, 23}, {223, 255, 23}, {224, 255, 22}, | |
{224, 255, 21}, {225, 255, 20}, {226, 255, 19}, {227, 255, 18}, {228, 255, 18}, | |
{229, 255, 17}, {230, 255, 16}, {231, 255, 15}, {231, 255, 15}, {232, 255, 14}, | |
{232, 255, 13}, {233, 255, 13}, {234, 255, 12}, {234, 255, 11}, {235, 255, 11}, | |
{235, 255, 10}, {236, 255, 10}, {236, 255, 9}, {237, 255, 8}, {238, 254, 8}, | |
{238, 253, 7}, {239, 252, 6}, {240, 251, 5}, {241, 250, 5}, {242, 249, 4}, | |
{243, 248, 3}, {244, 247, 3}, {245, 246, 2}, {246, 246, 1}, {247, 245, 0}, | |
{247, 243, 0}, {248, 242, 0}, {249, 242, 0}, {250, 241, 0}, {250, 240, 0}, | |
{251, 239, 0}, {252, 238, 0}, {252, 237, 0}, {253, 236, 0}, {254, 235, 0}, | |
{255, 234, 0}, {255, 233, 0}, {255, 232, 0}, {255, 231, 0}, {255, 230, 0}, | |
{255, 229, 0}, {255, 228, 0}, {255, 227, 0}, {255, 226, 0}, {255, 225, 0}, | |
{255, 224, 0}, {255, 223, 0}, {255, 222, 0}, {255, 221, 0}, {255, 220, 0}, | |
{255, 219, 0}, {255, 218, 0}, {255, 217, 0}, {255, 216, 0}, {255, 215, 0}, | |
{255, 214, 0}, {255, 213, 0}, {255, 212, 0}, {255, 211, 0}, {255, 210, 0}, | |
{255, 209, 0}, {255, 208, 0}, {255, 207, 0}, {255, 206, 0}, {255, 205, 0}, | |
{255, 204, 0}, {255, 203, 0}, {255, 202, 0}, {255, 201, 0}, {255, 200, 0}, | |
{255, 199, 0}, {255, 198, 0}, {255, 197, 0}, {255, 196, 0}, {255, 195, 0}, | |
{255, 194, 0}, {255, 193, 0}, {255, 192, 0}, {255, 191, 0}, {255, 190, 0}, | |
{255, 189, 0}, {255, 188, 0}, {255, 187, 0}, {255, 186, 0}, {255, 185, 0}, | |
{255, 184, 0}, {255, 183, 0}, {255, 182, 0}, {255, 180, 0}, {255, 179, 0}, | |
{255, 178, 0}, {255, 177, 0}, {255, 176, 0}, {255, 176, 0}, {255, 175, 0}, | |
{255, 175, 0}, {255, 174, 0}, {255, 173, 0}, {255, 173, 0}, {255, 172, 0}, | |
{255, 171, 0}, {255, 171, 0}, {255, 170, 0}, {255, 169, 0}, {255, 168, 0}, | |
{255, 167, 0}, {255, 166, 0}, {255, 165, 0}, {255, 164, 0}, {255, 163, 0}, | |
{255, 162, 0}, {255, 161, 0}, {255, 160, 0}, {255, 159, 0}, {255, 158, 0}, | |
{255, 157, 0}, {255, 156, 0}, {255, 155, 0}, {255, 154, 0}, {255, 153, 0}, | |
{255, 152, 0}, {255, 151, 0}, {255, 150, 0}, {255, 150, 0}, {255, 149, 0}, | |
{255, 147, 0}, {255, 146, 0}, {255, 146, 0}, {255, 145, 0}, {255, 144, 0}, | |
{255, 143, 0}, {255, 142, 0}, {255, 141, 0}, {255, 140, 0}, {255, 139, 0}, | |
{255, 138, 0}, {255, 137, 0}, {255, 136, 0}, {255, 135, 0}, {255, 134, 0}, | |
{255, 133, 0}, {255, 132, 0}, {255, 131, 0}, {255, 130, 0}, {255, 129, 0}, | |
{255, 128, 0}, {255, 127, 0}, {255, 126, 0}, {255, 125, 0}, {255, 124, 0}, | |
{255, 123, 0}, {255, 122, 0}, {255, 121, 0}, {255, 120, 0}, {255, 119, 0}, | |
{255, 118, 0}, {255, 117, 0}, {255, 116, 0}, {255, 115, 0}, {255, 114, 0}, | |
{255, 113, 0}, {255, 112, 0}, {255, 111, 0}, {255, 109, 0}, {255, 108, 0}, | |
{255, 107, 0}, {255, 106, 0}, {255, 105, 0}, {255, 104, 0}, {255, 103, 0}, | |
{255, 102, 0}, {255, 101, 0}, {255, 100, 0}, {255, 99, 0}, {255, 98, 0}, | |
{255, 97, 0}, {255, 96, 0}, {255, 95, 0}, {255, 94, 0}, {255, 93, 0}, | |
{255, 92, 0}, {255, 91, 0}, {255, 91, 0}, {255, 90, 0}, {255, 90, 0}, | |
{255, 89, 0}, {255, 88, 0}, {255, 88, 0}, {255, 87, 0}, {255, 86, 0}, | |
{255, 86, 0}, {255, 85, 0}, {255, 84, 0}, {255, 83, 0}, {255, 82, 0}, | |
{255, 81, 0}, {255, 80, 0}, {255, 79, 0}, {255, 78, 0}, {255, 77, 0}, | |
{255, 76, 0}, {255, 75, 0}, {255, 74, 0}, {255, 73, 0}, {255, 72, 0}, | |
{255, 71, 0}, {255, 70, 0}, {255, 69, 0}, {255, 68, 0}, {255, 67, 0}, | |
{255, 66, 0}, {255, 65, 0}, {255, 64, 0}, {255, 63, 0}, {255, 62, 0}, | |
{255, 61, 0}, {255, 60, 0}, {255, 59, 0}, {255, 58, 0}, {255, 57, 0}, | |
{255, 56, 0}, {255, 55, 0}, {255, 54, 0}, {255, 54, 0}, {255, 53, 0}, | |
{255, 51, 0}, {255, 50, 0}, {255, 49, 0}, {255, 48, 0}, {255, 47, 0}, | |
{255, 46, 0}, {255, 45, 0}, {255, 44, 0}, {255, 43, 0}, {255, 42, 0}, | |
{255, 41, 0}, {255, 40, 0}, {255, 39, 0}, {255, 38, 0}, {255, 37, 0}, | |
{255, 36, 0}, {255, 35, 0}, {255, 34, 0}, {255, 33, 0}, {255, 32, 0}, | |
{255, 31, 0}, {255, 30, 0}, {255, 29, 0}, {255, 28, 0}, {255, 27, 0}, | |
{255, 26, 0}, {255, 25, 0}, {255, 24, 0}, {254, 23, 0}, {254, 22, 0}, | |
{254, 21, 0}, {254, 20, 0}, {254, 19, 0}, {254, 18, 0}, {253, 17, 0}, | |
{251, 16, 0}, {250, 15, 0}, {249, 14, 0}, {248, 13, 0}, {247, 12, 0}, | |
{246, 11, 0}, {244, 10, 0}, {243, 9, 0}, {242, 8, 0}, {241, 7, 0}, | |
{240, 6, 0}, {239, 6, 0}, {239, 5, 0}, {238, 4, 0}, {237, 4, 0}, | |
{236, 3, 0}, {235, 3, 0}, {234, 2, 0}, {234, 1, 0}, {233, 1, 0}, | |
{232, 0, 0}, {231, 0, 0}, {230, 0, 0}, {228, 0, 0}, {227, 0, 0}, | |
{226, 0, 0}, {225, 0, 0}, {223, 0, 0}, {222, 0, 0}, {221, 0, 0}, | |
{219, 0, 0}, {218, 0, 0}, {217, 0, 0}, {216, 0, 0}, {214, 0, 0}, | |
{213, 0, 0}, {212, 0, 0}, {211, 0, 0}, {209, 0, 0}, {208, 0, 0}, | |
{207, 0, 0}, {206, 0, 0}, {204, 0, 0}, {203, 0, 0}, {202, 0, 0}, | |
{201, 0, 0}, {200, 0, 0}, {198, 0, 0}, {197, 0, 0}, {196, 0, 0}, | |
{195, 0, 0}, {194, 0, 0}, {193, 0, 0}, {191, 0, 0}, {190, 0, 0}, | |
{189, 0, 0}, {188, 0, 0}, {186, 0, 0}, {185, 0, 0}, {184, 0, 0}, | |
{183, 0, 0}, {181, 0, 0}, {180, 0, 0}, {179, 0, 0}, {178, 0, 0}, | |
{176, 0, 0}, {175, 0, 0}, {174, 0, 0}, {173, 0, 0}, {171, 0, 0}, | |
{170, 0, 0}, {169, 0, 0}, {168, 0, 0}, {166, 0, 0}, {165, 0, 0}, | |
{164, 0, 0}, {163, 0, 0}, {161, 0, 0}, {160, 0, 0}, {159, 0, 0}, | |
{158, 0, 0}, {157, 0, 0}, {156, 0, 0}, {154, 0, 0}, {153, 0, 0}, | |
{152, 0, 0}, {151, 0, 0}, {150, 0, 0}, {148, 0, 0}, {147, 0, 0}, | |
{146, 0, 0}, {145, 0, 0}, {143, 0, 0}, {142, 0, 0}, {141, 0, 0}, | |
{140, 0, 0}, {138, 0, 0}, {137, 0, 0}, {136, 0, 0}, {135, 0, 0}, | |
{134, 0, 0}, {133, 0, 0}, {133, 0, 0}, {132, 0, 0}, {131, 0, 0}, | |
{130, 0, 0}, {129, 0, 0}, {129, 0, 0}, {128, 0, 0}, {127, 0, 0}, | |
{122, 0, 9}, {117, 0, 18}, {112, 0, 27}, {107, 0, 36}, {102, 0, 45} | |
}; | |
const rgb_t prism_colormap[1000] = { | |
{255, 0, 0}, {255, 2, 0}, {255, 4, 0}, {255, 6, 0}, {255, 8, 0}, | |
{255, 10, 0}, {255, 11, 0}, {255, 13, 0}, {255, 15, 0}, {255, 17, 0}, | |
{255, 19, 0}, {255, 21, 0}, {255, 23, 0}, {255, 25, 0}, {255, 27, 0}, | |
{255, 29, 0}, {255, 31, 0}, {255, 33, 0}, {255, 34, 0}, {255, 36, 0}, | |
{255, 38, 0}, {255, 40, 0}, {255, 42, 0}, {255, 44, 0}, {255, 46, 0}, | |
{255, 48, 0}, {255, 50, 0}, {255, 52, 0}, {255, 54, 0}, {255, 56, 0}, | |
{255, 57, 0}, {255, 59, 0}, {255, 61, 0}, {255, 63, 0}, {255, 65, 0}, | |
{255, 67, 0}, {255, 69, 0}, {255, 71, 0}, {255, 73, 0}, {255, 75, 0}, | |
{255, 77, 0}, {255, 78, 0}, {255, 80, 0}, {255, 82, 0}, {255, 84, 0}, | |
{255, 86, 0}, {255, 88, 0}, {255, 90, 0}, {255, 92, 0}, {255, 94, 0}, | |
{255, 96, 0}, {255, 98, 0}, {255, 100, 0}, {255, 101, 0}, {255, 103, 0}, | |
{255, 105, 0}, {255, 107, 0}, {255, 109, 0}, {255, 111, 0}, {255, 113, 0}, | |
{255, 115, 0}, {255, 117, 0}, {255, 119, 0}, {255, 121, 0}, {255, 123, 0}, | |
{255, 124, 0}, {255, 126, 0}, {255, 128, 0}, {255, 130, 0}, {255, 132, 0}, | |
{255, 134, 0}, {255, 136, 0}, {255, 138, 0}, {255, 140, 0}, {255, 142, 0}, | |
{255, 144, 0}, {255, 145, 0}, {255, 147, 0}, {255, 149, 0}, {255, 151, 0}, | |
{255, 153, 0}, {255, 155, 0}, {255, 157, 0}, {255, 159, 0}, {255, 161, 0}, | |
{255, 163, 0}, {255, 165, 0}, {255, 167, 0}, {255, 168, 0}, {255, 170, 0}, | |
{255, 172, 0}, {255, 174, 0}, {255, 176, 0}, {255, 178, 0}, {255, 180, 0}, | |
{255, 182, 0}, {255, 184, 0}, {255, 186, 0}, {255, 188, 0}, {255, 190, 0}, | |
{255, 191, 0}, {255, 193, 0}, {255, 195, 0}, {255, 197, 0}, {255, 199, 0}, | |
{255, 201, 0}, {255, 203, 0}, {255, 205, 0}, {255, 207, 0}, {255, 209, 0}, | |
{255, 211, 0}, {255, 212, 0}, {255, 214, 0}, {255, 216, 0}, {255, 218, 0}, | |
{255, 220, 0}, {255, 222, 0}, {255, 224, 0}, {255, 226, 0}, {255, 228, 0}, | |
{255, 230, 0}, {255, 232, 0}, {255, 234, 0}, {255, 235, 0}, {255, 237, 0}, | |
{255, 239, 0}, {255, 241, 0}, {255, 243, 0}, {255, 245, 0}, {255, 247, 0}, | |
{255, 249, 0}, {255, 251, 0}, {255, 253, 0}, {255, 255, 0}, {252, 255, 0}, | |
{248, 255, 0}, {244, 255, 0}, {240, 255, 0}, {237, 255, 0}, {233, 255, 0}, | |
{229, 255, 0}, {225, 255, 0}, {221, 255, 0}, {217, 255, 0}, {214, 255, 0}, | |
{210, 255, 0}, {206, 255, 0}, {202, 255, 0}, {198, 255, 0}, {195, 255, 0}, | |
{191, 255, 0}, {187, 255, 0}, {183, 255, 0}, {179, 255, 0}, {175, 255, 0}, | |
{172, 255, 0}, {168, 255, 0}, {164, 255, 0}, {160, 255, 0}, {156, 255, 0}, | |
{152, 255, 0}, {149, 255, 0}, {145, 255, 0}, {141, 255, 0}, {137, 255, 0}, | |
{133, 255, 0}, {129, 255, 0}, {126, 255, 0}, {122, 255, 0}, {118, 255, 0}, | |
{114, 255, 0}, {110, 255, 0}, {106, 255, 0}, {103, 255, 0}, { 99, 255, 0}, | |
{ 95, 255, 0}, { 91, 255, 0}, { 87, 255, 0}, { 83, 255, 0}, { 80, 255, 0}, | |
{ 76, 255, 0}, { 72, 255, 0}, { 68, 255, 0}, { 64, 255, 0}, { 60, 255, 0}, | |
{ 57, 255, 0}, { 53, 255, 0}, { 49, 255, 0}, { 45, 255, 0}, { 41, 255, 0}, | |
{ 38, 255, 0}, { 34, 255, 0}, { 30, 255, 0}, { 26, 255, 0}, { 22, 255, 0}, | |
{ 18, 255, 0}, { 15, 255, 0}, { 11, 255, 0}, { 7, 255, 0}, { 3, 255, 0}, | |
{ 0, 254, 1}, { 0, 250, 5}, { 0, 247, 8}, { 0, 243, 12}, { 0, 239, 16}, | |
{ 0, 235, 20}, { 0, 231, 24}, { 0, 227, 28}, { 0, 224, 31}, { 0, 220, 35}, | |
{ 0, 216, 39}, { 0, 212, 43}, { 0, 208, 47}, { 0, 204, 51}, { 0, 201, 54}, | |
{ 0, 197, 58}, { 0, 193, 62}, { 0, 189, 66}, { 0, 185, 70}, { 0, 181, 74}, | |
{ 0, 178, 77}, { 0, 174, 81}, { 0, 170, 85}, { 0, 166, 89}, { 0, 162, 93}, | |
{ 0, 159, 96}, { 0, 155, 100}, { 0, 151, 104}, { 0, 147, 108}, { 0, 143, 112}, | |
{ 0, 139, 116}, { 0, 136, 119}, { 0, 132, 123}, { 0, 128, 127}, { 0, 124, 131}, | |
{ 0, 120, 135}, { 0, 116, 139}, { 0, 113, 142}, { 0, 109, 146}, { 0, 105, 150}, | |
{ 0, 101, 154}, { 0, 97, 158}, { 0, 93, 162}, { 0, 90, 165}, { 0, 86, 169}, | |
{ 0, 82, 173}, { 0, 78, 177}, { 0, 74, 181}, { 0, 70, 185}, { 0, 67, 188}, | |
{ 0, 63, 192}, { 0, 59, 196}, { 0, 55, 200}, { 0, 51, 204}, { 0, 47, 208}, | |
{ 0, 44, 211}, { 0, 40, 215}, { 0, 36, 219}, { 0, 32, 223}, { 0, 28, 227}, | |
{ 0, 25, 230}, { 0, 21, 234}, { 0, 17, 238}, { 0, 13, 242}, { 0, 9, 246}, | |
{ 0, 5, 250}, { 0, 2, 253}, { 2, 0, 255}, { 4, 0, 255}, { 7, 0, 255}, | |
{ 9, 0, 255}, { 12, 0, 255}, { 14, 0, 255}, { 17, 0, 255}, { 19, 0, 255}, | |
{ 22, 0, 255}, { 25, 0, 255}, { 27, 0, 255}, { 30, 0, 255}, { 32, 0, 255}, | |
{ 35, 0, 255}, { 37, 0, 255}, { 40, 0, 255}, { 42, 0, 255}, { 45, 0, 255}, | |
{ 47, 0, 255}, { 50, 0, 255}, { 53, 0, 255}, { 55, 0, 255}, { 58, 0, 255}, | |
{ 60, 0, 255}, { 63, 0, 255}, { 65, 0, 255}, { 68, 0, 255}, { 70, 0, 255}, | |
{ 73, 0, 255}, { 76, 0, 255}, { 78, 0, 255}, { 81, 0, 255}, { 83, 0, 255}, | |
{ 86, 0, 255}, { 88, 0, 255}, { 91, 0, 255}, { 93, 0, 255}, { 96, 0, 255}, | |
{ 99, 0, 255}, {101, 0, 255}, {104, 0, 255}, {106, 0, 255}, {109, 0, 255}, | |
{111, 0, 255}, {114, 0, 255}, {116, 0, 255}, {119, 0, 255}, {122, 0, 255}, | |
{124, 0, 255}, {127, 0, 255}, {129, 0, 255}, {132, 0, 255}, {134, 0, 255}, | |
{137, 0, 255}, {139, 0, 255}, {142, 0, 255}, {144, 0, 255}, {147, 0, 255}, | |
{150, 0, 255}, {152, 0, 255}, {155, 0, 255}, {157, 0, 255}, {160, 0, 255}, | |
{162, 0, 255}, {165, 0, 255}, {167, 0, 255}, {170, 0, 255}, {171, 0, 251}, | |
{173, 0, 247}, {174, 0, 244}, {175, 0, 240}, {176, 0, 236}, {178, 0, 232}, | |
{179, 0, 228}, {180, 0, 224}, {181, 0, 221}, {183, 0, 217}, {184, 0, 213}, | |
{185, 0, 209}, {187, 0, 205}, {188, 0, 201}, {189, 0, 198}, {190, 0, 194}, | |
{192, 0, 190}, {193, 0, 186}, {194, 0, 182}, {196, 0, 178}, {197, 0, 175}, | |
{198, 0, 171}, {199, 0, 167}, {201, 0, 163}, {202, 0, 159}, {203, 0, 155}, | |
{204, 0, 152}, {206, 0, 148}, {207, 0, 144}, {208, 0, 140}, {210, 0, 136}, | |
{211, 0, 132}, {212, 0, 129}, {213, 0, 125}, {215, 0, 121}, {216, 0, 117}, | |
{217, 0, 113}, {218, 0, 110}, {220, 0, 106}, {221, 0, 102}, {222, 0, 98}, | |
{224, 0, 94}, {225, 0, 90}, {226, 0, 87}, {227, 0, 83}, {229, 0, 79}, | |
{230, 0, 75}, {231, 0, 71}, {233, 0, 67}, {234, 0, 64}, {235, 0, 60}, | |
{236, 0, 56}, {238, 0, 52}, {239, 0, 48}, {240, 0, 44}, {241, 0, 41}, | |
{243, 0, 37}, {244, 0, 33}, {245, 0, 29}, {247, 0, 25}, {248, 0, 21}, | |
{249, 0, 18}, {250, 0, 14}, {252, 0, 10}, {253, 0, 6}, {254, 0, 2}, | |
{255, 1, 0}, {255, 3, 0}, {255, 5, 0}, {255, 7, 0}, {255, 8, 0}, | |
{255, 10, 0}, {255, 12, 0}, {255, 14, 0}, {255, 16, 0}, {255, 18, 0}, | |
{255, 20, 0}, {255, 22, 0}, {255, 24, 0}, {255, 26, 0}, {255, 28, 0}, | |
{255, 29, 0}, {255, 31, 0}, {255, 33, 0}, {255, 35, 0}, {255, 37, 0}, | |
{255, 39, 0}, {255, 41, 0}, {255, 43, 0}, {255, 45, 0}, {255, 47, 0}, | |
{255, 49, 0}, {255, 51, 0}, {255, 52, 0}, {255, 54, 0}, {255, 56, 0}, | |
{255, 58, 0}, {255, 60, 0}, {255, 62, 0}, {255, 64, 0}, {255, 66, 0}, | |
{255, 68, 0}, {255, 70, 0}, {255, 72, 0}, {255, 74, 0}, {255, 75, 0}, | |
{255, 77, 0}, {255, 79, 0}, {255, 81, 0}, {255, 83, 0}, {255, 85, 0}, | |
{255, 87, 0}, {255, 89, 0}, {255, 91, 0}, {255, 93, 0}, {255, 95, 0}, | |
{255, 96, 0}, {255, 98, 0}, {255, 100, 0}, {255, 102, 0}, {255, 104, 0}, | |
{255, 106, 0}, {255, 108, 0}, {255, 110, 0}, {255, 112, 0}, {255, 114, 0}, | |
{255, 116, 0}, {255, 118, 0}, {255, 119, 0}, {255, 121, 0}, {255, 123, 0}, | |
{255, 125, 0}, {255, 127, 0}, {255, 129, 0}, {255, 131, 0}, {255, 133, 0}, | |
{255, 135, 0}, {255, 137, 0}, {255, 139, 0}, {255, 141, 0}, {255, 142, 0}, | |
{255, 144, 0}, {255, 146, 0}, {255, 148, 0}, {255, 150, 0}, {255, 152, 0}, | |
{255, 154, 0}, {255, 156, 0}, {255, 158, 0}, {255, 160, 0}, {255, 162, 0}, | |
{255, 163, 0}, {255, 165, 0}, {255, 167, 0}, {255, 169, 0}, {255, 171, 0}, | |
{255, 173, 0}, {255, 175, 0}, {255, 177, 0}, {255, 179, 0}, {255, 181, 0}, | |
{255, 183, 0}, {255, 185, 0}, {255, 186, 0}, {255, 188, 0}, {255, 190, 0}, | |
{255, 192, 0}, {255, 194, 0}, {255, 196, 0}, {255, 198, 0}, {255, 200, 0}, | |
{255, 202, 0}, {255, 204, 0}, {255, 206, 0}, {255, 208, 0}, {255, 209, 0}, | |
{255, 211, 0}, {255, 213, 0}, {255, 215, 0}, {255, 217, 0}, {255, 219, 0}, | |
{255, 221, 0}, {255, 223, 0}, {255, 225, 0}, {255, 227, 0}, {255, 229, 0}, | |
{255, 230, 0}, {255, 232, 0}, {255, 234, 0}, {255, 236, 0}, {255, 238, 0}, | |
{255, 240, 0}, {255, 242, 0}, {255, 244, 0}, {255, 246, 0}, {255, 248, 0}, | |
{255, 250, 0}, {255, 252, 0}, {255, 253, 0}, {254, 255, 0}, {250, 255, 0}, | |
{247, 255, 0}, {243, 255, 0}, {239, 255, 0}, {235, 255, 0}, {231, 255, 0}, | |
{227, 255, 0}, {224, 255, 0}, {220, 255, 0}, {216, 255, 0}, {212, 255, 0}, | |
{208, 255, 0}, {204, 255, 0}, {201, 255, 0}, {197, 255, 0}, {193, 255, 0}, | |
{189, 255, 0}, {185, 255, 0}, {181, 255, 0}, {178, 255, 0}, {174, 255, 0}, | |
{170, 255, 0}, {166, 255, 0}, {162, 255, 0}, {159, 255, 0}, {155, 255, 0}, | |
{151, 255, 0}, {147, 255, 0}, {143, 255, 0}, {139, 255, 0}, {136, 255, 0}, | |
{132, 255, 0}, {128, 255, 0}, {124, 255, 0}, {120, 255, 0}, {116, 255, 0}, | |
{113, 255, 0}, {109, 255, 0}, {105, 255, 0}, {101, 255, 0}, { 97, 255, 0}, | |
{ 93, 255, 0}, { 90, 255, 0}, { 86, 255, 0}, { 82, 255, 0}, { 78, 255, 0}, | |
{ 74, 255, 0}, { 70, 255, 0}, { 67, 255, 0}, { 63, 255, 0}, { 59, 255, 0}, | |
{ 55, 255, 0}, { 51, 255, 0}, { 47, 255, 0}, { 44, 255, 0}, { 40, 255, 0}, | |
{ 36, 255, 0}, { 32, 255, 0}, { 28, 255, 0}, { 25, 255, 0}, { 21, 255, 0}, | |
{ 17, 255, 0}, { 13, 255, 0}, { 9, 255, 0}, { 5, 255, 0}, { 2, 255, 0}, | |
{ 0, 253, 2}, { 0, 249, 6}, { 0, 245, 10}, { 0, 241, 14}, { 0, 237, 18}, | |
{ 0, 234, 21}, { 0, 230, 25}, { 0, 226, 29}, { 0, 222, 33}, { 0, 218, 37}, | |
{ 0, 214, 41}, { 0, 211, 44}, { 0, 207, 48}, { 0, 203, 52}, { 0, 199, 56}, | |
{ 0, 195, 60}, { 0, 191, 64}, { 0, 188, 67}, { 0, 184, 71}, { 0, 180, 75}, | |
{ 0, 176, 79}, { 0, 172, 83}, { 0, 168, 87}, { 0, 165, 90}, { 0, 161, 94}, | |
{ 0, 157, 98}, { 0, 153, 102}, { 0, 149, 106}, { 0, 145, 110}, { 0, 142, 113}, | |
{ 0, 138, 117}, { 0, 134, 121}, { 0, 130, 125}, { 0, 126, 129}, { 0, 123, 132}, | |
{ 0, 119, 136}, { 0, 115, 140}, { 0, 111, 144}, { 0, 107, 148}, { 0, 103, 152}, | |
{ 0, 100, 155}, { 0, 96, 159}, { 0, 92, 163}, { 0, 88, 167}, { 0, 84, 171}, | |
{ 0, 80, 175}, { 0, 77, 178}, { 0, 73, 182}, { 0, 69, 186}, { 0, 65, 190}, | |
{ 0, 61, 194}, { 0, 57, 198}, { 0, 54, 201}, { 0, 50, 205}, { 0, 46, 209}, | |
{ 0, 42, 213}, { 0, 38, 217}, { 0, 34, 221}, { 0, 31, 224}, { 0, 27, 228}, | |
{ 0, 23, 232}, { 0, 19, 236}, { 0, 15, 240}, { 0, 11, 244}, { 0, 8, 247}, | |
{ 0, 4, 251}, { 0, 0, 255}, { 3, 0, 255}, { 5, 0, 255}, { 8, 0, 255}, | |
{ 10, 0, 255}, { 13, 0, 255}, { 15, 0, 255}, { 18, 0, 255}, { 20, 0, 255}, | |
{ 23, 0, 255}, { 26, 0, 255}, { 28, 0, 255}, { 31, 0, 255}, { 33, 0, 255}, | |
{ 36, 0, 255}, { 38, 0, 255}, { 41, 0, 255}, { 43, 0, 255}, { 46, 0, 255}, | |
{ 48, 0, 255}, { 51, 0, 255}, { 54, 0, 255}, { 56, 0, 255}, { 59, 0, 255}, | |
{ 61, 0, 255}, { 64, 0, 255}, { 66, 0, 255}, { 69, 0, 255}, { 71, 0, 255}, | |
{ 74, 0, 255}, { 77, 0, 255}, { 79, 0, 255}, { 82, 0, 255}, { 84, 0, 255}, | |
{ 87, 0, 255}, { 89, 0, 255}, { 92, 0, 255}, { 94, 0, 255}, { 97, 0, 255}, | |
{100, 0, 255}, {102, 0, 255}, {105, 0, 255}, {107, 0, 255}, {110, 0, 255}, | |
{112, 0, 255}, {115, 0, 255}, {117, 0, 255}, {120, 0, 255}, {123, 0, 255}, | |
{125, 0, 255}, {128, 0, 255}, {130, 0, 255}, {133, 0, 255}, {135, 0, 255}, | |
{138, 0, 255}, {140, 0, 255}, {143, 0, 255}, {145, 0, 255}, {148, 0, 255}, | |
{151, 0, 255}, {153, 0, 255}, {156, 0, 255}, {158, 0, 255}, {161, 0, 255}, | |
{163, 0, 255}, {166, 0, 255}, {168, 0, 255}, {171, 0, 253}, {172, 0, 250}, | |
{173, 0, 246}, {174, 0, 242}, {176, 0, 238}, {177, 0, 234}, {178, 0, 230}, | |
{179, 0, 227}, {181, 0, 223}, {182, 0, 219}, {183, 0, 215}, {185, 0, 211}, | |
{186, 0, 208}, {187, 0, 204}, {188, 0, 200}, {190, 0, 196}, {191, 0, 192}, | |
{192, 0, 188}, {193, 0, 185}, {195, 0, 181}, {196, 0, 177}, {197, 0, 173}, | |
{199, 0, 169}, {200, 0, 165}, {201, 0, 162}, {202, 0, 158}, {204, 0, 154}, | |
{205, 0, 150}, {206, 0, 146}, {208, 0, 142}, {209, 0, 139}, {210, 0, 135}, | |
{211, 0, 131}, {213, 0, 127}, {214, 0, 123}, {215, 0, 119}, {216, 0, 116}, | |
{218, 0, 112}, {219, 0, 108}, {220, 0, 104}, {222, 0, 100}, {223, 0, 96}, | |
{224, 0, 93}, {225, 0, 89}, {227, 0, 85}, {228, 0, 81}, {229, 0, 77}, | |
{230, 0, 74}, {232, 0, 70}, {233, 0, 66}, {234, 0, 62}, {236, 0, 58}, | |
{237, 0, 54}, {238, 0, 51}, {239, 0, 47}, {241, 0, 43}, {242, 0, 39}, | |
{243, 0, 35}, {245, 0, 31}, {246, 0, 28}, {247, 0, 24}, {248, 0, 20}, | |
{250, 0, 16}, {251, 0, 12}, {252, 0, 8}, {253, 0, 5}, {255, 0, 1}, | |
{255, 2, 0}, {255, 3, 0}, {255, 5, 0}, {255, 7, 0}, {255, 9, 0}, | |
{255, 11, 0}, {255, 13, 0}, {255, 15, 0}, {255, 17, 0}, {255, 19, 0}, | |
{255, 21, 0}, {255, 23, 0}, {255, 25, 0}, {255, 26, 0}, {255, 28, 0}, | |
{255, 30, 0}, {255, 32, 0}, {255, 34, 0}, {255, 36, 0}, {255, 38, 0}, | |
{255, 40, 0}, {255, 42, 0}, {255, 44, 0}, {255, 46, 0}, {255, 47, 0}, | |
{255, 49, 0}, {255, 51, 0}, {255, 53, 0}, {255, 55, 0}, {255, 57, 0}, | |
{255, 59, 0}, {255, 61, 0}, {255, 63, 0}, {255, 65, 0}, {255, 67, 0}, | |
{255, 69, 0}, {255, 70, 0}, {255, 72, 0}, {255, 74, 0}, {255, 76, 0}, | |
{255, 78, 0}, {255, 80, 0}, {255, 82, 0}, {255, 84, 0}, {255, 86, 0}, | |
{255, 88, 0}, {255, 90, 0}, {255, 92, 0}, {255, 93, 0}, {255, 95, 0}, | |
{255, 97, 0}, {255, 99, 0}, {255, 101, 0}, {255, 103, 0}, {255, 105, 0}, | |
{255, 107, 0}, {255, 109, 0}, {255, 111, 0}, {255, 113, 0}, {255, 114, 0}, | |
{255, 116, 0}, {255, 118, 0}, {255, 120, 0}, {255, 122, 0}, {255, 124, 0}, | |
{255, 126, 0}, {255, 128, 0}, {255, 130, 0}, {255, 132, 0}, {255, 134, 0}, | |
{255, 136, 0}, {255, 137, 0}, {255, 139, 0}, {255, 141, 0}, {255, 143, 0}, | |
{255, 145, 0}, {255, 147, 0}, {255, 149, 0}, {255, 151, 0}, {255, 153, 0}, | |
{255, 155, 0}, {255, 157, 0}, {255, 159, 0}, {255, 160, 0}, {255, 162, 0}, | |
{255, 164, 0}, {255, 166, 0}, {255, 168, 0}, {255, 170, 0}, {255, 172, 0}, | |
{255, 174, 0}, {255, 176, 0}, {255, 178, 0}, {255, 180, 0}, {255, 181, 0}, | |
{255, 183, 0}, {255, 185, 0}, {255, 187, 0}, {255, 189, 0}, {255, 191, 0}, | |
{255, 193, 0}, {255, 195, 0}, {255, 197, 0}, {255, 199, 0}, {255, 201, 0}, | |
{255, 203, 0}, {255, 204, 0}, {255, 206, 0}, {255, 208, 0}, {255, 210, 0}, | |
{255, 212, 0}, {255, 214, 0}, {255, 216, 0}, {255, 218, 0}, {255, 220, 0}, | |
{255, 222, 0}, {255, 224, 0}, {255, 226, 0}, {255, 227, 0}, {255, 229, 0}, | |
{255, 231, 0}, {255, 233, 0}, {255, 235, 0}, {255, 237, 0}, {255, 239, 0}, | |
{255, 241, 0}, {255, 243, 0}, {255, 245, 0}, {255, 247, 0}, {255, 248, 0}, | |
{255, 250, 0}, {255, 252, 0}, {255, 254, 0}, {253, 255, 0}, {249, 255, 0}, | |
{245, 255, 0}, {241, 255, 0}, {237, 255, 0}, {234, 255, 0}, {230, 255, 0}, | |
{226, 255, 0}, {222, 255, 0}, {218, 255, 0}, {214, 255, 0}, {211, 255, 0}, | |
{207, 255, 0}, {203, 255, 0}, {199, 255, 0}, {195, 255, 0}, {191, 255, 0}, | |
{188, 255, 0}, {184, 255, 0}, {180, 255, 0}, {176, 255, 0}, {172, 255, 0}, | |
{168, 255, 0}, {165, 255, 0}, {161, 255, 0}, {157, 255, 0}, {153, 255, 0}, | |
{149, 255, 0}, {145, 255, 0}, {142, 255, 0}, {138, 255, 0}, {134, 255, 0}, | |
{130, 255, 0}, {126, 255, 0}, {123, 255, 0}, {119, 255, 0}, {115, 255, 0}, | |
{111, 255, 0}, {107, 255, 0}, {103, 255, 0}, {100, 255, 0}, { 96, 255, 0}, | |
{ 92, 255, 0}, { 88, 255, 0}, { 84, 255, 0}, { 80, 255, 0}, { 77, 255, 0}, | |
{ 73, 255, 0}, { 69, 255, 0}, { 65, 255, 0}, { 61, 255, 0}, { 57, 255, 0}, | |
{ 54, 255, 0}, { 50, 255, 0}, { 46, 255, 0}, { 42, 255, 0}, { 38, 255, 0}, | |
{ 34, 255, 0}, { 31, 255, 0}, { 27, 255, 0}, { 23, 255, 0}, { 19, 255, 0}, | |
{ 15, 255, 0}, { 11, 255, 0}, { 8, 255, 0}, { 4, 255, 0}, { 0, 255, 0} | |
}; | |
const rgb_t vga_colormap[1000] = { | |
{255, 255, 255}, {254, 254, 254}, {253, 253, 253}, {252, 252, 252}, {251, 251, 251}, | |
{250, 250, 250}, {249, 249, 249}, {248, 248, 248}, {247, 247, 247}, {246, 246, 246}, | |
{245, 245, 245}, {244, 244, 244}, {244, 244, 244}, {243, 243, 243}, {242, 242, 242}, | |
{241, 241, 241}, {240, 240, 240}, {239, 239, 239}, {238, 238, 238}, {237, 237, 237}, | |
{236, 236, 236}, {235, 235, 235}, {234, 234, 234}, {233, 233, 233}, {232, 232, 232}, | |
{231, 231, 231}, {230, 230, 230}, {229, 229, 229}, {228, 228, 228}, {227, 227, 227}, | |
{226, 226, 226}, {225, 225, 225}, {224, 224, 224}, {223, 223, 223}, {222, 222, 222}, | |
{221, 221, 221}, {221, 221, 221}, {220, 220, 220}, {219, 219, 219}, {218, 218, 218}, | |
{217, 217, 217}, {216, 216, 216}, {215, 215, 215}, {214, 214, 214}, {213, 213, 213}, | |
{212, 212, 212}, {211, 211, 211}, {210, 210, 210}, {209, 209, 209}, {208, 208, 208}, | |
{207, 207, 207}, {206, 206, 206}, {205, 205, 205}, {204, 204, 204}, {203, 203, 203}, | |
{202, 202, 202}, {201, 201, 201}, {200, 200, 200}, {199, 199, 199}, {199, 199, 199}, | |
{198, 198, 198}, {197, 197, 197}, {196, 196, 196}, {195, 195, 195}, {194, 194, 194}, | |
{193, 193, 193}, {192, 192, 192}, {192, 190, 190}, {193, 187, 187}, {194, 184, 184}, | |
{195, 181, 181}, {195, 179, 179}, {196, 176, 176}, {197, 173, 173}, {198, 170, 170}, | |
{199, 167, 167}, {200, 164, 164}, {201, 161, 161}, {202, 159, 159}, {203, 156, 156}, | |
{204, 153, 153}, {205, 150, 150}, {206, 147, 147}, {207, 144, 144}, {208, 141, 141}, | |
{209, 138, 138}, {210, 136, 136}, {211, 133, 133}, {212, 130, 130}, {213, 127, 127}, | |
{214, 124, 124}, {215, 121, 121}, {216, 118, 118}, {217, 115, 115}, {217, 113, 113}, | |
{218, 110, 110}, {219, 107, 107}, {220, 104, 104}, {221, 101, 101}, {222, 98, 98}, | |
{223, 95, 95}, {224, 92, 92}, {225, 90, 90}, {226, 87, 87}, {227, 84, 84}, | |
{228, 81, 81}, {229, 78, 78}, {230, 75, 75}, {231, 72, 72}, {232, 69, 69}, | |
{233, 67, 67}, {234, 64, 64}, {235, 61, 61}, {236, 58, 58}, {237, 55, 55}, | |
{238, 52, 52}, {239, 49, 49}, {239, 47, 47}, {240, 44, 44}, {241, 41, 41}, | |
{242, 38, 38}, {243, 35, 35}, {244, 32, 32}, {245, 29, 29}, {246, 26, 26}, | |
{247, 24, 24}, {248, 21, 21}, {249, 18, 18}, {250, 15, 15}, {251, 12, 12}, | |
{252, 9, 9}, {253, 6, 6}, {254, 3, 3}, {255, 1, 1}, {255, 3, 0}, | |
{255, 7, 0}, {255, 11, 0}, {255, 15, 0}, {255, 18, 0}, {255, 22, 0}, | |
{255, 26, 0}, {255, 30, 0}, {255, 34, 0}, {255, 38, 0}, {255, 41, 0}, | |
{255, 45, 0}, {255, 49, 0}, {255, 53, 0}, {255, 57, 0}, {255, 60, 0}, | |
{255, 64, 0}, {255, 68, 0}, {255, 72, 0}, {255, 76, 0}, {255, 80, 0}, | |
{255, 83, 0}, {255, 87, 0}, {255, 91, 0}, {255, 95, 0}, {255, 99, 0}, | |
{255, 103, 0}, {255, 106, 0}, {255, 110, 0}, {255, 114, 0}, {255, 118, 0}, | |
{255, 122, 0}, {255, 126, 0}, {255, 129, 0}, {255, 133, 0}, {255, 137, 0}, | |
{255, 141, 0}, {255, 145, 0}, {255, 149, 0}, {255, 152, 0}, {255, 156, 0}, | |
{255, 160, 0}, {255, 164, 0}, {255, 168, 0}, {255, 172, 0}, {255, 175, 0}, | |
{255, 179, 0}, {255, 183, 0}, {255, 187, 0}, {255, 191, 0}, {255, 195, 0}, | |
{255, 198, 0}, {255, 202, 0}, {255, 206, 0}, {255, 210, 0}, {255, 214, 0}, | |
{255, 217, 0}, {255, 221, 0}, {255, 225, 0}, {255, 229, 0}, {255, 233, 0}, | |
{255, 237, 0}, {255, 240, 0}, {255, 244, 0}, {255, 248, 0}, {255, 252, 0}, | |
{254, 255, 0}, {250, 255, 0}, {247, 255, 0}, {243, 255, 0}, {239, 255, 0}, | |
{235, 255, 0}, {231, 255, 0}, {227, 255, 0}, {224, 255, 0}, {220, 255, 0}, | |
{216, 255, 0}, {212, 255, 0}, {208, 255, 0}, {204, 255, 0}, {201, 255, 0}, | |
{197, 255, 0}, {193, 255, 0}, {189, 255, 0}, {185, 255, 0}, {181, 255, 0}, | |
{178, 255, 0}, {174, 255, 0}, {170, 255, 0}, {166, 255, 0}, {162, 255, 0}, | |
{159, 255, 0}, {155, 255, 0}, {151, 255, 0}, {147, 255, 0}, {143, 255, 0}, | |
{139, 255, 0}, {136, 255, 0}, {132, 255, 0}, {128, 255, 0}, {124, 255, 0}, | |
{120, 255, 0}, {116, 255, 0}, {113, 255, 0}, {109, 255, 0}, {105, 255, 0}, | |
{101, 255, 0}, { 97, 255, 0}, { 93, 255, 0}, { 90, 255, 0}, { 86, 255, 0}, | |
{ 82, 255, 0}, { 78, 255, 0}, { 74, 255, 0}, { 70, 255, 0}, { 67, 255, 0}, | |
{ 63, 255, 0}, { 59, 255, 0}, { 55, 255, 0}, { 51, 255, 0}, { 47, 255, 0}, | |
{ 44, 255, 0}, { 40, 255, 0}, { 36, 255, 0}, { 32, 255, 0}, { 28, 255, 0}, | |
{ 25, 255, 0}, { 21, 255, 0}, { 17, 255, 0}, { 13, 255, 0}, { 9, 255, 0}, | |
{ 5, 255, 0}, { 2, 255, 0}, { 0, 255, 2}, { 0, 255, 6}, { 0, 255, 10}, | |
{ 0, 255, 14}, { 0, 255, 18}, { 0, 255, 21}, { 0, 255, 25}, { 0, 255, 29}, | |
{ 0, 255, 33}, { 0, 255, 37}, { 0, 255, 41}, { 0, 255, 44}, { 0, 255, 48}, | |
{ 0, 255, 52}, { 0, 255, 56}, { 0, 255, 60}, { 0, 255, 64}, { 0, 255, 67}, | |
{ 0, 255, 71}, { 0, 255, 75}, { 0, 255, 79}, { 0, 255, 83}, { 0, 255, 87}, | |
{ 0, 255, 90}, { 0, 255, 94}, { 0, 255, 98}, { 0, 255, 102}, { 0, 255, 106}, | |
{ 0, 255, 110}, { 0, 255, 113}, { 0, 255, 117}, { 0, 255, 121}, { 0, 255, 125}, | |
{ 0, 255, 129}, { 0, 255, 132}, { 0, 255, 136}, { 0, 255, 140}, { 0, 255, 144}, | |
{ 0, 255, 148}, { 0, 255, 152}, { 0, 255, 155}, { 0, 255, 159}, { 0, 255, 163}, | |
{ 0, 255, 167}, { 0, 255, 171}, { 0, 255, 175}, { 0, 255, 178}, { 0, 255, 182}, | |
{ 0, 255, 186}, { 0, 255, 190}, { 0, 255, 194}, { 0, 255, 198}, { 0, 255, 201}, | |
{ 0, 255, 205}, { 0, 255, 209}, { 0, 255, 213}, { 0, 255, 217}, { 0, 255, 221}, | |
{ 0, 255, 224}, { 0, 255, 228}, { 0, 255, 232}, { 0, 255, 236}, { 0, 255, 240}, | |
{ 0, 255, 244}, { 0, 255, 247}, { 0, 255, 251}, { 0, 255, 255}, { 0, 251, 255}, | |
{ 0, 247, 255}, { 0, 244, 255}, { 0, 240, 255}, { 0, 236, 255}, { 0, 232, 255}, | |
{ 0, 228, 255}, { 0, 224, 255}, { 0, 221, 255}, { 0, 217, 255}, { 0, 213, 255}, | |
{ 0, 209, 255}, { 0, 205, 255}, { 0, 201, 255}, { 0, 198, 255}, { 0, 194, 255}, | |
{ 0, 190, 255}, { 0, 186, 255}, { 0, 182, 255}, { 0, 178, 255}, { 0, 175, 255}, | |
{ 0, 171, 255}, { 0, 167, 255}, { 0, 163, 255}, { 0, 159, 255}, { 0, 155, 255}, | |
{ 0, 152, 255}, { 0, 148, 255}, { 0, 144, 255}, { 0, 140, 255}, { 0, 136, 255}, | |
{ 0, 132, 255}, { 0, 129, 255}, { 0, 125, 255}, { 0, 121, 255}, { 0, 117, 255}, | |
{ 0, 113, 255}, { 0, 110, 255}, { 0, 106, 255}, { 0, 102, 255}, { 0, 98, 255}, | |
{ 0, 94, 255}, { 0, 90, 255}, { 0, 87, 255}, { 0, 83, 255}, { 0, 79, 255}, | |
{ 0, 75, 255}, { 0, 71, 255}, { 0, 67, 255}, { 0, 64, 255}, { 0, 60, 255}, | |
{ 0, 56, 255}, { 0, 52, 255}, { 0, 48, 255}, { 0, 44, 255}, { 0, 41, 255}, | |
{ 0, 37, 255}, { 0, 33, 255}, { 0, 29, 255}, { 0, 25, 255}, { 0, 21, 255}, | |
{ 0, 18, 255}, { 0, 14, 255}, { 0, 10, 255}, { 0, 6, 255}, { 0, 2, 255}, | |
{ 2, 0, 255}, { 5, 0, 255}, { 9, 0, 255}, { 13, 0, 255}, { 17, 0, 255}, | |
{ 21, 0, 255}, { 25, 0, 255}, { 28, 0, 255}, { 32, 0, 255}, { 36, 0, 255}, | |
{ 40, 0, 255}, { 44, 0, 255}, { 47, 0, 255}, { 51, 0, 255}, { 55, 0, 255}, | |
{ 59, 0, 255}, { 63, 0, 255}, { 67, 0, 255}, { 70, 0, 255}, { 74, 0, 255}, | |
{ 78, 0, 255}, { 82, 0, 255}, { 86, 0, 255}, { 90, 0, 255}, { 93, 0, 255}, | |
{ 97, 0, 255}, {101, 0, 255}, {105, 0, 255}, {109, 0, 255}, {113, 0, 255}, | |
{116, 0, 255}, {120, 0, 255}, {124, 0, 255}, {128, 0, 255}, {132, 0, 255}, | |
{136, 0, 255}, {139, 0, 255}, {143, 0, 255}, {147, 0, 255}, {151, 0, 255}, | |
{155, 0, 255}, {159, 0, 255}, {162, 0, 255}, {166, 0, 255}, {170, 0, 255}, | |
{174, 0, 255}, {178, 0, 255}, {181, 0, 255}, {185, 0, 255}, {189, 0, 255}, | |
{193, 0, 255}, {197, 0, 255}, {201, 0, 255}, {204, 0, 255}, {208, 0, 255}, | |
{212, 0, 255}, {216, 0, 255}, {220, 0, 255}, {224, 0, 255}, {227, 0, 255}, | |
{231, 0, 255}, {235, 0, 255}, {239, 0, 255}, {243, 0, 255}, {247, 0, 255}, | |
{250, 0, 255}, {254, 0, 255}, {252, 0, 252}, {248, 0, 248}, {244, 0, 244}, | |
{240, 0, 240}, {237, 0, 237}, {233, 0, 233}, {229, 0, 229}, {225, 0, 225}, | |
{221, 0, 221}, {217, 0, 217}, {214, 0, 214}, {210, 0, 210}, {206, 0, 206}, | |
{202, 0, 202}, {198, 0, 198}, {195, 0, 195}, {191, 0, 191}, {187, 0, 187}, | |
{183, 0, 183}, {179, 0, 179}, {175, 0, 175}, {172, 0, 172}, {168, 0, 168}, | |
{164, 0, 164}, {160, 0, 160}, {156, 0, 156}, {152, 0, 152}, {149, 0, 149}, | |
{145, 0, 145}, {141, 0, 141}, {137, 0, 137}, {133, 0, 133}, {129, 0, 129}, | |
{126, 0, 126}, {122, 0, 122}, {118, 0, 118}, {114, 0, 114}, {110, 0, 110}, | |
{106, 0, 106}, {103, 0, 103}, { 99, 0, 99}, { 95, 0, 95}, { 91, 0, 91}, | |
{ 87, 0, 87}, { 83, 0, 83}, { 80, 0, 80}, { 76, 0, 76}, { 72, 0, 72}, | |
{ 68, 0, 68}, { 64, 0, 64}, { 60, 0, 60}, { 57, 0, 57}, { 53, 0, 53}, | |
{ 49, 0, 49}, { 45, 0, 45}, { 41, 0, 41}, { 38, 0, 38}, { 34, 0, 34}, | |
{ 30, 0, 30}, { 26, 0, 26}, { 22, 0, 22}, { 18, 0, 18}, { 15, 0, 15}, | |
{ 11, 0, 11}, { 7, 0, 7}, { 3, 0, 3}, { 0, 0, 0}, { 2, 2, 2}, | |
{ 4, 4, 4}, { 6, 6, 6}, { 8, 8, 8}, { 10, 10, 10}, { 12, 12, 12}, | |
{ 14, 14, 14}, { 16, 16, 16}, { 18, 18, 18}, { 20, 20, 20}, { 21, 21, 21}, | |
{ 23, 23, 23}, { 25, 25, 25}, { 27, 27, 27}, { 29, 29, 29}, { 31, 31, 31}, | |
{ 33, 33, 33}, { 35, 35, 35}, { 37, 37, 37}, { 39, 39, 39}, { 41, 41, 41}, | |
{ 43, 43, 43}, { 44, 44, 44}, { 46, 46, 46}, { 48, 48, 48}, { 50, 50, 50}, | |
{ 52, 52, 52}, { 54, 54, 54}, { 56, 56, 56}, { 58, 58, 58}, { 60, 60, 60}, | |
{ 62, 62, 62}, { 64, 64, 64}, { 65, 65, 65}, { 67, 67, 67}, { 69, 69, 69}, | |
{ 71, 71, 71}, { 73, 73, 73}, { 75, 75, 75}, { 77, 77, 77}, { 79, 79, 79}, | |
{ 81, 81, 81}, { 83, 83, 83}, { 85, 85, 85}, { 87, 87, 87}, { 88, 88, 88}, | |
{ 90, 90, 90}, { 92, 92, 92}, { 94, 94, 94}, { 96, 96, 96}, { 98, 98, 98}, | |
{100, 100, 100}, {102, 102, 102}, {104, 104, 104}, {106, 106, 106}, {108, 108, 108}, | |
{110, 110, 110}, {111, 111, 111}, {113, 113, 113}, {115, 115, 115}, {117, 117, 117}, | |
{119, 119, 119}, {121, 121, 121}, {123, 123, 123}, {125, 125, 125}, {127, 127, 127}, | |
{128, 126, 126}, {128, 124, 124}, {128, 123, 123}, {128, 121, 121}, {128, 119, 119}, | |
{128, 117, 117}, {128, 115, 115}, {128, 113, 113}, {128, 111, 111}, {128, 109, 109}, | |
{128, 107, 107}, {128, 105, 105}, {128, 103, 103}, {128, 101, 101}, {128, 100, 100}, | |
{128, 98, 98}, {128, 96, 96}, {128, 94, 94}, {128, 92, 92}, {128, 90, 90}, | |
{128, 88, 88}, {128, 86, 86}, {128, 84, 84}, {128, 82, 82}, {128, 80, 80}, | |
{128, 78, 78}, {128, 77, 77}, {128, 75, 75}, {128, 73, 73}, {128, 71, 71}, | |
{128, 69, 69}, {128, 67, 67}, {128, 65, 65}, {128, 63, 63}, {128, 61, 61}, | |
{128, 59, 59}, {128, 57, 57}, {128, 56, 56}, {128, 54, 54}, {128, 52, 52}, | |
{128, 50, 50}, {128, 48, 48}, {128, 46, 46}, {128, 44, 44}, {128, 42, 42}, | |
{128, 40, 40}, {128, 38, 38}, {128, 36, 36}, {128, 34, 34}, {128, 33, 33}, | |
{128, 31, 31}, {128, 29, 29}, {128, 27, 27}, {128, 25, 25}, {128, 23, 23}, | |
{128, 21, 21}, {128, 19, 19}, {128, 17, 17}, {128, 15, 15}, {128, 13, 13}, | |
{128, 11, 11}, {128, 10, 10}, {128, 8, 8}, {128, 6, 6}, {128, 4, 4}, | |
{128, 2, 2}, {128, 0, 0}, {128, 2, 0}, {128, 4, 0}, {128, 6, 0}, | |
{128, 8, 0}, {128, 10, 0}, {128, 11, 0}, {128, 13, 0}, {128, 15, 0}, | |
{128, 17, 0}, {128, 19, 0}, {128, 21, 0}, {128, 23, 0}, {128, 25, 0}, | |
{128, 27, 0}, {128, 29, 0}, {128, 31, 0}, {128, 33, 0}, {128, 34, 0}, | |
{128, 36, 0}, {128, 38, 0}, {128, 40, 0}, {128, 42, 0}, {128, 44, 0}, | |
{128, 46, 0}, {128, 48, 0}, {128, 50, 0}, {128, 52, 0}, {128, 54, 0}, | |
{128, 56, 0}, {128, 57, 0}, {128, 59, 0}, {128, 61, 0}, {128, 63, 0}, | |
{128, 65, 0}, {128, 67, 0}, {128, 69, 0}, {128, 71, 0}, {128, 73, 0}, | |
{128, 75, 0}, {128, 77, 0}, {128, 78, 0}, {128, 80, 0}, {128, 82, 0}, | |
{128, 84, 0}, {128, 86, 0}, {128, 88, 0}, {128, 90, 0}, {128, 92, 0}, | |
{128, 94, 0}, {128, 96, 0}, {128, 98, 0}, {128, 100, 0}, {128, 101, 0}, | |
{128, 103, 0}, {128, 105, 0}, {128, 107, 0}, {128, 109, 0}, {128, 111, 0}, | |
{128, 113, 0}, {128, 115, 0}, {128, 117, 0}, {128, 119, 0}, {128, 121, 0}, | |
{128, 123, 0}, {128, 124, 0}, {128, 126, 0}, {127, 128, 0}, {125, 128, 0}, | |
{123, 128, 0}, {121, 128, 0}, {119, 128, 0}, {117, 128, 0}, {115, 128, 0}, | |
{113, 128, 0}, {111, 128, 0}, {110, 128, 0}, {108, 128, 0}, {106, 128, 0}, | |
{104, 128, 0}, {102, 128, 0}, {100, 128, 0}, { 98, 128, 0}, { 96, 128, 0}, | |
{ 94, 128, 0}, { 92, 128, 0}, { 90, 128, 0}, { 88, 128, 0}, { 87, 128, 0}, | |
{ 85, 128, 0}, { 83, 128, 0}, { 81, 128, 0}, { 79, 128, 0}, { 77, 128, 0}, | |
{ 75, 128, 0}, { 73, 128, 0}, { 71, 128, 0}, { 69, 128, 0}, { 67, 128, 0}, | |
{ 65, 128, 0}, { 64, 128, 0}, { 62, 128, 0}, { 60, 128, 0}, { 58, 128, 0}, | |
{ 56, 128, 0}, { 54, 128, 0}, { 52, 128, 0}, { 50, 128, 0}, { 48, 128, 0}, | |
{ 46, 128, 0}, { 44, 128, 0}, { 43, 128, 0}, { 41, 128, 0}, { 39, 128, 0}, | |
{ 37, 128, 0}, { 35, 128, 0}, { 33, 128, 0}, { 31, 128, 0}, { 29, 128, 0}, | |
{ 27, 128, 0}, { 25, 128, 0}, { 23, 128, 0}, { 21, 128, 0}, { 20, 128, 0}, | |
{ 18, 128, 0}, { 16, 128, 0}, { 14, 128, 0}, { 12, 128, 0}, { 10, 128, 0}, | |
{ 8, 128, 0}, { 6, 128, 0}, { 4, 128, 0}, { 2, 128, 0}, { 0, 128, 0}, | |
{ 0, 128, 2}, { 0, 128, 3}, { 0, 128, 5}, { 0, 128, 7}, { 0, 128, 9}, | |
{ 0, 128, 11}, { 0, 128, 13}, { 0, 128, 15}, { 0, 128, 17}, { 0, 128, 19}, | |
{ 0, 128, 21}, { 0, 128, 23}, { 0, 128, 25}, { 0, 128, 26}, { 0, 128, 28}, | |
{ 0, 128, 30}, { 0, 128, 32}, { 0, 128, 34}, { 0, 128, 36}, { 0, 128, 38}, | |
{ 0, 128, 40}, { 0, 128, 42}, { 0, 128, 44}, { 0, 128, 46}, { 0, 128, 47}, | |
{ 0, 128, 49}, { 0, 128, 51}, { 0, 128, 53}, { 0, 128, 55}, { 0, 128, 57}, | |
{ 0, 128, 59}, { 0, 128, 61}, { 0, 128, 63}, { 0, 128, 65}, { 0, 128, 67}, | |
{ 0, 128, 69}, { 0, 128, 70}, { 0, 128, 72}, { 0, 128, 74}, { 0, 128, 76}, | |
{ 0, 128, 78}, { 0, 128, 80}, { 0, 128, 82}, { 0, 128, 84}, { 0, 128, 86}, | |
{ 0, 128, 88}, { 0, 128, 90}, { 0, 128, 92}, { 0, 128, 93}, { 0, 128, 95}, | |
{ 0, 128, 97}, { 0, 128, 99}, { 0, 128, 101}, { 0, 128, 103}, { 0, 128, 105}, | |
{ 0, 128, 107}, { 0, 128, 109}, { 0, 128, 111}, { 0, 128, 113}, { 0, 128, 114}, | |
{ 0, 128, 116}, { 0, 128, 118}, { 0, 128, 120}, { 0, 128, 122}, { 0, 128, 124}, | |
{ 0, 128, 126}, { 0, 127, 128}, { 0, 125, 128}, { 0, 123, 128}, { 0, 121, 128}, | |
{ 0, 119, 128}, { 0, 118, 128}, { 0, 116, 128}, { 0, 114, 128}, { 0, 112, 128}, | |
{ 0, 110, 128}, { 0, 108, 128}, { 0, 106, 128}, { 0, 104, 128}, { 0, 102, 128}, | |
{ 0, 100, 128}, { 0, 98, 128}, { 0, 96, 128}, { 0, 95, 128}, { 0, 93, 128}, | |
{ 0, 91, 128}, { 0, 89, 128}, { 0, 87, 128}, { 0, 85, 128}, { 0, 83, 128}, | |
{ 0, 81, 128}, { 0, 79, 128}, { 0, 77, 128}, { 0, 75, 128}, { 0, 74, 128}, | |
{ 0, 72, 128}, { 0, 70, 128}, { 0, 68, 128}, { 0, 66, 128}, { 0, 64, 128}, | |
{ 0, 62, 128}, { 0, 60, 128}, { 0, 58, 128}, { 0, 56, 128}, { 0, 54, 128}, | |
{ 0, 52, 128}, { 0, 51, 128}, { 0, 49, 128}, { 0, 47, 128}, { 0, 45, 128}, | |
{ 0, 43, 128}, { 0, 41, 128}, { 0, 39, 128}, { 0, 37, 128}, { 0, 35, 128}, | |
{ 0, 33, 128}, { 0, 31, 128}, { 0, 29, 128}, { 0, 28, 128}, { 0, 26, 128}, | |
{ 0, 24, 128}, { 0, 22, 128}, { 0, 20, 128}, { 0, 18, 128}, { 0, 16, 128}, | |
{ 0, 14, 128}, { 0, 12, 128}, { 0, 10, 128}, { 0, 8, 128}, { 0, 7, 128}, | |
{ 0, 5, 128}, { 0, 3, 128}, { 0, 1, 128}, { 1, 0, 128}, { 3, 0, 128}, | |
{ 5, 0, 128}, { 7, 0, 128}, { 9, 0, 128}, { 11, 0, 128}, { 13, 0, 128}, | |
{ 15, 0, 128}, { 16, 0, 128}, { 18, 0, 128}, { 20, 0, 128}, { 22, 0, 128}, | |
{ 24, 0, 128}, { 26, 0, 128}, { 28, 0, 128}, { 30, 0, 128}, { 32, 0, 128}, | |
{ 34, 0, 128}, { 36, 0, 128}, { 38, 0, 128}, { 39, 0, 128}, { 41, 0, 128}, | |
{ 43, 0, 128}, { 45, 0, 128}, { 47, 0, 128}, { 49, 0, 128}, { 51, 0, 128}, | |
{ 53, 0, 128}, { 55, 0, 128}, { 57, 0, 128}, { 59, 0, 128}, { 60, 0, 128}, | |
{ 62, 0, 128}, { 64, 0, 128}, { 66, 0, 128}, { 68, 0, 128}, { 70, 0, 128}, | |
{ 72, 0, 128}, { 74, 0, 128}, { 76, 0, 128}, { 78, 0, 128}, { 80, 0, 128}, | |
{ 82, 0, 128}, { 83, 0, 128}, { 85, 0, 128}, { 87, 0, 128}, { 89, 0, 128}, | |
{ 91, 0, 128}, { 93, 0, 128}, { 95, 0, 128}, { 97, 0, 128}, { 99, 0, 128}, | |
{101, 0, 128}, {103, 0, 128}, {105, 0, 128}, {106, 0, 128}, {108, 0, 128}, | |
{110, 0, 128}, {112, 0, 128}, {114, 0, 128}, {116, 0, 128}, {118, 0, 128}, | |
{120, 0, 128}, {122, 0, 128}, {124, 0, 128}, {126, 0, 128}, {128, 0, 128} | |
}; | |
const rgb_t yarg_colormap[1000] = { | |
{ 0, 0, 0}, { 0, 0, 0}, { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, | |
{ 1, 1, 1}, { 2, 2, 2}, { 2, 2, 2}, { 2, 2, 2}, { 2, 2, 2}, | |
{ 3, 3, 3}, { 3, 3, 3}, { 3, 3, 3}, { 3, 3, 3}, { 4, 4, 4}, | |
{ 4, 4, 4}, { 4, 4, 4}, { 4, 4, 4}, { 5, 5, 5}, { 5, 5, 5}, | |
{ 5, 5, 5}, { 5, 5, 5}, { 6, 6, 6}, { 6, 6, 6}, { 6, 6, 6}, | |
{ 6, 6, 6}, { 7, 7, 7}, { 7, 7, 7}, { 7, 7, 7}, { 7, 7, 7}, | |
{ 8, 8, 8}, { 8, 8, 8}, { 8, 8, 8}, { 8, 8, 8}, { 9, 9, 9}, | |
{ 9, 9, 9}, { 9, 9, 9}, { 9, 9, 9}, { 10, 10, 10}, { 10, 10, 10}, | |
{ 10, 10, 10}, { 10, 10, 10}, { 11, 11, 11}, { 11, 11, 11}, { 11, 11, 11}, | |
{ 11, 11, 11}, { 12, 12, 12}, { 12, 12, 12}, { 12, 12, 12}, { 13, 13, 13}, | |
{ 13, 13, 13}, { 13, 13, 13}, { 13, 13, 13}, { 14, 14, 14}, { 14, 14, 14}, | |
{ 14, 14, 14}, { 14, 14, 14}, { 15, 15, 15}, { 15, 15, 15}, { 15, 15, 15}, | |
{ 15, 15, 15}, { 16, 16, 16}, { 16, 16, 16}, { 16, 16, 16}, { 16, 16, 16}, | |
{ 17, 17, 17}, { 17, 17, 17}, { 17, 17, 17}, { 17, 17, 17}, { 18, 18, 18}, | |
{ 18, 18, 18}, { 18, 18, 18}, { 18, 18, 18}, { 19, 19, 19}, { 19, 19, 19}, | |
{ 19, 19, 19}, { 19, 19, 19}, { 20, 20, 20}, { 20, 20, 20}, { 20, 20, 20}, | |
{ 20, 20, 20}, { 21, 21, 21}, { 21, 21, 21}, { 21, 21, 21}, { 21, 21, 21}, | |
{ 22, 22, 22}, { 22, 22, 22}, { 22, 22, 22}, { 22, 22, 22}, { 23, 23, 23}, | |
{ 23, 23, 23}, { 23, 23, 23}, { 23, 23, 23}, { 24, 24, 24}, { 24, 24, 24}, | |
{ 24, 24, 24}, { 25, 25, 25}, { 25, 25, 25}, { 25, 25, 25}, { 25, 25, 25}, | |
{ 26, 26, 26}, { 26, 26, 26}, { 26, 26, 26}, { 26, 26, 26}, { 27, 27, 27}, | |
{ 27, 27, 27}, { 27, 27, 27}, { 27, 27, 27}, { 28, 28, 28}, { 28, 28, 28}, | |
{ 28, 28, 28}, { 28, 28, 28}, { 29, 29, 29}, { 29, 29, 29}, { 29, 29, 29}, | |
{ 29, 29, 29}, { 30, 30, 30}, { 30, 30, 30}, { 30, 30, 30}, { 30, 30, 30}, | |
{ 31, 31, 31}, { 31, 31, 31}, { 31, 31, 31}, { 31, 31, 31}, { 32, 32, 32}, | |
{ 32, 32, 32}, { 32, 32, 32}, { 32, 32, 32}, { 33, 33, 33}, { 33, 33, 33}, | |
{ 33, 33, 33}, { 33, 33, 33}, { 34, 34, 34}, { 34, 34, 34}, { 34, 34, 34}, | |
{ 34, 34, 34}, { 35, 35, 35}, { 35, 35, 35}, { 35, 35, 35}, { 35, 35, 35}, | |
{ 36, 36, 36}, { 36, 36, 36}, { 36, 36, 36}, { 37, 37, 37}, { 37, 37, 37}, | |
{ 37, 37, 37}, { 37, 37, 37}, { 38, 38, 38}, { 38, 38, 38}, { 38, 38, 38}, | |
{ 38, 38, 38}, { 39, 39, 39}, { 39, 39, 39}, { 39, 39, 39}, { 39, 39, 39}, | |
{ 40, 40, 40}, { 40, 40, 40}, { 40, 40, 40}, { 40, 40, 40}, { 41, 41, 41}, | |
{ 41, 41, 41}, { 41, 41, 41}, { 41, 41, 41}, { 42, 42, 42}, { 42, 42, 42}, | |
{ 42, 42, 42}, { 42, 42, 42}, { 43, 43, 43}, { 43, 43, 43}, { 43, 43, 43}, | |
{ 43, 43, 43}, { 44, 44, 44}, { 44, 44, 44}, { 44, 44, 44}, { 44, 44, 44}, | |
{ 45, 45, 45}, { 45, 45, 45}, { 45, 45, 45}, { 45, 45, 45}, { 46, 46, 46}, | |
{ 46, 46, 46}, { 46, 46, 46}, { 46, 46, 46}, { 47, 47, 47}, { 47, 47, 47}, | |
{ 47, 47, 47}, { 47, 47, 47}, { 48, 48, 48}, { 48, 48, 48}, { 48, 48, 48}, | |
{ 48, 48, 48}, { 49, 49, 49}, { 49, 49, 49}, { 49, 49, 49}, { 50, 50, 50}, | |
{ 50, 50, 50}, { 50, 50, 50}, { 50, 50, 50}, { 51, 51, 51}, { 51, 51, 51}, | |
{ 51, 51, 51}, { 51, 51, 51}, { 52, 52, 52}, { 52, 52, 52}, { 52, 52, 52}, | |
{ 52, 52, 52}, { 53, 53, 53}, { 53, 53, 53}, { 53, 53, 53}, { 53, 53, 53}, | |
{ 54, 54, 54}, { 54, 54, 54}, { 54, 54, 54}, { 54, 54, 54}, { 55, 55, 55}, | |
{ 55, 55, 55}, { 55, 55, 55}, { 55, 55, 55}, { 56, 56, 56}, { 56, 56, 56}, | |
{ 56, 56, 56}, { 56, 56, 56}, { 57, 57, 57}, { 57, 57, 57}, { 57, 57, 57}, | |
{ 57, 57, 57}, { 58, 58, 58}, { 58, 58, 58}, { 58, 58, 58}, { 58, 58, 58}, | |
{ 59, 59, 59}, { 59, 59, 59}, { 59, 59, 59}, { 59, 59, 59}, { 60, 60, 60}, | |
{ 60, 60, 60}, { 60, 60, 60}, { 60, 60, 60}, { 61, 61, 61}, { 61, 61, 61}, | |
{ 61, 61, 61}, { 62, 62, 62}, { 62, 62, 62}, { 62, 62, 62}, { 62, 62, 62}, | |
{ 63, 63, 63}, { 63, 63, 63}, { 63, 63, 63}, { 63, 63, 63}, { 64, 64, 64}, | |
{ 64, 64, 64}, { 64, 64, 64}, { 64, 64, 64}, { 65, 65, 65}, { 65, 65, 65}, | |
{ 65, 65, 65}, { 65, 65, 65}, { 66, 66, 66}, { 66, 66, 66}, { 66, 66, 66}, | |
{ 66, 66, 66}, { 67, 67, 67}, { 67, 67, 67}, { 67, 67, 67}, { 67, 67, 67}, | |
{ 68, 68, 68}, { 68, 68, 68}, { 68, 68, 68}, { 68, 68, 68}, { 69, 69, 69}, | |
{ 69, 69, 69}, { 69, 69, 69}, { 69, 69, 69}, { 70, 70, 70}, { 70, 70, 70}, | |
{ 70, 70, 70}, { 70, 70, 70}, { 71, 71, 71}, { 71, 71, 71}, { 71, 71, 71}, | |
{ 71, 71, 71}, { 72, 72, 72}, { 72, 72, 72}, { 72, 72, 72}, { 72, 72, 72}, | |
{ 73, 73, 73}, { 73, 73, 73}, { 73, 73, 73}, { 74, 74, 74}, { 74, 74, 74}, | |
{ 74, 74, 74}, { 74, 74, 74}, { 75, 75, 75}, { 75, 75, 75}, { 75, 75, 75}, | |
{ 75, 75, 75}, { 76, 76, 76}, { 76, 76, 76}, { 76, 76, 76}, { 76, 76, 76}, | |
{ 77, 77, 77}, { 77, 77, 77}, { 77, 77, 77}, { 77, 77, 77}, { 78, 78, 78}, | |
{ 78, 78, 78}, { 78, 78, 78}, { 78, 78, 78}, { 79, 79, 79}, { 79, 79, 79}, | |
{ 79, 79, 79}, { 79, 79, 79}, { 80, 80, 80}, { 80, 80, 80}, { 80, 80, 80}, | |
{ 80, 80, 80}, { 81, 81, 81}, { 81, 81, 81}, { 81, 81, 81}, { 81, 81, 81}, | |
{ 82, 82, 82}, { 82, 82, 82}, { 82, 82, 82}, { 82, 82, 82}, { 83, 83, 83}, | |
{ 83, 83, 83}, { 83, 83, 83}, { 83, 83, 83}, { 84, 84, 84}, { 84, 84, 84}, | |
{ 84, 84, 84}, { 84, 84, 84}, { 85, 85, 85}, { 85, 85, 85}, { 85, 85, 85}, | |
{ 86, 86, 86}, { 86, 86, 86}, { 86, 86, 86}, { 86, 86, 86}, { 87, 87, 87}, | |
{ 87, 87, 87}, { 87, 87, 87}, { 87, 87, 87}, { 88, 88, 88}, { 88, 88, 88}, | |
{ 88, 88, 88}, { 88, 88, 88}, { 89, 89, 89}, { 89, 89, 89}, { 89, 89, 89}, | |
{ 89, 89, 89}, { 90, 90, 90}, { 90, 90, 90}, { 90, 90, 90}, { 90, 90, 90}, | |
{ 91, 91, 91}, { 91, 91, 91}, { 91, 91, 91}, { 91, 91, 91}, { 92, 92, 92}, | |
{ 92, 92, 92}, { 92, 92, 92}, { 92, 92, 92}, { 93, 93, 93}, { 93, 93, 93}, | |
{ 93, 93, 93}, { 93, 93, 93}, { 94, 94, 94}, { 94, 94, 94}, { 94, 94, 94}, | |
{ 94, 94, 94}, { 95, 95, 95}, { 95, 95, 95}, { 95, 95, 95}, { 95, 95, 95}, | |
{ 96, 96, 96}, { 96, 96, 96}, { 96, 96, 96}, { 96, 96, 96}, { 97, 97, 97}, | |
{ 97, 97, 97}, { 97, 97, 97}, { 98, 98, 98}, { 98, 98, 98}, { 98, 98, 98}, | |
{ 98, 98, 98}, { 99, 99, 99}, { 99, 99, 99}, { 99, 99, 99}, { 99, 99, 99}, | |
{100, 100, 100}, {100, 100, 100}, {100, 100, 100}, {100, 100, 100}, {101, 101, 101}, | |
{101, 101, 101}, {101, 101, 101}, {101, 101, 101}, {102, 102, 102}, {102, 102, 102}, | |
{102, 102, 102}, {102, 102, 102}, {103, 103, 103}, {103, 103, 103}, {103, 103, 103}, | |
{103, 103, 103}, {104, 104, 104}, {104, 104, 104}, {104, 104, 104}, {104, 104, 104}, | |
{105, 105, 105}, {105, 105, 105}, {105, 105, 105}, {105, 105, 105}, {106, 106, 106}, | |
{106, 106, 106}, {106, 106, 106}, {106, 106, 106}, {107, 107, 107}, {107, 107, 107}, | |
{107, 107, 107}, {107, 107, 107}, {108, 108, 108}, {108, 108, 108}, {108, 108, 108}, | |
{108, 108, 108}, {109, 109, 109}, {109, 109, 109}, {109, 109, 109}, {110, 110, 110}, | |
{110, 110, 110}, {110, 110, 110}, {110, 110, 110}, {111, 111, 111}, {111, 111, 111}, | |
{111, 111, 111}, {111, 111, 111}, {112, 112, 112}, {112, 112, 112}, {112, 112, 112}, | |
{112, 112, 112}, {113, 113, 113}, {113, 113, 113}, {113, 113, 113}, {113, 113, 113}, | |
{114, 114, 114}, {114, 114, 114}, {114, 114, 114}, {114, 114, 114}, {115, 115, 115}, | |
{115, 115, 115}, {115, 115, 115}, {115, 115, 115}, {116, 116, 116}, {116, 116, 116}, | |
{116, 116, 116}, {116, 116, 116}, {117, 117, 117}, {117, 117, 117}, {117, 117, 117}, | |
{117, 117, 117}, {118, 118, 118}, {118, 118, 118}, {118, 118, 118}, {118, 118, 118}, | |
{119, 119, 119}, {119, 119, 119}, {119, 119, 119}, {119, 119, 119}, {120, 120, 120}, | |
{120, 120, 120}, {120, 120, 120}, {120, 120, 120}, {121, 121, 121}, {121, 121, 121}, | |
{121, 121, 121}, {122, 122, 122}, {122, 122, 122}, {122, 122, 122}, {122, 122, 122}, | |
{123, 123, 123}, {123, 123, 123}, {123, 123, 123}, {123, 123, 123}, {124, 124, 124}, | |
{124, 124, 124}, {124, 124, 124}, {124, 124, 124}, {125, 125, 125}, {125, 125, 125}, | |
{125, 125, 125}, {125, 125, 125}, {126, 126, 126}, {126, 126, 126}, {126, 126, 126}, | |
{126, 126, 126}, {127, 127, 127}, {127, 127, 127}, {127, 127, 127}, {127, 127, 127}, | |
{128, 128, 128}, {128, 128, 128}, {128, 128, 128}, {128, 128, 128}, {129, 129, 129}, | |
{129, 129, 129}, {129, 129, 129}, {129, 129, 129}, {130, 130, 130}, {130, 130, 130}, | |
{130, 130, 130}, {130, 130, 130}, {131, 131, 131}, {131, 131, 131}, {131, 131, 131}, | |
{131, 131, 131}, {132, 132, 132}, {132, 132, 132}, {132, 132, 132}, {132, 132, 132}, | |
{133, 133, 133}, {133, 133, 133}, {133, 133, 133}, {133, 133, 133}, {134, 134, 134}, | |
{134, 134, 134}, {134, 134, 134}, {135, 135, 135}, {135, 135, 135}, {135, 135, 135}, | |
{135, 135, 135}, {136, 136, 136}, {136, 136, 136}, {136, 136, 136}, {136, 136, 136}, | |
{137, 137, 137}, {137, 137, 137}, {137, 137, 137}, {137, 137, 137}, {138, 138, 138}, | |
{138, 138, 138}, {138, 138, 138}, {138, 138, 138}, {139, 139, 139}, {139, 139, 139}, | |
{139, 139, 139}, {139, 139, 139}, {140, 140, 140}, {140, 140, 140}, {140, 140, 140}, | |
{140, 140, 140}, {141, 141, 141}, {141, 141, 141}, {141, 141, 141}, {141, 141, 141}, | |
{142, 142, 142}, {142, 142, 142}, {142, 142, 142}, {142, 142, 142}, {143, 143, 143}, | |
{143, 143, 143}, {143, 143, 143}, {143, 143, 143}, {144, 144, 144}, {144, 144, 144}, | |
{144, 144, 144}, {144, 144, 144}, {145, 145, 145}, {145, 145, 145}, {145, 145, 145}, | |
{145, 145, 145}, {146, 146, 146}, {146, 146, 146}, {146, 146, 146}, {147, 147, 147}, | |
{147, 147, 147}, {147, 147, 147}, {147, 147, 147}, {148, 148, 148}, {148, 148, 148}, | |
{148, 148, 148}, {148, 148, 148}, {149, 149, 149}, {149, 149, 149}, {149, 149, 149}, | |
{149, 149, 149}, {150, 150, 150}, {150, 150, 150}, {150, 150, 150}, {150, 150, 150}, | |
{151, 151, 151}, {151, 151, 151}, {151, 151, 151}, {151, 151, 151}, {152, 152, 152}, | |
{152, 152, 152}, {152, 152, 152}, {152, 152, 152}, {153, 153, 153}, {153, 153, 153}, | |
{153, 153, 153}, {153, 153, 153}, {154, 154, 154}, {154, 154, 154}, {154, 154, 154}, | |
{154, 154, 154}, {155, 155, 155}, {155, 155, 155}, {155, 155, 155}, {155, 155, 155}, | |
{156, 156, 156}, {156, 156, 156}, {156, 156, 156}, {156, 156, 156}, {157, 157, 157}, | |
{157, 157, 157}, {157, 157, 157}, {157, 157, 157}, {158, 158, 158}, {158, 158, 158}, | |
{158, 158, 158}, {159, 159, 159}, {159, 159, 159}, {159, 159, 159}, {159, 159, 159}, | |
{160, 160, 160}, {160, 160, 160}, {160, 160, 160}, {160, 160, 160}, {161, 161, 161}, | |
{161, 161, 161}, {161, 161, 161}, {161, 161, 161}, {162, 162, 162}, {162, 162, 162}, | |
{162, 162, 162}, {162, 162, 162}, {163, 163, 163}, {163, 163, 163}, {163, 163, 163}, | |
{163, 163, 163}, {164, 164, 164}, {164, 164, 164}, {164, 164, 164}, {164, 164, 164}, | |
{165, 165, 165}, {165, 165, 165}, {165, 165, 165}, {165, 165, 165}, {166, 166, 166}, | |
{166, 166, 166}, {166, 166, 166}, {166, 166, 166}, {167, 167, 167}, {167, 167, 167}, | |
{167, 167, 167}, {167, 167, 167}, {168, 168, 168}, {168, 168, 168}, {168, 168, 168}, | |
{168, 168, 168}, {169, 169, 169}, {169, 169, 169}, {169, 169, 169}, {169, 169, 169}, | |
{170, 170, 170}, {170, 170, 170}, {170, 170, 170}, {171, 171, 171}, {171, 171, 171}, | |
{171, 171, 171}, {171, 171, 171}, {172, 172, 172}, {172, 172, 172}, {172, 172, 172}, | |
{172, 172, 172}, {173, 173, 173}, {173, 173, 173}, {173, 173, 173}, {173, 173, 173}, | |
{174, 174, 174}, {174, 174, 174}, {174, 174, 174}, {174, 174, 174}, {175, 175, 175}, | |
{175, 175, 175}, {175, 175, 175}, {175, 175, 175}, {176, 176, 176}, {176, 176, 176}, | |
{176, 176, 176}, {176, 176, 176}, {177, 177, 177}, {177, 177, 177}, {177, 177, 177}, | |
{177, 177, 177}, {178, 178, 178}, {178, 178, 178}, {178, 178, 178}, {178, 178, 178}, | |
{179, 179, 179}, {179, 179, 179}, {179, 179, 179}, {179, 179, 179}, {180, 180, 180}, | |
{180, 180, 180}, {180, 180, 180}, {180, 180, 180}, {181, 181, 181}, {181, 181, 181}, | |
{181, 181, 181}, {181, 181, 181}, {182, 182, 182}, {182, 182, 182}, {182, 182, 182}, | |
{183, 183, 183}, {183, 183, 183}, {183, 183, 183}, {183, 183, 183}, {184, 184, 184}, | |
{184, 184, 184}, {184, 184, 184}, {184, 184, 184}, {185, 185, 185}, {185, 185, 185}, | |
{185, 185, 185}, {185, 185, 185}, {186, 186, 186}, {186, 186, 186}, {186, 186, 186}, | |
{186, 186, 186}, {187, 187, 187}, {187, 187, 187}, {187, 187, 187}, {187, 187, 187}, | |
{188, 188, 188}, {188, 188, 188}, {188, 188, 188}, {188, 188, 188}, {189, 189, 189}, | |
{189, 189, 189}, {189, 189, 189}, {189, 189, 189}, {190, 190, 190}, {190, 190, 190}, | |
{190, 190, 190}, {190, 190, 190}, {191, 191, 191}, {191, 191, 191}, {191, 191, 191}, | |
{191, 191, 191}, {192, 192, 192}, {192, 192, 192}, {192, 192, 192}, {192, 192, 192}, | |
{193, 193, 193}, {193, 193, 193}, {193, 193, 193}, {193, 193, 193}, {194, 194, 194}, | |
{194, 194, 194}, {194, 194, 194}, {195, 195, 195}, {195, 195, 195}, {195, 195, 195}, | |
{195, 195, 195}, {196, 196, 196}, {196, 196, 196}, {196, 196, 196}, {196, 196, 196}, | |
{197, 197, 197}, {197, 197, 197}, {197, 197, 197}, {197, 197, 197}, {198, 198, 198}, | |
{198, 198, 198}, {198, 198, 198}, {198, 198, 198}, {199, 199, 199}, {199, 199, 199}, | |
{199, 199, 199}, {199, 199, 199}, {200, 200, 200}, {200, 200, 200}, {200, 200, 200}, | |
{200, 200, 200}, {201, 201, 201}, {201, 201, 201}, {201, 201, 201}, {201, 201, 201}, | |
{202, 202, 202}, {202, 202, 202}, {202, 202, 202}, {202, 202, 202}, {203, 203, 203}, | |
{203, 203, 203}, {203, 203, 203}, {203, 203, 203}, {204, 204, 204}, {204, 204, 204}, | |
{204, 204, 204}, {204, 204, 204}, {205, 205, 205}, {205, 205, 205}, {205, 205, 205}, | |
{205, 205, 205}, {206, 206, 206}, {206, 206, 206}, {206, 206, 206}, {207, 207, 207}, | |
{207, 207, 207}, {207, 207, 207}, {207, 207, 207}, {208, 208, 208}, {208, 208, 208}, | |
{208, 208, 208}, {208, 208, 208}, {209, 209, 209}, {209, 209, 209}, {209, 209, 209}, | |
{209, 209, 209}, {210, 210, 210}, {210, 210, 210}, {210, 210, 210}, {210, 210, 210}, | |
{211, 211, 211}, {211, 211, 211}, {211, 211, 211}, {211, 211, 211}, {212, 212, 212}, | |
{212, 212, 212}, {212, 212, 212}, {212, 212, 212}, {213, 213, 213}, {213, 213, 213}, | |
{213, 213, 213}, {213, 213, 213}, {214, 214, 214}, {214, 214, 214}, {214, 214, 214}, | |
{214, 214, 214}, {215, 215, 215}, {215, 215, 215}, {215, 215, 215}, {215, 215, 215}, | |
{216, 216, 216}, {216, 216, 216}, {216, 216, 216}, {216, 216, 216}, {217, 217, 217}, | |
{217, 217, 217}, {217, 217, 217}, {217, 217, 217}, {218, 218, 218}, {218, 218, 218}, | |
{218, 218, 218}, {218, 218, 218}, {219, 219, 219}, {219, 219, 219}, {219, 219, 219}, | |
{220, 220, 220}, {220, 220, 220}, {220, 220, 220}, {220, 220, 220}, {221, 221, 221}, | |
{221, 221, 221}, {221, 221, 221}, {221, 221, 221}, {222, 222, 222}, {222, 222, 222}, | |
{222, 222, 222}, {222, 222, 222}, {223, 223, 223}, {223, 223, 223}, {223, 223, 223}, | |
{223, 223, 223}, {224, 224, 224}, {224, 224, 224}, {224, 224, 224}, {224, 224, 224}, | |
{225, 225, 225}, {225, 225, 225}, {225, 225, 225}, {225, 225, 225}, {226, 226, 226}, | |
{226, 226, 226}, {226, 226, 226}, {226, 226, 226}, {227, 227, 227}, {227, 227, 227}, | |
{227, 227, 227}, {227, 227, 227}, {228, 228, 228}, {228, 228, 228}, {228, 228, 228}, | |
{228, 228, 228}, {229, 229, 229}, {229, 229, 229}, {229, 229, 229}, {229, 229, 229}, | |
{230, 230, 230}, {230, 230, 230}, {230, 230, 230}, {230, 230, 230}, {231, 231, 231}, | |
{231, 231, 231}, {231, 231, 231}, {232, 232, 232}, {232, 232, 232}, {232, 232, 232}, | |
{232, 232, 232}, {233, 233, 233}, {233, 233, 233}, {233, 233, 233}, {233, 233, 233}, | |
{234, 234, 234}, {234, 234, 234}, {234, 234, 234}, {234, 234, 234}, {235, 235, 235}, | |
{235, 235, 235}, {235, 235, 235}, {235, 235, 235}, {236, 236, 236}, {236, 236, 236}, | |
{236, 236, 236}, {236, 236, 236}, {237, 237, 237}, {237, 237, 237}, {237, 237, 237}, | |
{237, 237, 237}, {238, 238, 238}, {238, 238, 238}, {238, 238, 238}, {238, 238, 238}, | |
{239, 239, 239}, {239, 239, 239}, {239, 239, 239}, {239, 239, 239}, {240, 240, 240}, | |
{240, 240, 240}, {240, 240, 240}, {240, 240, 240}, {241, 241, 241}, {241, 241, 241}, | |
{241, 241, 241}, {241, 241, 241}, {242, 242, 242}, {242, 242, 242}, {242, 242, 242}, | |
{242, 242, 242}, {243, 243, 243}, {243, 243, 243}, {243, 243, 243}, {244, 244, 244}, | |
{244, 244, 244}, {244, 244, 244}, {244, 244, 244}, {245, 245, 245}, {245, 245, 245}, | |
{245, 245, 245}, {245, 245, 245}, {246, 246, 246}, {246, 246, 246}, {246, 246, 246}, | |
{246, 246, 246}, {247, 247, 247}, {247, 247, 247}, {247, 247, 247}, {247, 247, 247}, | |
{248, 248, 248}, {248, 248, 248}, {248, 248, 248}, {248, 248, 248}, {249, 249, 249}, | |
{249, 249, 249}, {249, 249, 249}, {249, 249, 249}, {250, 250, 250}, {250, 250, 250}, | |
{250, 250, 250}, {250, 250, 250}, {251, 251, 251}, {251, 251, 251}, {251, 251, 251}, | |
{251, 251, 251}, {252, 252, 252}, {252, 252, 252}, {252, 252, 252}, {252, 252, 252}, | |
{253, 253, 253}, {253, 253, 253}, {253, 253, 253}, {253, 253, 253}, {254, 254, 254}, | |
{254, 254, 254}, {254, 254, 254}, {254, 254, 254}, {255, 255, 255}, {255, 255, 255} | |
}; | |
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "BitmapLybrary.cpp" | |
#include <iostream> | |
#include <cmath> | |
#include <Windows.h> | |
#include <stdio.h> | |
#include <conio.h> | |
#include <stdlib.h> | |
#include <ctime> | |
#define DEBUG | |
void DrawingBitmap(HDC kuda, int whereX, int whereY, const std::string &NameFile, int width,int height) | |
{ | |
bitmap_image input(width, height); | |
input.clear();// если убрать эту строку, то рисует значительно меньше строк(но такой же бред) | |
input = bitmap_image(NameFile); | |
rgb_t perenos; | |
int i, j; | |
//выделение памяти под массив указателей на строки | |
COLORREF** Pixels = new COLORREF * [height]; | |
//выделение памяти под пиксели в строках | |
for (i = 0; i < height; i++) | |
{ | |
Pixels[i] = new COLORREF[width]; | |
} | |
#ifdef DEBUG | |
const rgb_t colormap[2] = {{ 0, 0, 0 },{255,0,0}}; | |
int counter = 0; | |
#endif | |
//CreateBitmap НУЖЕН ТРАНСПОРИРОВАННЫЙ МАССИВ ЦВЕТОВ( я это выяснил при работе с первой программой) | |
for (i = 0; i < height; i++) | |
{ | |
for (j = 0; j < width; j++) | |
{ | |
perenos = input.get_pixel(j, i); | |
#ifdef DEBUG | |
if (perenos == colormap[1]) | |
counter++; | |
#endif | |
Pixels[i][j] = RGB(perenos.red, perenos.green, perenos.blue); | |
} | |
} | |
//создал по взятому по номеру окну участок памяти, совместимый с устройством на который указывает hdcConsole | |
HDC memDC = CreateCompatibleDC(kuda); | |
//создаю HBITMAP идентификатор используя массив пикселей(указатель на начало в памяти), длину, ширину, количество цветовых | |
//плоскостей, количество бит на 1 пиксель | |
HBITMAP memBM = CreateBitmap(width, height, 1, 32, Pixels); | |
#ifdef DEBUG | |
std::cout << NameFile << std::endl; | |
//std::cout << counter << std::endl; | |
if (memDC == 0) | |
std::cout << "NET HDC" << std::endl; | |
if (memBM == 0) | |
std::cout << "NET HBITMAP" << std::endl; | |
#endif | |
(HBITMAP)SelectObject(memDC, memBM);//если убрть HBITMAP, то рисует меньше(ВТФ?) | |
// Для контекста памяти устанавливаем тот же режим отображения, что используется в контексте отображения | |
SetMapMode(memDC, GetMapMode(kuda)); | |
//рисую изображение | |
BitBlt(kuda, whereX, whereY, width, height, memDC, 0, 0, SRCCOPY);//kuda, whereX, whereY, width, height, memDC, 0, 0, SRCCOPY | |
// Восстанавливаем контекст памяти kuda, whereX, whereY, ptSize.x, ptSize.y, memDC, ptOrg.x, ptOrg.y, SRCCOPY | |
SelectObject(memDC, memBM); | |
// Удаляем контекст памяти | |
DeleteDC(memDC); | |
//освобождение памяти в строках | |
for (i=0;i<height;i++) | |
{ | |
delete[] Pixels[i]; | |
} | |
//освобождение памяти от массива указателей на строки | |
delete[] Pixels; | |
} | |
int main() | |
{ | |
//длина и ширина массива пикселей входного файла | |
const int x = 483; | |
const int y = 483; | |
//находим имя консоли и окно консоли по имени | |
char Title[1024]; | |
GetConsoleTitle(Title, 1024); | |
HWND hwndConsole = FindWindow(NULL, Title); | |
// взял окно по номеру | |
HDC hdcConsole = GetDC(hwndConsole); | |
int n=1, m=1; | |
while (n!=0) | |
{ | |
std::cout << "enter N please" << std::endl; | |
std::cin >> n; | |
std::cout << "enter M please" << std::endl; | |
std::cin >> m; | |
DrawingBitmap(hdcConsole, n, m, "GameMap1.bmp", x, y); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment