@Override
    public void run() {
      if (DEBUG_ATLAS) Log.d(LOG_TAG, "Running " + Thread.currentThread().getName());

      Atlas.Entry entry = new Atlas.Entry();
      for (Atlas.Type type : Atlas.Type.values()) {
        for (int width = mEnd; width > mStart; width -= mStep) {
          for (int height = MAX_SIZE; height > MIN_SIZE; height -= STEP) {
            // If the atlas is not big enough, skip it
            if (width * height <= mThreshold) continue;

            final int count = packBitmaps(type, width, height, entry);
            if (count > 0) {
              mResults.add(new WorkerResult(type, width, height, count));
              // If we were able to pack everything let's stop here
              // Increasing the height further won't make things better
              if (count == mBitmaps.size()) {
                break;
              }
            }
          }
        }
      }

      if (mSignal != null) {
        mSignal.countDown();
      }
    }
  /**
   * Reads an atlas configuration from the specified file. This method returns null if an error
   * occurs or if the configuration is invalid.
   */
  private Configuration readConfiguration(File file, String versionName) {
    BufferedReader reader = null;
    Configuration config = null;
    try {
      reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

      if (checkBuildIdentifier(reader, versionName)) {
        Atlas.Type type = Atlas.Type.valueOf(reader.readLine());
        int width = readInt(reader, MIN_SIZE, MAX_SIZE);
        int height = readInt(reader, MIN_SIZE, MAX_SIZE);
        int count = readInt(reader, 0, Integer.MAX_VALUE);
        int flags = readInt(reader, Integer.MIN_VALUE, Integer.MAX_VALUE);

        config = new Configuration(type, width, height, count, flags);
      }
    } catch (IllegalArgumentException e) {
      Log.w(LOG_TAG, "Invalid parameter value in " + file, e);
    } catch (FileNotFoundException e) {
      Log.w(LOG_TAG, "Could not read " + file, e);
    } catch (IOException e) {
      Log.w(LOG_TAG, "Could not read " + file, e);
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (IOException e) {
          // Ignore
        }
      }
    }
    return config;
  }
 @Override
 public String toString() {
   return type.toString()
       + " ("
       + width
       + "x"
       + height
       + ") flags=0x"
       + Integer.toHexString(flags)
       + " count="
       + count;
 }
 @Override
 public String toString() {
   return String.format("%s %dx%d", type.toString(), width, height);
 }