29 #ifndef PT_GFX_IMAGE_FORMAT_H
30 #define PT_GFX_IMAGE_FORMAT_H
32 #include <Pt/Gfx/Api.h>
33 #include <Pt/Gfx/ViewBase.h>
34 #include <Pt/Gfx/ImageTraits.h>
35 #include <Pt/Gfx/PixelBase.h>
36 #include <Pt/Gfx/Color.h>
37 #include <Pt/TypeTraits.h>
55 friend struct ImageTraitsF;
59 : _pixelStride(pixelStride)
66 Pt::ssize_t x, Pt::ssize_t y,
67 PixelStorage& store)
const
69 return onCreatePixel(data, view, x, y, store);
74 return onGetType() == a.onGetType();
79 return ! (*
this == a);
82 const std::type_info& type()
const
88 PT_GFX_API
static const ImageFormat& get(
int type = 0);
97 virtual std::unique_ptr<ImageFormat> onClone()
const
102 virtual const std::type_info& onGetType()
const = 0;
104 virtual std::size_t onImageSize(Pt::ssize_t width, Pt::ssize_t height,
105 std::size_t padding)
const = 0;
108 Pt::ssize_t x, Pt::ssize_t y,
109 PixelStorage& store)
const = 0;
111 inline const void* r0()
const
114 inline const void* r1()
const
117 inline const void* r2()
const
121 const std::size_t _pixelStride;
134 typedef Gfx::Pixel<Color> Pixel;
135 typedef Gfx::ConstPixel<Color> ConstPixel;
137 static std::size_t pixelStride(
const ImageFormat& format)
139 return format._pixelStride;
142 static std::size_t imageSize(
const ImageFormat& format, Pt::ssize_t width, Pt::ssize_t height,
145 return format.onImageSize(width, height, padding);
148 static std::unique_ptr<ImageFormat> clone(
const ImageFormat& format)
150 return format.onClone();
157 typedef Gfx::Pixel<ColorF> Pixel;
158 typedef Gfx::ConstPixel<ColorF> ConstPixel;
160 static std::size_t pixelStride(
const ImageFormat& format)
162 return format._pixelStride;
165 static std::size_t imageSize(
const ImageFormat& format, Pt::ssize_t width, Pt::ssize_t height,
168 return format.onImageSize(width, height, padding);
171 static std::unique_ptr<ImageFormat> clone(
const ImageFormat& format)
173 return format.onClone();
181 template <
typename ColorT>
184 template <
typename C>
185 friend class ConstPixel;
188 typedef ImageFormat FormatType;
189 typedef ColorT ColorType;
192 template <
typename T>
193 Pixel(T& view, Pt::ssize_t x, Pt::ssize_t y);
195 Pixel(
const Pixel& p);
199 Pixel& operator=(
const Pixel&) =
delete;
201 Pixel& operator=(
const ColorT& color)
203 _pixel->assign(color);
207 template <
typename T>
208 void reset(T& view, Pt::ssize_t x, Pt::ssize_t y);
210 void reset(
const Pixel& p);
212 const PixelBase* pixelBase()
const
215 PixelBase* pixelBase()
218 const ViewBase& view()
const
219 {
return _pixel->view(); }
221 const ImageFormat& format()
const
225 {
return _pixel->base(); }
228 {
return _pixel->base(); }
237 _pixel->skipPadding();
240 void advance(Pt::ssize_t n)
245 void advanceLines(Pt::ssize_t n)
247 _pixel->advanceLines(n);
250 ColorT getColor()
const
252 return _pixel->getColor<ColorT>();
255 void getColors(ColorT* colors, std::size_t length)
const
257 _pixel->getColors(colors, length);
260 void assign(
const Pixel& p);
262 void assign(
const ConstPixel<ColorT>& p);
264 void assign(
const Pixel& p, std::size_t length);
266 void assign(
const ConstPixel<ColorT>& p, std::size_t length);
268 void assign(
const ColorT* colors, std::size_t length)
270 _pixel->assign(colors, length);
273 void fill(std::size_t n,
const ColorT& color)
275 _pixel->fill(n, color);
278 bool equals(
const Pixel& p)
const
280 return _pixel->base() == p.base();
283 bool equals(
const ConstPixel<ColorT>& p)
const;
286 template <
typename PixelT>
287 void assignPixels(
const PixelT& p, std::size_t length);
291 PixelStorage _storage;
292 const ImageFormat* _format;
299 template <
typename ColorT>
302 template <
typename C>
306 typedef ImageFormat FormatType;
307 typedef ColorT ColorType;
310 template <
typename T>
311 ConstPixel(
const T& view, Pt::ssize_t x, Pt::ssize_t y);
313 template <
typename T>
314 ConstPixel(T& view, Pt::ssize_t x, Pt::ssize_t y);
316 ConstPixel(
const ConstPixel& p);
318 ConstPixel(
const Pixel<ColorT>& p);
322 ConstPixel& operator=(
const ConstPixel&) =
delete;
324 template <
typename T>
325 void reset(
const T& view, Pt::ssize_t x, Pt::ssize_t y);
327 template <
typename T>
328 void reset(T& view, Pt::ssize_t x, Pt::ssize_t y);
330 void reset(
const ConstPixel& p);
332 void reset(
const Pixel<ColorT>& p);
334 const PixelBase* pixelBase()
const
337 const ImageFormat& format()
const
340 const ViewBase& view()
const
341 {
return _pixel->view(); }
344 {
return _pixel->base(); }
353 _pixel->skipPadding();
356 void advance(Pt::ssize_t n)
361 void advanceLines(Pt::ssize_t n)
363 _pixel->advanceLines(n);
366 ColorT getColor()
const
368 return _pixel->getColor<ColorT>();
371 void getColors(ColorT* colors, std::size_t length)
const
373 _pixel->getColors(colors, length);
376 bool equals(
const ConstPixel& p)
const
378 return _pixel->base() == p.base();
381 bool equals(
const Pixel<ColorT>& p)
const
383 return _pixel->base() == p.base();
388 PixelStorage _storage;
389 const ImageFormat* _format;
396 #include <Pt/Gfx/ImageFormat.hpp>