template <typename Tmemory, typename Treturn> MIPMap<Tmemory> * ImageTexture<Tmemory, Treturn>::GetTexture(const string &filename, bool doTrilinear, bool noFiltering, float maxAniso, ImageWrap wrap, float scale, float gamma) { // Look for texture in texture cache TexInfo texInfo(filename, doTrilinear, maxAniso, wrap, scale, gamma); if (textures.find(texInfo) != textures.end()) return textures[texInfo]; int width, height; RGBSpectrum *texels = ReadImage(filename, &width, &height); MIPMap<Tmemory> *ret = NULL; if (texels) { // Convert texels to type _Tmemory_ and create _MIPMap_ Tmemory *convertedTexels = new Tmemory[width*height]; for (int i = 0; i < width*height; ++i) convertIn(texels[i], &convertedTexels[i], scale, gamma); ret = new MIPMap<Tmemory>(width, height, convertedTexels, doTrilinear,noFiltering, maxAniso, wrap); delete[] texels; delete[] convertedTexels; } else { // Create one-valued _MIPMap_ Tmemory *oneVal = new Tmemory[1]; oneVal[0] = powf(scale, gamma); ret = new MIPMap<Tmemory>(1, 1, oneVal); delete[] oneVal; } textures[texInfo] = ret; PBRT_LOADED_IMAGE_MAP(const_cast<char *>(filename.c_str()), width, height, sizeof(Tmemory), ret); return ret; }
MIPMap<Tmemory> *ImageTexture<Tmemory, Treturn>::GetTexture( const std::string &filename, bool doTrilinear, Float maxAniso, ImageWrap wrap, Float scale, bool gamma) { // Return _MIPMap_ from texture cache if present TexInfo texInfo(filename, doTrilinear, maxAniso, wrap, scale, gamma); if (textures.find(texInfo) != textures.end()) return textures[texInfo].get(); // Create _MIPMap_ for _filename_ Point2i resolution; std::unique_ptr<RGBSpectrum[]> texels = ReadImage(filename, &resolution); MIPMap<Tmemory> *mipmap = nullptr; if (texels) { // Convert texels to type _Tmemory_ and create _MIPMap_ std::unique_ptr<Tmemory[]> convertedTexels( new Tmemory[resolution.x * resolution.y]); for (int i = 0; i < resolution.x * resolution.y; ++i) convertIn(texels[i], &convertedTexels[i], scale, gamma); mipmap = new MIPMap<Tmemory>(resolution, convertedTexels.get(), doTrilinear, maxAniso, wrap); } else { // Create one-valued _MIPMap_ Tmemory oneVal = scale; mipmap = new MIPMap<Tmemory>(Point2i(1, 1), &oneVal); } textures[texInfo].reset(mipmap); return mipmap; }
////////////////////////////////////////////////////////////////////// // LM service: convertOut. ////////////////////////////////////////////////////////////////////// LmResult LmLanguageManager::convertOut( NAType *src, NAType **dst, NAMemory *mem) { *dst = NULL; if (src->getTypeQualifier() == NA_NUMERIC_TYPE && src->getPrecision() == SQL_FLOAT_PRECISION) return LM_CONV_ERROR; return convertIn(src, dst, mem); }