/* JAI-Ext - OpenSource Java Advanced Image Extensions Library
* http://www.geo-solutions.it/
* Copyright 2014 GeoSolutions
* Licensed 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 it.geosolutions.jaiext.colorindexer;
import java.awt.image.IndexColorModel;
/**
* Wraps around another palette and adds last match caching. This speeds up significantly lookups on maps that have large areas with constant color
*
* @author Andrea Aime - GeoSolutions
*/
public class CachingColorIndexer implements ColorIndexer {
/** {@link ColorIndexer} wrapped by this instance*/
ColorIndexer delegate;
/** Last used element of its colorcomponent */
int lr, lg, lb, la;
/** Last used colormap index */
int idx = -1;
public CachingColorIndexer(ColorIndexer delegate) {
this.delegate = delegate;
}
public IndexColorModel toIndexColorModel() {
return delegate.toIndexColorModel();
}
public int getClosestIndex(int r, int g, int b, int a) {
// Cecking if it is the same colours
synchronized (this) {
if (r == lr && g == lg && b == lb && a == la && idx >= 0) {
return idx;
}
}
// Otherwise get a new one
int delegateIdx = delegate.getClosestIndex(r, g, b, a);
synchronized (this) {
lr = r;
lg = g;
lb = b;
la = a;
idx = delegateIdx;
}
return delegateIdx;
}
}