941
operator_name (pixman_op_t op)
945
case PIXMAN_OP_CLEAR: return "PIXMAN_OP_CLEAR";
946
case PIXMAN_OP_SRC: return "PIXMAN_OP_SRC";
947
case PIXMAN_OP_DST: return "PIXMAN_OP_DST";
948
case PIXMAN_OP_OVER: return "PIXMAN_OP_OVER";
949
case PIXMAN_OP_OVER_REVERSE: return "PIXMAN_OP_OVER_REVERSE";
950
case PIXMAN_OP_IN: return "PIXMAN_OP_IN";
951
case PIXMAN_OP_IN_REVERSE: return "PIXMAN_OP_IN_REVERSE";
952
case PIXMAN_OP_OUT: return "PIXMAN_OP_OUT";
953
case PIXMAN_OP_OUT_REVERSE: return "PIXMAN_OP_OUT_REVERSE";
954
case PIXMAN_OP_ATOP: return "PIXMAN_OP_ATOP";
955
case PIXMAN_OP_ATOP_REVERSE: return "PIXMAN_OP_ATOP_REVERSE";
956
case PIXMAN_OP_XOR: return "PIXMAN_OP_XOR";
957
case PIXMAN_OP_ADD: return "PIXMAN_OP_ADD";
958
case PIXMAN_OP_SATURATE: return "PIXMAN_OP_SATURATE";
960
case PIXMAN_OP_DISJOINT_CLEAR: return "PIXMAN_OP_DISJOINT_CLEAR";
961
case PIXMAN_OP_DISJOINT_SRC: return "PIXMAN_OP_DISJOINT_SRC";
962
case PIXMAN_OP_DISJOINT_DST: return "PIXMAN_OP_DISJOINT_DST";
963
case PIXMAN_OP_DISJOINT_OVER: return "PIXMAN_OP_DISJOINT_OVER";
964
case PIXMAN_OP_DISJOINT_OVER_REVERSE: return "PIXMAN_OP_DISJOINT_OVER_REVERSE";
965
case PIXMAN_OP_DISJOINT_IN: return "PIXMAN_OP_DISJOINT_IN";
966
case PIXMAN_OP_DISJOINT_IN_REVERSE: return "PIXMAN_OP_DISJOINT_IN_REVERSE";
967
case PIXMAN_OP_DISJOINT_OUT: return "PIXMAN_OP_DISJOINT_OUT";
968
case PIXMAN_OP_DISJOINT_OUT_REVERSE: return "PIXMAN_OP_DISJOINT_OUT_REVERSE";
969
case PIXMAN_OP_DISJOINT_ATOP: return "PIXMAN_OP_DISJOINT_ATOP";
970
case PIXMAN_OP_DISJOINT_ATOP_REVERSE: return "PIXMAN_OP_DISJOINT_ATOP_REVERSE";
971
case PIXMAN_OP_DISJOINT_XOR: return "PIXMAN_OP_DISJOINT_XOR";
973
case PIXMAN_OP_CONJOINT_CLEAR: return "PIXMAN_OP_CONJOINT_CLEAR";
974
case PIXMAN_OP_CONJOINT_SRC: return "PIXMAN_OP_CONJOINT_SRC";
975
case PIXMAN_OP_CONJOINT_DST: return "PIXMAN_OP_CONJOINT_DST";
976
case PIXMAN_OP_CONJOINT_OVER: return "PIXMAN_OP_CONJOINT_OVER";
977
case PIXMAN_OP_CONJOINT_OVER_REVERSE: return "PIXMAN_OP_CONJOINT_OVER_REVERSE";
978
case PIXMAN_OP_CONJOINT_IN: return "PIXMAN_OP_CONJOINT_IN";
979
case PIXMAN_OP_CONJOINT_IN_REVERSE: return "PIXMAN_OP_CONJOINT_IN_REVERSE";
980
case PIXMAN_OP_CONJOINT_OUT: return "PIXMAN_OP_CONJOINT_OUT";
981
case PIXMAN_OP_CONJOINT_OUT_REVERSE: return "PIXMAN_OP_CONJOINT_OUT_REVERSE";
982
case PIXMAN_OP_CONJOINT_ATOP: return "PIXMAN_OP_CONJOINT_ATOP";
983
case PIXMAN_OP_CONJOINT_ATOP_REVERSE: return "PIXMAN_OP_CONJOINT_ATOP_REVERSE";
984
case PIXMAN_OP_CONJOINT_XOR: return "PIXMAN_OP_CONJOINT_XOR";
986
case PIXMAN_OP_MULTIPLY: return "PIXMAN_OP_MULTIPLY";
987
case PIXMAN_OP_SCREEN: return "PIXMAN_OP_SCREEN";
988
case PIXMAN_OP_OVERLAY: return "PIXMAN_OP_OVERLAY";
989
case PIXMAN_OP_DARKEN: return "PIXMAN_OP_DARKEN";
990
case PIXMAN_OP_LIGHTEN: return "PIXMAN_OP_LIGHTEN";
991
case PIXMAN_OP_COLOR_DODGE: return "PIXMAN_OP_COLOR_DODGE";
992
case PIXMAN_OP_COLOR_BURN: return "PIXMAN_OP_COLOR_BURN";
993
case PIXMAN_OP_HARD_LIGHT: return "PIXMAN_OP_HARD_LIGHT";
994
case PIXMAN_OP_SOFT_LIGHT: return "PIXMAN_OP_SOFT_LIGHT";
995
case PIXMAN_OP_DIFFERENCE: return "PIXMAN_OP_DIFFERENCE";
996
case PIXMAN_OP_EXCLUSION: return "PIXMAN_OP_EXCLUSION";
997
case PIXMAN_OP_HSL_HUE: return "PIXMAN_OP_HSL_HUE";
998
case PIXMAN_OP_HSL_SATURATION: return "PIXMAN_OP_HSL_SATURATION";
999
case PIXMAN_OP_HSL_COLOR: return "PIXMAN_OP_HSL_COLOR";
1000
case PIXMAN_OP_HSL_LUMINOSITY: return "PIXMAN_OP_HSL_LUMINOSITY";
1002
case PIXMAN_OP_NONE:
1003
return "<invalid operator 'none'>";
1006
return "<unknown operator>";
1010
format_name (pixman_format_code_t format)
952
struct operator_entry {
955
pixman_bool_t is_alias;
958
typedef struct operator_entry operator_entry_t;
960
static const operator_entry_t op_list[] =
963
{ PIXMAN_OP_##op, "PIXMAN_OP_" #op, FALSE }
964
#define ALIAS(op, nam) \
965
{ PIXMAN_OP_##op, nam, TRUE }
967
/* operator_name () will return the first hit in this table,
968
* so keep the list properly ordered between entries and aliases.
969
* Aliases are not listed by list_operators ().
976
ENTRY (OVER_REVERSE),
977
ALIAS (OVER_REVERSE, "overrev"),
980
ALIAS (IN_REVERSE, "inrev"),
983
ALIAS (OUT_REVERSE, "outrev"),
985
ENTRY (ATOP_REVERSE),
986
ALIAS (ATOP_REVERSE, "atoprev"),
991
ENTRY (DISJOINT_CLEAR),
992
ENTRY (DISJOINT_SRC),
993
ENTRY (DISJOINT_DST),
994
ENTRY (DISJOINT_OVER),
995
ENTRY (DISJOINT_OVER_REVERSE),
997
ENTRY (DISJOINT_IN_REVERSE),
998
ENTRY (DISJOINT_OUT),
999
ENTRY (DISJOINT_OUT_REVERSE),
1000
ENTRY (DISJOINT_ATOP),
1001
ENTRY (DISJOINT_ATOP_REVERSE),
1002
ENTRY (DISJOINT_XOR),
1004
ENTRY (CONJOINT_CLEAR),
1005
ENTRY (CONJOINT_SRC),
1006
ENTRY (CONJOINT_DST),
1007
ENTRY (CONJOINT_OVER),
1008
ENTRY (CONJOINT_OVER_REVERSE),
1009
ENTRY (CONJOINT_IN),
1010
ENTRY (CONJOINT_IN_REVERSE),
1011
ENTRY (CONJOINT_OUT),
1012
ENTRY (CONJOINT_OUT_REVERSE),
1013
ENTRY (CONJOINT_ATOP),
1014
ENTRY (CONJOINT_ATOP_REVERSE),
1015
ENTRY (CONJOINT_XOR),
1022
ENTRY (COLOR_DODGE),
1029
ENTRY (HSL_SATURATION),
1031
ENTRY (HSL_LUMINOSITY),
1033
ALIAS (NONE, "<invalid operator 'none'>")
1041
pixman_format_code_t format;
1043
pixman_bool_t is_alias;
1046
typedef struct format_entry format_entry_t;
1048
static const format_entry_t format_list[] =
1051
{ PIXMAN_##f, #f, FALSE }
1052
#define ALIAS(f, nam) \
1053
{ PIXMAN_##f, nam, TRUE }
1055
/* format_name () will return the first hit in this table,
1056
* so keep the list properly ordered between entries and aliases.
1057
* Aliases are not listed by list_formats ().
1014
1060
/* 32bpp formats */
1015
case PIXMAN_a8r8g8b8: return "a8r8g8b8";
1016
case PIXMAN_x8r8g8b8: return "x8r8g8b8";
1017
case PIXMAN_a8b8g8r8: return "a8b8g8r8";
1018
case PIXMAN_x8b8g8r8: return "x8b8g8r8";
1019
case PIXMAN_b8g8r8a8: return "b8g8r8a8";
1020
case PIXMAN_b8g8r8x8: return "b8g8r8x8";
1021
case PIXMAN_r8g8b8a8: return "r8g8b8a8";
1022
case PIXMAN_r8g8b8x8: return "r8g8b8x8";
1023
case PIXMAN_x14r6g6b6: return "x14r6g6b6";
1024
case PIXMAN_x2r10g10b10: return "x2r10g10b10";
1025
case PIXMAN_a2r10g10b10: return "a2r10g10b10";
1026
case PIXMAN_x2b10g10r10: return "x2b10g10r10";
1027
case PIXMAN_a2b10g10r10: return "a2b10g10r10";
1062
ALIAS (a8r8g8b8, "8888"),
1064
ALIAS (x8r8g8b8, "x888"),
1072
ENTRY (x2r10g10b10),
1073
ALIAS (x2r10g10b10, "2x10"),
1074
ENTRY (a2r10g10b10),
1075
ALIAS (a2r10g10b10, "2a10"),
1076
ENTRY (x2b10g10r10),
1077
ENTRY (a2b10g10r10),
1029
1079
/* sRGB formats */
1030
case PIXMAN_a8r8g8b8_sRGB: return "a8r8g8b8_sRGB";
1080
ENTRY (a8r8g8b8_sRGB),
1032
1082
/* 24bpp formats */
1033
case PIXMAN_r8g8b8: return "r8g8b8";
1034
case PIXMAN_b8g8r8: return "b8g8r8";
1037
case PIXMAN_r5g6b5: return "r5g6b5";
1038
case PIXMAN_b5g6r5: return "b5g6r5";
1040
case PIXMAN_a1r5g5b5: return "a1r5g5b5";
1041
case PIXMAN_x1r5g5b5: return "x1r5g5b5";
1042
case PIXMAN_a1b5g5r5: return "a1b5g5r5";
1043
case PIXMAN_x1b5g5r5: return "x1b5g5r5";
1044
case PIXMAN_a4r4g4b4: return "a4r4g4b4";
1045
case PIXMAN_x4r4g4b4: return "x4r4g4b4";
1046
case PIXMAN_a4b4g4r4: return "a4b4g4r4";
1047
case PIXMAN_x4b4g4r4: return "x4b4g4r4";
1084
ALIAS (r8g8b8, "0888"),
1087
/* 16 bpp formats */
1089
ALIAS (r5g6b5, "0565"),
1093
ALIAS (a1r5g5b5, "1555"),
1098
ALIAS (a4r4g4b4, "4444"),
1049
1103
/* 8bpp formats */
1050
case PIXMAN_a8: return "a8";
1051
case PIXMAN_r3g3b2: return "r3g3b2";
1052
case PIXMAN_b2g3r3: return "b2g3r3";
1053
case PIXMAN_a2r2g2b2: return "a2r2g2b2";
1054
case PIXMAN_a2b2g2r2: return "a2b2g2r2";
1057
case PIXMAN_x4c4: return "x4c4";
1058
case PIXMAN_g8: return "g8";
1060
case PIXMAN_c8: return "x4c4 / c8";
1061
case PIXMAN_x4g4: return "x4g4 / g8";
1063
case PIXMAN_x4a4: return "x4a4";
1066
case PIXMAN_a4: return "a4";
1067
case PIXMAN_r1g2b1: return "r1g2b1";
1068
case PIXMAN_b1g2r1: return "b1g2r1";
1069
case PIXMAN_a1r1g1b1: return "a1r1g1b1";
1070
case PIXMAN_a1b1g1r1: return "a1b1g1r1";
1072
case PIXMAN_c4: return "c4";
1073
case PIXMAN_g4: return "g4";
1109
ALIAS (a2r2g2b2, "2222"),
1112
ALIAS (c8, "x4c4 / c8"),
1114
ALIAS (g8, "x4g4 / g8"),
1119
/* These format codes are identical to c8 and g8, respectively. */
1075
1135
/* 1bpp formats */
1076
case PIXMAN_a1: return "a1";
1078
case PIXMAN_g1: return "g1";
1080
1141
/* YUV formats */
1081
case PIXMAN_yuy2: return "yuy2";
1082
case PIXMAN_yv12: return "yv12";
1087
* This is separate switch to prevent GCC from complaining
1088
* that the values are not in the pixman_format_code_t enum.
1090
switch ((uint32_t)format)
1092
case PIXMAN_null: return "null";
1093
case PIXMAN_solid: return "solid";
1094
case PIXMAN_pixbuf: return "pixbuf";
1095
case PIXMAN_rpixbuf: return "rpixbuf";
1096
case PIXMAN_unknown: return "unknown";
1142
ALIAS (yuy2, "yuy2"),
1144
ALIAS (yv12, "yv12"),
1147
/* Fake formats, not in pixman_format_code_t enum */
1148
ALIAS (null, "null"),
1149
ALIAS (solid, "solid"),
1151
ALIAS (pixbuf, "pixbuf"),
1152
ALIAS (rpixbuf, "rpixbuf"),
1153
ALIAS (unknown, "unknown"),
1159
pixman_format_code_t
1160
format_from_string (const char *s)
1164
for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
1166
const format_entry_t *ent = &format_list[i];
1168
if (strcasecmp (ent->name, s) == 0)
1176
emit (const char *s, int *n_chars)
1178
*n_chars += printf ("%s,", s);
1197
printf ("Formats:\n ");
1200
for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
1202
const format_entry_t *ent = &format_list[i];
1207
emit (ent->name, &n_chars);
1214
list_operators (void)
1216
char short_name [128] = { 0 };
1219
printf ("Operators:\n ");
1222
for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
1224
const operator_entry_t *ent = &op_list[i];
1230
snprintf (short_name, sizeof (short_name) - 1, "%s",
1231
ent->name + strlen ("PIXMAN_OP_"));
1233
for (j = 0; short_name[j] != '\0'; ++j)
1234
short_name[j] = tolower (short_name[j]);
1236
emit (short_name, &n_chars);
1243
operator_from_string (const char *s)
1247
for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
1249
const operator_entry_t *ent = &op_list[i];
1253
if (strcasecmp (ent->name, s) == 0)
1258
if (strcasecmp (ent->name + strlen ("PIXMAN_OP_"), s) == 0)
1263
return PIXMAN_OP_NONE;
1267
operator_name (pixman_op_t op)
1271
for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
1273
const operator_entry_t *ent = &op_list[i];
1279
return "<unknown operator>";
1283
format_name (pixman_format_code_t format)
1287
for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
1289
const format_entry_t *ent = &format_list[i];
1291
if (ent->format == format)
1099
1295
return "<unknown format>";
1298
#define IS_ZERO(f) (-DBL_MIN < (f) && (f) < DBL_MIN)
1300
typedef double (* blend_func_t) (double as, double s, double ad, double d);
1302
static force_inline double
1303
blend_multiply (double sa, double s, double da, double d)
1308
static force_inline double
1309
blend_screen (double sa, double s, double da, double d)
1311
return d * sa + s * da - s * d;
1314
static force_inline double
1315
blend_overlay (double sa, double s, double da, double d)
1320
return sa * da - 2 * (da - d) * (sa - s);
1323
static force_inline double
1324
blend_darken (double sa, double s, double da, double d)
1335
static force_inline double
1336
blend_lighten (double sa, double s, double da, double d)
1347
static force_inline double
1348
blend_color_dodge (double sa, double s, double da, double d)
1352
else if (d * sa >= sa * da - s * da)
1354
else if (IS_ZERO (sa - s))
1357
return sa * sa * d / (sa - s);
1360
static force_inline double
1361
blend_color_burn (double sa, double s, double da, double d)
1365
else if (sa * (da - d) >= s * da)
1367
else if (IS_ZERO (s))
1370
return sa * (da - sa * (da - d) / s);
1373
static force_inline double
1374
blend_hard_light (double sa, double s, double da, double d)
1379
return sa * da - 2 * (da - d) * (sa - s);
1382
static force_inline double
1383
blend_soft_light (double sa, double s, double da, double d)
1390
return d * sa - d * (da - d) * (sa - 2 * s) / da;
1401
return d * sa + (2 * s - sa) * d * ((16 * d / da - 12) * d / da + 3);
1403
return d * sa + (sqrt (d * da) - d) * (2 * s - sa);
1408
static force_inline double
1409
blend_difference (double sa, double s, double da, double d)
1411
double dsa = d * sa;
1412
double sda = s * da;
1420
static force_inline double
1421
blend_exclusion (double sa, double s, double da, double d)
1423
return s * da + d * sa - 2 * d * s;
1438
blend_channel (double as, double s, double ad, double d,
1441
return clamp ((1 - ad) * s + (1 - as) * d + blend (as, s, ad, d));
1103
1445
calc_op (pixman_op_t op, double src, double dst, double srca, double dsta)