Here is a script adaptation of the scale2x algorithm:
var image = Document.RasterImage;
var sizeX = image.sizeX;
var sizeY = image.sizeY;
// create copy of the image with border pixels duplicated
var timg = Blender.CreateCanvas(sizeX+2, sizeY+2, 0);
Blender.Compose(timg, 1, 1, sizeX+1, sizeY+1, image, 0, 0, 0, Blender.OpSrc);
Blender.Compose(timg, 0, 1, 1, sizeY+1, image, 0, 0, 0, Blender.OpSrc);
Blender.Compose(timg, 1, 0, sizeX+1, 1, image, 0, 0, 0, Blender.OpSrc);
Blender.Compose(timg, sizeX+1, 1, sizeX+2, sizeY+1, image, sizeX-1, 0, 0, Blender.OpSrc);
Blender.Compose(timg, 1, sizeY+1, sizeX+1, sizeY+2, image, 0, sizeY-1, 0, Blender.OpSrc);
timg.SetPixel(0, 0, 0, 0, timg.GetPixel(1, 1, 0, 0));
timg.SetPixel(0, sizeY+1, 0, 0, timg.GetPixel(1, sizeY, 0, 0));
timg.SetPixel(sizeX+1, 0, 0, 0, timg.GetPixel(sizeX, 1, 0, 0));
timg.SetPixel(sizeX+1, sizeY+1, 0, 0, timg.GetPixel(sizeX, sizeY, 0, 0));
// double the size of the canvas of the original image
image.Resize(sizeX*2, sizeY*2, 1, 1, 0, 0, 0, 0);
// apply scale2x
for (var y = 0; y < sizeY; ++y)
{
for (var x = 0; x < sizeX; ++x)
{
var B = timg.GetPixel(x+1, y, 0, 0);
var D = timg.GetPixel(x, y+1, 0, 0);
var E = timg.GetPixel(x+1, y+1, 0, 0);
var F = timg.GetPixel(x+2, y+1, 0, 0);
var H = timg.GetPixel(x+1, y+2, 0, 0);
if (B != H && D != F)
{
image.SetPixel(x*2 , y*2 , 0, 0, D == B ? D : E);
image.SetPixel(x*2+1, y*2 , 0, 0, B == F ? F : E);
image.SetPixel(x*2 , y*2+1, 0, 0, D == H ? D : E);
image.SetPixel(x*2+1, y*2+1, 0, 0, H == F ? F : E);
}
else
{
image.SetPixel(x*2 , y*2 , 0, 0, E);
image.SetPixel(x*2+1, y*2 , 0, 0, E);
image.SetPixel(x*2 , y*2+1, 0, 0, E);
image.SetPixel(x*2+1, y*2+1, 0, 0, E);
}
}
}
Go to Effect->Custom operation... and paste the above code there replacing the original. If you want to use the custom operation icon on the toolbar, you may also want to comment out the code in the Configuration tab.