256 это всего возможных, а их в таком раскладе просто нет и твое решение может и поудобнее будет
но если придется, например, еще 'внутренние' скругления (в дырках) учесть, то вариантов прибавится..
хотел по-простому вариант с бордюром нарисовать, но по-простому не выходит - надо еще и диагональные клетки анализировать

Код AS3:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.geom.Rectangle;
public class Main extends Sprite
{
private var size:Number = 30;
private var srcRounded:Sprite = new Sprite();
private var srcCorner:Sprite = new Sprite();
private var srcVLine:Sprite = new Sprite();
private var srcHLine:Sprite = new Sprite();
public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
srcRounded.graphics.beginFill(0xC0C0C0);
srcRounded.graphics.drawRoundRect(0, 0, size, size, 0.5 * size, 0.5 * size);
srcRounded.graphics.endFill();
srcRounded.graphics.lineStyle(2, 0);
srcRounded.graphics.drawRoundRect(size/6, size/6, 2*size/3, 2*size/3, size/3, size/3);
srcCorner.graphics.beginFill(0xC0C0C0);
srcCorner.graphics.drawRect(0, 0, size, size);
srcVLine.graphics.lineStyle(2, 0);
srcVLine.graphics.moveTo(size / 6, 0);
srcVLine.graphics.lineTo(size / 6, size);
srcVLine.graphics.moveTo(5 * size / 6, 0);
srcVLine.graphics.lineTo(5 * size / 6, size);
srcHLine.graphics.lineStyle(2, 0);
srcHLine.graphics.moveTo(0, size / 6);
srcHLine.graphics.lineTo(size, size / 6);
srcHLine.graphics.moveTo(0, 5 * size / 6);
srcHLine.graphics.lineTo(size, 5 * size / 6);
var grid:Array = [
[0, 1, 1, 0, 0, 0, 1, 1, 0],
[1, 1, 0, 1, 1, 1, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 0, 1, 1],
[1, 0, 1, 1, 1, 1, 1, 0, 1],
[1, 1, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 1, 0, 1, 1, 1, 0, 1, 0]]
for (var j:int = 0; j < grid.length; j++)
{
var line:Array = grid[j];
for (var i:int = 0; i < line.length; i++)
{
if (line[i])
{
var tile:Bitmap = getTile(
line[i - 1],
grid[j - 1] ? grid[j - 1][i] : 0,
line[i+1],
grid[j + 1] ? grid[j + 1][i] : 0
);
tile.x = size * i;
tile.y = size * j;
addChild(tile);
tile.alpha = 1 - 0.25 * ((j * 9 + i) % 2);
}
}
}
}
private function getTile(l:Boolean,t:Boolean,r:Boolean,b:Boolean):Bitmap
{
var bmd:BitmapData = new BitmapData(size, size, true, 0);
drawSegm(bmd, 0, 0, l || t, (t && !l), l&&!t);
drawSegm(bmd, 1, 0, t);
drawSegm(bmd, 2, 0, r || t, t && !r, r && !t);
drawSegm(bmd, 0, 1, l);
drawSegm(bmd, 1, 1, false);
drawSegm(bmd, 2, 1, r);
drawSegm(bmd, 0, 2, l || b, b && !l, l && !b);
drawSegm(bmd, 1, 2, b);
drawSegm(bmd, 2, 2, b || r, b && !r, r && !b);
return new Bitmap(bmd);
}
private function drawSegm(bmd:BitmapData, i:int, j:int, corner:Boolean, vLine:Boolean=false,hLine:Boolean=false):void
{
var s:Number = size / 3;
var rec:Rectangle = new Rectangle(i * s, j * s, s, s);
var src:Sprite = corner ? srcCorner : srcRounded;
bmd.draw(src, null, null, null, rec);
if (vLine)bmd.draw(srcVLine, null, null, null, rec);
if (hLine)bmd.draw(srcHLine, null, null, null, rec);
}
}
}