View Single Post
Old 07-20-2022, 03:21 PM   #6
papagirafe
Human being with feelings
 
papagirafe's Avatar
 
Join Date: Aug 2020
Location: Brasil
Posts: 690
Default

Ok folks,

Here is a more permanent solution to this ajustable vignette position. I did a major rewite and simplification of the stock preset and guess what: no more video artifacts. A major rewrite means potential situations I've overlooked so let me know if there are problems.
Code:
//Peephole wipe / vignette v3
// by Papagirafe 
// major stock code simplification + adjustable vignette position
//@param size 'size' 1 0 8 1 0.01
//@param scale 'shaping' 1 .5 10 5.25 0.01
//@param div 'sub-divide' 32 8 256 36 1
//@param fgi 'fg src' 0 0 10 5 1
//@param bgi 'bg src' 1 0 10 5 1
//@param fga 'fg alpha' 1 0 1 0.5 0.01
//@param bga 'bg alpha' 1 0 1 0.5 0.01
//@param xoff "fg x offset" 0 -1 1 0 0.01
//@param yoff "fg y offset" 0 -1 1 0 0.01

function vignette(si,x,y,w,h, size, scale, alpha)
  local(divw, divh, xp, yp, dx, dy, p, yv,xsc, ysc, xr, yr, mask, sz, adj)
  global(div,project_w,project_h,colorspace)
(
  input_info(si,w,h);
  sz=max(min(w,h)*size*.5,1);
  adj=-scale/sz;

  mask = colorspace=='RGBA'?-1:-2;
  divw = w*.5; while (divw > div) ( divw *= 0.5 ); divw |= 0;
  divh = h*.5; while (divh > div) ( divh *= 0.5 ); divh |= 0;

  dx = w / (divw-1); dy = h / (divh-1);
  xsc = w / project_w; 
  ysc = h / project_h;
  yp=p=0;
  loop(divh,
    xp=0;
    yr = (yp+0.5)&mask;
    yv = sqr(yr-h*.5);
    loop(divw,
      xr = (xp+0.5)&mask;
      p[0]=(x + xr)*xsc; p[1] = (y + yr)*ysc;
      p[2] = alpha * max(min((sqrt(sqr(xr-w*.5)+yv)-sz)*adj,1),0);
      p += 3;
      xp += dx;
    );
    yp += dy;
  );
  gfx_xformblit(si,x,y,w,h,divw,divh,0,1);
);
////////////////////////////////
!project_wh_valid?( //get a rectangle that can contain both images
  input_info(fgi,fw,fh); input_info(bgi,fw,fh); 
  project_w=max(fw,bw); project_h=max(fh,bh);
);
xoff*=(project_w/2);
yoff*=(project_h/2);
gfx_set(0,0,0,1,0,-1,0);
gfx_blit(bgi,0);
bga<1?(
  gfx_a=1-bga;
  gfx_blit(fgi,0);
);
gfx_a=1;
vignette(fgi,xoff,yoff,fsw,fsh,size,scale,fga);

Last edited by papagirafe; 07-23-2022 at 04:46 AM. Reason: correcting typo in code
papagirafe is online now   Reply With Quote