BlinkenArea - GitList
Repositories
Blog
Wiki
libetherpix
Code
Commits
Branches
Tags
Search
Tree:
b320fb0
Branches
Tags
master
libetherpix
simulator
mapping.cpp
implement mapping table
Stefan Schuermans
commited
b320fb0
at 2017-06-11 13:35:25
mapping.cpp
Blame
History
Raw
/* * EtherPix simulator * * Copyright 2017 Stefan Schuermans <stefan schuermans info> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License. * * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <math.h> #include <stdint.h> #include "mapping.h" /// default constructor Mapping::Mapping(): m_base(1.0), m_factor(0.0), m_gamma(1.0) { update(); } /// constructor based on parameters Mapping::Mapping(double base, double factor, double gamma): m_base(base), m_factor(factor), m_gamma(gamma) { update(); } /// update internal mapping table based on parameters void Mapping::update() { /* mapping formula: * display := base + factor * video ** (1.0 / gamma) * display values are coming in via IPv4/UDP * simulator needs to show video values * video := ((display - base) / factor) ** gamma */ for (unsigned int display_i = 0; display_i < 256; ++display_i) { double display = (double)display_i / 255.0; double video = pow((display - m_base) / m_factor, m_gamma); uint8_t video_u8; if (video < 0.0) { video_u8 = 0; } else if (video > 1.0) { video_u8 = 255; } else { video_u8 = (uint8_t)round(255.0 * video); } m_display2video[display_i] = video_u8; } }