summaryrefslogtreecommitdiff
path: root/vcl/inc/regionband.hxx
blob: c25b5dd648eb261b7f0ce1a1ef464c10ff1144e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* -*- 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 .
 */
#ifndef INCLUDED_VCL_INC_REGIONBAND_HXX
#define INCLUDED_VCL_INC_REGIONBAND_HXX

#include <vcl/region.hxx>

#include "regband.hxx"

#ifdef DBG_UTIL
const char* ImplDbgTestRegionBand(const void*);
#endif

class RegionBand
{
private:
    friend const char* ImplDbgTestRegionBand(const void*);

    ImplRegionBand* mpFirstBand; // root of the list with y-bands
    ImplRegionBand* mpLastCheckedBand;

    void implReset();
    [[nodiscard]] bool CheckConsistency() const;

public:
    RegionBand();
    RegionBand(const RegionBand&);
    RegionBand& operator=(const RegionBand&);
    RegionBand(const tools::Rectangle&);
    ~RegionBand();

    bool operator==(const RegionBand& rRegionBand) const;

    [[nodiscard]] bool load(SvStream& rIStrm);
    void save(SvStream& rIStrm) const;

    bool isSingleRectangle() const;
    ImplRegionBand* ImplGetFirstRegionBand() const { return mpFirstBand; }
    void ImplAddMissingBands(const tools::Long nTop, const tools::Long nBottom);
    void InsertBand(ImplRegionBand* pPreviousBand, ImplRegionBand* pBandToInsert);
    void processPoints();
    void CreateBandRange(tools::Long nYTop, tools::Long nYBottom);
    void InsertLine(const Point& rStartPt, const Point& rEndPt, tools::Long nLineId);
    void InsertPoint(const Point& rPoint, tools::Long nLineID, bool bEndPoint, LineType eLineType);
    bool OptimizeBandList();
    void Move(tools::Long nHorzMove, tools::Long nVertMove);
    void Scale(double fScaleX, double fScaleY);
    void InsertBands(tools::Long nTop, tools::Long nBottom);
    static bool InsertSingleBand(ImplRegionBand* pBand, tools::Long nYBandPosition);
    void Union(tools::Long nLeft, tools::Long nTop, tools::Long nRight, tools::Long nBottom);
    void Intersect(tools::Long nLeft, tools::Long nTop, tools::Long nRight, tools::Long nBottom);
    void Union(const RegionBand& rSource);
    void Exclude(tools::Long nLeft, tools::Long nTop, tools::Long nRight, tools::Long nBottom);
    void XOr(tools::Long nLeft, tools::Long nTop, tools::Long nRight, tools::Long nBottom);
    void Intersect(const RegionBand& rSource);
    bool Exclude(const RegionBand& rSource);
    void XOr(const RegionBand& rSource);
    tools::Rectangle GetBoundRect() const;
    bool Contains(const Point& rPoint) const;
    sal_uInt32 getRectangleCount()
        const; // only users are Region::Intersect, Region::IsRectangle and PSWriter::ImplBmp
    void GetRegionRectangles(RectangleVector& rTarget) const;
};

#endif // INCLUDED_VCL_INC_REGIONBAND_HXX

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