Update to Scintilla5 (#2867)
[geany-mirror.git] / scintilla / src / XPM.h
blob4ec020580547293f5d2eded693b12bb866ce2a81
1 // Scintilla source code edit control
2 /** @file XPM.h
3 ** Define a classes to hold image data in the X Pixmap (XPM) and RGBA formats.
4 **/
5 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
8 #ifndef XPM_H
9 #define XPM_H
11 namespace Scintilla::Internal {
13 /**
14 * Hold a pixmap in XPM format.
16 class XPM {
17 int height=1;
18 int width=1;
19 int nColours=1;
20 std::vector<unsigned char> pixels;
21 ColourRGBA colourCodeTable[256];
22 char codeTransparent=' ';
23 ColourRGBA ColourFromCode(int ch) const noexcept;
24 void FillRun(Surface *surface, int code, int startX, int y, int x) const;
25 public:
26 explicit XPM(const char *textForm);
27 explicit XPM(const char *const *linesForm);
28 XPM(const XPM &) = default;
29 XPM(XPM &&) noexcept = default;
30 XPM &operator=(const XPM &) = default;
31 XPM &operator=(XPM &&) noexcept = default;
32 ~XPM();
33 void Init(const char *textForm);
34 void Init(const char *const *linesForm);
35 /// Decompose image into runs and use FillRectangle for each run
36 void Draw(Surface *surface, const PRectangle &rc);
37 int GetHeight() const noexcept { return height; }
38 int GetWidth() const noexcept { return width; }
39 ColourRGBA PixelAt(int x, int y) const noexcept;
40 private:
41 static std::vector<const char *>LinesFormFromTextForm(const char *textForm);
44 /**
45 * A translucent image stored as a sequence of RGBA bytes.
47 class RGBAImage {
48 int height;
49 int width;
50 float scale;
51 std::vector<unsigned char> pixelBytes;
52 public:
53 static constexpr size_t bytesPerPixel = 4;
54 RGBAImage(int width_, int height_, float scale_, const unsigned char *pixels_);
55 explicit RGBAImage(const XPM &xpm);
56 RGBAImage(const RGBAImage &) = default;
57 RGBAImage(RGBAImage &&) noexcept = default;
58 RGBAImage &operator=(const RGBAImage &) = default;
59 RGBAImage &operator=(RGBAImage &&) noexcept = default;
60 virtual ~RGBAImage();
61 int GetHeight() const noexcept { return height; }
62 int GetWidth() const noexcept { return width; }
63 float GetScale() const noexcept { return scale; }
64 float GetScaledHeight() const noexcept { return height / scale; }
65 float GetScaledWidth() const noexcept { return width / scale; }
66 int CountBytes() const noexcept;
67 const unsigned char *Pixels() const noexcept;
68 void SetPixel(int x, int y, ColourRGBA colour) noexcept;
69 static void BGRAFromRGBA(unsigned char *pixelsBGRA, const unsigned char *pixelsRGBA, size_t count) noexcept;
72 /**
73 * A collection of RGBAImage pixmaps indexed by integer id.
75 class RGBAImageSet {
76 typedef std::map<int, std::unique_ptr<RGBAImage>> ImageMap;
77 ImageMap images;
78 mutable int height; ///< Memorize largest height of the set.
79 mutable int width; ///< Memorize largest width of the set.
80 public:
81 RGBAImageSet();
82 // Deleted so RGBAImageSet objects can not be copied.
83 RGBAImageSet(const RGBAImageSet &) = delete;
84 RGBAImageSet(RGBAImageSet &&) = delete;
85 RGBAImageSet &operator=(const RGBAImageSet &) = delete;
86 RGBAImageSet &operator=(RGBAImageSet &&) = delete;
87 ~RGBAImageSet();
88 /// Remove all images.
89 void Clear() noexcept;
90 /// Add an image.
91 void AddImage(int ident, std::unique_ptr<RGBAImage> image);
92 /// Get image by id.
93 RGBAImage *Get(int ident);
94 /// Give the largest height of the set.
95 int GetHeight() const;
96 /// Give the largest width of the set.
97 int GetWidth() const;
102 #endif