private BufferedImage shapenImage(BufferedImage in) {
      BufferedImage out =
          DrawManager.getInstance().createBlankBufferedImage(in.getWidth(), in.getHeight(), false);
      Graphics2D g = out.createGraphics();
      g.setRenderingHint(
          RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

      g.drawImage(in, shapenOp, 0, 0);

      g.dispose();

      return out;
    }
    private BufferedImage reduceImageSizeByFactorOfTwo(BufferedImage in) {
      BufferedImage out =
          DrawManager.getInstance()
              .createBlankBufferedImage(in.getWidth() / 2, in.getHeight() / 2, false);
      Graphics2D g = out.createGraphics();
      g.setRenderingHint(
          RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

      g.drawImage(in, 0, 0, in.getWidth() / 2, in.getHeight() / 2, null);

      g.dispose();

      return out;
    }
    @Override
    public void run() {
      // System.out.println("Render job \"" + levelData.getMapName() + "\" : start");

      // Wait for previous runnable job to complete first
      if (previousRunnable != null) {
        synchronized (previousRunnable.finishNotifer) {
          try {
            previousRunnable.finishNotifer.wait();
          } catch (InterruptedException e) {
            // The code should not reach here...
            e.printStackTrace();
          }
        }
      }

      // System.out.println("Render job \"" + levelData.getMapName() + "\" : rendering");

      BufferedImage renderImg =
          DrawManager.getInstance()
              .createBlankBufferedImage(RENDER_IMAGE_WIDTH, RENDER_IMAGE_HEIGHT, false);
      Graphics2D graphic = renderImg.createGraphics();
      graphic.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      graphic.setClip(0, 0, RENDER_IMAGE_WIDTH, RENDER_IMAGE_HEIGHT);

      GameStage renderStage = new GameStage(levelData, GameStageType.THUMBNAIL);
      renderStage.update(0);
      renderStage.draw(graphic, RENDER_IMAGE_WIDTH, RENDER_IMAGE_HEIGHT);
      graphic.dispose();

      // Resize image

      renderImg = shapenImage(renderImg);
      for (int i = 0; i < 3; i++) {
        renderImg = reduceImageSizeByFactorOfTwo(renderImg);
      }

      this.levelData.setThumbnail(renderImg);

      // System.out.println("Render job \"" + levelData.getMapName() + "\" : finished");

      synchronized (finishNotifer) {
        finishNotifer.notifyAll();
      }
    }