public synchronized BufferedImage getScaled( Getter<BufferedImage> populator, int width, int height ) throws ResourceNotFound {
		int firstAvailableSlot = -1;
		int hash = (width ^ (height << 16)) & Integer.MAX_VALUE;
		
		if( scaled == null ) {
			@SuppressWarnings("unchecked")
			SoftReference<BufferedImageWithFlipBits>[] _scaled = (SoftReference<BufferedImageWithFlipBits>[])new SoftReference[31];
			scaled = _scaled;
		}
		
		for( int i=0; i<scaled.length; ++i ) {
			int idx = (hash + i) % scaled.length;
			SoftReference<BufferedImageWithFlipBits> s = scaled[idx];
			BufferedImageWithFlipBits b;
			if( s == null ) {
				// Nobody's even tried to fill this slot, therefore our scaled
				// image hasn't yet been generated, so exit the loop.
				if( firstAvailableSlot == -1 ) firstAvailableSlot = idx;
				break;
			}
			
			b = s.get();
			if( b == null ) {
				// Can't tell if this would have been our slot or not,
				// but if we don't find out image elsewhere, we can use it.
				if( firstAvailableSlot == -1 ) firstAvailableSlot = idx;
				continue;
			}
			
			if( b.fWidth == width && b.fHeight == height ) {
				return b;
			}
		}
		
		// If no slots were available, we'll overwrite whatever's in the first one
		if( firstAvailableSlot == -1 ) firstAvailableSlot = hash % scaled.length;
		
		// Oh no, doing work in synchronized block!
		// But maybe it will be okay.
		BufferedImageWithFlipBits b = scale( populator, width, height );
		scaled[firstAvailableSlot] = new SoftReference<BufferedImageWithFlipBits>(b); 
		return b;
	}