示例#1
0
void Spectrum::fromSRGB(Float r, Float g, Float b) {
	r = fromSRGBComponent(r);
	g = fromSRGBComponent(g);
	b = fromSRGBComponent(b);
	fromLinearRGB(r, g, b);
}
示例#2
0
    void initializeFrom(Bitmap *bitmap) {
        ref<Bitmap> corrected;
        m_bpp = bitmap->getBitsPerPixel();
        if (bitmap->getBitsPerPixel() == 128) {
            /* Nothing needs to be done */
            corrected = bitmap;
        } else {
            corrected = new Bitmap(bitmap->getWidth(), bitmap->getHeight(), 128);

            float tbl[256];
            if (m_gamma == -1) {
                for (int i=0; i<256; ++i)
                    tbl[i] = fromSRGBComponent((Float) i / (Float) 255);
            } else {
                for (int i=0; i<256; ++i)
                    tbl[i] = std::pow((Float) i / (Float) 255, m_gamma);
            }

            uint8_t *data = bitmap->getData();
            float *flData = corrected->getFloatData();
            if (bitmap->getBitsPerPixel() == 32) {
                for (int y=0; y<bitmap->getHeight(); ++y) {
                    for (int x=0; x<bitmap->getWidth(); ++x) {
                        float
                        r = tbl[*data++],
                        g = tbl[*data++],
                        b = tbl[*data++],
                        a = *data++ / 255.0f;
                        *flData++ = r;
                        *flData++ = g;
                        *flData++ = b;
                        *flData++ = a;
                    }
                }
            } else if (bitmap->getBitsPerPixel() == 24) {
                for (int y=0; y<bitmap->getHeight(); ++y) {
                    for (int x=0; x<bitmap->getWidth(); ++x) {
                        float
                        r = tbl[*data++],
                        g = tbl[*data++],
                        b = tbl[*data++];
                        *flData++ = r;
                        *flData++ = g;
                        *flData++ = b;
                        *flData++ = 1.0f;
                    }
                }
            } else if (bitmap->getBitsPerPixel() == 16) {
                for (int y=0; y<bitmap->getHeight(); ++y) {
                    for (int x=0; x<bitmap->getWidth(); ++x) {
                        float col = tbl[*data++],
                              a = *data++ / 255.0f;
                        *flData++ = col;
                        *flData++ = col;
                        *flData++ = col;
                        *flData++ = a;
                    }
                }
            } else if (bitmap->getBitsPerPixel() == 8) {
                for (int y=0; y<bitmap->getHeight(); ++y) {
                    for (int x=0; x<bitmap->getWidth(); ++x) {
                        float col = tbl[*data++];
                        *flData++ = col;
                        *flData++ = col;
                        *flData++ = col;
                        *flData++ = 1.0f;
                    }
                }
            } else if (bitmap->getBitsPerPixel() == 1) {
                int pos = 0;
                for (int y=0; y<bitmap->getHeight(); ++y) {
                    for (int x=0; x<bitmap->getWidth(); ++x) {
                        int entry = pos / 8;
                        int bit   = pos % 8;
                        int value = (data[entry] & (1 << bit)) ? 255 : 0;
                        float col = tbl[value];
                        *flData++ = col;
                        *flData++ = col;
                        *flData++ = col;
                        *flData++ = 1.0f;
                        pos++;
                    }
                }
            } else {
                Log(EError, "%i bpp images are currently not supported!", bitmap->getBitsPerPixel());
            }
        }

        m_mipmap = MIPMap::fromBitmap(corrected, m_filterType,
                                      m_wrapMode, m_maxAnisotropy);
    }