package im.actor.sdk.util.images.ops; import android.graphics.*; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; import im.actor.sdk.util.images.common.WorkCache; /** * Drawing operations for bitmaps */ public class ImageDrawing { /** * Default clear color (Transparent) */ public static final int CLEAR_COLOR = Color.TRANSPARENT; /** * Clearing bitmap with transparent color (Transparent) * * @param bitmap bitmap for clearing */ public static void clearBitmap(Bitmap bitmap) { clearBitmap(bitmap, CLEAR_COLOR); } /** * Clearing bitmap with transparent color * * @param bitmap bitmap for clearing */ public static void clearBitmap(Bitmap bitmap, int color) { bitmap.eraseColor(color); } /** * Drawing bitmap over dest bitmap with clearing last one before drawing * * @param src source bitmap * @param dest destination bitmap */ public static void drawTo(Bitmap src, Bitmap dest) { drawTo(src, dest, CLEAR_COLOR); } /** * Drawing bitmap over dest bitmap with clearing last one before drawing * * @param src source bitmap * @param dest destination bitmap * @param color clear color */ public static void drawTo(Bitmap src, Bitmap dest, int color) { clearBitmap(src, color); Canvas canvas = new Canvas(dest); canvas.drawBitmap(src, 0, 0, null); canvas.setBitmap(null); } /** * Drawing src bitmap to dest bitmap with applied mask. * * @param src source bitmap * @param mask bitmap mask * @param dest destination bitmap */ public static void drawMasked(Bitmap src, Drawable mask, Bitmap dest) { drawMasked(src, mask, dest, CLEAR_COLOR); } /** * Drawing src bitmap to dest bitmap with applied mask. * * @param src source bitmap * @param mask bitmap mask * @param dest destination bitmap * @param clearColor clear color */ public static void drawMasked(Bitmap src, Drawable mask, Bitmap dest, int clearColor) { clearBitmap(dest, clearColor); Canvas canvas = new Canvas(dest); canvas.drawBitmap(src, new Rect(0, 0, src.getWidth(), src.getHeight()), new Rect(0, 0, dest.getWidth(), dest.getHeight()), new Paint(Paint.FILTER_BITMAP_FLAG)); if (mask instanceof BitmapDrawable) { ((BitmapDrawable) mask).getPaint().setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); } else if (mask instanceof NinePatchDrawable) { ((NinePatchDrawable) mask).getPaint().setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); } else { throw new RuntimeException("Supported only BitmapDrawable or NinePatchDrawable"); } mask.setBounds(0, 0, mask.getIntrinsicWidth(), mask.getIntrinsicHeight()); mask.draw(canvas); canvas.setBitmap(null); } /** * Drawing src bitmap to dest bitmap with rounded corners * * @param src source bitmap * @param dest destination bitmap * @param radius radius in destination bitmap scale */ public static void drawRoundedCorners(Bitmap src, Bitmap dest, int radius) { drawRoundedCorners(src, dest, radius, CLEAR_COLOR); } /** * Drawing src bitmap to dest bitmap with rounded corners * * @param src source bitmap * @param dest destination bitmap * @param radius radius in destination bitmap scale * @param clearColor clear color */ public static void drawRoundedCorners(Bitmap src, Bitmap dest, int radius, int clearColor) { clearBitmap(dest, clearColor); Canvas canvas = new Canvas(dest); Rect sourceRect = WorkCache.RECT1.get(); Rect destRect = WorkCache.RECT2.get(); sourceRect.set(0, 0, src.getWidth(), src.getHeight()); destRect.set(0, 0, dest.getWidth(), dest.getHeight()); RectF roundRect = WorkCache.RECTF1.get(); roundRect.set(0, 0, dest.getWidth(), dest.getHeight()); Paint paint = WorkCache.PAINT.get(); paint.reset(); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); paint.setAntiAlias(true); canvas.drawRoundRect(roundRect, radius, radius, paint); paint.reset(); paint.setFilterBitmap(true); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(src, sourceRect, destRect, paint); canvas.setBitmap(null); } /** * Drawing src bitmap to dest bitmap with round mask. Dest might be squared, src is recommended to be square * * @param src source bitmap * @param dest destination bitmap */ public static void drawInRound(Bitmap src, Bitmap dest) { drawInRound(src, dest, CLEAR_COLOR); } /** * Drawing src bitmap to dest bitmap with round mask. Dest might be squared, src is recommended to be square * * @param src source bitmap * @param dest destination bitmap * @param clearColor clear color */ public static void drawInRound(Bitmap src, Bitmap dest, int clearColor) { if (dest.getWidth() != dest.getHeight()) { throw new RuntimeException("dest Bitmap must have square size"); } clearBitmap(dest, clearColor); Canvas canvas = new Canvas(dest); int r = dest.getWidth() / 2; Rect sourceRect = WorkCache.RECT1.get(); Rect destRect = WorkCache.RECT2.get(); sourceRect.set(0, 0, src.getWidth(), src.getHeight()); destRect.set(0, 0, dest.getWidth(), dest.getHeight()); Paint paint = WorkCache.PAINT.get(); paint.reset(); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); paint.setAntiAlias(true); canvas.drawCircle(r, r, r, paint); paint.reset(); paint.setFilterBitmap(true); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(src, sourceRect, destRect, paint); canvas.setBitmap(null); } }