content: /*
   * Copyright 2011 - AndroidQuery.com (tinyeeliu@gmail.com)
   * 
   * 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 com.androidquery.util;
  
  import java.util.Iterator;
  import java.util.LinkedHashMap;
  import java.util.Map;
  
  import android.graphics.Bitmap;
  
  /**
   * AQuery internal use only. 
   * 
   */
  
  public class BitmapCache extends LinkedHashMap<String, Bitmap>{
  
  	private static final long serialVersionUID = 1L;
  	
  	private int maxCount;
  	private int maxPixels;
  	private int maxTotalPixels;
  	private int pixels;
  	
  	public BitmapCache(int mc, int mp, int mtp){
  		
  		super(8, 0.75F, true);
  		
  		this.maxCount = mc;
  		this.maxPixels = mp;
  		this.maxTotalPixels = mtp;
  		
  	}
  	
  	@Override
  	public Bitmap put(String key, Bitmap bm){
  		
  		Bitmap old = null;
  		
  		int px = pixels(bm);
  		if(px <= maxPixels){
  			pixels += px;
  			old = super.put(key, bm);
  			if(old != null){
  				pixels -= pixels(old);
  			}			
  			
  			//AQUtility.debug("put", key);
  		}else{
  			//AQUtility.debug("reject", px + ":" + bm.getWidth() + ":" + bm.getHeight() + ":" + key);
  		}
  		
  		
  		
  		return old;
  	}
  	
  	
  	@Override
  	public Bitmap remove(Object key){
  		
  		Bitmap old = super.remove(key);
  		if(old != null){
  			pixels -= pixels(old);
  		}
  		
  		//AQUtility.debug("remove pixels", key + ":" + size() + ":" + pixels);
  		
  		return old;
  	}
  	
  	@Override
  	public void clear(){
  		super.clear();
  		pixels = 0;
  	}
  	
  	private int pixels(Bitmap bm){
  		if(bm == null) return 0;
  		return bm.getWidth() * bm.getHeight();
  	}
  	
  	private void shrink(){
  		
  		if(pixels > maxTotalPixels){
  			
  			Iterator<String> keys = keySet().iterator();
  			
  			while(keys.hasNext()){
  				
  				keys.next();
  				keys.remove();
  				
  				if(pixels <= maxTotalPixels){
  					break;
  				}
  			}
  			
  			
  		}
  		
  	}
  	
  	
  	@Override
  	public boolean removeEldestEntry(Map.Entry<String, Bitmap> eldest) {
          
  		if(pixels > maxTotalPixels || size() > maxCount){
  		
  			/*
  			if(pixels > maxTotalPixels){
  				AQUtility.debug("evict by max size");
  			}else{
  				AQUtility.debug("evict by count", maxCount);
  			}
  			*/
  			remove(eldest.getKey());
  		
  			
  		}
  		
  		shrink();
  		
  		return false;
      }
  	
  }
  