C

Monitor: Verifying the Rendering Output

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial

// This file is part of the Qt Safe Renderer module
#ifndef OFFSCREENSURFACE_H
#define OFFSCREENSURFACE_H

#include <QtSafeRenderer/qsaferenderer.h>
#include <QtSafeRenderer/qsafewindow.h>
#include <QtSafeRenderer/qsafeallocator.h>

class FrameBuffer : public SafeRenderer::AbstractFrameBuffer
{
public:
    FrameBuffer(const SafeRenderer::QSafeSize& size, const PixelFormat format)
        : m_format(format), m_width(size.width()), m_height(size.height()), m_buffer(NULL) {
        if (format == SafeRenderer::AbstractFrameBuffer::RGBA8888 || format == SafeRenderer::AbstractFrameBuffer::RGBA8888_LE || format == SafeRenderer::AbstractFrameBuffer::ARGB32) {
            m_bitsperPixel = 32U;
        } else {
            m_bitsperPixel = 16U;
        }
        const SafeRenderer::quint32 totalBytes = (size.width() * size.height() * m_bitsperPixel / 8U) + 4U;
        m_buffer = SafeRenderer::allocAlignedFromMemoryPool(totalBytes);
    }

    virtual ~FrameBuffer() {
        if (m_buffer != NULL) {
            SafeRenderer::deallocFromMemoryPool(reinterpret_cast<SafeRenderer::quint8*>(m_buffer));
            m_buffer = NULL;
        }
    }

    SafeRenderer::quchar *framebufferData() { return m_buffer; }
    SafeRenderer::quint32 bytesPerLine() { return (m_bitsperPixel / 8U) * m_width; }
    SafeRenderer::quchar bitsPerPixel() const { return static_cast<SafeRenderer::quchar>(m_bitsperPixel); }
    PixelFormat framebufferFormat() const { return m_format; }
    virtual void requestUpdate() {}

private:
    const PixelFormat m_format;
    SafeRenderer::quint32 m_bitsperPixel;
    const SafeRenderer::quint32 m_width;
    const SafeRenderer::quint32 m_height;
    SafeRenderer::quint8 * m_buffer;
};

class OffscreenSurface : public SafeRenderer::AbstractWindow
{
public:
    OffscreenSurface(const SafeRenderer::QSafeSize &size, SafeRenderer::AbstractFrameBuffer::PixelFormat format=SafeRenderer::AbstractFrameBuffer::ARGB32)
        : SafeRenderer::AbstractWindow(size, SafeRenderer::QSafePoint()), m_buffer(size, format) {}

    virtual void render(const SafeRenderer::QSafeRect &dirtyArea, const SafeRenderer::quint32 idArg) {
        (void)dirtyArea;
        (void)idArg;
    }

    virtual SafeRenderer::AbstractFrameBuffer *framebuffer() { return &m_buffer; }
    virtual void requestUpdate() {}

protected:
    FrameBuffer m_buffer;
};

#endif // OFFSCREENSURFACE_H