| 1588 | static ushort LabCbrtTab_b[LAB_CBRT_TAB_SIZE_B]; |
| 1589 | |
| 1590 | static void initLabTabs() |
| 1591 | { |
| 1592 | static bool initialized = false; |
| 1593 | if(!initialized) |
| 1594 | { |
| 1595 | float f[LAB_CBRT_TAB_SIZE+1], g[GAMMA_TAB_SIZE+1], ig[GAMMA_TAB_SIZE+1], scale = 1.f/LabCbrtTabScale; |
| 1596 | int i; |
| 1597 | for(i = 0; i <= LAB_CBRT_TAB_SIZE; i++) |
| 1598 | { |
| 1599 | float x = i*scale; |
| 1600 | f[i] = x < 0.008856f ? x*7.787f + 0.13793103448275862f : cvCbrt(x); |
| 1601 | } |
| 1602 | splineBuild(f, LAB_CBRT_TAB_SIZE, LabCbrtTab); |
| 1603 | |
| 1604 | scale = 1.f/GammaTabScale; |
| 1605 | for(i = 0; i <= GAMMA_TAB_SIZE; i++) |
| 1606 | { |
| 1607 | float x = i*scale; |
| 1608 | g[i] = x <= 0.04045f ? x*(1.f/12.92f) : (float)pow((double)(x + 0.055)*(1./1.055), 2.4); |
| 1609 | ig[i] = x <= 0.0031308 ? x*12.92f : (float)(1.055*pow((double)x, 1./2.4) - 0.055); |
| 1610 | } |
| 1611 | splineBuild(g, GAMMA_TAB_SIZE, sRGBGammaTab); |
| 1612 | splineBuild(ig, GAMMA_TAB_SIZE, sRGBInvGammaTab); |
| 1613 | |
| 1614 | for(i = 0; i < 256; i++) |
| 1615 | { |
| 1616 | float x = i*(1.f/255.f); |
| 1617 | sRGBGammaTab_b[i] = saturate_cast<ushort>(255.f*(1 << gamma_shift)*(x <= 0.04045f ? x*(1.f/12.92f) : (float)pow((double)(x + 0.055)*(1./1.055), 2.4))); |
| 1618 | linearGammaTab_b[i] = (ushort)(i*(1 << gamma_shift)); |
| 1619 | } |
| 1620 | |
| 1621 | for(i = 0; i < LAB_CBRT_TAB_SIZE_B; i++) |
| 1622 | { |
| 1623 | float x = i*(1.f/(255.f*(1 << gamma_shift))); |
| 1624 | LabCbrtTab_b[i] = saturate_cast<ushort>((1 << lab_shift2)*(x < 0.008856f ? x*7.787f + 0.13793103448275862f : cvCbrt(x))); |
| 1625 | } |
| 1626 | initialized = true; |
| 1627 | } |
| 1628 | } |
| 1629 | |
| 1630 | struct RGB2Lab_b |
| 1631 | { |