1526{
1527 size_t i = (size_t)hcmTransform;
1528 icFloatNumber srcPixel[MAX_COLOR_CHANNELS], destPixel[MAX_COLOR_CHANNELS];
1529
1531 SetLastError(ERROR_INVALID_HANDLE);
1532 return FALSE;
1533 }
1534
1536 LPBYTE lpSrcLine;
1537 LPBYTE lpDestLine;
1538 DWORD j;
1539
1540
1543 SetLastError(ERROR_INVALID_DATATYPE);
1544 return FALSE;
1545 }
1546
1547 for (j=0; j<dwHeight; j++) {
1548 lpSrcLine = lpSrcBits;
1549 lpDestLine = lpDestBits;
1550
1551 for (i=0; i<dwWidth; i++) {
1552 switch(bmInput) {
1553 case BM_x555Lab:
1554 {
1556
1560
1562 CIccPCSUtil::Lab2ToLab4(srcPixel, srcPixel);
1563 }
1564
1565 lpSrcBits += 2;
1566 }
1567 break;
1568
1569 case BM_x555RGB:
1570 case BM_x555XYZ:
1571 case BM_x555Yxy:
1572 case BM_x555G3CH:
1573 {
1575
1579
1580 lpSrcBits += 2;
1581 }
1582 break;
1583
1584
1585
1586
1587
1588
1589 case BM_LabTRIPLETS:
1590 {
1592
1596
1598 CIccPCSUtil::Lab2ToLab4(srcPixel, srcPixel);
1599 }
1600
1601 lpSrcBits += 3;
1602
1603 }
1604 break;
1605
1606 case BM_RGBTRIPLETS:
1607 case BM_XYZTRIPLETS:
1608 case BM_YxyTRIPLETS:
1609 case BM_G3CHTRIPLETS:
1610 {
1612
1616
1617 lpSrcBits += 3;
1618
1619 }
1620 break;
1621
1622 case BM_BGRTRIPLETS:
1623 {
1625
1629
1630 lpSrcBits += 3;
1631
1632 }
1633 break;
1634
1635
1636 case BM_5CHANNEL:
1637 {
1639
1645
1646 lpSrcBits += 5;
1647
1648 }
1649 break;
1650
1651 case BM_6CHANNEL:
1652 {
1654
1661
1662 lpSrcBits += 6;
1663
1664 }
1665 break;
1666
1667 case BM_7CHANNEL:
1668 {
1670
1678
1679 lpSrcBits += 7;
1680
1681 }
1682 break;
1683
1684 case BM_8CHANNEL:
1685 {
1687
1696
1697 lpSrcBits += 8;
1698
1699 }
1700 break;
1701
1702 case BM_GRAY:
1703 {
1705
1707
1708 lpSrcBits++;
1709
1710 }
1711 break;
1712
1713
1714
1715
1716
1717
1718 case BM_xRGBQUADS:
1719 case BM_xG3CHQUADS:
1720 {
1722
1726
1727 lpSrcBits += 4;
1728
1729 }
1730 break;
1731
1732 case BM_xBGRQUADS:
1733 {
1735
1739
1740 lpSrcBits += 4;
1741
1742 }
1743 break;
1744
1745 case BM_KYMCQUADS:
1746 {
1748
1753
1754 lpSrcBits += 4;
1755
1756 }
1757 break;
1758
1759 case BM_CMYKQUADS:
1760 {
1762
1767
1768 lpSrcBits += 4;
1769
1770 }
1771 break;
1772
1773
1774
1775
1776
1777 case BM_10b_Lab:
1778 {
1780
1781 srcPixel[0] = (
icFloatNumber)((bits&0x3FF00000)>>20) / 1023.0f;
1782 srcPixel[1] = (
icFloatNumber)((bits&0x000FFC00)>>10) / 1023.0f;
1784
1786 CIccPCSUtil::Lab2ToLab4(srcPixel, srcPixel);
1787 }
1788
1789 lpSrcBits += 4;
1790 }
1791 break;
1792
1793 case BM_10b_RGB:
1794 case BM_10b_XYZ:
1795 case BM_10b_Yxy:
1796 case BM_10b_G3CH:
1797 {
1799
1800 srcPixel[0] = (
icFloatNumber)((bits&0x3FF00000)>>20) / 1023.0f;
1801 srcPixel[1] = (
icFloatNumber)((bits&0x000FFC00)>>10) / 1023.0f;
1803
1804 lpSrcBits += 4;
1805 }
1806 break;
1807
1808
1809
1810
1811
1812
1813 case BM_16b_Lab:
1814 {
1816
1820
1822 CIccPCSUtil::Lab2ToLab4(srcPixel, srcPixel);
1823 }
1824
1825 lpSrcBits += 6;
1826 }
1827 break;
1828
1829 case BM_16b_RGB:
1830 case BM_16b_XYZ:
1831 case BM_16b_Yxy:
1832 case BM_16b_G3CH:
1833 {
1835
1839
1840 lpSrcBits += 6;
1841 }
1842 break;
1843
1844 case BM_16b_GRAY:
1845 {
1847
1849
1850 lpSrcBits += 2;
1851 }
1852 break;
1853
1854
1855
1856
1857
1858 case BM_565RGB:
1859 {
1861
1865
1866 lpSrcBits += 2;
1867 }
1868 break;
1869
1870
1871
1872
1873
1874 case BM_NAMED_INDEX:
1875 default:
1876 SetLastError(ERROR_UNSUPPORTED_TYPE);
1877 return FALSE;
1878
1879 }
1880
1881 if (pCmm->Apply(destPixel, srcPixel)!=
icCmmStatOk) {
1882 SetLastError(ERROR_FUNCTION_FAILED);
1883 return FALSE;
1884 }
1885
1886 switch(bmOutput) {
1887 case BM_x555Lab:
1888 {
1890 CIccPCSUtil::Lab4ToLab2(destPixel, destPixel);
1891 }
1895
1896 lpDestBits += 2;
1897 }
1898 break;
1899
1900 case BM_x555RGB:
1901 case BM_x555XYZ:
1902 case BM_x555Yxy:
1903 case BM_x555G3CH:
1904 {
1908
1909 lpDestBits += 2;
1910 }
1911 break;
1912
1913
1914
1915
1916
1917
1918 case BM_LabTRIPLETS:
1919 {
1921 CIccPCSUtil::Lab4ToLab2(destPixel, destPixel);
1922 }
1926 }
1927 break;
1928
1929 case BM_RGBTRIPLETS:
1930 case BM_XYZTRIPLETS:
1931 case BM_YxyTRIPLETS:
1932 case BM_G3CHTRIPLETS:
1933 {
1937 }
1938 break;
1939
1940 case BM_BGRTRIPLETS:
1941 {
1945 }
1946 break;
1947
1948 case BM_5CHANNEL:
1949 {
1955 }
1956 break;
1957
1958 case BM_6CHANNEL:
1959 {
1961
1968 }
1969 break;
1970
1971 case BM_7CHANNEL:
1972 {
1980 }
1981 break;
1982
1983 case BM_8CHANNEL:
1984 {
1993 }
1994 break;
1995
1996 case BM_GRAY:
1997 {
1999 }
2000 break;
2001
2002
2003
2004
2005
2006
2007 case BM_xRGBQUADS:
2008 case BM_xG3CHQUADS:
2009 {
2013 *lpDestBits++ = 0x00;
2014 }
2015 break;
2016
2017 case BM_xBGRQUADS:
2018 {
2022 *lpDestBits++ = 0x00;
2023 }
2024 break;
2025
2026 case BM_KYMCQUADS:
2027 {
2032 }
2033 break;
2034
2035 case BM_CMYKQUADS:
2036 {
2041 }
2042 break;
2043
2044
2045
2046
2047
2048 case BM_10b_Lab:
2049 {
2051 CIccPCSUtil::Lab4ToLab2(destPixel, destPixel);
2052 }
2056
2057 lpDestBits += 4;
2058 }
2059 break;
2060
2061 case BM_10b_RGB:
2062 case BM_10b_XYZ:
2063 case BM_10b_Yxy:
2064 case BM_10b_G3CH:
2065 {
2069
2070 lpDestBits += 4;
2071 }
2072 break;
2073
2074
2075
2076
2077
2078
2079 case BM_16b_Lab:
2080 {
2082 CIccPCSUtil::Lab4ToLab2(destPixel, destPixel);
2083 }
2085
2089
2090 lpDestBits += 6;
2091 }
2092 break;
2093
2094 case BM_16b_RGB:
2095 case BM_16b_XYZ:
2096 case BM_16b_Yxy:
2097 case BM_16b_G3CH:
2098 {
2100
2104
2105 lpDestBits += 6;
2106 }
2107 break;
2108
2109 case BM_16b_GRAY:
2110 {
2112
2113 lpDestBits += 2;
2114 }
2115 break;
2116
2117
2118
2119
2120
2121 case BM_565RGB:
2122 {
2126
2127 lpDestBits += 2;
2128 }
2129 break;
2130
2131
2132
2133
2134
2135 case BM_NAMED_INDEX:
2136 default:
2137 SetLastError(ERROR_UNSUPPORTED_TYPE);
2138 return FALSE;
2139
2140 }
2141 }
2142
2143 if (lpfnCallback && !lpfnCallback(j, dwHeight, ulCallbackData)) {
2144 SetLastError(ERROR_CANCELLED);
2145 return FALSE;
2146 }
2147
2148 if (!dwInputStride) {
2149 size_t dwAlignedSize = (((lpSrcBits - lpSrcLine) + 3)>>2)<<2;
2150 lpSrcBits = lpSrcLine + dwAlignedSize;
2151 }
2152 else {
2153 lpSrcBits = lpSrcLine + dwInputStride;
2154 }
2155
2156 if (!dwOutputStride) {
2157 size_t dwAlignedSize = (((lpDestBits - lpDestLine) + 3)>>2)<<2;
2158 lpDestBits = lpDestLine + dwAlignedSize;
2159 }
2160 else {
2161 lpSrcBits = lpDestLine + dwOutputStride;
2162 }
2163 }
2164 return TRUE;
2165}