Sprite shrinking

Shrinking (also known as scaling, reduction, zooming...) is a hardware feature of the NeoGeo that reduces the sprites sizes with per-pixel accuracy.

It can be seen as subsampling of the original graphics, there's no smooth interpolation at all.

=Vertical shrinking=

To do. See Sprites.

Range: $FF is full size, $0 is smallest.

Sprite set to height = 4, graphics intentionally filling 4 tiles (magenta representing size):

If the same sprite is updated to be only 3 tiles high (magenta representing size) without cleaning:

It will shrink this way, showing the garbage yellow tile from the previous setup:

=Horizontal shrinking=

The horizontal shrinking value is a 4-bit value indicating the final width of the sprite +1 (giving 1 to 16 pixels wide sprites). This value is also set in VRAM, in the SCB2.

Range: $F is full size, $0 is 1 pixel wide.

Skipping of the pixels to render the effect is done by a hardwired lookup table in the GPU. This table is not in the LO ROM.

For each shrinking value, 1 means the pixel will be drawn, 0 means it will be skipped (info from MAME's source, matches the real hardware):




 * 0: 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 (1 pixel skipped)
 * 1: 0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0
 * 2: 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
 * 3: 0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0
 * 4: 0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0
 * 5: 0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0
 * 6: 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0
 * 7: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0
 * 8: 1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0
 * 9: 1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0
 * A: 1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1
 * B: 1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1
 * C: 1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1
 * D: 1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1
 * E: 1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1
 * F: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 (no pixels skipped, full size)

Table logic
The lookup table might not be a real ROM table but a logic function.

For each pixel of the line, WXYZ being the reduction value:
 * 0 = W(X+Y)
 * 1 = W+X
 * 2 = WX
 * 3 = W+X+Y
 * 4 = WXY
 * 5 = W+(XY)
 * 6 = W
 * 7 = 1
 * 8 = WX+WYZ
 * 9 = W+X(Y+Z)
 * A = WXYZ
 * B = W+X+Y+Z
 * C = W(X+Y+Z)
 * D = W+X+(YZ)
 * E = WX(Y+Z)
 * F = W+(XYZ)