void Histogram::computeLog( const pfs::Array2Df *image ) { const int size = image->getRows()*image->getCols(); float max, min; // Find min, max { min = 999999999.0f; max = -999999999.0f; for( int i = 0; i < size; i += accuracy ) { float v = (*image)(i); if( v > max ) max = v; else if( v < min ) min = v; } } computeLog( image, min, max ); }
// hlavni funkce main int main(int argc, char* argv[]) { ProgParams state; Error err = parseParams(argc, argv, &state); CHECK_ERROR(err); switch (state.progState) { case PS_HELP: printHelp(); break; case PS_WEIGHTED_ARITHMETIC_MEAN: err = computeWeightedMean(stdin, stdout, WM_ARITHMETIC); CHECK_ERROR(err); break; case PS_WEIGHTED_QUADRATIC_MEAN: err = computeWeightedMean(stdin, stdout, WM_QUADRATIC); CHECK_ERROR(err); break; case PS_HYPERBOLIC_TANGENT: err = computeTanh(stdin, stdout, sigdigToEpsylon(state.sigdig)); CHECK_ERROR(err); break; case PS_LOGARITHM: err = computeLog(stdin, stdout, state.logBase, sigdigToEpsylon(state.sigdig)); CHECK_ERROR(err); break; default: printError(E_NOT_IMPLEMENTED); return EXIT_FAILURE; } return EXIT_SUCCESS; }
void GLESTextureBuffer::buildMipmaps(const PixelBox &data) { int width; int height; int logW; int logH; int level; PixelBox scaled = data; scaled.data = data.data; scaled.left = data.left; scaled.right = data.right; scaled.top = data.top; scaled.bottom = data.bottom; scaled.front = data.front; scaled.back = data.back; width = data.getWidth(); height = data.getHeight(); logW = computeLog(width); logH = computeLog(height); level = (logW > logH ? logW : logH); for (int mip = 0; mip <= level; mip++) { GLenum glFormat = GLESPixelUtil::getGLOriginFormat(scaled.format); GLenum dataType = GLESPixelUtil::getGLOriginDataType(scaled.format); glTexImage2D(mFaceTarget, mip, glFormat, width, height, 0, glFormat, dataType, scaled.data); GL_CHECK_ERROR; if (mip != 0) { delete[] (uint8*) scaled.data; scaled.data = 0; } if (width > 1) { width = width / 2; } if (height > 1) { height = height / 2; } int sizeInBytes = PixelUtil::getMemorySize(width, height, 1, data.format); scaled = PixelBox(width, height, 1, data.format); scaled.data = new uint8[sizeInBytes]; Image::scale(data, scaled, Image::FILTER_LINEAR); } }
void GLES2TextureBuffer::buildMipmaps(const PixelBox &data) { int width; int height; int logW; int logH; int level; PixelBox scaled = data; scaled.data = data.data; scaled.left = data.left; scaled.right = data.right; scaled.top = data.top; scaled.bottom = data.bottom; scaled.front = data.front; scaled.back = data.back; width = data.getWidth(); height = data.getHeight(); logW = computeLog(width); logH = computeLog(height); level = (logW > logH ? logW : logH); for (int mip = 0; mip <= level; mip++) { GLenum glFormat = GLES2PixelUtil::getGLOriginFormat(scaled.format); GLenum dataType = GLES2PixelUtil::getGLOriginDataType(scaled.format); GLenum internalFormat = glFormat; #if OGRE_NO_GLES3_SUPPORT == 0 // In GL ES 3, the internalformat and format parameters do not need to be identical internalFormat = GLES2PixelUtil::getClosestGLInternalFormat(scaled.format); #endif switch(mTarget) { case GL_TEXTURE_2D: case GL_TEXTURE_CUBE_MAP: OGRE_CHECK_GL_ERROR(glTexImage2D(mFaceTarget, mip, internalFormat, width, height, 0, glFormat, dataType, scaled.data)); break; #if OGRE_NO_GLES3_SUPPORT == 0 case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: OGRE_CHECK_GL_ERROR(glTexImage3D(mFaceTarget, mip, internalFormat, width, height, depth, 0, glFormat, dataType, scaled.data)); break; #endif } if (mip != 0) { OGRE_DELETE[] (uint8*) scaled.data; scaled.data = 0; } if (width > 1) { width = width / 2; } if (height > 1) { height = height / 2; } int sizeInBytes = PixelUtil::getMemorySize(width, height, 1, data.format); scaled = PixelBox(width, height, 1, data.format); scaled.data = new uint8[sizeInBytes]; Image::scale(data, scaled, Image::FILTER_LINEAR); }