fun roundBitmapInPlace()

in imagepipeline/src/main/java/com/facebook/imagepipeline/filter/InPlaceRoundFilter.kt [28:116]


  fun roundBitmapInPlace(bitmap: Bitmap) {
    Preconditions.checkNotNull(bitmap)
    val w = bitmap.width
    val h = bitmap.height
    val radius = Math.min(w, h) / 2
    val centerX = w / 2
    val centerY = h / 2
    // Nothing to do if the radius is equal to 0.
    if (radius == 0) {
      return
    }
    Preconditions.checkArgument(radius >= 1)
    Preconditions.checkArgument(w > 0 && w <= BitmapUtil.MAX_BITMAP_SIZE)
    Preconditions.checkArgument(h > 0 && h <= BitmapUtil.MAX_BITMAP_SIZE)
    Preconditions.checkArgument(centerX > 0 && centerX < w)
    Preconditions.checkArgument(centerY > 0 && centerY < h)
    val pixels = IntArray(w * h)
    bitmap.getPixels(pixels, 0, w, 0, 0, w, h)
    var x = radius - 1
    var y = 0
    val maxX = centerX + x
    val maxY = centerY + x
    val minX = centerX - x
    val minY = centerY - x
    Preconditions.checkArgument(minX >= 0 && minY >= 0 && maxX < w && maxY < h)
    var dx = 1
    var dy = 1
    val rInc = -radius * 2
    val transparentColor = IntArray(w)
    var err = dx + rInc
    var cXpX: Int
    var cXmX: Int
    var cXpY: Int
    var cXmY: Int
    var cYpX: Int
    var cYmX: Int
    var cYpY: Int
    var cYmY: Int
    var offA: Int
    var offB: Int
    var offC: Int
    var offD: Int
    while (x >= y) {
      cXpX = centerX + x
      cXmX = centerX - x
      cXpY = centerX + y
      cXmY = centerX - y
      cYpX = centerY + x
      cYmX = centerY - x
      cYpY = centerY + y
      cYmY = centerY - y
      Preconditions.checkArgument(x >= 0 && cXpY < w && cXmY >= 0 && cYpY < h && cYmY >= 0)
      offA = w * cYpY
      offB = w * cYmY
      offC = w * cYpX
      offD = w * cYmX

      // Clear left
      System.arraycopy(transparentColor, 0, pixels, offA, cXmX)
      System.arraycopy(transparentColor, 0, pixels, offB, cXmX)
      System.arraycopy(transparentColor, 0, pixels, offC, cXmY)
      System.arraycopy(transparentColor, 0, pixels, offD, cXmY)

      // Clear right
      System.arraycopy(transparentColor, 0, pixels, offA + cXpX, w - cXpX)
      System.arraycopy(transparentColor, 0, pixels, offB + cXpX, w - cXpX)
      System.arraycopy(transparentColor, 0, pixels, offC + cXpY, w - cXpY)
      System.arraycopy(transparentColor, 0, pixels, offD + cXpY, w - cXpY)
      if (err <= 0) {
        y++
        dy += 2
        err += dy
      }
      if (err > 0) {
        x--
        dx += 2
        err += dx + rInc
      }
    }

    // Clear top / bottom if height > width
    for (i in centerY - radius downTo 0) {
      System.arraycopy(transparentColor, 0, pixels, i * w, w)
    }
    for (i in centerY + radius until h) {
      System.arraycopy(transparentColor, 0, pixels, i * w, w)
    }
    bitmap.setPixels(pixels, 0, w, 0, 0, w, h)
  }