Scale2x Algorithm

The effect works repeating a computation pattern for every pixel of the original image. The pattern starts from a square of 9 pixels and expands the central pixel computing 4 new pixels.

Starting from this pattern :

ABC
DEF
GHI

The central pixel E is expanded in 4 new pixels:

E0E1
E2E3

with these rules (in C language) :

E0 = D == B && B != F && D != H ? D : E;
E1 = B == F && B != D && F != H ? F : E;
E2 = D == H && D != B && H != F ? D : E;
E3 = H == F && D != H && B != F ? F : E;

which can be rewritten as :

E0 = D == B && B != H && D != F ? D : E;
E1 = B == F && B != H && D != F ? F : E;
E2 = D == H && B != H && D != F ? D : E;
E3 = H == F && B != H && D != F ? F : E;

and optimized as:

if (B != H && D != F) {
	E0 = D == B ? D : E;
	E1 = B == F ? F : E;
	E2 = D == H ? D : E;
	E3 = H == F ? F : E;
} else {
	E0 = E;
	E1 = E;
	E2 = E;
	E3 = E;
}

The image border is computed reusing the value of the nearest pixel on the border when the value of a pixel over the border is required.

Scale3x Algorithm

Starting from this pattern :

ABC
DEF
GHI

The central pixel E is expanded in 9 new pixels:

E0E1E2
E3E4E5
E6E7E8

with these rules (in C language) :

E0 = D == B && B != F && D != H ? D : E;
E1 = (D == B && B != F && D != H && E != C) || (B == F && B != D && F != H && E != A) ? B : E;
E2 = B == F && B != D && F != H ? F : E;
E3 = (D == B && B != F && D != H && E != G) || (D == H && D != B && H != F && E != A) ? D : E;
E4 = E
E5 = (B == F && B != D && F != H && E != I) || (H == F && D != H && B != F && E != C) ? F : E;
E6 = D == H && D != B && H != F ? D : E;
E7 = (D == H && D != B && H != F && E != I) || (H == F && D != H && B != F && E != G) ? H : E;
E8 = H == F && D != H && B != F ? F : E;

and optimized as:

if (B != H && D != F) {
	E0 = D == B ? D : E;
	E1 = (D == B && E != C) || (B == F && E != A) ? B : E;
	E2 = B == F ? F : E;
	E3 = (D == B && E != G) || (D == H && E != A) ? D : E;
	E4 = E;
	E5 = (B == F && E != I) || (H == F && E != C) ? F : E;
	E6 = D == H ? D : E;
	E7 = (D == H && E != I) || (H == F && E != G) ? H : E;
	E8 = H == F ? F : E;
} else {
	E0 = E;
	E1 = E;
	E2 = E;
	E3 = E;
	E4 = E;
	E5 = E;
	E6 = E;
	E7 = E;
	E8 = E;
}

Scale4x Algorithm

The Scale4x effect is simply the Scale2x effect applied two times.

Examples

The following are some examples that show the application of the effects.

Original
original
Scale2x
scale2x
Scale3x
scale3x
Scale4x
scale4x