Move out palette code

This commit is contained in:
Alexander Kojevnikov 2012-08-17 22:19:18 -07:00
parent 8544a03c3c
commit 93b5dc79a7
5 changed files with 104 additions and 51 deletions

View File

@ -1,13 +1,14 @@
bin_PROGRAMS = spek
spek_SOURCES = \
spek.cc \
spek-audio.c \
spek-audio.h \
spek-audio-desc.cc \
spek-audio-desc.hh \
spek-audio.c \
spek-audio.h \
spek-fft.c \
spek-fft.h \
spek-palette.c \
spek-palette.h \
spek-pipeline.c \
spek-pipeline.h \
spek-platform.cc \
@ -19,7 +20,8 @@ spek_SOURCES = \
spek-spectrogram.cc \
spek-spectrogram.hh \
spek-window.cc \
spek-window.hh
spek-window.hh \
spek.cc
spek_CPPFLAGS = \
-include config.h \

61
src/spek-palette.c Normal file
View File

@ -0,0 +1,61 @@
/* spek-palette.c
*
* Copyright (C) 2010-2012 Alexander Kojevnikov <alexander@kojevnikov.com>
*
* Spek 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, either version 3 of the License, or
* (at your option) any later version.
*
* Spek 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 General Public License
* along with Spek. If not, see <http://www.gnu.org/licenses/>.
*/
#include "spek-palette.h"
// Modified version of Dan Bruton's algorithm:
// http://www.physics.sfasu.edu/astro/color/spectra.html
uint32_t spek_palette_spectrum(double level)
{
level *= 0.6625;
double r = 0.0, g = 0.0, b = 0.0;
if (level >= 0 && level < 0.15) {
r = (0.15 - level) / (0.15 + 0.075);
g = 0.0;
b = 1.0;
} else if (level >= 0.15 && level < 0.275) {
r = 0.0;
g = (level - 0.15) / (0.275 - 0.15);
b = 1.0;
} else if (level >= 0.275 && level < 0.325) {
r = 0.0;
g = 1.0;
b = (0.325 - level) / (0.325 - 0.275);
} else if (level >= 0.325 && level < 0.5) {
r = (level - 0.325) / (0.5 - 0.325);
g = 1.0;
b = 0.0;
} else if (level >= 0.5 && level < 0.6625) {
r = 1.0;
g = (0.6625 - level) / (0.6625 - 0.5f);
b = 0.0;
}
// Intensity correction.
double cf = 1.0;
if (level >= 0.0 && level < 0.1) {
cf = level / 0.1;
}
cf *= 255.0;
// Pack RGB values into a 32-bit uint.
uint32_t rr = (uint32_t) (r * cf + 0.5);
uint32_t gg = (uint32_t) (g * cf + 0.5);
uint32_t bb = (uint32_t) (b * cf + 0.5);
return (rr << 16) + (gg << 8) + bb;
}

34
src/spek-palette.h Normal file
View File

@ -0,0 +1,34 @@
/* spek-palette.h
*
* Copyright (C) 2010-2012 Alexander Kojevnikov <alexander@kojevnikov.com>
*
* Spek 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, either version 3 of the License, or
* (at your option) any later version.
*
* Spek 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 General Public License
* along with Spek. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SPEK_PALETTE_HH_
#define SPEK_PALETTE_HH_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
uint32_t spek_palette_spectrum(double level);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -21,6 +21,7 @@
#include "spek-audio.h"
#include "spek-audio-desc.hh"
#include "spek-palette.h"
#include "spek-pipeline.h"
#include "spek-platform.hh"
#include "spek-ruler.hh"
@ -58,7 +59,7 @@ SpekSpectrogram::SpekSpectrogram(wxFrame *parent) :
// Pre-draw the palette.
for (int y = 0; y < BANDS; y++) {
uint32_t color = get_color(y / (double) BANDS);
uint32_t color = spek_palette_spectrum(y / (double) BANDS);
this->palette.SetRGB(
wxRect(0, BANDS - y - 1, RULER, 1),
color >> 16,
@ -260,7 +261,7 @@ void SpekSpectrogram::pipeline_cb(int sample, float *values, void *cb_data)
for (int y = 0; y < BANDS; y++) {
double level = log10(1.0 - THRESHOLD + values[y]) / log10_threshold;
if (level > 1.0) level = 1.0;
uint32_t color = get_color(level);
uint32_t color = spek_palette_spectrum(level);
s->image.SetRGB(
sample,
BANDS - y - 1,
@ -307,46 +308,3 @@ void SpekSpectrogram::start()
Refresh();
}
// Modified version of Dan Bruton's algorithm:
// http://www.physics.sfasu.edu/astro/color/spectra.html
// TODO: Move out to a C function.
uint32_t SpekSpectrogram::get_color(double level)
{
level *= 0.6625;
double r = 0.0, g = 0.0, b = 0.0;
if (level >= 0 && level < 0.15) {
r = (0.15 - level) / (0.15 + 0.075);
g = 0.0;
b = 1.0;
} else if (level >= 0.15 && level < 0.275) {
r = 0.0;
g = (level - 0.15) / (0.275 - 0.15);
b = 1.0;
} else if (level >= 0.275 && level < 0.325) {
r = 0.0;
g = 1.0;
b = (0.325 - level) / (0.325 - 0.275);
} else if (level >= 0.325 && level < 0.5) {
r = (level - 0.325) / (0.5 - 0.325);
g = 1.0;
b = 0.0;
} else if (level >= 0.5 && level < 0.6625) {
r = 1.0;
g = (0.6625 - level) / (0.6625 - 0.5f);
b = 0.0;
}
// Intensity correction.
double cf = 1.0;
if (level >= 0.0 && level < 0.1) {
cf = level / 0.1;
}
cf *= 255.0;
// Pack RGB values into a 32-bit uint.
uint32_t rr = (uint32_t) (r * cf + 0.5);
uint32_t gg = (uint32_t) (g * cf + 0.5);
uint32_t bb = (uint32_t) (b * cf + 0.5);
return (rr << 16) + (gg << 8) + bb;
}

View File

@ -19,7 +19,6 @@
#ifndef SPEK_SPECTROGRAM_HH_
#define SPEK_SPECTROGRAM_HH_
#include <stdint.h>
#include <wx/wx.h>
struct spek_audio_properties;
@ -40,7 +39,6 @@ private:
void start();
static void pipeline_cb(int sample, float *values, void *cb_data);
static uint32_t get_color(double level);
spek_pipeline *pipeline;
const spek_audio_properties *properties;