Files
Webcam/include/framework/picture/pict.h
2026-06-22 11:49:35 +02:00

342 lines
9.8 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __NPICTURE__
#define __NPICTURE__
#include "geometry/rect.h"
#include "picture/pict_color_format.h"
#include "memory/bit_field.h"
#include "memory/nshared_ptr.h"
namespace GS {
struct Color;
struct Vector4;
class Gradient;
/*!
@short The base image class.
When used with PictureTools, this class provides high-quality sub-pixel
bitmap manipulations from shrinking/enlargement to blit/resize.
Importing/exporting from common image formats can be done through the
GS::PictureIO class.
@author Emmanuel Julien (ejulien@nworks.fr)
*/
class Picture : public SharedObject
{
public:
NPLACEMENT_NEW(Picture)
enum BlendMode
{
BlendReplace = 0,
BlendCompose,
BlendComposeFast,
BlendAdd,
BlendMultiply,
BlendMultiply2x,
BlendAlphaAdd,
BlendAlphaMultiply,
BlendAlphaMultiply2x,
RgbToAlpha
};
protected:
uchar *data; ///< Internal pointer to the picture's data.
uint hash, ///< Raster data hash value.
width, ///< Object's width.
height; ///< Object's height.
PixelFormat pxformat; ///< Pixel format.
/// Zeroify the class but do not free anything.
void Zeroify();
/*!
@short Internal free.
@note Free raster data only.
*/
void FreeData();
enum
{
PictureIsStub = (1 << 1)
};
BitField protected_flag;
public:
enum
{
HasForeignData = (1 << 1)
};
BitField pic_flag;
String name;
/*!
@name Blit functions.
@{
*/
/// Blit.
static bool Blit(const Picture &src, Picture &dst, const Rect <int> *src_rect = 0, const Rect <int> *dst_rect = 0, BlendMode op = BlendReplace);
/// Blit using a mask.
static bool BlitMask(const Picture &src, Picture &dst, Picture &mask, const Rect <int> *src_rect = 0, const Rect <int> *dst_rect = 0);
/*!
@short Scaled blit.
This function is designed to be used in high quality compositing
and perform a bilinear filtered sub-pixel blit.
@note When a rectangle is omitted the whole picture is used.
*/
static bool ScaleBlit(Picture &src, Picture &dst, Rect <float> *src_rect = 0, Rect <float> *dst_rect = 0);
/*!
@}
@name Cropping/framing functions.
@{
*/
/*!
@short Reframe picture.
All offsets may be negative.
Fill color can be specified and defaults to black.
@note Reframe(-2, -2, 2, 2) to display a 2 pixel-wide frame around
the picture.
*/
bool Reframe(int offset_sx, int offset_sy, int offset_ex, int offset_ey, const Color *fill = 0);
/// Crop picture to specified dimension.
bool Crop(uint target_width, uint target_height)
{ return (target_width <= width) && (target_height <= height) ? Reframe(0, 0, target_width - width, target_height - height) : false; }
/*!
@}
@name Rescaling functions.
@{
*/
/*!
@short Downscale a picture using area-summing filtering.
@note 0 can be used on width or height to resize the picture
proportionally.
*/
bool Downscale(uint width, uint height);
/*!
@short Resize a picture using bilinear filtering.
@note 0 can be used on width or height to resize the picture
proportionally.
*/
bool Resize(uint width, uint height);
/// Flip picture.
bool Flip(bool flip_h, bool flip_v);
/*!
@}
@name Color conversion functions.
@{
*/
protected:
bool RealToIntegerConversion(const PixelFormat &);
bool IntegerToIntegerConversion(const PixelFormat &);
bool Fast8888Conversion(const PixelFormat &);
public:
bool Swizzle(uchar r = 0, uchar g = 1, uchar b = 2, uchar a = 3);
/// Convert YUV buffers to RGB buffer.
static void YUV422toRGB32(uchar * const yuv_plane[3], uchar *rgb32, int width, int height, int dst_pitch = 0, int dst_height = 0);
/// Alpha blend two 32bit RGBA values together.
static uint ColorBlend(uint u, uint v, float opacity);
static void AlphaCompositePixel(uchar *data, uchar r, uchar g, uchar b, uchar a);
static uchar AlphaCompositeAlpha(uchar a, uchar b);
static uchar AlphaCompositeColor(uchar u, uchar v, uchar a, uchar b, uchar k);
bool ToGrayscale();
void Negative(bool r = true, bool g = true, bool b = true, bool a = false);
void UnpackYCbCr(uchar *y, uchar *cb, uchar *cr);
void PackYCbCr(uchar *y, uchar *cb, uchar *cr);
/*!
@}
@name Sampling functions.
@{
*/
void Sample(float u, float v, Color &out, uint _w = 0, uint _h = 0) const;
void Sample(float u, float v, uint &out, uint _w = 0, uint _h = 0) const;
void SampleRGBA(float u, float v, Color &out, uint _w = 0, uint _h = 0) const;
uint SampleInteger(float u, float v, uint _w = 0, uint _h = 0) const;
Color SampleColor(float u, float v, uint _w = 0, uint _h = 0) const;
Color SampleRGBAColor(float u, float v, uint _w = 0, uint _h = 0) const;
/*!
@}
@name Drawing functions.
@note Most of these functions are for now extremely slow!
@{
*/
protected:
/// Low-level draw line.
void LowLevelDrawLine(bool hq, float sx, float sy, float ex, float ey, float r, float g, float b, float a = 1, const Rect <float> *clip_rect = 0);
public:
/// Fill picture with a given color.
bool Fill(float r, float g, float b, float a = 1, const Rect <int> *clip_rect = 0, bool lock_alpha = false);
/// Draw a gradient.
void DrawGradient(const Gradient &gradient, const Rect <int> *clip_rect = 0);
/*!
@short Apply a convolution kernel to the picture.
@note Do not use in time critical code as this function is slow
and uses a temporary copy of the picture.
*/
bool ApplyConvolution(uint kernel_width, uint kernel_height, const int *weights, int weight = 256, int pass = 1, const Rect <int> *clip_rect = 0);
void DrawPlot(float x, float y, float r, float g, float b, float a = 1, const Rect <float> *clip_rect = 0);
void DrawPlotHQ(float x, float y, float r, float g, float b, float a = 1, const Rect <float> *clip_rect = 0);
void DrawLine(float sx, float sy, float ex, float ey, float r, float g, float b, float a = 1, const Rect <float> *clip_rect = 0);
void DrawLineHQ(float sx, float sy, float ex, float ey, float r, float g, float b, float a = 1, const Rect <float> *clip_rect = 0);
void DrawPolygon(uint point_count, Point <float> *point, float r, float g, float b, float a = 1, const Rect <float> *clip_rect = 0);
/// @}
bool ComputeHash();
int GetHash() const;
bool Compare(const Picture &picture) const;
/// Clone the picture via assignment operator.
void operator = (Picture &picture) { Clone(picture); }
/// Convert the picture to another pixel formats.
bool Convert(const PixelFormatDescription &);
/// Set the picture format without performing any data conversion.
bool SetFormat(const PixelFormatDescription &);
/*!
@short Set the picture dimensions but do not perform any allocation.
This function is used by the 3d engine built on the picture object.
It should not have any practical usage in standard usage.
*/
void Stub(uint w, uint h);
/// Is stub.
inline bool IsStub() const { return protected_flag.IsSet(PictureIsStub); }
/*!
@short Return image dimensions as a nfRect.
@note sx and sy are 0. Only ex and ey are relevant.
*/
inline iRect GetRect() const { return iRect(0, 0, width, height); }
/*!
@short Return image dimensions as a rectangle.
@note sx and sy are 0. Only ex and ey are relevant.
*/
inline void GetRect(iRect &rect) const { rect.Set(0, 0, width, height); }
/// Test is the picture has an alpha component.
bool HasAlpha() const;
inline uchar *GetData() const { return data; }
uchar *GetDataOffset(uint offset_x, uint offset_y) const { return data + (offset_x + offset_y * GetWidth()) * (pxformat.GetBpp() / 8); }
inline uint GetWidth() const { return width; }
inline uint GetHeight() const { return height; }
inline uchar GetBpp() const { return pxformat.GetBpp(); }
inline uint GetPitch() const { return (width * (pxformat.GetBpp() / 8)); }
inline bool isValid() const { return (width && height && data); }
/// Return the pixel format descriptor of the picture.
inline const PixelFormat &GetPixelFormat() const { return pxformat; }
void Clone(const Picture &, bool clone_data = true);
/*
@name Memory allocator.
@{
*/
virtual uchar *AllocMemory(size_t);
virtual void FreeMemory(uchar *);
/// @}
/*!
@short Set the picture object raster data source.
@note Ownership of the data buffer can be passed to this object.
*/
virtual void SetData(void *data, uint w, uint h, const PixelFormatDescription & = PixelFormat::RGBA8, bool take_ownership = false);
/*!
@short Allocate internal buffers overriding object settings.
@note Ownership of the data buffer is passed to this object.
@note If the internals already match the new settings this
function returns without doing anything unless user data is
passed.
@note If you provide the picture raster data buffer, you must make
sure that the pointer you pass to this function as user_data
is at least large enough to hold the complete picture in
memory.
@see SetData().
*/
virtual bool AllocAs(uint w, uint h, const PixelFormatDescription & = PixelFormat::RGBA8);
/*!
@short Free all object's data.
@note If you used the SetData() function the passed buffer will
not be freed by this object. You are responsible for
cleaning memory in such case.
*/
virtual void Free()
{
FreeData();
Zeroify();
}
Picture(const Picture &p)
{
Zeroify();
Clone(p);
}
Picture(void *data, uint w, uint h, const PixelFormatDescription &f = PixelFormat::RGBA8, bool take_ownership = false)
{
Zeroify();
SetData(data, w, h, f, take_ownership);
}
Picture(uint w, uint h, const PixelFormatDescription &f = PixelFormat::RGBA8)
{
Zeroify();
AllocAs(w, h, f);
}
Picture() { Zeroify(); }
virtual ~Picture();
};
typedef SharedPtr <Picture> sPicture;
} // GS
#endif // __NPICTURE__