void Spectrum::fromSRGB(Float r, Float g, Float b) { r = fromSRGBComponent(r); g = fromSRGBComponent(g); b = fromSRGBComponent(b); fromLinearRGB(r, g, b); }
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); }