content: package im.actor.sdk.util.images.ops;
  
  import android.graphics.*;
  import im.actor.sdk.util.images.common.WorkCache;
  
  import static im.actor.sdk.util.images.ops.ImageDrawing.*;
  
  /**
   * Scaling images effectively with keeping good quality.
   *
   * @author Stepan ex3ndr Korshakov me@ex3ndr.com
   */
  public class ImageScaling {
  
      /**
       * Scaling bitmap to fill rect with centering. Method keep aspect ratio.
       *
       * @param src source bitmap
       * @param w   width of result
       * @param h   height of result
       * @return scaled bitmap
       */
      public static Bitmap scaleFill(Bitmap src, int w, int h) {
          Bitmap res = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
          scaleFill(src, res);
          return res;
      }
  
      /**
       * Scaling src bitmap to fill dest bitmap with centering. Method keep aspect ratio.
       *
       * @param src  source bitmap
       * @param dest destination bitmap
       */
      public static void scaleFill(Bitmap src, Bitmap dest) {
          scaleFill(src, dest, CLEAR_COLOR);
      }
  
      /**
       * Scaling src bitmap to fill dest bitmap with centering. Method keep aspect ratio.
       *
       * @param src        source bitmap
       * @param dest       destination bitmap
       * @param clearColor color for clearing dest before drawing
       */
      public static void scaleFill(Bitmap src, Bitmap dest, int clearColor) {
          float ratio = Math.max(dest.getWidth() / (float) src.getWidth(), dest.getHeight() / (float) src.getHeight());
          int newW = (int) (src.getWidth() * ratio);
          int newH = (int) (src.getHeight() * ratio);
          int paddingTop = (dest.getHeight() - (int) (src.getHeight() * ratio)) / 2;
          int paddingLeft = (dest.getWidth() - (int) (src.getWidth() * ratio)) / 2;
  
          scale(src, dest, clearColor, 0, 0, src.getWidth(), src.getHeight(), paddingLeft, paddingTop,
                  newW + paddingLeft,
                  newH + paddingTop);
      }
  
      /**
       * Scaling bitmap to fit required sizes. Method keep aspect ratio.
       *
       * @param src  source bitmap
       * @param maxW maximum width of result bitmap
       * @param maxH maximum height of result bitmap
       * @return scaled bitmap
       */
      public static Bitmap scaleFit(Bitmap src, int maxW, int maxH) {
          float ratio = Math.min(maxW / (float) src.getWidth(), maxH / (float) src.getHeight());
          int newW = (int) (src.getWidth() * ratio);
          int newH = (int) (src.getHeight() * ratio);
          return scale(src, newW, newH);
      }
  
      /**
       * Scaling src Bitmap to fit and cenetered in dest bitmap. Method keep aspect ratio.
       *
       * @param src  source bitmap
       * @param dest destination bitmap
       */
      public static void scaleFit(Bitmap src, Bitmap dest) {
          scaleFit(src, dest, CLEAR_COLOR);
      }
  
      /**
       * Scaling src Bitmap to fit and cenetered in dest bitmap. Method keep aspect ratio.
       *
       * @param src        source bitmap
       * @param dest       destination bitmap
       * @param clearColor color for clearing dest before drawing
       */
      public static void scaleFit(Bitmap src, Bitmap dest, int clearColor) {
          float ratio = Math.min(dest.getWidth() / (float) src.getWidth(), dest.getHeight() / (float) src.getHeight());
          int newW = (int) (src.getWidth() * ratio);
          int newH = (int) (src.getHeight() * ratio);
          int paddingTop = (dest.getHeight() - (int) (src.getHeight() * ratio)) / 2;
          int paddingLeft = (dest.getWidth() - (int) (src.getWidth() * ratio)) / 2;
  
          scale(src, dest, clearColor, 0, 0, src.getWidth(), src.getHeight(), paddingLeft, paddingTop,
                  newW + paddingLeft,
                  newH + paddingTop);
      }
  
      /**
       * Scaling bitmap to specific width and height without keeping aspect ratio.
       *
       * @param src source bitmap
       * @param dw  new width
       * @param dh  new height
       * @return scaled bitmap
       */
      public static Bitmap scale(Bitmap src, int dw, int dh) {
          Bitmap res = Bitmap.createBitmap(dw, dh, Bitmap.Config.ARGB_8888);
          scale(src, res);
          return res;
      }
  
      /**
       * Scaling bitmap to fill dest bitmap without keeping aspect ratio.
       *
       * @param src  source bitmap
       * @param dest destination bitmap
       */
      public static void scale(Bitmap src, Bitmap dest) {
          scale(src, dest, CLEAR_COLOR);
      }
  
      /**
       * Scaling bitmap to fill dest bitmap without keeping aspect ratio.
       *
       * @param src        source bitmap
       * @param dest       destination bitmap
       * @param clearColor color for clearing dest before drawing
       */
      public static void scale(Bitmap src, Bitmap dest, int clearColor) {
          scale(src, dest, clearColor, 0, 0, src.getWidth(), src.getHeight(), 0, 0, dest.getWidth(), dest.getHeight());
      }
  
      /**
       * Scaling region of bitmap to destination bitmap region
       *
       * @param src  source bitmap
       * @param dest destination bitmap
       * @param x    source x
       * @param y    source y
       * @param sw   source width
       * @param sh   source height
       * @param dx   destination x
       * @param dy   destination y
       * @param dw   destination width
       * @param dh   destination height
       */
      public static void scale(Bitmap src, Bitmap dest,
                               int x, int y, int sw, int sh,
                               int dx, int dy,
                               int dw, int dh) {
          scale(src, dest, CLEAR_COLOR, x, y, sw, sh, dx, dy, dw, dh);
      }
  
      /**
       * Scaling region of bitmap to destination bitmap region
       *
       * @param src        source bitmap
       * @param dest       destination bitmap
       * @param clearColor color for clearing dest before drawing
       * @param x          source x
       * @param y          source y
       * @param sw         source width
       * @param sh         source height
       * @param dx         destination x
       * @param dy         destination y
       * @param dw         destination width
       * @param dh         destination height
       */
      public static void scale(Bitmap src, Bitmap dest, int clearColor,
                               int x, int y, int sw, int sh,
                               int dx, int dy,
                               int dw, int dh) {
          clearBitmap(dest, clearColor);
          Canvas canvas = new Canvas(dest);
          Paint paint = WorkCache.PAINT.get();
          paint.setFilterBitmap(true);
          canvas.drawBitmap(src, new Rect(x + 1, y + 1, sw - 1, sh - 1), new Rect(dx, dy, dw, dh), paint);
          canvas.setBitmap(null);
      }
  
      protected ImageScaling() {
      }
  }