Interesting, here's how I did it in AGK:
float dist(double a,double b,double c,double d){
float e = sqrt( ((a-c)*(a-c)) + ((b-d)*(b-d)));
return e;
}
int createBoxImage(int width, int height, float radius){ //radius in pixels
int size = width*height*4 + 12;
int mem = agk::CreateMemblock(size);
agk::SetMemblockInt(mem,0,width);
agk::SetMemblockInt(mem,4,height);
agk::SetMemblockInt(mem,8,32);
int pixelIsInCorner=0;
float gradient=0;
for(int ty=0;ty<height;ty++){
for(int tx=0;tx<width;tx++){
pixelIsInCorner=0;
gradient=ty*(10.0/height);
if(tx<radius){ //Left half of the screen
if(ty<radius){ //top left half
if(dist(tx,ty,radius,radius)>radius){pixelIsInCorner=1;}
}else if( ty>(height-radius)){ //Bottom Left half
if(dist(tx,ty,radius,height-radius)>radius){pixelIsInCorner=1;}
}
}else if(tx>(width-radius)){ //Right half of the screen
if(ty<radius){ //Top Right
if(dist(tx,ty,width-radius,radius)>radius){pixelIsInCorner=1;}
}else if(ty>(height-radius)){ //Bottom Right
if(dist(tx,ty,width-radius,height-radius)>radius){pixelIsInCorner=1;}
}
}
int d = 12 + (ty*width + tx)*4;
switch(pixelIsInCorner){
case 1:
agk::SetMemblockByte(mem,d,255-gradient); //RGBA 255,255,255,0
agk::SetMemblockByte(mem,d+1,255-gradient);
agk::SetMemblockByte(mem,d+2,255-gradient);
agk::SetMemblockByte(mem,d+3,0);
break;
case 0:
agk::SetMemblockByte(mem,d,255-gradient); //RGBA 255,255,255,255
agk::SetMemblockByte(mem,d+1,255-gradient);
agk::SetMemblockByte(mem,d+2,255-gradient);
agk::SetMemblockByte(mem,d+3,255);
break;
}
}
}
int i = agk::CreateImageFromMemblock(mem);
agk::DeleteMemblock(mem);
return i;
}