/work/obj-fuzz/dist/include/gfxImageSurface.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- |
2 | | * This Source Code Form is subject to the terms of the Mozilla Public |
3 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | | |
6 | | #ifndef GFX_IMAGESURFACE_H |
7 | | #define GFX_IMAGESURFACE_H |
8 | | |
9 | | #include "mozilla/MemoryReporting.h" |
10 | | #include "mozilla/RefPtr.h" |
11 | | #include "gfxASurface.h" |
12 | | #include "nsSize.h" |
13 | | |
14 | | // ARGB -- raw buffer.. wont be changed.. good for storing data. |
15 | | |
16 | | class gfxSubimageSurface; |
17 | | |
18 | | namespace mozilla { |
19 | | namespace gfx { |
20 | | class DataSourceSurface; |
21 | | class SourceSurface; |
22 | | } // namespace gfx |
23 | | } // namespace mozilla |
24 | | |
25 | | /** |
26 | | * A raw image buffer. The format can be set in the constructor. Its main |
27 | | * purpose is for storing read-only images and using it as a source surface, |
28 | | * but it can also be drawn to. |
29 | | */ |
30 | | class gfxImageSurface : public gfxASurface { |
31 | | public: |
32 | | /** |
33 | | * Construct an image surface around an existing buffer of image data. |
34 | | * @param aData A buffer containing the image data |
35 | | * @param aSize The size of the buffer |
36 | | * @param aStride The stride of the buffer |
37 | | * @param format Format of the data |
38 | | * |
39 | | * @see gfxImageFormat |
40 | | */ |
41 | | gfxImageSurface(unsigned char *aData, const mozilla::gfx::IntSize& aSize, |
42 | | long aStride, gfxImageFormat aFormat); |
43 | | |
44 | | /** |
45 | | * Construct an image surface. |
46 | | * @param aSize The size of the buffer |
47 | | * @param format Format of the data |
48 | | * |
49 | | * @see gfxImageFormat |
50 | | */ |
51 | | gfxImageSurface(const mozilla::gfx::IntSize& size, gfxImageFormat format, bool aClear = true); |
52 | | |
53 | | /** |
54 | | * Construct an image surface, with a specified stride and allowing the |
55 | | * allocation of more memory than required for the storage of the surface |
56 | | * itself. When aStride and aMinimalAllocation are <=0, this constructor |
57 | | * is the equivalent of the preceeding one. |
58 | | * |
59 | | * @param format Format of the data |
60 | | * @param aSize The size of the buffer |
61 | | * @param aStride The stride of the buffer - if <=0, use ComputeStride() |
62 | | * @param aMinimalAllocation Allocate at least this many bytes. If smaller |
63 | | * than width * stride, or width*stride <=0, this value is ignored. |
64 | | * @param aClear |
65 | | * |
66 | | * @see gfxImageFormat |
67 | | */ |
68 | | gfxImageSurface(const mozilla::gfx::IntSize& aSize, gfxImageFormat aFormat, |
69 | | long aStride, int32_t aMinimalAllocation, bool aClear); |
70 | | |
71 | | explicit gfxImageSurface(cairo_surface_t *csurf); |
72 | | |
73 | | virtual ~gfxImageSurface(); |
74 | | |
75 | | // ImageSurface methods |
76 | | gfxImageFormat Format() const { return mFormat; } |
77 | | |
78 | | virtual const mozilla::gfx::IntSize GetSize() const override { return mSize; } |
79 | 0 | int32_t Width() const { |
80 | 0 | if (mSize.width < 0) { |
81 | 0 | return 0; |
82 | 0 | } |
83 | 0 | return mSize.width; |
84 | 0 | } |
85 | 0 | int32_t Height() const { |
86 | 0 | if (mSize.height < 0) { |
87 | 0 | return 0; |
88 | 0 | } |
89 | 0 | return mSize.height; |
90 | 0 | } |
91 | | |
92 | | /** |
93 | | * Distance in bytes between the start of a line and the start of the |
94 | | * next line. |
95 | | */ |
96 | | int32_t Stride() const { return mStride; } |
97 | | /** |
98 | | * Returns a pointer for the image data. Users of this function can |
99 | | * write to it, but must not attempt to free the buffer. |
100 | | */ |
101 | | unsigned char* Data() const { return mData; } // delete this data under us and die. |
102 | | /** |
103 | | * Returns the total size of the image data. |
104 | | */ |
105 | 0 | int32_t GetDataSize() const { |
106 | 0 | if (mStride < 0 || mSize.height < 0) { |
107 | 0 | return 0; |
108 | 0 | } |
109 | 0 | return mStride*mSize.height; |
110 | 0 | } |
111 | | |
112 | | /* Fast copy from another image surface; returns TRUE if successful, FALSE otherwise */ |
113 | | bool CopyFrom (gfxImageSurface *other); |
114 | | |
115 | | /** |
116 | | * Fast copy from a source surface; returns TRUE if successful, FALSE otherwise |
117 | | * Assumes that the format of this surface is compatable with aSurface |
118 | | */ |
119 | | bool CopyFrom (mozilla::gfx::SourceSurface *aSurface); |
120 | | |
121 | | /** |
122 | | * Fast copy to a source surface; returns TRUE if successful, FALSE otherwise |
123 | | * Assumes that the format of this surface is compatible with aSurface |
124 | | */ |
125 | | bool CopyTo (mozilla::gfx::SourceSurface *aSurface); |
126 | | |
127 | | /** |
128 | | * Copy to a Moz2D DataSourceSurface. |
129 | | * Marked as virtual so that browsercomps can access this method. |
130 | | */ |
131 | | virtual already_AddRefed<mozilla::gfx::DataSourceSurface> CopyToB8G8R8A8DataSourceSurface(); |
132 | | |
133 | | /* return new Subimage with pointing to original image starting from aRect.pos |
134 | | * and size of aRect.size. New subimage keeping current image reference |
135 | | */ |
136 | | already_AddRefed<gfxSubimageSurface> GetSubimage(const gfxRect& aRect); |
137 | | |
138 | | virtual already_AddRefed<gfxImageSurface> GetAsImageSurface() override; |
139 | | |
140 | | /** See gfxASurface.h. */ |
141 | | static long ComputeStride(const mozilla::gfx::IntSize&, gfxImageFormat); |
142 | | |
143 | | virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const |
144 | | override; |
145 | | virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const |
146 | | override; |
147 | | virtual bool SizeOfIsMeasured() const override; |
148 | | |
149 | | protected: |
150 | | gfxImageSurface(); |
151 | | void InitWithData(unsigned char *aData, const mozilla::gfx::IntSize& aSize, |
152 | | long aStride, gfxImageFormat aFormat); |
153 | | /** |
154 | | * See the parameters to the matching constructor. This should only |
155 | | * be called once, in the constructor, which has already set mSize |
156 | | * and mFormat. |
157 | | */ |
158 | | void AllocateAndInit(long aStride, int32_t aMinimalAllocation, bool aClear); |
159 | | void InitFromSurface(cairo_surface_t *csurf); |
160 | | |
161 | | long ComputeStride() const { |
162 | | if (mSize.height < 0 || mSize.width < 0) { |
163 | | return 0; |
164 | | } |
165 | | return ComputeStride(mSize, mFormat); |
166 | | } |
167 | | |
168 | | void MakeInvalid(); |
169 | | |
170 | | mozilla::gfx::IntSize mSize; |
171 | | bool mOwnsData; |
172 | | unsigned char *mData; |
173 | | gfxImageFormat mFormat; |
174 | | long mStride; |
175 | | }; |
176 | | |
177 | | class gfxSubimageSurface : public gfxImageSurface { |
178 | | protected: |
179 | | friend class gfxImageSurface; |
180 | | gfxSubimageSurface(gfxImageSurface* aParent, |
181 | | unsigned char* aData, |
182 | | const mozilla::gfx::IntSize& aSize, |
183 | | gfxImageFormat aFormat); |
184 | | private: |
185 | | RefPtr<gfxImageSurface> mParent; |
186 | | }; |
187 | | |
188 | | #endif /* GFX_IMAGESURFACE_H */ |