content: 
  package com.banrossyn.imageloader.core.display;
  
  import android.graphics.*;
  import android.graphics.drawable.Drawable;
  
  import com.banrossyn.imageloader.core.assist.LoadedFrom;
  import com.banrossyn.imageloader.core.imageaware.ImageAware;
  import com.banrossyn.imageloader.core.imageaware.ImageViewAware;
  
  /**
   * Can display bitmap with rounded corners. This implementation works only with ImageViews wrapped
   * in ImageViewAware.
   * <br />
   * This implementation is inspired by
   * <a href="http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/">
   * Romain Guy's article</a>. It rounds images using custom drawable drawing. Original bitmap isn't changed.
   * <br />
   * <br />
   * If this implementation doesn't meet your needs then consider
   * <a href="https://github.com/vinc3m1/RoundedImageView">RoundedImageView</a> or
   * <a href="https://github.com/Pkmmte/CircularImageView">CircularImageView</a> projects for usage.
   *
   * @author rossyn (banrossyn[at]gmail[dot]com)
   * @since 1.5.6
   */
  public class RoundedBitmapDisplayer implements BitmapDisplayer {
  
  	protected final int cornerRadius;
  	protected final int margin;
  
  	public RoundedBitmapDisplayer(int cornerRadiusPixels) {
  		this(cornerRadiusPixels, 0);
  	}
  
  	public RoundedBitmapDisplayer(int cornerRadiusPixels, int marginPixels) {
  		this.cornerRadius = cornerRadiusPixels;
  		this.margin = marginPixels;
  	}
  
  	@Override
  	public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
  		if (!(imageAware instanceof ImageViewAware)) {
  			throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
  		}
  
  		imageAware.setImageDrawable(new RoundedDrawable(bitmap, cornerRadius, margin));
  	}
  
  	public static class RoundedDrawable extends Drawable {
  
  		protected final float cornerRadius;
  		protected final int margin;
  
  		protected final RectF mRect = new RectF(),
  				mBitmapRect;
  		protected final BitmapShader bitmapShader;
  		protected final Paint paint;
  
  		public RoundedDrawable(Bitmap bitmap, int cornerRadius, int margin) {
  			this.cornerRadius = cornerRadius;
  			this.margin = margin;
  
  			bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  			mBitmapRect = new RectF (margin, margin, bitmap.getWidth() - margin, bitmap.getHeight() - margin);
  			
  			paint = new Paint();
  			paint.setAntiAlias(true);
  			paint.setShader(bitmapShader);
  			paint.setFilterBitmap(true);
  			paint.setDither(true);
  		}
  
  		@Override
  		protected void onBoundsChange(Rect bounds) {
  			super.onBoundsChange(bounds);
  			mRect.set(margin, margin, bounds.width() - margin, bounds.height() - margin);
  			
  			// Resize the original bitmap to fit the new bound
  			Matrix shaderMatrix = new Matrix();
  			shaderMatrix.setRectToRect(mBitmapRect, mRect, Matrix.ScaleToFit.FILL);
  			bitmapShader.setLocalMatrix(shaderMatrix);
  			
  		}
  
  		@Override
  		public void draw(Canvas canvas) {
  			canvas.drawRoundRect(mRect, cornerRadius, cornerRadius, paint);
  		}
  
  		@Override
  		public int getOpacity() {
  			return PixelFormat.TRANSLUCENT;
  		}
  
  		@Override
  		public void setAlpha(int alpha) {
  			paint.setAlpha(alpha);
  		}
  
  		@Override
  		public void setColorFilter(ColorFilter cf) {
  			paint.setColorFilter(cf);
  		}
  	}
  }
  