//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//

#ifndef INCLUDED_IMF_DEEP_IMAGE_H
#define INCLUDED_IMF_DEEP_IMAGE_H

//----------------------------------------------------------------------------
//
//      class DeepImage
//
//      For an explanation of images, levels and channels,
//      see the comments in header file Image.h.
//
//----------------------------------------------------------------------------

#include "ImfDeepImageLevel.h"
#include "ImfImage.h"
#include "ImfUtilExport.h"

#include "ImfTileDescription.h"

OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER

class IMFUTIL_EXPORT_TYPE DeepImage : public Image
{
public:
    //
    // Constructors and destructor.
    // The default constructor constructs an image with an empty data
    // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN.
    //

    IMFUTIL_EXPORT DeepImage ();

    IMFUTIL_EXPORT
    DeepImage (
        const IMATH_NAMESPACE::Box2i& dataWindow,
        LevelMode                     levelMode         = ONE_LEVEL,
        LevelRoundingMode             levelRoundingMode = ROUND_DOWN);

    IMFUTIL_EXPORT virtual ~DeepImage ();

    //
    // Accessing image levels by level number
    //

    IMFUTIL_EXPORT virtual DeepImageLevel&       level (int l = 0);
    IMFUTIL_EXPORT virtual const DeepImageLevel& level (int l = 0) const;

    IMFUTIL_EXPORT virtual DeepImageLevel&       level (int lx, int ly);
    IMFUTIL_EXPORT virtual const DeepImageLevel& level (int lx, int ly) const;

protected:
    IMFUTIL_EXPORT
    virtual DeepImageLevel*
    newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i& dataWindow);
};

OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT

#endif