Code cleanups, commenting fixes, etc for Blargg-related code.

This commit is contained in:
Stephen Anthony 2017-07-05 14:11:41 -02:30
parent 6da07d8dc7
commit ea59fdd3f2
5 changed files with 63 additions and 89 deletions

View File

@ -66,8 +66,8 @@ void AtariNTSC::initializePalette(const uInt8* palette)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void AtariNTSC::blitSingle(const uInt8* atari_in, uInt32 in_width,
uInt32 in_height, void* rgb_out, uInt32 out_pitch)
void AtariNTSC::render(const uInt8* atari_in, uInt32 in_width,
uInt32 in_height, void* rgb_out, uInt32 out_pitch)
{
uInt32 const chunk_count = (in_width - 1) / PIXEL_in_chunk;
while ( in_height-- )
@ -146,38 +146,31 @@ void AtariNTSC::init(init_t& impl, const Setup& setup)
{
float hue = float(setup.hue) * PI + PI / 180 * ext_decoder_hue;
float sat = float(setup.saturation) + 1;
float const* decoder = setup.decoder_matrix;
if ( !decoder )
{
decoder = default_decoder;
hue += PI / 180 * (std_decoder_hue - ext_decoder_hue);
}
hue += PI / 180 * (std_decoder_hue - ext_decoder_hue);
{
float s = float(sin( hue )) * sat;
float c = float(cos( hue )) * sat;
float* out = impl.to_rgb;
int n;
float s = float(sin( hue )) * sat;
float c = float(cos( hue )) * sat;
float* out = impl.to_rgb;
int n;
n = burst_count;
n = burst_count;
do
{
float const* in = default_decoder;
int n2 = 3;
do
{
float const* in = decoder;
int n2 = 3;
do
{
float i = *in++;
float q = *in++;
*out++ = i * c - q * s;
*out++ = i * s + q * c;
}
while ( --n2 );
if ( burst_count <= 1 )
break;
ROTATE_IQ( s, c, 0.866025f, -0.5f ); /* +120 degrees */
float i = *in++;
float q = *in++;
*out++ = i * c - q * s;
*out++ = i * s + q * c;
}
while ( --n );
while ( --n2 );
if ( burst_count <= 1 )
break;
ROTATE_IQ( s, c, 0.866025f, -0.5f ); /* +120 degrees */
}
while ( --n );
}
}
@ -343,31 +336,22 @@ void AtariNTSC::genKernel(init_t& impl, float y, float i, float q, uInt32* out)
}
}
while ( alignment_count > 1 && --alignment_remain );
#if 0 // FIXME: dead code detected by Xcode
if ( burst_count <= 1 )
break;
to_rgb += 6;
ROTATE_IQ( i, q, -0.866025f, -0.5f ); /* -120 degrees */
#endif
}
while ( --burst_remain );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const AtariNTSC::Setup AtariNTSC::TV_Composite = {
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15, 0.0, 0.0, 0.0, 0
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15, 0.0, 0.0, 0.0
};
const AtariNTSC::Setup AtariNTSC::TV_SVideo = {
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.45, -1.0, -1.0, 0.0, 0
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.45, -1.0, -1.0, 0.0
};
const AtariNTSC::Setup AtariNTSC::TV_RGB = {
0.0, 0.0, 0.0, 0.0, 0.2, 0.0, 0.70, -1.0, -1.0, -1.0, 0
0.0, 0.0, 0.0, 0.0, 0.2, 0.0, 0.70, -1.0, -1.0, -1.0
};
const AtariNTSC::Setup AtariNTSC::TV_Bad = {
0.1, -0.3, 0.3, 0.25, 0.2, 0.0, 0.1, 0.5, 0.5, 0.5, 0
0.1, -0.3, 0.3, 0.25, 0.2, 0.0, 0.1, 0.5, 0.5, 0.5
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -53,7 +53,7 @@ class AtariNTSC
// Image parameters, ranging from -1.0 to 1.0. Actual internal values shown
// in parenthesis and should remain fairly stable in future versions.
struct Setup // atari_ntsc_setup_t
struct Setup
{
// Basic parameters
double hue; // -1 = -180 degrees +1 = +180 degrees
@ -68,7 +68,6 @@ class AtariNTSC
double artifacts; // artifacts caused by color changes
double fringing; // color artifacts caused by brightness changes
double bleed; // color bleed (color resolution reduction)
float const* decoder_matrix; // optional RGB decoder matrix, 6 elements
};
// Video format presets
@ -85,8 +84,8 @@ class AtariNTSC
// palette colors.
// In_row_width is the number of pixels to get to the next input row.
// Out_pitch is the number of *bytes* to get to the next output row.
void blitSingle(const uInt8* atari_in, uInt32 in_width, uInt32 in_height,
void* rgb_out, uInt32 out_pitch);
void render(const uInt8* atari_in, uInt32 in_width, uInt32 in_height,
void* rgb_out, uInt32 out_pitch);
// Number of input pixels that will fit within given output width.
// Might be rounded down slightly; use outWidth() on result to find

View File

@ -111,9 +111,9 @@ string NTSCFilter::increaseAdjustable()
if(myPreset != PRESET_CUSTOM)
return "'Custom' TV mode not selected";
uInt32 newval = SCALE_TO_100(*ourCustomAdjustables[myCurrentAdjustable].value);
uInt32 newval = scaleTo100(*ourCustomAdjustables[myCurrentAdjustable].value);
newval += 2; if(newval > 100) newval = 100;
*ourCustomAdjustables[myCurrentAdjustable].value = SCALE_FROM_100(newval);
*ourCustomAdjustables[myCurrentAdjustable].value = scaleFrom100(newval);
ostringstream buf;
buf << "Custom '" << ourCustomAdjustables[myCurrentAdjustable].type
@ -129,10 +129,10 @@ string NTSCFilter::decreaseAdjustable()
if(myPreset != PRESET_CUSTOM)
return "'Custom' TV mode not selected";
uInt32 newval = SCALE_TO_100(*ourCustomAdjustables[myCurrentAdjustable].value);
uInt32 newval = scaleTo100(*ourCustomAdjustables[myCurrentAdjustable].value);
if(newval < 2) newval = 0;
else newval -= 2;
*ourCustomAdjustables[myCurrentAdjustable].value = SCALE_FROM_100(newval);
*ourCustomAdjustables[myCurrentAdjustable].value = scaleFrom100(newval);
ostringstream buf;
buf << "Custom '" << ourCustomAdjustables[myCurrentAdjustable].type
@ -197,32 +197,32 @@ void NTSCFilter::getAdjustables(Adjustable& adjustable, Preset preset) const
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void NTSCFilter::setCustomAdjustables(Adjustable& adjustable)
{
myCustomSetup.hue = SCALE_FROM_100(adjustable.hue);
myCustomSetup.saturation = SCALE_FROM_100(adjustable.saturation);
myCustomSetup.contrast = SCALE_FROM_100(adjustable.contrast);
myCustomSetup.brightness = SCALE_FROM_100(adjustable.brightness);
myCustomSetup.sharpness = SCALE_FROM_100(adjustable.sharpness);
myCustomSetup.gamma = SCALE_FROM_100(adjustable.gamma);
myCustomSetup.resolution = SCALE_FROM_100(adjustable.resolution);
myCustomSetup.artifacts = SCALE_FROM_100(adjustable.artifacts);
myCustomSetup.fringing = SCALE_FROM_100(adjustable.fringing);
myCustomSetup.bleed = SCALE_FROM_100(adjustable.bleed);
myCustomSetup.hue = scaleFrom100(adjustable.hue);
myCustomSetup.saturation = scaleFrom100(adjustable.saturation);
myCustomSetup.contrast = scaleFrom100(adjustable.contrast);
myCustomSetup.brightness = scaleFrom100(adjustable.brightness);
myCustomSetup.sharpness = scaleFrom100(adjustable.sharpness);
myCustomSetup.gamma = scaleFrom100(adjustable.gamma);
myCustomSetup.resolution = scaleFrom100(adjustable.resolution);
myCustomSetup.artifacts = scaleFrom100(adjustable.artifacts);
myCustomSetup.fringing = scaleFrom100(adjustable.fringing);
myCustomSetup.bleed = scaleFrom100(adjustable.bleed);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void NTSCFilter::convertToAdjustable(Adjustable& adjustable,
const AtariNTSC::Setup& setup) const
{
adjustable.hue = SCALE_TO_100(setup.hue);
adjustable.saturation = SCALE_TO_100(setup.saturation);
adjustable.contrast = SCALE_TO_100(setup.contrast);
adjustable.brightness = SCALE_TO_100(setup.brightness);
adjustable.sharpness = SCALE_TO_100(setup.sharpness);
adjustable.gamma = SCALE_TO_100(setup.gamma);
adjustable.resolution = SCALE_TO_100(setup.resolution);
adjustable.artifacts = SCALE_TO_100(setup.artifacts);
adjustable.fringing = SCALE_TO_100(setup.fringing);
adjustable.bleed = SCALE_TO_100(setup.bleed);
adjustable.hue = scaleTo100(setup.hue);
adjustable.saturation = scaleTo100(setup.saturation);
adjustable.contrast = scaleTo100(setup.contrast);
adjustable.brightness = scaleTo100(setup.brightness);
adjustable.sharpness = scaleTo100(setup.sharpness);
adjustable.gamma = scaleTo100(setup.gamma);
adjustable.resolution = scaleTo100(setup.resolution);
adjustable.artifacts = scaleTo100(setup.artifacts);
adjustable.fringing = scaleTo100(setup.fringing);
adjustable.bleed = scaleTo100(setup.bleed);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -24,9 +24,6 @@ class Settings;
#include "bspf.hxx"
#include "AtariNTSC.hxx"
#define SCALE_FROM_100(x) ((x/50.0)-1.0)
#define SCALE_TO_100(x) uInt32(50*(x+1.0))
/**
This class is based on the Blargg NTSC filter code from Atari800,
and is derived from 'filter_ntsc.(h|c)'. Original code based on
@ -108,10 +105,10 @@ class NTSCFilter
// Perform Blargg filtering on input buffer, place results in
// output buffer
inline void blit_single(uInt8* src_buf, uInt32 src_width, uInt32 src_height,
uInt32* dest_buf, uInt32 dest_pitch)
inline void render(uInt8* src_buf, uInt32 src_width, uInt32 src_height,
uInt32* dest_buf, uInt32 dest_pitch)
{
myNTSC.blitSingle(src_buf, src_width, src_height, dest_buf, dest_pitch);
myNTSC.render(src_buf, src_width, src_height, dest_buf, dest_pitch);
}
private:
@ -119,6 +116,9 @@ class NTSCFilter
void convertToAdjustable(Adjustable& adjustable,
const AtariNTSC::Setup& setup) const;
constexpr double scaleFrom100(double x) const { return (x/50.0) - 1.0; }
constexpr uInt32 scaleTo100(double x) const { return uInt32(50*(x+1.0)); }
private:
// The NTSC object
AtariNTSC myNTSC;
@ -134,16 +134,9 @@ class NTSCFilter
// Current preset in use
Preset myPreset;
// The base 2600 palette contains 128 colours
// However, 'phosphor' mode needs a 128x128 matrix to simulate
// low-flicker output, so we need 128x128 + 128, or 129x128
// Note that this is a huge hack, which hopefully will go
// away once the phosphor effect can be more properly emulated
// Memory layout is as follows:
//
// 128x128 in first bytes of array
// 128 in last bytes of array
// Each colour is represented by 3 bytes, in R,G,B order
// The base 2600 palette contains 128 normal colours
// and 128 black&white colours (PAL colour loss)
// Each colour is represented by 3 bytes, in R,G,B order
uInt8 myTIAPalette[AtariNTSC::palette_size * 3];
struct AdjustableTag {

View File

@ -360,16 +360,14 @@ void TIASurface::render()
case Filter::BlarggNormal:
{
myNTSCFilter.blit_single(myTIA->frameBuffer(), width, height,
out, outPitch << 2);
myNTSCFilter.render(myTIA->frameBuffer(), width, height, out, outPitch << 2);
break;
}
case Filter::BlarggPhosphor:
{
// First do Blargg filtering
myNTSCFilter.blit_single(myTIA->frameBuffer(), width, height,
out, outPitch << 2);
myNTSCFilter.render(myTIA->frameBuffer(), width, height, out, outPitch << 2);
// Then do phosphor mode (blend the resulting frames)
uInt32* rgbIn = myRGBFramebuffer;