I have this working perfectly now. I'm very relieved not to have had to go to GL.

I basically draw the first (red -- at 12 o'clock) gem with a mask only allowing the right half to be visible.
Then I draw the remaining 11.
Then I draw the first one again, this time setting the mask to only show the left half.
for( int i = 0; i <= 12; i++ )
{
for ( int dullGlow = 0; dullGlow <= 1; dullGlow++ )
{
BOOL isDull = ( dullGlow == 0 ) ? YES : NO;
CALayer* L = [CALayer layer];
CGImageRef dullImage = [ButtonImages dullImage: i % 12];
CGImageRef glowImage = [ButtonImages glowImage: i % 12];
L.contents = (id) ( isDull ? dullImage : glowImage );
L.bounds = CGRectMake( 0, 0, buttonSize, buttonSize );
L.opacity = ( isDull ? 1.0 : 0.0 );
if( i == 0 || i == 12 )
{
CGFloat halfSize = buttonSize / 2.0;
CGRect keepLeftHalf = CGRectMake( 0, 0,
halfSize, buttonSize );
CGRect keepRightHalf = CGRectMake( halfSize, 0,
halfSize, buttonSize );
CALayer* maskLayer = [CALayer layer];
maskLayer.frame = ( i == 0 ) ? keepRightHalf : keepLeftHalf;
maskLayer.backgroundColor = [UIColor greenColor].CGColor;
maskLayer.edgeAntialiasingMask = 0x0;
[L setMask: maskLayer];
}
[self.layer addSublayer: L];
layers[ dullGlow ] [ i ] = L;
} // dullGlow
} // i
Setting edgeAntialiasingMask's 4 least significant bits to 0 terms of anti-aliasing on all 4 edges -- without this line I was getting a seam.
I would be very grateful if someone can explain the mechanics of the masking process -- though I achieved the correct result, I did it by trial and error.
Notice that the mask is set to ( opaque ) green, and it is the masked area that is visible -- ie for the first pass the green rectangle is covering the right half of the image, and it is this love that gets displayed.
I am guessing that for each pixel it is multiplying the layer-pixel RGBA by the alpha value on the mask-pixel