Skip to content
This repository was archived by the owner on Nov 14, 2018. It is now read-only.
3 changes: 3 additions & 0 deletions api/current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,14 @@ package androidx.graphics {
public final class BitmapKt {
ctor public BitmapKt();
method public static android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
method public static android.graphics.Bitmap clip(android.graphics.Bitmap, int x, int y, int width, int height);
method public static android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
method @RequiresApi(26) public static android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888", boolean hasAlpha = "true", android.graphics.ColorSpace colorSpace = "ColorSpace.get(ColorSpace.Named.SRGB)");
method public static operator int get(android.graphics.Bitmap, int x, int y);
method public static android.graphics.Bitmap rotate(android.graphics.Bitmap, float degrees);
method public static android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = "true");
method public static operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
method public static java.io.ByteArrayInputStream toStream(android.graphics.Bitmap, android.graphics.Bitmap.CompressFormat format = "CompressFormat.JPEG", @IntRange(from=0L, to=100L) int quality = "100");
}

public final class CanvasKt {
Expand Down
32 changes: 32 additions & 0 deletions src/androidTest/java/androidx/graphics/BitmapTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package androidx.graphics

import android.graphics.Bitmap
import android.graphics.Bitmap.CompressFormat.PNG
import android.graphics.BitmapFactory
import android.graphics.ColorSpace
import android.support.test.filters.SdkSuppress
import org.junit.Assert.assertEquals
Expand Down Expand Up @@ -68,4 +70,34 @@ class BitmapTest {
b[1, 1] = 0x40302010
assertEquals(0x40302010, b[1, 1])
}

@Test fun clip() {
val src = createBitmap(10, 10)
src[3, 5] = 0x40302010
val res = src.clip(3, 5, 2, 2)
assertEquals(2, res.width)
assertEquals(2, res.height)
assertEquals(0x40302010, res[0, 0])
}

@Test fun rotate() {
val src = createBitmap(10, 10)
src[3, 5] = 0x40302010
src[0, 0] = 0x10203010
val res = src.rotate(90f)
assertEquals(10, res.width)
assertEquals(10, res.height)
assertEquals(0x10203010, res[9, 0])
assertEquals(0x40302010, res[4, 3])
}

@Test fun toStream() {
val src = createBitmap(10, 10)
src[3, 5] = 0x40302010
val stream = src.toStream(PNG)
val back = BitmapFactory.decodeStream(stream)
assertEquals(10, back.width)
assertEquals(10, back.height)
assertEquals(0x40302010, back[3, 5])
}
}
47 changes: 47 additions & 0 deletions src/main/java/androidx/graphics/Bitmap.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@
package androidx.graphics

import android.graphics.Bitmap
import android.graphics.Bitmap.CompressFormat
import android.graphics.Bitmap.createBitmap
import android.graphics.Canvas
import android.graphics.ColorSpace
import android.graphics.Matrix
import android.support.annotation.ColorInt
import android.support.annotation.IntRange
import android.support.annotation.RequiresApi
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream

/**
* Creates a new [Canvas] to draw on this bitmap and executes the specified
Expand Down Expand Up @@ -111,3 +117,44 @@ inline fun createBitmap(
): Bitmap {
return Bitmap.createBitmap(width, height, config, hasAlpha, colorSpace)
}

/**
* Returns ByteArrayInputStream compressed from this bitmap with the specified [format]
* and [quality].
*
* @param format The format of bitmap.
* @param quality Hint to the compressor, 0-100. 0 meaning compress for small size, 100 meaning compress for max quality.
* @return ByteArrayInputStream
*/
inline fun Bitmap.toStream(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is not what I meant. What I meant is that there shouldn't be an extension on Bitmap to compress to a byte array or a stream, etc. Bitmap.compress() already accepts an OuputStream which is generic enough to cover all use cases. It shouldn't be specialized here.

format: CompressFormat = CompressFormat.JPEG,
@IntRange(from = 0, to = 100) quality: Int = 100
): ByteArrayInputStream =
ByteArrayOutputStream().also { compress(format, quality, it) }.toByteArray().inputStream()

/**
* Creates a new bitmap, clipped from this bitmap. If the specified [x], [y],
* [width], [height] are the same as the current width and height of this bitmap,
* this bitmap is returned and no new bitmap is created.
*
* @param x The x coordinate of the first pixel.
* @param y The y coordinate of the first pixel.
* @param width The width.
* @param height The height.
* @return the clipped bitmap
*/
inline fun Bitmap.clip(x: Int, y: Int, width: Int, height: Int): Bitmap =
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The return type is not needed. Please rename this method to crop().

Bitmap.createBitmap(this, x, y, width, height)

/**
* Creates a new bitmap, rotated from this bitmap by [degrees] - the specified number of degrees,
* with a pivot point at ([px], [py]). The pivot point is the coordinate that should remain
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no pivot point in the API

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorry for that, i added it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the change. The pivot point should probably be set to width/2.0f and height/2.0f by default.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added the default pivot point.

* unchanged by the specified transformation.
*
* @param degrees The number of degrees.
* @param px The x coordinate of the pivot point.
* @param py The y coordinate of the pivot point.
* @return the rotated bitmap
*/
inline fun Bitmap.rotate(degrees: Float): Bitmap =
createBitmap(this, 0, 0, width, height, Matrix().apply { setRotate(degrees) }, true)