[webkit-dev] Proposal for serializing alpha channel values; request for algorithm help

Gavin Barraclough barraclough at apple.com
Mon Nov 2 00:28:38 PST 2015


> On Nov 1, 2015, at 7:40 PM, Darin Adler <darin at apple.com> wrote:
> 
> 3) Can you help me come up with a super-efficient algorithm to do this serialization?

Table lookup? FP conversion code is hard, and this is a relatively small number of strings.

You could also flatten all the strings into one big string, and take out a pointer indirection (below).

Data would add 1.5k to binary size, which is probably competitive to instruction space for an optimized implementation.

cheers,
G.


const char* unsignedCharToFloatString(unsigned char x)
{
    return unsignedCharToFloatStrings[x];
}

static const char* unsignedCharToFloatStrings[256] = {
    "0",
    "0.003",
    "0.007",
    "0.01",
    "0.015",
    "0.019",
    "0.023",
    "0.027",
    "0.03",
    "0.035",
    "0.039",
    "0.043",
    "0.047",
    "0.05",
    "0.054",
    "0.058",
    "0.062",
    "0.066",
    "0.07",
    "0.074",
    "0.078",
    "0.082",
    "0.086",
    "0.09",
    "0.094",
    "0.098",
    "0.1",
    "0.105",
    "0.109",
    "0.113",
    "0.117",
    "0.12",
    "0.125",
    "0.129",
    "0.133",
    "0.137",
    "0.14",
    "0.145",
    "0.149",
    "0.152",
    "0.156",
    "0.16",
    "0.164",
    "0.168",
    "0.172",
    "0.176",
    "0.18",
    "0.184",
    "0.188",
    "0.192",
    "0.196",
    "0.2",
    "0.203",
    "0.207",
    "0.21",
    "0.215",
    "0.219",
    "0.223",
    "0.227",
    "0.23",
    "0.235",
    "0.239",
    "0.243",
    "0.247",
    "0.25",
    "0.254",
    "0.258",
    "0.262",
    "0.266",
    "0.27",
    "0.274",
    "0.278",
    "0.282",
    "0.286",
    "0.29",
    "0.294",
    "0.298",
    "0.3",
    "0.305",
    "0.309",
    "0.313",
    "0.317",
    "0.32",
    "0.325",
    "0.329",
    "0.333",
    "0.337",
    "0.34",
    "0.345",
    "0.349",
    "0.352",
    "0.356",
    "0.36",
    "0.364",
    "0.368",
    "0.372",
    "0.376",
    "0.38",
    "0.384",
    "0.388",
    "0.392",
    "0.396",
    "0.4",
    "0.403",
    "0.407",
    "0.41",
    "0.415",
    "0.419",
    "0.423",
    "0.427",
    "0.43",
    "0.435",
    "0.439",
    "0.443",
    "0.447",
    "0.45",
    "0.454",
    "0.458",
    "0.462",
    "0.466",
    "0.47",
    "0.474",
    "0.478",
    "0.482",
    "0.486",
    "0.49",
    "0.494",
    "0.498",
    "0.5",
    "0.505",
    "0.509",
    "0.513",
    "0.517",
    "0.52",
    "0.525",
    "0.529",
    "0.533",
    "0.537",
    "0.54",
    "0.545",
    "0.549",
    "0.552",
    "0.556",
    "0.56",
    "0.564",
    "0.568",
    "0.572",
    "0.576",
    "0.58",
    "0.584",
    "0.588",
    "0.592",
    "0.596",
    "0.6",
    "0.603",
    "0.607",
    "0.61",
    "0.615",
    "0.619",
    "0.623",
    "0.627",
    "0.63",
    "0.635",
    "0.639",
    "0.643",
    "0.647",
    "0.65",
    "0.654",
    "0.658",
    "0.662",
    "0.666",
    "0.67",
    "0.674",
    "0.678",
    "0.682",
    "0.686",
    "0.69",
    "0.694",
    "0.698",
    "0.7",
    "0.705",
    "0.709",
    "0.713",
    "0.717",
    "0.72",
    "0.725",
    "0.729",
    "0.733",
    "0.737",
    "0.74",
    "0.745",
    "0.749",
    "0.752",
    "0.756",
    "0.76",
    "0.764",
    "0.768",
    "0.772",
    "0.776",
    "0.78",
    "0.784",
    "0.788",
    "0.792",
    "0.796",
    "0.8",
    "0.803",
    "0.807",
    "0.81",
    "0.815",
    "0.819",
    "0.823",
    "0.827",
    "0.83",
    "0.835",
    "0.839",
    "0.843",
    "0.847",
    "0.85",
    "0.854",
    "0.858",
    "0.862",
    "0.866",
    "0.87",
    "0.874",
    "0.878",
    "0.882",
    "0.886",
    "0.89",
    "0.894",
    "0.898",
    "0.9",
    "0.905",
    "0.909",
    "0.913",
    "0.917",
    "0.92",
    "0.925",
    "0.929",
    "0.933",
    "0.937",
    "0.94",
    "0.945",
    "0.949",
    "0.952",
    "0.956",
    "0.96",
    "0.964",
    "0.968",
    "0.972",
    "0.976",
    "0.98",
    "0.984",
    "0.988",
    "0.992",
    "0.996",
    "1",
};

const char* unsignedCharToFloatStringSingleIndirection(unsigned char x)
{
    return &"\x30\x00\x00\x00\x00\x00\x30\x2E\x30\x30\x33\x00\x30\x2E\x30\x30\x37\x00\x30\x2E\x30\x31\x00\x00\x30\x2E\x30\x31\x35\x00\x30\x2E\x30\x31\x39\x00\x30\x2E\x30\x32\x33\x00\x30\x2E\x30\x32\x37\x00\x30\x2E\x30\x33\x00\x00\x30\x2E\x30\x33\x35\x00\x30\x2E\x30\x33\x39\x00\x30\x2E\x30\x34\x33\x00\x30\x2E\x30\x34\x37\x00\x30\x2E\x30\x35\x00\x00\x30\x2E\x30\x35\x34\x00\x30\x2E\x30\x35\x38\x00\x30\x2E\x30\x36\x32\x00\x30\x2E\x30\x36\x36\x00\x30\x2E\x30\x37\x00\x00\x30\x2E\x30\x37\x34\x00\x30\x2E\x30\x37\x38\x00\x30\x2E\x30\x38\x32\x00\x30\x2E\x30\x38\x36\x00\x30\x2E\x30\x39\x00\x00\x30\x2E\x30\x39\x34\x00\x30\x2E\x30\x39\x38\x00\x30\x2E\x31\x00\x00\x00\x30\x2E\x31\x30\x35\x00\x30\x2E\x31\x30\x39\x00\x30\x2E\x31\x31\x33\x00\x30\x2E\x31\x31\x37\x00\x30\x2E\x31\x32\x00\x00\x30\x2E\x31\x32\x35\x00\x30\x2E\x31\x32\x39\x00\x30\x2E\x31\x33\x33\x00\x30\x2E\x31\x33\x37\x00\x30\x2E\x31\x34\x00\x00\x30\x2E\x31\x34\x35\x00\x30\x2E\x31\x34\x39\x00\x30\x2E\x31\x35\x32\x00\x30\x2E\x31\x35\x36\x00\x30\x2E\x31\x36\x00\x00\x30\x2E\x31\x36\x34\x00\x30\x2E\x31\x36\x38\x00\x30\x2E\x31\x37\x32\x00\x30\x2E\x31\x37\x36\x00\x30\x2E\x31\x38\x00\x00\x30\x2E\x31\x38\x34\x00\x30\x2E\x31\x38\x38\x00\x30\x2E\x31\x39\x32\x00\x30\x2E\x31\x39\x36\x00\x30\x2E\x32\x00\x00\x00\x30\x2E\x32\x30\x33\x00\x30\x2E\x32\x30\x37\x00\x30\x2E\x32\x31\x00\x00\x30\x2E\x32\x31\x35\x00\x30\x2E\x32\x31\x39\x00\x30\x2E\x32\x32\x33\x00\x30\x2E\x32\x32\x37\x00\x30\x2E\x32\x33\x00\x00\x30\x2E\x32\x33\x35\x00\x30\x2E\x32\x33\x39\x00\x30\x2E\x32\x34\x33\x00\x30\x2E\x32\x34\x37\x00\x30\x2E\x32\x35\x00\x00\x30\x2E\x32\x35\x34\x00\x30\x2E\x32\x35\x38\x00\x30\x2E\x32\x36\x32\x00\x30\x2E\x32\x36\x36\x00\x30\x2E\x32\x37\x00\x00\x30\x2E\x32\x37\x34\x00\x30\x2E\x32\x37\x38\x00\x30\x2E\x32\x38\x32\x00\x30\x2E\x32\x38\x36\x00\x30\x2E\x32\x39\x00\x00\x30\x2E\x32\x39\x34\x00\x30\x2E\x32\x39\x38\x00\x30\x2E\x33\x00\x00\x00\x30\x2E\x33\x30\x35\x00\x30\x2E\x33\x30\x39\x00\x30\x2E\x33\x31\x33\x00\x30\x2E\x33\x31\x37\x00\x30\x2E\x33\x32\x00\x00\x30\x2E\x33\x32\x35\x00\x30\x2E\x33\x32\x39\x00\x30\x2E\x33\x33\x33\x00\x30\x2E\x33\x33\x37\x00\x30\x2E\x33\x34\x00\x00\x30\x2E\x33\x34\x35\x00\x30\x2E\x33\x34\x39\x00\x30\x2E\x33\x35\x32\x00\x30\x2E\x33\x35\x36\x00\x30\x2E\x33\x36\x00\x00\x30\x2E\x33\x36\x34\x00\x30\x2E\x33\x36\x38\x00\x30\x2E\x33\x37\x32\x00\x30\x2E\x33\x37\x36\x00\x30\x2E\x33\x38\x00\x00\x30\x2E\x33\x38\x34\x00\x30\x2E\x33\x38\x38\x00\x30\x2E\x33\x39\x32\x00\x30\x2E\x33\x39\x36\x00\x30\x2E\x34\x00\x00\x00\x30\x2E\x34\x30\x33\x00\x30\x2E\x34\x30\x37\x00\x30\x2E\x34\x31\x00\x00\x30\x2E\x34\x31\x35\x00\x30\x2E\x34\x31\x39\x00\x30\x2E\x34\x32\x33\x00\x30\x2E\x34\x32\x37\x00\x30\x2E\x34\x33\x00\x00\x30\x2E\x34\x33\x35\x00\x30\x2E\x34\x33\x39\x00\x30\x2E\x34\x34\x33\x00\x30\x2E\x34\x34\x37\x00\x30\x2E\x34\x35\x00\x00\x30\x2E\x34\x35\x34\x00\x30\x2E\x34\x35\x38\x00\x30\x2E\x34\x36\x32\x00\x30\x2E\x34\x36\x36\x00\x30\x2E\x34\x37\x00\x00\x30\x2E\x34\x37\x34\x00\x30\x2E\x34\x37\x38\x00\x30\x2E\x34\x38\x32\x00\x30\x2E\x34\x38\x36\x00\x30\x2E\x34\x39\x00\x00\x30\x2E\x34\x39\x34\x00\x30\x2E\x34\x39\x38\x00\x30\x2E\x35\x00\x00\x00\x30\x2E\x35\x30\x35\x00\x30\x2E\x35\x30\x39\x00\x30\x2E\x35\x31\x33\x00\x30\x2E\x35\x31\x37\x00\x30\x2E\x35\x32\x00\x00\x30\x2E\x35\x32\x35\x00\x30\x2E\x35\x32\x39\x00\x30\x2E\x35\x33\x33\x00\x30\x2E\x35\x33\x37\x00\x30\x2E\x35\x34\x00\x00\x30\x2E\x35\x34\x35\x00\x30\x2E\x35\x34\x39\x00\x30\x2E\x35\x35\x32\x00\x30\x2E\x35\x35\x36\x00\x30\x2E\x35\x36\x00\x00\x30\x2E\x35\x36\x34\x00\x30\x2E\x35\x36\x38\x00\x30\x2E\x35\x37\x32\x00\x30\x2E\x35\x37\x36\x00\x30\x2E\x35\x38\x00\x00\x30\x2E\x35\x38\x34\x00\x30\x2E\x35\x38\x38\x00\x30\x2E\x35\x39\x32\x00\x30\x2E\x35\x39\x36\x00\x30\x2E\x36\x00\x00\x00\x30\x2E\x36\x30\x33\x00\x30\x2E\x36\x30\x37\x00\x30\x2E\x36\x31\x00\x00\x30\x2E\x36\x31\x35\x00\x30\x2E\x36\x31\x39\x00\x30\x2E\x36\x32\x33\x00\x30\x2E\x36\x32\x37\x00\x30\x2E\x36\x33\x00\x00\x30\x2E\x36\x33\x35\x00\x30\x2E\x36\x33\x39\x00\x30\x2E\x36\x34\x33\x00\x30\x2E\x36\x34\x37\x00\x30\x2E\x36\x35\x00\x00\x30\x2E\x36\x35\x34\x00\x30\x2E\x36\x35\x38\x00\x30\x2E\x36\x36\x32\x00\x30\x2E\x36\x36\x36\x00\x30\x2E\x36\x37\x00\x00\x30\x2E\x36\x37\x34\x00\x30\x2E\x36\x37\x38\x00\x30\x2E\x36\x38\x32\x00\x30\x2E\x36\x38\x36\x00\x30\x2E\x36\x39\x00\x00\x30\x2E\x36\x39\x34\x00\x30\x2E\x36\x39\x38\x00\x30\x2E\x37\x00\x00\x00\x30\x2E\x37\x30\x35\x00\x30\x2E\x37\x30\x39\x00\x30\x2E\x37\x31\x33\x00\x30\x2E\x37\x31\x37\x00\x30\x2E\x37\x32\x00\x00\x30\x2E\x37\x32\x35\x00\x30\x2E\x37\x32\x39\x00\x30\x2E\x37\x33\x33\x00\x30\x2E\x37\x33\x37\x00\x30\x2E\x37\x34\x00\x00\x30\x2E\x37\x34\x35\x00\x30\x2E\x37\x34\x39\x00\x30\x2E\x37\x35\x32\x00\x30\x2E\x37\x35\x36\x00\x30\x2E\x37\x36\x00\x00\x30\x2E\x37\x36\x34\x00\x30\x2E\x37\x36\x38\x00\x30\x2E\x37\x37\x32\x00\x30\x2E\x37\x37\x36\x00\x30\x2E\x37\x38\x00\x00\x30\x2E\x37\x38\x34\x00\x30\x2E\x37\x38\x38\x00\x30\x2E\x37\x39\x32\x00\x30\x2E\x37\x39\x36\x00\x30\x2E\x38\x00\x00\x00\x30\x2E\x38\x30\x33\x00\x30\x2E\x38\x30\x37\x00\x30\x2E\x38\x31\x00\x00\x30\x2E\x38\x31\x35\x00\x30\x2E\x38\x31\x39\x00\x30\x2E\x38\x32\x33\x00\x30\x2E\x38\x32\x37\x00\x30\x2E\x38\x33\x00\x00\x30\x2E\x38\x33\x35\x00\x30\x2E\x38\x33\x39\x00\x30\x2E\x38\x34\x33\x00\x30\x2E\x38\x34\x37\x00\x30\x2E\x38\x35\x00\x00\x30\x2E\x38\x35\x34\x00\x30\x2E\x38\x35\x38\x00\x30\x2E\x38\x36\x32\x00\x30\x2E\x38\x36\x36\x00\x30\x2E\x38\x37\x00\x00\x30\x2E\x38\x37\x34\x00\x30\x2E\x38\x37\x38\x00\x30\x2E\x38\x38\x32\x00\x30\x2E\x38\x38\x36\x00\x30\x2E\x38\x39\x00\x00\x30\x2E\x38\x39\x34\x00\x30\x2E\x38\x39\x38\x00\x30\x2E\x39\x00\x00\x00\x30\x2E\x39\x30\x35\x00\x30\x2E\x39\x30\x39\x00\x30\x2E\x39\x31\x33\x00\x30\x2E\x39\x31\x37\x00\x30\x2E\x39\x32\x00\x00\x30\x2E\x39\x32\x35\x00\x30\x2E\x39\x32\x39\x00\x30\x2E\x39\x33\x33\x00\x30\x2E\x39\x33\x37\x00\x30\x2E\x39\x34\x00\x00\x30\x2E\x39\x34\x35\x00\x30\x2E\x39\x34\x39\x00\x30\x2E\x39\x35\x32\x00\x30\x2E\x39\x35\x36\x00\x30\x2E\x39\x36\x00\x00\x30\x2E\x39\x36\x34\x00\x30\x2E\x39\x36\x38\x00\x30\x2E\x39\x37\x32\x00\x30\x2E\x39\x37\x36\x00\x30\x2E\x39\x38\x00\x00\x30\x2E\x39\x38\x34\x00\x30\x2E\x39\x38\x38\x00\x30\x2E\x39\x39\x32\x00\x30\x2E\x39\x39\x36\x00\x31"[(ptrdiff_t)x * 6];
}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.webkit.org/pipermail/webkit-dev/attachments/20151102/27a742df/attachment.html>


More information about the webkit-dev mailing list