Coverage Report

Created: 2026-07-10 11:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/include/vcl/BitmapWriteAccess.hxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 */
10
#pragma once
11
12
#include <vcl/BitmapReadAccess.hxx>
13
#include <optional>
14
15
class AlphaMask;
16
class Bitmap;
17
class Color;
18
class Point;
19
namespace tools
20
{
21
class Rectangle;
22
}
23
24
class VCL_DLLPUBLIC BitmapWriteAccess final : public BitmapReadAccess
25
{
26
public:
27
    BitmapWriteAccess(Bitmap& rBitmap);
28
    BitmapWriteAccess(AlphaMask& rBitmap);
29
    virtual ~BitmapWriteAccess() override;
30
31
    SAL_DLLPRIVATE void CopyScanline(tools::Long nY, const BitmapReadAccess& rReadAcc);
32
    SAL_DLLPRIVATE void CopyScanline(tools::Long nY, ConstScanline aSrcScanline,
33
                                     ScanlineFormat nSrcScanlineFormat,
34
                                     sal_uInt32 nSrcScanlineSize);
35
36
    void SetPalette(const BitmapPalette& rPalette)
37
414
    {
38
414
        assert(mpBuffer && "Access is not valid!");
39
40
414
        mpBuffer->maPalette = rPalette;
41
414
    }
42
43
    void SetPaletteEntryCount(sal_uInt16 nCount)
44
0
    {
45
0
        assert(mpBuffer && "Access is not valid!");
46
47
0
        mpBuffer->maPalette.SetEntryCount(nCount);
48
0
    }
49
50
    void SetPaletteColor(sal_uInt16 nColor, const BitmapColor& rBitmapColor)
51
1.67M
    {
52
1.67M
        assert(mpBuffer && "Access is not valid!");
53
1.67M
        assert(HasPalette() && "Bitmap has no palette!");
54
55
1.67M
        mpBuffer->maPalette[nColor] = rBitmapColor;
56
1.67M
    }
57
58
    void SetPixel(tools::Long nY, tools::Long nX, const BitmapColor& rBitmapColor)
59
4.46G
    {
60
4.46G
        assert(mpBuffer && "Access is not valid!");
61
4.46G
        assert(nX < mpBuffer->mnWidth && "x-coordinate out of range!");
62
4.46G
        assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
63
64
4.46G
        mFncSetPixel(GetScanline(nY), nX, rBitmapColor);
65
4.46G
    }
66
67
    void SetPixelIndex(tools::Long nY, tools::Long nX, sal_uInt8 cIndex)
68
6.39M
    {
69
6.39M
        SetPixel(nY, nX, BitmapColor(cIndex));
70
6.39M
    }
71
72
    void SetLineColor(const Color& rColor);
73
74
    void SetFillColor();
75
    void SetFillColor(const Color& rColor);
76
77
    void Erase(const Color& rColor);
78
79
    SAL_DLLPRIVATE void DrawLine(const Point& rStart, const Point& rEnd);
80
81
    void FillRect(const tools::Rectangle& rRect);
82
    void DrawRect(const tools::Rectangle& rRect);
83
84
private:
85
    std::optional<BitmapColor> mpLineColor;
86
    std::optional<BitmapColor> mpFillColor;
87
88
    BitmapWriteAccess() = delete;
89
    BitmapWriteAccess(const BitmapWriteAccess&) = delete;
90
    BitmapWriteAccess& operator=(const BitmapWriteAccess&) = delete;
91
};
92
93
class BitmapScopedWriteAccess
94
{
95
public:
96
    BitmapScopedWriteAccess(Bitmap& rBitmap)
97
210k
        : moAccess(rBitmap)
98
210k
    {
99
210k
    }
100
    BitmapScopedWriteAccess(AlphaMask& rBitmap)
101
9.74k
        : moAccess(rBitmap)
102
9.74k
    {
103
9.74k
    }
104
95.6k
    BitmapScopedWriteAccess() {}
105
106
    BitmapScopedWriteAccess& operator=(Bitmap& rBitmap)
107
22.2k
    {
108
22.2k
        moAccess.emplace(rBitmap);
109
22.2k
        return *this;
110
22.2k
    }
111
112
    BitmapScopedWriteAccess& operator=(AlphaMask& rBitmap)
113
821
    {
114
821
        moAccess.emplace(rBitmap);
115
821
        return *this;
116
821
    }
117
118
130k
    bool operator!() const { return !moAccess.has_value() || !*moAccess; }
119
48.8k
    explicit operator bool() const { return moAccess && bool(*moAccess); }
120
121
143k
    void reset() { moAccess.reset(); }
122
123
63.3k
    BitmapWriteAccess* get() { return moAccess ? &*moAccess : nullptr; }
124
0
    const BitmapWriteAccess* get() const { return moAccess ? &*moAccess : nullptr; }
125
126
12.2G
    BitmapWriteAccess* operator->() { return &*moAccess; }
127
0
    const BitmapWriteAccess* operator->() const { return &*moAccess; }
128
129
62.8k
    BitmapWriteAccess& operator*() { return *moAccess; }
130
0
    const BitmapWriteAccess& operator*() const { return *moAccess; }
131
132
private:
133
    std::optional<BitmapWriteAccess> moAccess;
134
};
135
136
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */