📄 qdrawhelper_p.h
字号:
static int len_red; static int len_green; static int len_blue; static int len_alpha; static int off_red; static int off_green; static int off_blue; static int off_alpha;} Q_PACKED;template <typename SRC>static inline quint32 qt_convertToRgb(SRC color);template <>static inline quint32 qt_convertToRgb(quint32 color){ const int r = qRed(color) >> (8 - qrgb::len_red); const int g = qGreen(color) >> (8 - qrgb::len_green); const int b = qBlue(color) >> (8 - qrgb::len_blue); const int a = qAlpha(color) >> (8 - qrgb::len_alpha); const quint32 v = (r << qrgb::off_red) | (g << qrgb::off_green) | (b << qrgb::off_blue) | (a << qrgb::off_alpha); return v;}template <>static inline quint32 qt_convertToRgb(quint16 color){ return qt_convertToRgb(qt_colorConvert<quint32, quint16>(color, 0));}class qrgb_generic16{public: inline qrgb_generic16(quint32 color) { const int r = qRed(color) >> (8 - qrgb::len_red); const int g = qGreen(color) >> (8 - qrgb::len_green); const int b = qBlue(color) >> (8 - qrgb::len_blue); const int a = qAlpha(color) >> (8 - qrgb::len_alpha); data = (r << qrgb::off_red) | (g << qrgb::off_green) | (b << qrgb::off_blue) | (a << qrgb::off_alpha); } inline operator quint16 () { return data; } inline quint32 operator<<(int shift) const { return data << shift; }private: quint16 data;} Q_PACKED;template <>static inline qrgb_generic16 qt_colorConvert(quint32 color, qrgb_generic16 dummy){ Q_UNUSED(dummy); return qrgb_generic16(color);}template <>static inline qrgb_generic16 qt_colorConvert(quint16 color, qrgb_generic16 dummy){ Q_UNUSED(dummy); return qrgb_generic16(qt_colorConvert<quint32, quint16>(color, 0));}#endif // QT_QWS_DEPTH_GENERICtemplate <class T>void qt_memfill(T *dest, T value, int count);template<> inline void qt_memfill(quint32 *dest, quint32 color, int count){ extern void (*qt_memfill32)(quint32 *dest, quint32 value, int count); qt_memfill32(dest, color, count);}template<> inline void qt_memfill(quint16 *dest, quint16 color, int count){ extern void (*qt_memfill16)(quint16 *dest, quint16 value, int count); qt_memfill16(dest, color, count);}template <class T>inline void qt_memfill(T *dest, T value, int count){ int n = (count + 7) / 8; switch (count & 0x07) { case 0: do { *dest++ = value; case 7: *dest++ = value; case 6: *dest++ = value; case 5: *dest++ = value; case 4: *dest++ = value; case 3: *dest++ = value; case 2: *dest++ = value; case 1: *dest++ = value; } while (--n > 0); }}template <class T>inline void qt_rectfill(T *dest, T value, int x, int y, int width, int height, int stride){ stride /= sizeof(T); dest += y * stride + x; for (int j = 0; j < height; ++j) { qt_memfill(dest, value, width); dest += stride; }}template <class DST, class SRC>inline void qt_memconvert(DST *dest, const SRC *src, int count){ /* Duff's device */ int n = (count + 7) / 8; switch (count & 0x07) { case 0: do { *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 7: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 6: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 5: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 4: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 3: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 2: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); case 1: *dest++ = qt_colorConvert<DST, SRC>(*src++, 0); } while (--n > 0); }}template <class DST, class SRC>void qt_rectconvert(DST *dest, const SRC *src, int x, int y, int width, int height, int dstStride, int srcStride){ dstStride /= sizeof(DST); srcStride /= sizeof(SRC); dest += y * dstStride + x; for (int i = 0; i < height; ++i) { qt_memconvert<DST,SRC>(dest, src, width); dest += dstStride; src += srcStride; }}#ifdef QT_QWS_DEPTH_GENERICtemplate <> void qt_rectconvert(qrgb *dest, const quint32 *src, int x, int y, int width, int height, int dstStride, int srcStride);template <> void qt_rectconvert(qrgb *dest, const quint16 *src, int x, int y, int width, int height, int dstStride, int srcStride);#endif // QT_QWS_DEPTH_GENERIC#define QT_MEMFILL_UINT(dest, length, color) \ qt_memfill<quint32>(dest, color, length);#define QT_MEMFILL_USHORT(dest, length, color) \ qt_memfill<quint16>(dest, color, length);#define QT_MEMCPY_REV_UINT(dest, src, length) \do { \ /* Duff's device */ \ uint *_d = (uint*)(dest) + length; \ const uint *_s = (uint*)(src) + length; \ register int n = ((length) + 7) / 8; \ switch ((length) & 0x07) \ { \ case 0: do { *--_d = *--_s; \ case 7: *--_d = *--_s; \ case 6: *--_d = *--_s; \ case 5: *--_d = *--_s; \ case 4: *--_d = *--_s; \ case 3: *--_d = *--_s; \ case 2: *--_d = *--_s; \ case 1: *--_d = *--_s; \ } while (--n > 0); \ } \} while (0)#define QT_MEMCPY_USHORT(dest, src, length) \do { \ /* Duff's device */ \ ushort *_d = (ushort*)(dest); \ const ushort *_s = (ushort*)(src); \ register int n = ((length) + 7) / 8; \ switch ((length) & 0x07) \ { \ case 0: do { *_d++ = *_s++; \ case 7: *_d++ = *_s++; \ case 6: *_d++ = *_s++; \ case 5: *_d++ = *_s++; \ case 4: *_d++ = *_s++; \ case 3: *_d++ = *_s++; \ case 2: *_d++ = *_s++; \ case 1: *_d++ = *_s++; \ } while (--n > 0); \ } \} while (0)#define QT_DECL_MEMROTATE(srctype, desttype) \ void Q_GUI_QWS_EXPORT qt_memrotate90(const srctype*, int, int, int, desttype*, int); \ void Q_GUI_QWS_EXPORT qt_memrotate180(const srctype*, int, int, int, desttype*, int); \ void Q_GUI_QWS_EXPORT qt_memrotate270(const srctype*, int, int, int, desttype*, int)QT_DECL_MEMROTATE(quint32, quint32);QT_DECL_MEMROTATE(quint32, quint16);QT_DECL_MEMROTATE(quint16, quint32);QT_DECL_MEMROTATE(quint16, quint16);#ifdef QT_QWS_DEPTH_24QT_DECL_MEMROTATE(quint32, quint24);#endif#ifdef QT_QWS_DEPTH_18QT_DECL_MEMROTATE(quint32, quint18);#endifQT_DECL_MEMROTATE(quint32, quint8);QT_DECL_MEMROTATE(quint16, quint8);QT_DECL_MEMROTATE(quint8, quint8);#if defined(QT_QWS_DEPTH_GENERIC)QT_DECL_MEMROTATE(quint32, qrgb_generic16);QT_DECL_MEMROTATE(quint16, qrgb_generic16);#endif#undef QT_DECL_MEMROTATEstatic inline int qt_div_255(int x) { return (x + (x>>8) + 0x80) >> 8; }inline ushort qConvertRgb32To16(uint c){ return (((c) >> 3) & 0x001f) | (((c) >> 5) & 0x07e0) | (((c) >> 8) & 0xf800);}#if defined(Q_WS_QWS) || (QT_VERSION >= 0x040400)inline quint32 qConvertRgb32To16x2(quint64 c){ c = (((c) >> 3) & 0x001f0000001full) | (((c) >> 5) & 0x07e0000007e0ull) | (((c) >> 8) & 0xf8000000f800ull); return c | (c >> 16);}#endifinline QRgb qConvertRgb16To32(uint c){ return 0xff000000 | ((((c) << 3) & 0xf8) | (((c) >> 2) & 0x7)) | ((((c) << 5) & 0xfc00) | (((c) >> 1) & 0x300)) | ((((c) << 8) & 0xf80000) | (((c) << 3) & 0x70000));}#if 1static inline uint INTERPOLATE_PIXEL_256(uint x, uint a, uint y, uint b) { uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; t >>= 8; t &= 0xff00ff; x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; x &= 0xff00ff00; x |= t; return x;}static inline uint INTERPOLATE_PIXEL_255(uint x, uint a, uint y, uint b) { uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; t &= 0xff00ff; x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; x = (x + ((x >> 8) & 0xff00ff) + 0x800080); x &= 0xff00ff00; x |= t; return x;}static inline uint BYTE_MUL(uint x, uint a) { uint t = (x & 0xff00ff) * a; t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; t &= 0xff00ff; x = ((x >> 8) & 0xff00ff) * a; x = (x + ((x >> 8) & 0xff00ff) + 0x800080); x &= 0xff00ff00; x |= t; return x;}static inline uint PREMUL(uint x) { uint a = x >> 24; uint t = (x & 0xff00ff) * a; t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; t &= 0xff00ff; x = ((x >> 8) & 0xff) * a; x = (x + ((x >> 8) & 0xff) + 0x80); x &= 0xff00; x |= t | (a << 24); return x;}#else// possible implementation for 64 bitstatic inline uint INTERPOLATE_PIXEL_256(uint x, uint a, uint y, uint b) { ulong t = (((ulong(x)) | ((ulong(x)) << 24)) & 0x00ff00ff00ff00ff) * a; t += (((ulong(y)) | ((ulong(y)) << 24)) & 0x00ff00ff00ff00ff) * b; t >>= 8; t &= 0x00ff00ff00ff00ff; return (uint(t)) | (uint(t >> 24));}static inline uint INTERPOLATE_PIXEL_255(uint x, uint a, uint y, uint b) { ulong t = (((ulong(x)) | ((ulong(x)) << 24)) & 0x00ff00ff00ff00ff) * a; t += (((ulong(y)) | ((ulong(y)) << 24)) & 0x00ff00ff00ff00ff) * b; t = (t + ((t >> 8) & 0xff00ff00ff00ff) + 0x80008000800080); t &= 0x00ff00ff00ff00ff; return (uint(t)) | (uint(t >> 24));}static inline uint BYTE_MUL(uint x, uint a) { ulong t = (((ulong(x)) | ((ulong(x)) << 24)) & 0x00ff00ff00ff00ff) * a; t = (t + ((t >> 8) & 0xff00ff00ff00ff) + 0x80008000800080); t &= 0x00ff00ff00ff00ff; return (uint(t)) | (uint(t >> 24));}static inline uint PREMUL(uint x) { uint a = x >> 24; ulong t = (((ulong(x)) | ((ulong(x)) << 24)) & 0x00ff00ff00ff00ff) * a; t = (t + ((t >> 8) & 0xff00ff00ff00ff) + 0x80008000800080); t &= 0x00ff00ff00ff00ff; return (uint(t)) | (uint(t >> 24)) | 0xff000000;}#endif#define INV_PREMUL(p) \ (qAlpha(p) == 0 ? 0 : \ ((qAlpha(p) << 24) \ | (((255*qRed(p))/ qAlpha(p)) << 16) \ | (((255*qGreen(p)) / qAlpha(p)) << 8) \ | ((255*qBlue(p)) / qAlpha(p))))const uint qt_bayer_matrix[16][16] = { { 0x1, 0xc0, 0x30, 0xf0, 0xc, 0xcc, 0x3c, 0xfc, 0x3, 0xc3, 0x33, 0xf3, 0xf, 0xcf, 0x3f, 0xff}, { 0x80, 0x40, 0xb0, 0x70, 0x8c, 0x4c, 0xbc, 0x7c, 0x83, 0x43, 0xb3, 0x73, 0x8f, 0x4f, 0xbf, 0x7f}, { 0x20, 0xe0, 0x10, 0xd0, 0x2c, 0xec, 0x1c, 0xdc, 0x23, 0xe3, 0x13, 0xd3, 0x2f, 0xef, 0x1f, 0xdf}, { 0xa0, 0x60, 0x90, 0x50, 0xac, 0x6c, 0x9c, 0x5c, 0xa3, 0x63, 0x93, 0x53, 0xaf, 0x6f, 0x9f, 0x5f}, { 0x8, 0xc8, 0x38, 0xf8, 0x4, 0xc4, 0x34, 0xf4, 0xb, 0xcb, 0x3b, 0xfb, 0x7, 0xc7, 0x37, 0xf7}, { 0x88, 0x48, 0xb8, 0x78, 0x84, 0x44, 0xb4, 0x74, 0x8b, 0x4b, 0xbb, 0x7b, 0x87, 0x47, 0xb7, 0x77}, { 0x28, 0xe8, 0x18, 0xd8, 0x24, 0xe4, 0x14, 0xd4, 0x2b, 0xeb, 0x1b, 0xdb, 0x27, 0xe7, 0x17, 0xd7}, { 0xa8, 0x68, 0x98, 0x58, 0xa4, 0x64, 0x94, 0x54, 0xab, 0x6b, 0x9b, 0x5b, 0xa7, 0x67, 0x97, 0x57}, { 0x2, 0xc2, 0x32, 0xf2, 0xe, 0xce, 0x3e, 0xfe, 0x1, 0xc1, 0x31, 0xf1, 0xd, 0xcd, 0x3d, 0xfd}, { 0x82, 0x42, 0xb2, 0x72, 0x8e, 0x4e, 0xbe, 0x7e, 0x81, 0x41, 0xb1, 0x71, 0x8d, 0x4d, 0xbd, 0x7d}, { 0x22, 0xe2, 0x12, 0xd2, 0x2e, 0xee, 0x1e, 0xde, 0x21, 0xe1, 0x11, 0xd1, 0x2d, 0xed, 0x1d, 0xdd}, { 0xa2, 0x62, 0x92, 0x52, 0xae, 0x6e, 0x9e, 0x5e, 0xa1, 0x61, 0x91, 0x51, 0xad, 0x6d, 0x9d, 0x5d}, { 0xa, 0xca, 0x3a, 0xfa, 0x6, 0xc6, 0x36, 0xf6, 0x9, 0xc9, 0x39, 0xf9, 0x5, 0xc5, 0x35, 0xf5}, { 0x8a, 0x4a, 0xba, 0x7a, 0x86, 0x46, 0xb6, 0x76, 0x89, 0x49, 0xb9, 0x79, 0x85, 0x45, 0xb5, 0x75}, { 0x2a, 0xea, 0x1a, 0xda, 0x26, 0xe6, 0x16, 0xd6, 0x29, 0xe9, 0x19, 0xd9, 0x25, 0xe5, 0x15, 0xd5}, { 0xaa, 0x6a, 0x9a, 0x5a, 0xa6, 0x66, 0x96, 0x56, 0xa9, 0x69, 0x99, 0x59, 0xa5, 0x65, 0x95, 0x55}};#define ARGB_COMBINE_ALPHA(argb, alpha) \ ((((argb >> 24) * alpha) >> 8) << 24) | (argb & 0x00ffffff)#endif // QDRAWHELPER_P_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -