/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#pragma once

#include "emfphelperdata.hxx"
#include "emfpimage.hxx"
#include <tools/color.hxx>

namespace emfplushelper
{
    enum EmfPlusHatchStyle
    {
        HatchStyleHorizontal = 0x00000000,
        HatchStyleVertical = 0x00000001,
        HatchStyleForwardDiagonal = 0x00000002,
        HatchStyleBackwardDiagonal = 0x00000003,
        HatchStyleLargeGrid = 0x00000004,
        HatchStyleDiagonalCross = 0x00000005,
        HatchStyle05Percent = 0x00000006,
        HatchStyle10Percent = 0x00000007,
        HatchStyle20Percent = 0x00000008,
        HatchStyle25Percent = 0x00000009,
        HatchStyle30Percent = 0x0000000A,
        HatchStyle40Percent = 0x0000000B,
        HatchStyle50Percent = 0x0000000C,
        HatchStyle60Percent = 0x0000000D,
        HatchStyle70Percent = 0x0000000E,
        HatchStyle75Percent = 0x0000000F,
        HatchStyle80Percent = 0x00000010,
        HatchStyle90Percent = 0x00000011,
        HatchStyleLightDownwardDiagonal = 0x00000012,
        HatchStyleLightUpwardDiagonal = 0x00000013,
        HatchStyleDarkDownwardDiagonal = 0x00000014,
        HatchStyleDarkUpwardDiagonal = 0x00000015,
        HatchStyleWideDownwardDiagonal = 0x00000016,
        HatchStyleWideUpwardDiagonal = 0x00000017,
        HatchStyleLightVertical = 0x00000018,
        HatchStyleLightHorizontal = 0x00000019,
        HatchStyleNarrowVertical = 0x0000001A,
        HatchStyleNarrowHorizontal = 0x0000001B,
        HatchStyleDarkVertical = 0x0000001C,
        HatchStyleDarkHorizontal = 0x0000001D,
        HatchStyleDashedDownwardDiagonal = 0x0000001E,
        HatchStyleDashedUpwardDiagonal = 0x0000001F,
        HatchStyleDashedHorizontal = 0x00000020,
        HatchStyleDashedVertical = 0x00000021,
        HatchStyleSmallConfetti = 0x00000022,
        HatchStyleLargeConfetti = 0x00000023,
        HatchStyleZigZag = 0x00000024,
        HatchStyleWave = 0x00000025,
        HatchStyleDiagonalBrick = 0x00000026,
        HatchStyleHorizontalBrick = 0x00000027,
        HatchStyleWeave = 0x00000028,
        HatchStylePlaid = 0x00000029,
        HatchStyleDivot = 0x0000002A,
        HatchStyleDottedGrid = 0x0000002B,
        HatchStyleDottedDiamond = 0x0000002C,
        HatchStyleShingle = 0x0000002D,
        HatchStyleTrellis = 0x0000002E,
        HatchStyleSphere = 0x0000002F,
        HatchStyleSmallGrid = 0x00000030,
        HatchStyleSmallCheckerBoard = 0x00000031,
        HatchStyleLargeCheckerBoard = 0x00000032,
        HatchStyleOutlinedDiamond = 0x00000033,
        HatchStyleSolidDiamond = 0x00000034
    };

    enum EmfPlusBrushType
    {
        BrushTypeSolidColor = 0x00000000,
        BrushTypeHatchFill = 0x00000001,
        BrushTypeTextureFill = 0x00000002,
        BrushTypePathGradient = 0x00000003,
        BrushTypeLinearGradient = 0x00000004
    };

    class EMFPPath;

    struct EMFPBrush : public EMFPObject
    {
        ::Color solidColor;
        sal_uInt32 type;
        sal_uInt32 additionalFlags;

        /* linear gradient */
        sal_Int32 wrapMode;
        float firstPointX, firstPointY, aWidth, aHeight;
        ::Color secondColor; // first color is stored in solidColor;
        basegfx::B2DHomMatrix brush_transformation;
        bool hasTransformation;
        sal_uInt32 blendPoints;
        std::unique_ptr<float[]> blendPositions;
        float* blendFactors;
        sal_uInt32 colorblendPoints;
        std::unique_ptr<float[]> colorblendPositions;
        std::unique_ptr<::Color[]> colorblendColors;
        sal_uInt32 surroundColorsNumber;
        std::unique_ptr<::Color[]> surroundColors;
        std::unique_ptr<EMFPPath> path;
        EmfPlusHatchStyle hatchStyle;
        std::unique_ptr<EMFPImage> textureImage;

        EMFPBrush();
        virtual ~EMFPBrush() override;

        sal_uInt32 GetType() const { return type; }
        const ::Color& GetColor() const { return solidColor; }

        void Read(SvMemoryStream& s, EmfPlusHelperData const & rR, sal_uInt32 dataSize, bool bUseWholeStream);
    };
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
