mirror of
https://github.com/yshui/picom.git
synced 2024-11-03 04:33:49 -05:00
Support all alpha values
Remove alpha_step, and support all 256 alpha values. 1 pixel pictures don't really use that many resources. Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
c389a1335d
commit
0a6f48dba2
5 changed files with 20 additions and 39 deletions
|
@ -27,7 +27,6 @@ inactive-opacity = 0.8;
|
|||
# active-opacity = 0.8;
|
||||
frame-opacity = 0.7;
|
||||
inactive-opacity-override = false;
|
||||
alpha-step = 0.06;
|
||||
# inactive-dim = 0.2;
|
||||
# inactive-dim-fixed = true;
|
||||
# blur-background = true;
|
||||
|
|
|
@ -148,9 +148,6 @@ OPTIONS
|
|||
*--vsync-aggressive*::
|
||||
Attempt to send painting request before VBlank and do XFlush() during VBlank. Reported to work pretty terribly. This switch may be lifted out at any moment.
|
||||
|
||||
*--alpha-step* 'VALUE'::
|
||||
X Render backend: Step for pregenerating alpha pictures. (0.01 - 1.0, defaults to 0.03)
|
||||
|
||||
*--dbe*::
|
||||
Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing. Reported to have no effect, though.
|
||||
|
||||
|
|
|
@ -62,6 +62,8 @@
|
|||
#define DEBUG_BACKTRACE 1
|
||||
#endif
|
||||
|
||||
#define MAX_ALPHA (255)
|
||||
|
||||
// === Includes ===
|
||||
|
||||
// For some special functions
|
||||
|
@ -582,8 +584,6 @@ typedef struct options_t {
|
|||
/// Whether to detect _NET_WM_OPACITY on client windows. Used on window
|
||||
/// managers that don't pass _NET_WM_OPACITY to frame windows.
|
||||
bool detect_client_opacity;
|
||||
/// Step for pregenerating alpha pictures. 0.01 - 1.0.
|
||||
double alpha_step;
|
||||
|
||||
// === Other window processing ===
|
||||
/// Whether to blur background of semi-transparent / ARGB windows.
|
||||
|
|
|
@ -324,12 +324,6 @@ resize_region(session_t *ps, region_t *region, short mod) {
|
|||
free(newrects);
|
||||
}
|
||||
|
||||
static inline int
|
||||
get_alpha_step(session_t *ps, opacity_t o) {
|
||||
double d = ((double) o) / OPAQUE;
|
||||
return (int)(round(normalize_d(d) / ps->o.alpha_step));
|
||||
}
|
||||
|
||||
static inline void
|
||||
__attribute__((nonnull(1, 2)))
|
||||
set_tgt_clip(session_t *ps, region_t *reg) {
|
||||
|
@ -1288,7 +1282,7 @@ paint_preprocess(session_t *ps, win *list) {
|
|||
|| w->g.x + w->g.width < 1 || w->g.y + w->g.height < 1
|
||||
|| w->g.x >= ps->root_width || w->g.y >= ps->root_height
|
||||
|| ((w->a.map_state == XCB_MAP_STATE_UNMAPPED || w->destroyed) && !w->paint.pixmap)
|
||||
|| get_alpha_step(ps, w->opacity) == 0
|
||||
|| (double) w->opacity / OPAQUE * MAX_ALPHA < 1
|
||||
|| w->paint_excluded)
|
||||
to_paint = false;
|
||||
//printf_errf("(): %s %d %d %d", w->name, to_paint, w->opacity, w->paint_excluded);
|
||||
|
@ -1602,7 +1596,7 @@ render(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
|
|||
case BKEND_XRENDER:
|
||||
case BKEND_XR_GLX_HYBRID:
|
||||
{
|
||||
int alpha_step = get_alpha_step(ps, opacity * OPAQUE);
|
||||
int alpha_step = opacity * MAX_ALPHA;
|
||||
xcb_render_picture_t alpha_pict = ps->alpha_picts[alpha_step];
|
||||
if (alpha_step != 0) {
|
||||
int op = ((!argb && !alpha_pict) ? XCB_RENDER_PICT_OP_SRC: XCB_RENDER_PICT_OP_OVER);
|
||||
|
@ -2011,7 +2005,7 @@ paint_all(session_t *ps, region_t *region, const region_t *region_real, win * co
|
|||
// Next, we set the region of paint and highlight it
|
||||
x_set_picture_clip_region(ps, new_pict, 0, 0, region_real);
|
||||
xcb_render_composite(ps->c, XCB_RENDER_PICT_OP_OVER, ps->white_picture,
|
||||
ps->alpha_picts[(int)(0.5 / ps->o.alpha_step)],
|
||||
ps->alpha_picts[MAX_ALPHA / 2],
|
||||
new_pict, 0, 0, 0, 0, 0, 0,
|
||||
ps->root_width, ps->root_height);
|
||||
|
||||
|
@ -3502,10 +3496,6 @@ usage(int ret) {
|
|||
" Attempt to send painting request before VBlank and do XFlush()\n"
|
||||
" during VBlank. This switch may be lifted out at any moment.\n"
|
||||
"\n"
|
||||
"--alpha-step val\n"
|
||||
" X Render backend: Step for pregenerating alpha pictures. \n"
|
||||
" 0.01 - 1.0. Defaults to 0.03.\n"
|
||||
"\n"
|
||||
"--paint-on-overlay\n"
|
||||
" Painting on X Composite overlay window.\n"
|
||||
"\n"
|
||||
|
@ -4109,13 +4099,15 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
|
|||
break;
|
||||
case 271:
|
||||
// --alpha-step
|
||||
ps->o.alpha_step = atof(optarg);
|
||||
printf_errf("(): --alpha-step has been removed, compton now tries to make use"
|
||||
" of all alpha values");
|
||||
break;
|
||||
case 272:
|
||||
printf_errf("(): use of --dbe is deprecated");
|
||||
break;
|
||||
case 273:
|
||||
printf_errf("(): --paint-on-overlay is removed, and is enabled when possible");
|
||||
printf_errf("(): --paint-on-overlay has been removed, and is enabled when "
|
||||
"possible");
|
||||
break;
|
||||
P_CASEBOOL(274, sw_opti);
|
||||
P_CASEBOOL(275, vsync_aggressive);
|
||||
|
@ -4255,7 +4247,6 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
|
|||
ps->o.shadow_opacity = normalize_d(ps->o.shadow_opacity);
|
||||
cfgtmp.menu_opacity = normalize_d(cfgtmp.menu_opacity);
|
||||
ps->o.refresh_rate = normalize_i_range(ps->o.refresh_rate, 0, 300);
|
||||
ps->o.alpha_step = normalize_d_range(ps->o.alpha_step, 0.01, 1.0);
|
||||
|
||||
if (shadow_enable)
|
||||
wintype_arr_enable(ps->o.wintype_shadow);
|
||||
|
@ -4689,18 +4680,12 @@ vsync_deinit(session_t *ps) {
|
|||
*/
|
||||
static void
|
||||
init_alpha_picts(session_t *ps) {
|
||||
int i;
|
||||
int num = round(1.0 / ps->o.alpha_step) + 1;
|
||||
ps->alpha_picts = malloc(sizeof(xcb_render_picture_t) * (MAX_ALPHA+1));
|
||||
|
||||
ps->alpha_picts = malloc(sizeof(xcb_render_picture_t) * num);
|
||||
|
||||
for (i = 0; i < num; ++i) {
|
||||
double o = i * ps->o.alpha_step;
|
||||
if ((1.0 - o) > ps->o.alpha_step) {
|
||||
ps->alpha_picts[i] = solid_picture(ps, false, o, 0, 0, 0);
|
||||
assert(ps->alpha_picts[i] != None);
|
||||
} else
|
||||
ps->alpha_picts[i] = None;
|
||||
for (int i = 0; i <= MAX_ALPHA; ++i) {
|
||||
double o = (double) i / MAX_ALPHA;
|
||||
ps->alpha_picts[i] = solid_picture(ps, false, o, 0, 0, 0);
|
||||
assert(ps->alpha_picts[i] != None);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5106,7 +5091,6 @@ session_init(session_t *ps_old, int argc, char **argv) {
|
|||
.active_opacity = OPAQUE,
|
||||
.frame_opacity = 1.0,
|
||||
.detect_client_opacity = false,
|
||||
.alpha_step = 0.03,
|
||||
|
||||
.blur_background = false,
|
||||
.blur_background_frame = false,
|
||||
|
@ -5635,8 +5619,7 @@ session_destroy(session_t *ps) {
|
|||
|
||||
// Free alpha_picts
|
||||
{
|
||||
const int max = round(1.0 / ps->o.alpha_step) + 1;
|
||||
for (int i = 0; i < max; ++i)
|
||||
for (int i = 0; i <= MAX_ALPHA; ++i)
|
||||
free_picture(ps, &ps->alpha_picts[i]);
|
||||
free(ps->alpha_picts);
|
||||
ps->alpha_picts = NULL;
|
||||
|
|
|
@ -295,8 +295,6 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
|
|||
// --backend
|
||||
if (config_lookup_string(&cfg, "backend", &sval) && !parse_backend(ps, sval))
|
||||
exit(1);
|
||||
// --alpha-step
|
||||
config_lookup_float(&cfg, "alpha-step", &ps->o.alpha_step);
|
||||
// --sw-opti
|
||||
lcfg_lookup_bool(&cfg, "sw-opti", &ps->o.sw_opti);
|
||||
// --use-ewmh-active-win
|
||||
|
@ -365,8 +363,12 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
|
|||
printf_errf("(): \"paint-on-overlay\" has been removed as an option, and "
|
||||
"is enabled whenever possible");
|
||||
|
||||
if (config_lookup_float(&cfg, "alpha-step", &dval))
|
||||
printf_errf("(): \"alpha-step\" has been removed, compton now tries to make use"
|
||||
" of all alpha values");
|
||||
|
||||
const char *deprecation_message = "has been removed. If you encounter problems "
|
||||
"without this feature, please feel free to open a bug report.";
|
||||
"without this feature, please feel free to open a bug report";
|
||||
if (lcfg_lookup_bool(&cfg, "glx-use-copysubbuffermesa", &bval) && bval)
|
||||
printf_errf("(): \"glx-use-copysubbuffermesa\" %s", deprecation_message);
|
||||
if (lcfg_lookup_bool(&cfg, "glx-copy-from-front", &bval) && bval)
|
||||
|
|
Loading…
Reference in a new issue