/***
Olive - Non-Linear Video Editor
Copyright (C) 2019 Olive Team
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, either version 3 of the License, or
(at your option) any later version.
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 General Public License
along with this program. If not, see .
***/
#include "colormanager.h"
#include
#include
#include "common/define.h"
#include "common/filefunctions.h"
#include "config/config.h"
#include "core.h"
OLIVE_NAMESPACE_ENTER
OCIO::ConstConfigRcPtr ColorManager::default_config_;
ColorManager::ColorManager()
{
// Ensures config is set to something
config_ = GetDefaultConfig();
// Default input space
default_input_color_space_ = QStringLiteral("sRGB OETF");
// Default reference space is scene linear
reference_space_ = OCIO::ROLE_SCENE_LINEAR;
}
OCIO::ConstConfigRcPtr ColorManager::GetConfig() const
{
return config_;
}
const QString &ColorManager::GetConfigFilename() const
{
return config_filename_;
}
OCIO::ConstConfigRcPtr ColorManager::GetDefaultConfig()
{
return default_config_;
}
void ColorManager::SetUpDefaultConfig()
{
// Kind of hacky, but it'll work
QString dir = QDir(FileFunctions::GetTempFilePath()).filePath(QStringLiteral("ocioconf"));
FileFunctions::CopyDirectory(QStringLiteral(":/ocioconf"),
dir);
default_config_ = OCIO::Config::CreateFromFile(QDir(dir).filePath(QStringLiteral("config.ocio")).toUtf8());
}
void ColorManager::SetConfig(const QString &filename)
{
if (filename != config_filename_) {
SetConfigInternal(filename);
emit ConfigChanged();
}
}
void ColorManager::SetConfigInternal(const QString &filename)
{
config_filename_ = filename;
OCIO::ConstConfigRcPtr cfg;
if (config_filename_.isEmpty()) {
cfg = OCIO::GetCurrentConfig();
} else {
cfg = OCIO::Config::CreateFromFile(filename.toUtf8());
}
config_ = cfg;
}
void ColorManager::SetDefaultInputColorSpaceInternal(const QString &s)
{
default_input_color_space_ = s;
}
void ColorManager::SetConfigAndDefaultInput(const QString &filename, const QString &s)
{
bool config_changed = false;
bool default_input_changed = false;
if (filename != config_filename_) {
SetConfigInternal(filename);
config_changed = true;
}
if (default_input_color_space_ != s) {
SetDefaultInputColorSpaceInternal(s);
default_input_changed = true;
}
if (config_changed) {
emit ConfigChanged();
}
if (default_input_changed) {
emit DefaultInputColorSpaceChanged();
}
}
void ColorManager::DisassociateAlpha(FramePtr f)
{
AssociateAlphaPixFmtFilter(kDisassociate, f);
}
void ColorManager::AssociateAlpha(FramePtr f)
{
AssociateAlphaPixFmtFilter(kAssociate, f);
}
void ColorManager::ReassociateAlpha(FramePtr f)
{
AssociateAlphaPixFmtFilter(kReassociate, f);
}
QStringList ColorManager::ListAvailableDisplays()
{
QStringList displays;
int number_of_displays = config_->getNumDisplays();
for (int i=0;igetDisplay(i));
}
return displays;
}
QString ColorManager::GetDefaultDisplay()
{
return config_->getDefaultDisplay();
}
QStringList ColorManager::ListAvailableViews(QString display)
{
QStringList views;
int number_of_views = config_->getNumViews(display.toUtf8());
for (int i=0;igetView(display.toUtf8(), i));
}
return views;
}
QString ColorManager::GetDefaultView(const QString &display)
{
return config_->getDefaultView(display.toUtf8());
}
QStringList ColorManager::ListAvailableLooks()
{
QStringList looks;
int number_of_looks = config_->getNumLooks();
for (int i=0;igetLookNameByIndex(i));
}
return looks;
}
QStringList ColorManager::ListAvailableInputColorspaces()
{
return ListAvailableInputColorspaces(config_);
}
const QString &ColorManager::GetDefaultInputColorSpace() const
{
return default_input_color_space_;
}
void ColorManager::SetDefaultInputColorSpace(const QString &s)
{
if (default_input_color_space_ != s) {
SetDefaultInputColorSpaceInternal(s);
emit DefaultInputColorSpaceChanged();
}
}
const QString &ColorManager::GetReferenceColorSpace() const
{
return reference_space_;
}
void ColorManager::SetReferenceColorSpace(const QString &s)
{
reference_space_ = s;
emit ConfigChanged();
}
QStringList ColorManager::ListAvailableInputColorspaces(OCIO::ConstConfigRcPtr config)
{
QStringList spaces;
int number_of_colorspaces = config->getNumColorSpaces();
for (int i=0;igetColorSpaceNameByIndex(i));
}
return spaces;
}
ColorManager::OCIOMethod ColorManager::GetOCIOMethodForMode(RenderMode::Mode mode)
{
return static_cast(Core::GetPreferenceForRenderMode(mode, QStringLiteral("OCIOMethod")).toInt());
}
void ColorManager::SetOCIOMethodForMode(RenderMode::Mode mode, ColorManager::OCIOMethod method)
{
Core::SetPreferenceForRenderMode(mode, QStringLiteral("OCIOMethod"), method);
}
void ColorManager::AssociateAlphaPixFmtFilter(ColorManager::AlphaAction action, FramePtr f)
{
if (!PixelFormat::FormatHasAlphaChannel(f->format())) {
// This frame has no alpha channel, do nothing
return;
}
int pixel_count = f->width() * f->height() * kRGBAChannels;
switch (static_cast(f->format())) {
case PixelFormat::PIX_FMT_INVALID:
case PixelFormat::PIX_FMT_COUNT:
qWarning() << "Alpha association functions received an invalid pixel format";
break;
case PixelFormat::PIX_FMT_RGB8:
case PixelFormat::PIX_FMT_RGBA8:
case PixelFormat::PIX_FMT_RGB16U:
case PixelFormat::PIX_FMT_RGBA16U:
qWarning() << "Alpha association functions only works on float-based pixel formats at this time";
break;
case PixelFormat::PIX_FMT_RGB16F:
case PixelFormat::PIX_FMT_RGBA16F:
{
AssociateAlphaInternal(action, reinterpret_cast(f->data()), pixel_count);
break;
}
case PixelFormat::PIX_FMT_RGB32F:
case PixelFormat::PIX_FMT_RGBA32F:
{
AssociateAlphaInternal(action, reinterpret_cast(f->data()), pixel_count);
break;
}
}
}
template
void ColorManager::AssociateAlphaInternal(ColorManager::AlphaAction action, T *data, int pix_count)
{
for (int i=0;i 0) {
for (int j=0;j