summaryrefslogtreecommitdiffstats
path: root/chalk/core/kis_selection.h
blob: ae21e696cc0d1fb58730b05ba1204ec1445a6820 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 *  Copyright (c) 2004 Boudewijn Rempt <boud@valdyas.org>
 *
 *  this program is free software; you can redistribute it and/or modify
 *  it under the terms of the gnu general public license as published by
 *  the free software foundation; either version 2 of the license, or
 *  (at your option) any later version.
 *
 *  this program is distributed in the hope that it will be useful,
 *  but without any warranty; without even the implied warranty of
 *  merchantability or fitness for a particular purpose.  see the
 *  gnu general public license for more details.
 *
 *  you should have received a copy of the gnu general public license
 *  along with this program; if not, write to the free software
 *  foundation, inc., 675 mass ave, cambridge, ma 02139, usa.
 */
#ifndef KIS_SELECTION_H_
#define KIS_SELECTION_H_

#include <tqrect.h>

#include "kis_types.h"
#include "kis_paint_device.h"

#include <koffice_export.h>


enum enumSelectionMode {
    SELECTION_ADD,
    SELECTION_SUBTRACT
};

/**
 * KisSelection contains a byte-map representation of a layer, where
 * the value of a byte signifies whether a corresponding pixel is selected, or not.
 *
 * NOTE: If you need to manually call emitSelectionChanged on the owner paint device
 *       of a selection. KisSelection does not emit any signals by itself because
 *       often you want to combine several actions in to perfom one operation and you
 *       do not want recomposition to happen all the time.
 */
class KRITACORE_EXPORT KisSelection : public KisPaintDevice {

    typedef KisPaintDevice super;

public:
    /**
     * Create a new KisSelection
    * @param dev the parent paint device. The selection will never be bigger than the parent
     *              paint device.
     */
    KisSelection(KisPaintDeviceSP dev);

    /**
     * Create a new KisSelection. This selection will not have a parent paint device.
     */
    KisSelection();
    
    /**
     * Copy the selection
     */
    KisSelection(const KisSelection& rhs);
    
    virtual ~KisSelection();

    // Returns selectedness, or 0 if invalid coordinates
    TQ_UINT8 selected(TQ_INT32 x, TQ_INT32 y);

    void setSelected(TQ_INT32 x, TQ_INT32 y, TQ_UINT8 s);

    TQImage maskImage();

    void select(TQRect r);

    void invert();

    void clear(TQRect r);

    void clear();

    /// Tests if the the rect is totally outside the selection
    bool isTotallyUnselected(TQRect r);

    /**
     * Tests if the the rect is totally outside the selection, but uses selectedRect
     * instead of selectedRect, and this is faster (but might deliver false positives!)
     *
     * XXX: This comment makes no sense anymore! (BSAR)
     */
    bool isProbablyTotallyUnselected(TQRect r);

    /**
     * Rough, but fastish way of determining the area
     * of the tiles used by the selection.
     */
    TQRect selectedRect() const;

    /**
     * Slow, but exact way of determining the rectangle
     * that encloses the selection
     */
    TQRect selectedExactRect() const;

    void paintSelection(TQImage img, TQ_INT32 x, TQ_INT32 y, TQ_INT32 w, TQ_INT32 h);
    void paintSelection(TQImage img, const TQRect& scaledImageRect, const TQSize& scaledImageSize, const TQSize& imageSize);

    void startCachingExactRect();
    void stopCachingExactRect();

    // if the parent layer is interested in keeping up to date with the dirtyness
    // of this layer, set to true
    void setInterestedInDirtyness(bool b) { m_dirty = b; }
    bool interestedInDirtyness() const { return m_dirty; }

    virtual void setDirty(const TQRect & rc);
    virtual void setDirty();
    inline KisPaintDeviceSP parentPaintDevice() { return m_parentPaintDevice; }
private:
    void paintUniformSelectionRegion(TQImage img, const TQRect& imageRect, const TQRegion& uniformRegion);

private:

    // We don't want these methods to be used on selections:
    void extent(TQ_INT32 &x, TQ_INT32 &y, TQ_INT32 &w, TQ_INT32 &h) const 
        { 
            KisPaintDevice::extent(x,y,w,h);
        }
    
    TQRect extent() const { return KisPaintDevice::extent(); }
    
    void exactBounds(TQ_INT32 &x, TQ_INT32 &y, TQ_INT32 &w, TQ_INT32 &h) const 
        {
            return KisPaintDevice::exactBounds(x,y,w,h);
        }   

    TQRect exactBounds() const
        {
            return KisPaintDevice::exactBounds();
        }

    TQRect exactBoundsOldMethod() const 
        {
            return KisPaintDevice::exactBoundsOldMethod();
        }

    TQRect exactBoundsImprovedOldMethod() const
        {
            return KisPaintDevice::exactBoundsImprovedOldMethod();
        }


private:
    KisPaintDeviceSP m_parentPaintDevice;
    bool m_doCacheExactRect;
    TQRect m_cachedExactRect;
    bool m_dirty;
};

#endif // KIS_SELECTION_H_