void GdImageRendererTest::testImageRendering(bool axis_labels)
{
    const char* filename = temp_filename_.getFilename();
    ASSERT_NE(nullptr, filename);

    // Ensure temporary file is deleted at end of test.
    FileDeleter deleter(filename);

    bool result = buffer_.load("../test/data/test_file_stereo_8bit_64spp.dat");
    ASSERT_TRUE(result);

    const WaveformColors& colors = audacityWaveformColors;

    result = renderer_.create(buffer_, 5.0, 1000, 300, colors, axis_labels); // zoom: 128
    ASSERT_TRUE(result);

    result = renderer_.saveAsPng(filename);
    ASSERT_TRUE(result);

    struct stat info;
    int stat_result = stat(filename, &info);

    ASSERT_THAT(stat_result, Eq(0));
    ASSERT_THAT(info.st_size, Gt(0));

    ASSERT_FALSE(output.str().empty());
    ASSERT_TRUE(error.str().empty());
}
示例#2
0
bool OptionHandler::renderWaveformImage(
    const boost::filesystem::path& input_filename,
    const boost::filesystem::path& output_filename,
    const Options& options)
{
    const std::unique_ptr<ScaleFactor> scale_factor = createScaleFactor(options);

    int output_samples_per_pixel = 0;

    WaveformBuffer input_buffer;

    const boost::filesystem::path input_file_ext = input_filename.extension();

    if (input_file_ext == ".dat") {
        if (!input_buffer.load(input_filename.c_str())) {
            return false;
        }

        output_samples_per_pixel = scale_factor->getSamplesPerPixel(
            input_buffer.getSampleRate()
        );
    }
    else {
        std::unique_ptr<AudioFileReader> audio_file_reader(
            createAudioFileReader(input_filename)
        );

        if (!audio_file_reader->open(input_filename.c_str())) {
            return false;
        }

        WaveformGenerator processor(input_buffer, *scale_factor);

        if (!audio_file_reader->run(processor)) {
            return false;
        }

        output_samples_per_pixel = input_buffer.getSamplesPerPixel();
    }

    WaveformBuffer output_buffer;
    WaveformBuffer* render_buffer = nullptr;

    const int input_samples_per_pixel = input_buffer.getSamplesPerPixel();

    if (output_samples_per_pixel == input_samples_per_pixel) {
        // No need to rescale
        render_buffer = &input_buffer;
    }
    else if (output_samples_per_pixel > input_samples_per_pixel) {
        WaveformRescaler rescaler;

        if (!rescaler.rescale(
            input_buffer,
            output_buffer,
            output_samples_per_pixel))
        {
            return false;
        }

        render_buffer = &output_buffer;
    }
    else {
        error_stream << "Invalid zoom, minimum: " << input_samples_per_pixel << '\n';
        return false;
    }

    const WaveformColors colors = createWaveformColors(options);

    GdImageRenderer renderer;

    if (!renderer.create(
        *render_buffer,
        options.getStartTime(),
        options.getImageWidth(),
        options.getImageHeight(),
        colors,
        options.getRenderAxisLabels()))
    {
        return false;
    }

    return renderer.saveAsPng(
        output_filename.c_str(),
        options.getPngCompressionLevel()
    );
}
示例#3
0
bool OptionHandler::renderWaveformImage(
    const boost::filesystem::path& input_filename,
    const boost::filesystem::path& output_filename,
    const Options& options)
{
    const std::unique_ptr<ScaleFactor> scale_factor = createScaleFactor(options);

    int output_samples_per_pixel = 0;

    WaveformBuffer input_buffer;

    const boost::filesystem::path input_file_ext = input_filename.extension();

    if (input_file_ext == ".dat") {
        if (!input_buffer.load(input_filename.string().c_str())) {
            return false;
        }

        output_samples_per_pixel = scale_factor->getSamplesPerPixel(
            input_buffer.getSampleRate()
        );
    }
    else {
        std::unique_ptr<AudioFileReader> audio_file_reader(
            createAudioFileReader(input_filename)
        );

        if (!audio_file_reader->open(input_filename.string().c_str())) {
            return false;
        }

        WaveformGenerator processor(input_buffer, *scale_factor);

        if (!audio_file_reader->run(processor)) {
            return false;
        }

        output_samples_per_pixel = input_buffer.getSamplesPerPixel();
    }

    WaveformBuffer output_buffer;
    WaveformBuffer* render_buffer = nullptr;

    const int input_samples_per_pixel = input_buffer.getSamplesPerPixel();

    if (output_samples_per_pixel == input_samples_per_pixel) {
        // No need to rescale
        render_buffer = &input_buffer;
    }
    else if (output_samples_per_pixel > input_samples_per_pixel) {
        WaveformRescaler rescaler;

        if (!rescaler.rescale(
            input_buffer,
            output_buffer,
            output_samples_per_pixel))
        {
            return false;
        }

        render_buffer = &output_buffer;
    }
    else {
        error_stream << "Invalid zoom, minimum: " << input_samples_per_pixel << '\n';
        return false;
    }

    const std::string& color_scheme = options.getColorScheme();

    WaveformColors colors;

    if (color_scheme == "audacity") {
        colors = audacity_waveform_colors;
    }
    else if (color_scheme == "audition") {
        colors = audition_waveform_colors;
    }
    else {
        error_stream << "Unknown color scheme: " << color_scheme << '\n';
        return false;
    }

    GdImageRenderer renderer;

    if (options.hasBorderColor()) {
        colors.border_color = options.getBorderColor();
    }

    if (options.hasBackgroundColor()) {
        colors.background_color = options.getBackgroundColor();
    }

    if (options.hasWaveformColor()) {
        colors.waveform_color = options.getWaveformColor();
    }

    if (options.hasAxisLabelColor()) {
        colors.axis_label_color = options.getAxisLabelColor();
    }

    if (!renderer.create(
        *render_buffer,
        options.getStartTime(),
        options.getImageWidth(),
        options.getImageHeight(),
        colors,
        options.getRenderAxisLabels()))
    {
        return false;
    }

    return renderer.saveAsPng(output_filename.string().c_str());
}