#include <QtCore/qmath.h>

#include "CanvasImpl.h"
#include "Manager.h"

HsQMLGLDelegateImpl::HsQMLGLDelegateImpl(HsQMLGLPaintCb paintCb)
    : mPaintCb(paintCb)
{}

HsQMLGLDelegateImpl::~HsQMLGLDelegateImpl()
{
    gManager->freeFun(reinterpret_cast<HsFunPtr>(mPaintCb));
}

HsQMLCanvasBackEnd::HsQMLCanvasBackEnd(QQuickWindow* win)
{
    QObject::connect(
        win, SIGNAL(beforeRendering()),
        this, SLOT(doRendering()));
}

HsQMLCanvasBackEnd::~HsQMLCanvasBackEnd()
{
}

void HsQMLCanvasBackEnd::setModeSize(
    HsQMLCanvas::DisplayMode mode, qreal w, qreal h)
{
    mDisplayMode = mode;
    mCanvasWidth = w;
    mCanvasHeight = h;

    if (HsQMLCanvas::Inline == mode) {
        if (!mFBO || mFBO->width() != w || mFBO->height() != h) {
            mFBO.reset(new QOpenGLFramebufferObject(
                qCeil(w), qCeil(h), QOpenGLFramebufferObject::Depth));
        }
    }
    else {
        mFBO.reset();
    }
}

void HsQMLCanvasBackEnd::doRendering()
{
    bool inlineMode = HsQMLCanvas::Inline == mDisplayMode;
    if (inlineMode && !mFBO) {
        return;
    }
    if (inlineMode) {
        mFBO->bind();
    }
    if (inlineMode) {
        mFBO->release();
    }
}
