/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.sanselan.formats.png; public class GammaCorrection { private static final boolean DEBUG = false; private final int lookupTable[]; public GammaCorrection(double src_gamma, double dst_gamma) { if (DEBUG) { System.out.println("src_gamma: " + src_gamma); System.out.println("dst_gamma: " + dst_gamma); } lookupTable = new int[256]; for (int i = 0; i < 256; i++) { lookupTable[i] = correctSample(i, src_gamma, dst_gamma); if (DEBUG) { System.out .println("lookup_table[" + i + "]: " + lookupTable[i]); } } } public int correctSample(int sample) { return lookupTable[sample]; } public int correctARGB(int pixel) { int alpha = (0xff000000) & pixel; int red = (pixel >> 16) & 0xff; int green = (pixel >> 8) & 0xff; int blue = (pixel >> 0) & 0xff; red = correctSample(red); green = correctSample(green); blue = correctSample(blue); int rgb = alpha | ((0xff & red) << 16) | ((0xff & green) << 8) | ((0xff & blue) << 0); return rgb; } private int correctSample(int sample, double src_gamma, double dst_gamma) { // if (kUseAdobeGammaMethod && val <= 32) // { // double slope = Math.round(255.0d * Math.pow((32.0 / 255.0d), // src_gamma / dst_gamma)) / 32.d; // return (int) (sample * slope); // } return (int) Math.round(255.0d * Math.pow((sample / 255.0d), src_gamma / dst_gamma)); } }