1 package com.atlassian.core.util.thumbnail;
2
3 import com.google.common.annotations.VisibleForTesting;
4 import com.google.common.base.Predicate;
5 import org.apache.log4j.Logger;
6
7 import javax.annotation.Nullable;
8
9 public class AdaptiveThresholdPredicate implements Predicate<Dimensions>
10 {
11 private final static Logger log = Logger.getLogger(AdaptiveThresholdPredicate.class);
12
13 private static final int BYTES_PER_PIXEL = 4;
14 private static final float PROCESSING_HEADROOM = 1.2F;
15
16 @Override
17 public boolean apply(@Nullable final Dimensions input)
18 {
19 return sufficientMemory(input);
20 }
21
22 private boolean sufficientMemory(final Dimensions dimensions)
23 {
24 long requiredMemory = dimensions.getHeight() * dimensions.getWidth() * BYTES_PER_PIXEL;
25 long freeMemory = freeMemory();
26 boolean result = requiredMemory * PROCESSING_HEADROOM < freeMemory;
27 if (log.isDebugEnabled())
28 {
29 log.debug(String.format("Expected memory required for this image conversion: %d. " +
30 "Free memory: %d. Image dimension (%s) renderable: %s", requiredMemory, freeMemory, dimensions, result));
31 }
32 return result;
33 }
34
35 @VisibleForTesting
36 long freeMemory()
37 {
38 return Runtime.getRuntime().freeMemory();
39 }
40 }