- Cleaned up some files -- seems there were some wrongly resolved conflicts which resulted into duplicated code in space_image.py and some build configuration files. - Store all color space related data (such as display device, view transform and so) as strings, so it could easily be ported to new OCIO configuration files and it'll be much more portable between different configurations. This required adding some look-ups to RNA associated with such settings, but it's indeed the only way to do this. If it'll be figured out such look-ups causes performance issues it's possible to optimize this further using hash. So far it's only few elements in list to be looked up. - Added support of display device transformation from OCIO configuration files. Display device is setting per-window and different windows could have different display devices, so it's possible to have one blender window opened on sRGB monitor and another one on xyz projector. Display device is ignored when using ACES ODT Tonecurve view transform due to it's not an OCIO transformation. Probably it'll be possible to get rid of this tone curve soon (if it'll be proved useless or it'll be implemented as a part of OCIO LUT). - Movie Cache now supports deleter functions for user keys, so such keys could have some allocated data which would be removed as soon as element in cache is being removed. - Movie Cache now support callbacks to check whether current cache element could be removed from a cache due to it wouldn't be accessed anymore. - Re-written cache stuff for display buffers of ImBuf. Now it's using Movie Cache which is global for all ImBufs. Probably it's not implemented in fastest way, would be investigated further and probably changed it performance wouldn't be good enough.
110 lines
2.9 KiB
C++
110 lines
2.9 KiB
C++
/*
|
|
* Copyright 2011, Blender Foundation.
|
|
*
|
|
* 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 2
|
|
* 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, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Contributor:
|
|
* Jeroen Bakker
|
|
* Monique Dewanchand
|
|
*/
|
|
|
|
#include "COM_ViewerBaseOperation.h"
|
|
#include "COM_SocketConnection.h"
|
|
#include "BLI_listbase.h"
|
|
#include "DNA_scene_types.h"
|
|
#include "BKE_image.h"
|
|
#include "WM_api.h"
|
|
#include "WM_types.h"
|
|
#include "PIL_time.h"
|
|
#include "BLI_utildefines.h"
|
|
#include "BLI_math_color.h"
|
|
|
|
extern "C" {
|
|
#include "MEM_guardedalloc.h"
|
|
#include "IMB_imbuf.h"
|
|
#include "IMB_imbuf_types.h"
|
|
#include "IMB_colormanagement.h"
|
|
}
|
|
|
|
|
|
ViewerBaseOperation::ViewerBaseOperation() : NodeOperation()
|
|
{
|
|
this->setImage(NULL);
|
|
this->setImageUser(NULL);
|
|
this->m_outputBuffer = NULL;
|
|
this->m_outputBufferDisplay = NULL;
|
|
this->m_active = false;
|
|
this->m_doColorManagement = true;
|
|
}
|
|
|
|
void ViewerBaseOperation::initExecution()
|
|
{
|
|
if (isActiveViewerOutput()) {
|
|
initImage();
|
|
}
|
|
}
|
|
|
|
void ViewerBaseOperation::initImage()
|
|
{
|
|
Image *anImage = this->m_image;
|
|
ImBuf *ibuf = BKE_image_acquire_ibuf(anImage, this->m_imageUser, &this->m_lock);
|
|
|
|
if (!ibuf) return;
|
|
if (ibuf->x != (int)getWidth() || ibuf->y != (int)getHeight()) {
|
|
imb_freerectImBuf(ibuf);
|
|
imb_freerectfloatImBuf(ibuf);
|
|
IMB_freezbuffloatImBuf(ibuf);
|
|
ibuf->x = getWidth();
|
|
ibuf->y = getHeight();
|
|
imb_addrectImBuf(ibuf);
|
|
imb_addrectfloatImBuf(ibuf);
|
|
anImage->ok = IMA_OK_LOADED;
|
|
}
|
|
|
|
/* viewer might have been change size, invalidate cached
|
|
* display buffers so they'll be used with a proper size
|
|
*/
|
|
IMB_display_buffer_invalidate(ibuf);
|
|
|
|
/* now we combine the input with ibuf */
|
|
this->m_outputBuffer = ibuf->rect_float;
|
|
this->m_outputBufferDisplay = (unsigned char *)ibuf->rect;
|
|
|
|
BKE_image_release_ibuf(this->m_image, this->m_lock);
|
|
}
|
|
void ViewerBaseOperation:: updateImage(rcti *rect)
|
|
{
|
|
WM_main_add_notifier(NC_WINDOW | ND_DRAW, NULL);
|
|
}
|
|
|
|
void ViewerBaseOperation::deinitExecution()
|
|
{
|
|
ImBuf *ibuf = BKE_image_acquire_ibuf(this->m_image, this->m_imageUser, &this->m_lock);
|
|
IMB_display_buffer_invalidate(ibuf);
|
|
BKE_image_release_ibuf(this->m_image, this->m_lock);
|
|
|
|
this->m_outputBuffer = NULL;
|
|
}
|
|
|
|
const CompositorPriority ViewerBaseOperation::getRenderPriority() const
|
|
{
|
|
if (this->isActiveViewerOutput()) {
|
|
return COM_PRIORITY_HIGH;
|
|
}
|
|
else {
|
|
return COM_PRIORITY_LOW;
|
|
}
|
|
}
|