1
0
mirror of https://github.com/wasabeef/glide-transformations.git synced 2025-10-05 10:43:22 +08:00

71 Commits
1.0.8 ... 2.0.1

Author SHA1 Message Date
Daichi Furiya
c3f09cdd0d Merge pull request #38 from wasabeef/v2.0.1
V2.0.1
2016-04-21 15:29:01 +09:00
wasabeef
ddd76d4f06 fix layout 2016-04-21 15:27:26 +09:00
wasabeef
f9bca8887d fix bugs issue #35 2016-04-21 15:23:22 +09:00
wasabeef
592815a6a0 update gradle 2016-04-21 15:22:58 +09:00
wasabeef
f6540b111f bump up 2.0.1 2016-04-21 15:22:46 +09:00
wasabeef
9bea464afc format 2016-04-21 15:22:21 +09:00
wasabeef
219b32bbcc format 2016-04-21 15:18:48 +09:00
Daichi Furiya
4d7190847c Merge pull request #36 from elevenfive/patch-1
Use correct field prefix
2016-04-19 13:05:36 +09:00
Matthew Zavislak
0d7a93c264 Use correct field prefix 2016-04-15 20:19:29 -07:00
Daichi Furiya
e69f775ddd Update build.gradle 2016-03-02 23:12:39 +09:00
Daichi Furiya
4b9cf87770 Update gradle-wrapper.properties 2016-03-02 23:11:59 +09:00
Daichi Furiya
cafad91b0b Update gradle-wrapper.properties 2016-03-02 23:11:43 +09:00
Daichi Furiya
933c3f7989 Merge pull request #31 from wasabeef/goodbye-v8rs
Goodbye v8.RenderScript
2016-03-02 23:11:05 +09:00
wasabeef
68bafb0f53 bump up 2.0.0 2016-03-02 23:09:31 +09:00
wasabeef
817b138980 Say v8.RenderScript goodbye 2016-03-02 22:53:34 +09:00
wasabeef
a908abc7d4 bump up 1.4.0 2016-02-28 04:58:55 +09:00
Daichi Furiya
3e0738de0a Update README.md 2016-01-31 02:57:09 +09:00
Daichi Furiya
dff7328f6e Update README.md 2015-12-11 17:50:07 +09:00
Daichi Furiya
f5cb7392d6 Update CHANGELOG.md 2015-11-27 17:56:25 +09:00
wasabeef
d8a12b02b8 bump up 1.3.1 2015-11-27 17:50:00 +09:00
wasabeef
a6a2b625ad fix leak code 2015-11-27 17:44:35 +09:00
wasabeef
f488f09b19 Merge branch 'master' of github.com:wasabeef/glide-transformations 2015-11-27 17:42:30 +09:00
Daichi Furiya
76b7e3b719 Merge pull request #25 from AAkira/fix/leak-context
Fix memory leak at BlurTransformation.
2015-11-27 17:41:57 +09:00
A.Akira
c29df80ae9 Use application context. 2015-11-27 17:38:06 +09:00
wasabeef
aef7541ea3 fix leak code and constractor 2015-11-27 17:11:58 +09:00
wasabeef
71255edcd0 Change the renderscriptTargetApi down to 20 2015-11-27 17:03:55 +09:00
wasabeef
4a268b6dbd refactor gpu transformations 2015-11-27 17:00:01 +09:00
A.Akira
eef0be6b92 Add null checking the context. 2015-11-26 10:22:18 +09:00
A.Akira
260f91e291 Use WeakReference. 2015-11-25 17:09:05 +09:00
Daichi Furiya
36ceccb38e Update README.md 2015-11-10 15:17:55 +09:00
Daichi Furiya
e3a035d5cb Update CHANGELOG.md 2015-11-10 15:17:42 +09:00
wasabeef
656ea50911 bump up 1.3.0 2015-11-10 15:10:18 +09:00
wasabeef
e2cf4fd7eb update sample 2015-11-10 15:03:58 +09:00
wasabeef
e387df2daa format 2015-11-10 15:03:49 +09:00
wasabeef
5b311f74f6 update gradle 2015-11-10 12:42:46 +09:00
Daichi Furiya
62f3ee6b4a Merge pull request #23 from kaelaela/feature/upgrade_rounded_transformation
Add round corner type
2015-11-10 12:40:38 +09:00
kaelaela
3150b4c8d5 Add round corner type 2015-10-04 15:57:46 +09:00
Daichi Furiya
410d94b7b1 Update README.md 2015-09-20 01:47:23 +09:00
Daichi Furiya
a559d8bea8 Update README.md 2015-09-20 00:53:23 +09:00
wasabeef
4629d5e375 bump up 1.2.1 2015-09-18 15:32:51 +09:00
Daichi Furiya
113200de55 Merge pull request #22 from start141/master
Replaced the mask_starfish.png
2015-09-18 15:22:49 +09:00
wasabeef
143efe2ea7 bump up 1.2.1 2015-09-18 15:14:36 +09:00
start141
fe864e498b replace mask_starfish.png 2015-09-18 14:14:09 +08:00
wasabeef
f2f1229c8d format 2015-09-18 15:09:03 +09:00
Daichi Furiya
f1246ff9ee Merge pull request #21 from start141/master
Merged NinePatchMaskTransformation to MaskTransformation
2015-09-18 15:03:32 +09:00
start141
d063aac6fa Merged NinePatchMaskTransformation to MaskTransformation
1.merged the NinePatchMaskTransformation to the maskTransformation.
2.replace mask resource.
2015-09-18 12:07:54 +08:00
start141
cb3cd88ed2 Optimize the code
1. Not to create the mask bitmap.
2. Adjust MaskTransformation’s getId()’s return.
2015-09-17 20:27:30 +08:00
start141
57fcfce9df Merge pull request #1 from wasabeef/master
Update to 1.2.0
2015-09-17 18:25:55 +08:00
Daichi Furiya
347326dafa Update README.md 2015-09-17 00:09:12 +09:00
Daichi Furiya
b4332f8c8d Update CHANGELOG.md 2015-09-17 00:08:47 +09:00
Daichi Furiya
39b9d6aa6b Update README.md 2015-09-16 23:59:48 +09:00
wasabeef
2c08c1fb5e Merge branch 'master' of github.com:wasabeef/glide-transformations 2015-09-16 23:56:07 +09:00
wasabeef
abde4c694d update documents 2015-09-16 23:52:37 +09:00
wasabeef
d5616ec9fa refactor samples 2015-09-16 23:46:49 +09:00
wasabeef
1253147c4a bump up 2015-09-16 22:49:01 +09:00
wasabeef
7614f1326a update demo 2015-09-16 22:38:28 +09:00
wasabeef
5cf3e3d934 Refactor 2015-09-16 22:38:16 +09:00
Daichi Furiya
efc447d2f7 Update README.md 2015-09-15 15:12:11 +09:00
Daichi Furiya
23b623c882 Merge pull request #19 from satorufujiwara/feature/provided_gpuimage
Change gpuimage's scope to provided.
2015-09-15 15:09:24 +09:00
Daichi Furiya
f9ea19aaae Merge pull request #18 from start141/master
Add Transformation
2015-09-15 15:09:13 +09:00
start141
831f038d29 Put the mask bitmap to the BitmapPool
put the mask bitmap to the BitmapPool when the mask is get from the
BitmapPool.
2015-09-14 19:56:51 +08:00
fujiwara-satoru
eed7b944e5 Change gpuimage's scope to provided. 2015-09-14 20:54:40 +09:00
start141
46d5d4d72f Add Transformation
Add MaskTransformation and NinePatchMaskTransformation.
2015-09-14 16:49:58 +08:00
wasabeef
6ebfdbe581 modify changelog 2015-09-06 17:34:47 +09:00
wasabeef
2a4eb22841 modify comment 2015-09-06 17:19:27 +09:00
wasabeef
2cc2104802 bump up 2015-09-06 01:29:00 +09:00
wasabeef
f83e5ef85a change the codestyle 2015-09-06 01:24:12 +09:00
wasabeef
cdbd42595a Adjustment of default parameters. 2015-09-06 01:18:40 +09:00
Daichi Furiya
987651f9da Update README.md 2015-08-12 19:26:57 +09:00
Daichi Furiya
ad376134e9 Update README.md 2015-07-25 15:36:18 +09:00
Daichi Furiya
3f695c1e9c Update CHANGELOG.md 2015-07-24 18:28:35 +09:00
49 changed files with 1781 additions and 1249 deletions

View File

@@ -1,6 +1,59 @@
Change Log Change Log
========== ==========
Version 2.0.1 *(2016-04-21)*
----------------------------
Fix:
[#35](https://github.com/wasabeef/glide-transformations/issues/35)
RSInvalidStateException
Version 2.0.0 *(2016-03-02)*
----------------------------
Say v8.RenderScript goodbye
Version 1.4.0 *(2016-02-28)*
----------------------------
fix Issue [#29](https://github.com/wasabeef/glide-transformations/issues/29)
Use FastBlur as a fallback upon RenderScript failure.
Version 1.3.1 *(2015-11-27)*
----------------------------
Change the renderscriptTargetApi down to 20.
Warning:Renderscript support mode is not currently supported with renderscript target 21+
fix: memory leak.
Version 1.3.0 *(2015-11-10)*
----------------------------
add round corner type to RoundedCornersTransformation.
Thanks to [kaelaela](https://github.com/kaelaela)
Version 1.2.1 *(2015-09-18)*
----------------------------
Merged NinePatchMaskTransformation to MaskTransformation.
Version 1.2.0 *(2015-09-16)*
----------------------------
add new transformations MaskTransformation and NinePatchMaskTransformation.
Thanks to [start141](https://github.com/start141)
Version 1.1.0 *(2015-09-05)*
----------------------------
Adjustment of default parameters.
Version 1.0.8 *(2015-07-24)*
----------------------------
add DownSampling to BlurTransform
Version 1.0.7 *(2015-07-18)* Version 1.0.7 *(2015-07-18)*
---------------------------- ----------------------------

View File

@@ -9,8 +9,9 @@ An Android transformation library providing a variety of image transformations f
Please feel free to use this. Please feel free to use this.
#### Are you using Picasso? #### Are you using Picasso or Fresco?
[Picasso Transformations](https://github.com/wasabeef/picasso-transformations) [Picasso Transformations](https://github.com/wasabeef/picasso-transformations)
[Fresco Processors](https://github.com/wasabeef/fresco-processors)
# Demo # Demo
@@ -32,8 +33,9 @@ repositories {
} }
dependencies { dependencies {
compile 'jp.wasabeef:glide-transformations:1.0.8@aar' compile 'jp.wasabeef:glide-transformations:2.0.1'
compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.2.3@aar' // If you want to use the GPU Filters
compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0'
} }
``` ```
@@ -43,7 +45,7 @@ Set Glide Transform.
```java ```java
Glide.with(this).load(R.drawable.demo) Glide.with(this).load(R.drawable.demo)
.bitmapTransform(new BlurTransformation(this, Glide.get(this).getBitmapPool())) .bitmapTransform(new BlurTransformation(context))
.into((ImageView) findViewById(R.id.image)); .into((ImageView) findViewById(R.id.image));
``` ```
@@ -52,31 +54,16 @@ Glide.with(this).load(R.drawable.demo)
You can set a multiple transformations. You can set a multiple transformations.
```java ```java
BitmapPool pool = Glide.get(this).getBitmapPool(); Glide.with(this).load(R.drawable.demo)
Glide.with(this).load(R.drawable.demo).bitmapTransform( .bitmapTransform(new BlurTransformation(context, 25), new CropCircleTransformation(context))
new BlurTransformation(this, pool, 25, 2), new CropCircleTransformation(pool))
.into((ImageView) findViewById(R.id.image)); .into((ImageView) findViewById(R.id.image));
``` ```
## Step 4
If you are using `BlurTransformation`.
```groovy
android {
...
defaultConfig {
...
renderscriptTargetApi 22
renderscriptSupportModeEnabled true
}
}
```
## Transformations ## Transformations
### Crop ### Crop
`CropTransformation`, `CropCircleTransformation`, `CropSquareTransformation` `CropTransformation`, `CropCircleTransformation`, `CropSquareTransformation`,
`RoundedCornersTransformation`
### Color ### Color
`ColorFilterTransformation`, `GrayscaleTransformation` `ColorFilterTransformation`, `GrayscaleTransformation`
@@ -84,13 +71,17 @@ android {
### Blur ### Blur
`BlurTransformation` `BlurTransformation`
### Filter (use [GPUImage](https://github.com/CyberAgent/android-gpuimage)) ### Mask
`MaskTransformation`
### GPU Filter (use [GPUImage](https://github.com/CyberAgent/android-gpuimage))
**Will require add dependencies for GPUImage.**
`ToonFilterTransformation`, `SepiaFilterTransformation`, `ContrastFilterTransformation` `ToonFilterTransformation`, `SepiaFilterTransformation`, `ContrastFilterTransformation`
`InvertFilterTransformation`, `PixelationFilterTransformation`, `SketchFilterTransformation` `InvertFilterTransformation`, `PixelationFilterTransformation`, `SketchFilterTransformation`
`SwirlFilterTransformation`, `KuwaharaFilterTransformation`, `VignetteFilterTransformation` `SwirlFilterTransformation`, `BrightnessFilterTransformation`, `KuwaharaFilterTransformation`
`VignetteFilterTransformation`
### Other
`RoundedCornersTransformation`
Applications using Glide Transformations Applications using Glide Transformations
--- ---
@@ -110,6 +101,16 @@ Daichi Furiya (Wasabeef) - <dadadada.chop@gmail.com>
src="https://raw.githubusercontent.com/wasabeef/art/master/twitter.png" width="75"/> src="https://raw.githubusercontent.com/wasabeef/art/master/twitter.png" width="75"/>
</a> </a>
Contributions
-------
Any contributions are welcome!
Contributers
-------
* [start141](https://github.com/start141)
Thanks Thanks
------- -------

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 MiB

After

Width:  |  Height:  |  Size: 3.9 MiB

View File

@@ -5,11 +5,8 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:1.3.0-beta4' classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath 'com.novoda:bintray-release:0.3.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
} }
} }

View File

@@ -1,60 +1,58 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion COMPILE_SDK_VERSION as int compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION buildToolsVersion BUILD_TOOLS_VERSION
defaultConfig { defaultConfig {
minSdkVersion MIN_SDK_VERSION as int minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int targetSdkVersion TARGET_SDK_VERSION as int
versionCode VERSION_CODE as int versionCode "git rev-list origin/master --count".execute().text.toInteger()
versionName VERSION_NAME versionName VERSION_NAME
renderscriptTargetApi RENDERSCRIPT_TARGET_API as int }
renderscriptSupportModeEnabled true
}
signingConfigs { signingConfigs {
release { release {
storeFile file(keyStoreProperty) storeFile file(keyStoreProperty)
keyAlias keyAliasProperty keyAlias keyAliasProperty
storePassword keyStorePasswordProperty storePassword keyStorePasswordProperty
keyPassword keyAliasPasswordProperty keyPassword keyAliasPasswordProperty
}
} }
}
buildTypes { buildTypes {
debug { debug {
debuggable true debuggable true
zipAlignEnabled true zipAlignEnabled true
}
release {
debuggable false
zipAlignEnabled true
signingConfig signingConfigs.release
}
} }
release {
debuggable false
zipAlignEnabled true
signingConfig signingConfigs.release
}
}
} }
def getKeyStoreProperty() { def getKeyStoreProperty() {
return hasProperty('WASABEEF_KEYSTORE') ? WASABEEF_KEYSTORE : "debug.keystore" return hasProperty('WASABEEF_KEYSTORE') ? WASABEEF_KEYSTORE : "debug.keystore"
} }
def getKeyAliasProperty() { def getKeyAliasProperty() {
return hasProperty('WASABEEF_KEYALIAS') ? WASABEEF_KEYALIAS : "android" return hasProperty('WASABEEF_KEYALIAS') ? WASABEEF_KEYALIAS : "android"
} }
def getKeyStorePasswordProperty() { def getKeyStorePasswordProperty() {
return hasProperty('WASABEEF_KEYSTOREPASSWORD') ? WASABEEF_KEYSTOREPASSWORD : "androiddebugkey" return hasProperty('WASABEEF_KEYSTOREPASSWORD') ? WASABEEF_KEYSTOREPASSWORD : "androiddebugkey"
} }
def getKeyAliasPasswordProperty() { def getKeyAliasPasswordProperty() {
return hasProperty('WASABEEF_KEYALIASPASSWORD') ? WASABEEF_KEYALIASPASSWORD : "android" return hasProperty('WASABEEF_KEYALIASPASSWORD') ? WASABEEF_KEYALIASPASSWORD : "android"
} }
dependencies { dependencies {
compile project(':transformations') compile project(':transformations')
compile "com.github.bumptech.glide:glide:${GLIDE_VERSION}" compile "com.github.bumptech.glide:glide:${GLIDE_VERSION}"
compile "jp.co.cyberagent.android.gpuimage:gpuimage-library:${GPUIMAGE_VERSION}" compile "jp.co.cyberagent.android.gpuimage:gpuimage-library:${GPUIMAGE_VERSION}"
compile "com.android.support:appcompat-v7:${SUPPORT_PACKAGE_VERSION}" compile "com.android.support:appcompat-v7:${SUPPORT_PACKAGE_VERSION}"
compile "com.android.support:recyclerview-v7:${SUPPORT_PACKAGE_VERSION}" compile "com.android.support:recyclerview-v7:${SUPPORT_PACKAGE_VERSION}"
} }

View File

@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.wasabeef.example.glide" > package="jp.wasabeef.example.glide"
>
<application <application
android:allowBackup="true" android:allowBackup="true"
android:icon="@drawable/ic_launcher" android:icon="@drawable/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" > android:theme="@style/AppTheme"
<activity >
android:name=".MainActivity" <activity
android:label="@string/app_name" > android:name=".MainActivity"
<intent-filter> android:label="@string/app_name"
<action android:name="android.intent.action.MAIN" /> >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
</application> </application>
</manifest> </manifest>

View File

@@ -4,44 +4,42 @@ import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import jp.wasabeef.example.glide.MainAdapter.Type; import jp.wasabeef.example.glide.MainAdapter.Type;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
@Override @Override protected void onCreate(Bundle savedInstanceState) {
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
List<Type> dataSet = new ArrayList<>(); List<Type> dataSet = new ArrayList<>();
dataSet.add(Type.CropTop); dataSet.add(Type.Mask);
dataSet.add(Type.CropCenter); dataSet.add(Type.NinePatchMask);
dataSet.add(Type.CropBottom); dataSet.add(Type.CropTop);
dataSet.add(Type.CropSquare); dataSet.add(Type.CropCenter);
dataSet.add(Type.CropCircle); dataSet.add(Type.CropBottom);
dataSet.add(Type.ColorFilter); dataSet.add(Type.CropSquare);
dataSet.add(Type.Grayscale); dataSet.add(Type.CropCircle);
dataSet.add(Type.RoundedCorners); dataSet.add(Type.ColorFilter);
dataSet.add(Type.Blur); dataSet.add(Type.Grayscale);
dataSet.add(Type.Toon); dataSet.add(Type.RoundedCorners);
dataSet.add(Type.Sepia); dataSet.add(Type.Blur);
dataSet.add(Type.Contrast); dataSet.add(Type.Toon);
dataSet.add(Type.Invert); dataSet.add(Type.Sepia);
dataSet.add(Type.Pixel); dataSet.add(Type.Contrast);
dataSet.add(Type.Sketch); dataSet.add(Type.Invert);
dataSet.add(Type.Swirl); dataSet.add(Type.Pixel);
dataSet.add(Type.Brightness); dataSet.add(Type.Sketch);
dataSet.add(Type.Kuawahara); dataSet.add(Type.Swirl);
dataSet.add(Type.Vignette); dataSet.add(Type.Brightness);
dataSet.add(Type.Kuawahara);
dataSet.add(Type.Vignette);
recyclerView.setAdapter(new MainAdapter(this, dataSet)); recyclerView.setAdapter(new MainAdapter(this, dataSet));
} }
} }

View File

@@ -1,11 +1,6 @@
package jp.wasabeef.example.glide; package jp.wasabeef.example.glide;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PointF; import android.graphics.PointF;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
@@ -14,15 +9,16 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import java.util.List; import java.util.List;
import jp.wasabeef.glide.transformations.BlurTransformation; import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.ColorFilterTransformation; import jp.wasabeef.glide.transformations.ColorFilterTransformation;
import jp.wasabeef.glide.transformations.CropCircleTransformation; import jp.wasabeef.glide.transformations.CropCircleTransformation;
import jp.wasabeef.glide.transformations.CropSquareTransformation; import jp.wasabeef.glide.transformations.CropSquareTransformation;
import jp.wasabeef.glide.transformations.CropTransformation; import jp.wasabeef.glide.transformations.CropTransformation;
import jp.wasabeef.glide.transformations.GrayscaleTransformation; import jp.wasabeef.glide.transformations.GrayscaleTransformation;
import jp.wasabeef.glide.transformations.MaskTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import jp.wasabeef.glide.transformations.gpu.BrightnessFilterTransformation; import jp.wasabeef.glide.transformations.gpu.BrightnessFilterTransformation;
import jp.wasabeef.glide.transformations.gpu.ContrastFilterTransformation; import jp.wasabeef.glide.transformations.gpu.ContrastFilterTransformation;
@@ -40,131 +36,204 @@ import jp.wasabeef.glide.transformations.gpu.VignetteFilterTransformation;
*/ */
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> { public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {
private Context mContext; private Context mContext;
private List<Type> mDataSet; private List<Type> mDataSet;
private BitmapPool mPool;
enum Type { enum Type {
CropTop, Mask,
CropCenter, NinePatchMask,
CropBottom, CropTop,
CropSquare, CropCenter,
CropCircle, CropBottom,
ColorFilter, CropSquare,
Grayscale, CropCircle,
RoundedCorners, ColorFilter,
Blur, Grayscale,
Toon, RoundedCorners,
Sepia, Blur,
Contrast, Toon,
Invert, Sepia,
Pixel, Contrast,
Sketch, Invert,
Swirl, Pixel,
Brightness, Sketch,
Kuawahara, Swirl,
Vignette Brightness,
Kuawahara,
Vignette
}
public MainAdapter(Context context, List<Type> dataSet) {
mContext = context;
mDataSet = dataSet;
}
@Override public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.layout_list_item, parent, false);
return new ViewHolder(v);
}
@Override public void onBindViewHolder(MainAdapter.ViewHolder holder, int position) {
switch (mDataSet.get(position)) {
case Mask: {
int width = Utils.dip2px(mContext, 133.33f);
int height = Utils.dip2px(mContext, 126.33f);
Glide.with(mContext)
.load(R.drawable.check)
.override(width, height)
.bitmapTransform(new CenterCrop(mContext),
new MaskTransformation(mContext, R.drawable.mask_starfish))
.into(holder.image);
break;
}
case NinePatchMask: {
int width = Utils.dip2px(mContext, 150.0f);
int height = Utils.dip2px(mContext, 100.0f);
Glide.with(mContext)
.load(R.drawable.check)
.override(width, height)
.bitmapTransform(new CenterCrop(mContext),
new MaskTransformation(mContext, R.drawable.mask_chat_right))
.into(holder.image);
break;
}
case CropTop:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(
new CropTransformation(mContext, 300, 100, CropTransformation.CropType.TOP))
.into(holder.image);
break;
case CropCenter:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new CropTransformation(mContext, 300, 100))
.into(holder.image);
break;
case CropBottom:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(
new CropTransformation(mContext, 300, 100, CropTransformation.CropType.BOTTOM))
.into(holder.image);
break;
case CropSquare:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new CropSquareTransformation(mContext))
.into(holder.image);
break;
case CropCircle:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new CropCircleTransformation(mContext))
.into(holder.image);
break;
case ColorFilter:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new ColorFilterTransformation(mContext, Color.argb(80, 255, 0, 0)))
.into(holder.image);
break;
case Grayscale:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new GrayscaleTransformation(mContext))
.into(holder.image);
break;
case RoundedCorners:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new RoundedCornersTransformation(mContext, 30, 0,
RoundedCornersTransformation.CornerType.BOTTOM))
.into(holder.image);
break;
case Blur:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new BlurTransformation(mContext, 25))
.into(holder.image);
break;
case Toon:
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new ToonFilterTransformation(mContext))
.into(holder.image);
break;
case Sepia:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new SepiaFilterTransformation(mContext))
.into(holder.image);
break;
case Contrast:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new ContrastFilterTransformation(mContext, 2.0f))
.into(holder.image);
break;
case Invert:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new InvertFilterTransformation(mContext))
.into(holder.image);
break;
case Pixel:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new PixelationFilterTransformation(mContext, 20))
.into(holder.image);
break;
case Sketch:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new SketchFilterTransformation(mContext))
.into(holder.image);
break;
case Swirl:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(
new SwirlFilterTransformation(mContext, 0.5f, 1.0f, new PointF(0.5f, 0.5f)))
.into(holder.image);
break;
case Brightness:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new BrightnessFilterTransformation(mContext, 0.5f))
.into(holder.image);
break;
case Kuawahara:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new KuwaharaFilterTransformation(mContext, 25))
.into(holder.image);
break;
case Vignette:
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new VignetteFilterTransformation(mContext, new PointF(0.5f, 0.5f),
new float[] { 0.0f, 0.0f, 0.0f }, 0f, 0.75f))
.into(holder.image);
break;
} }
holder.title.setText(mDataSet.get(position).name());
}
public MainAdapter(Context context, List<Type> dataSet) { @Override public int getItemCount() {
mContext = context; return mDataSet.size();
mDataSet = dataSet; }
mPool = Glide.get(mContext).getBitmapPool();
} static class ViewHolder extends RecyclerView.ViewHolder {
@Override public ImageView image;
public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public TextView title;
View v = LayoutInflater.from(mContext)
.inflate(R.layout.layout_list_item, parent, false); ViewHolder(View itemView) {
return new ViewHolder(v); super(itemView);
} image = (ImageView) itemView.findViewById(R.id.image);
title = (TextView) itemView.findViewById(R.id.title);
@Override
public void onBindViewHolder(MainAdapter.ViewHolder holder, int position) {
Transformation transformation = null;
switch (mDataSet.get(position)) {
case CropTop:
transformation =
new CropTransformation(mPool, 300, 100, CropTransformation.CropType.TOP);
break;
case CropCenter:
transformation = new CropTransformation(mPool, 300, 100);
break;
case CropBottom:
transformation =
new CropTransformation(mPool, 300, 100, CropTransformation.CropType.BOTTOM);
break;
case CropSquare:
transformation = new CropSquareTransformation(mPool);
break;
case CropCircle:
transformation = new CropCircleTransformation(mPool);
break;
case ColorFilter:
transformation = new ColorFilterTransformation(mPool, Color.argb(80, 255, 0, 0));
break;
case Grayscale:
transformation = new GrayscaleTransformation(mPool);
break;
case RoundedCorners:
transformation = new RoundedCornersTransformation(mPool, 100, 0);
break;
case Blur:
transformation = new BlurTransformation(mContext, mPool, 25, 1);
break;
case Toon:
transformation = new ToonFilterTransformation(mContext, mPool);
break;
case Sepia:
transformation = new SepiaFilterTransformation(mContext, mPool);
break;
case Contrast:
transformation = new ContrastFilterTransformation(mContext, mPool, 2.0f);
break;
case Invert:
transformation = new InvertFilterTransformation(mContext, mPool);
break;
case Pixel:
transformation = new PixelationFilterTransformation(mContext, mPool, 20);
break;
case Sketch:
transformation = new SketchFilterTransformation(mContext, mPool);
break;
case Swirl:
transformation = new SwirlFilterTransformation(mContext, mPool,
0.5f, 1.0f, new PointF(0.5f, 0.5f));
break;
case Brightness:
transformation = new BrightnessFilterTransformation(mContext, mPool, 0.5f);
break;
case Kuawahara:
transformation = new KuwaharaFilterTransformation(mContext, mPool, 25);
break;
case Vignette:
transformation = new VignetteFilterTransformation(mContext, mPool,
new PointF(0.5f, 0.5f), new float[]{0.0f, 0.0f, 0.0f}, 0f, 0.75f);
break;
}
Glide.with(mContext).load(R.drawable.demo)
.bitmapTransform(transformation).into(holder.image);
holder.title.setText(mDataSet.get(position).name());
}
@Override
public int getItemCount() {
return mDataSet.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public TextView title;
ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.image);
title = (TextView) itemView.findViewById(R.id.title);
}
} }
}
} }

View File

@@ -0,0 +1,27 @@
package jp.wasabeef.example.glide;
/**
* Copyright (C) 2015 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.content.Context;
public class Utils {
public static int dip2px(Context context, float dp) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -1,13 +1,15 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#CC000000"
tools:context=".MainActivity"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#CC000000" />
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout> </RelativeLayout>

View File

@@ -1,23 +1,26 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:padding="5dp"> android:layout_centerInParent="true"
android:contentDescription="@null"
/>
<ImageView <TextView
android:id="@+id/image" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" android:layout_below="@id/image"
android:contentDescription="@null"/> android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
<TextView android:textColor="@android:color/white"
android:id="@+id/title" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/image"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:textColor="@android:color/white"/>
</RelativeLayout> </RelativeLayout>

View File

@@ -1,6 +1,6 @@
<resources> <resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml <!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This (such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen> <dimen name="activity_horizontal_margin">64dp</dimen>
</resources> </resources>

View File

@@ -1,5 +1,5 @@
<resources> <resources>
<!-- Default screen margins, per the Android Design guidelines. --> <!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen>
</resources> </resources>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">glide-transformations</string> <string name="app_name">glide-transformations</string>
<string name="hello_world">Hello world!</string> <string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
</resources> </resources>

View File

@@ -1,8 +1,8 @@
<resources> <resources>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>

View File

@@ -1,12 +1,10 @@
VERSION_NAME=1.0.8 VERSION_NAME=2.0.1
VERSION_CODE=8
GROUP=jp.wasabeef GROUP=jp.wasabeef
ARTIFACT_ID=glide-transformations ARTIFACT_ID=glide-transformations
COMPILE_SDK_VERSION=22 COMPILE_SDK_VERSION=23
BUILD_TOOLS_VERSION=22.0.1 BUILD_TOOLS_VERSION=23.0.2
TARGET_SDK_VERSION=22 TARGET_SDK_VERSION=23
RENDERSCRIPT_TARGET_API=22
MIN_SDK_VERSION=11 MIN_SDK_VERSION=11
POM_DESCRIPTION=which provides simple Tranformations to Glide POM_DESCRIPTION=which provides simple Tranformations to Glide
@@ -23,6 +21,6 @@ POM_DEVELOPER_EMAIL=dadadada.chop@gmail.com
POM_DEVELOPER_URL=wasabeef.jp POM_DEVELOPER_URL=wasabeef.jp
ISSUE_URL=https://github.com/wasabeef/glide-transformations/issues ISSUE_URL=https://github.com/wasabeef/glide-transformations/issues
SUPPORT_PACKAGE_VERSION=22.2.1 SUPPORT_PACKAGE_VERSION=23.2.1
GLIDE_VERSION=3.6.1 GLIDE_VERSION=3.7.0
GPUIMAGE_VERSION=1.2.3 GPUIMAGE_VERSION=1.3.0

View File

@@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-all.zip

View File

@@ -1,25 +0,0 @@
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
classpath += files(ext.androidJar)
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
task androidJar(type: Jar) {
from 'build/intermediates/classes/release'
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
archives androidJar
}

View File

@@ -1,64 +0,0 @@
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'
publishing {
publications {
mavenJava(MavenPublication) {
groupId GROUP
version VERSION_NAME
artifactId ARTIFACT_ID
// artifact androidJar
artifact "build/outputs/aar/transformations-release.aar"
artifact androidJavadocsJar
artifact androidSourcesJar
pom.withXml {
Node root = asNode()
root.appendNode('name', ARTIFACT_ID)
root.appendNode('description', POM_DESCRIPTION)
root.appendNode('url', POM_URL)
def issues = root.appendNode('issueManagement')
issues.appendNode('system', 'github')
issues.appendNode('url', ISSUE_URL)
def scm = root.appendNode('scm')
scm.appendNode('url', POM_SCM_URL)
scm.appendNode('connection', POM_SCM_CONNECTION)
scm.appendNode('developerConnection', POM_SCM_DEV_CONNECTION)
def license = root.appendNode('licenses').appendNode('license')
license.appendNode('name', POM_LICENCE_NAME)
license.appendNode('url', POM_LICENCE_URL)
license.appendNode('distribution', POM_LICENCE_DIST)
}
}
}
}
def getBintrayUserProperty() {
return hasProperty('bintrayUser') ? bintrayUser : ""
}
def getBintrayApiKeyProperty() {
return hasProperty('bintrayApiKey') ? bintrayApiKey : ""
}
bintray {
user = bintrayUserProperty
key = bintrayApiKeyProperty
publications = ['mavenJava']
dryRun = false
publish = false
pkg {
repo = 'maven'
name = ARTIFACT_ID
licenses = ['Apache-2.0']
labels = ['android']
version {
name = VERSION_NAME
vcsTag = VERSION_NAME
}
}
}

View File

@@ -1,42 +1,50 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'com.novoda.bintray-release'
android { android {
compileSdkVersion COMPILE_SDK_VERSION as int compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION buildToolsVersion BUILD_TOOLS_VERSION
defaultConfig { defaultConfig {
minSdkVersion MIN_SDK_VERSION as int minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int targetSdkVersion TARGET_SDK_VERSION as int
versionCode VERSION_CODE as int versionCode "git rev-list origin/master --count".execute().text.toInteger()
versionName VERSION_NAME versionName VERSION_NAME
renderscriptTargetApi RENDERSCRIPT_TARGET_API as int
renderscriptSupportModeEnabled true consumerProguardFiles 'proguard-rules.txt'
} }
} }
dependencies { dependencies {
compile "com.github.bumptech.glide:glide:${GLIDE_VERSION}" compile "com.github.bumptech.glide:glide:${GLIDE_VERSION}"
compile "jp.co.cyberagent.android.gpuimage:gpuimage-library:${GPUIMAGE_VERSION}" provided "jp.co.cyberagent.android.gpuimage:gpuimage-library:${GPUIMAGE_VERSION}"
} }
android.libraryVariants.all { variant -> task androidJavadocs(type: Javadoc) {
if (variant.buildType.isDebuggable()) { source = android.sourceSets.main.java.srcDirs
return; // Skip debug builds. classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task("javadoc${variant.name.capitalize()}", type: Javadoc) {
description "Generates Javadoc for $variant.name."
source = variant.javaCompile.source
ext.androidJar = System.getenv("ANDROID_HOME") + "/platforms/${android.compileSdkVersion}/android.jar"
classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
}
task("bundleJavadoc${variant.name.capitalize()}", type: Jar) {
description "Bundles Javadoc into zip for $variant.name."
classifier = "javadoc"
from tasks["javadoc${variant.name.capitalize()}"]
}
} }
apply from: 'android-artifacts.gradle' task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
apply from: 'central-publish.gradle' classifier = 'javadoc'
apply from: 'bintray-publish.gradle' from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
publish {
userOrg = POM_DEVELOPER_ID
groupId = GROUP
artifactId = ARTIFACT_ID
publishVersion = VERSION_NAME
desc = POM_DESCRIPTION
website = POM_URL
}

View File

@@ -1,94 +0,0 @@
/*
* Copyright 2013 Chris Banes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
apply plugin: 'maven'
apply plugin: 'signing'
def isReleaseBuild() {
return VERSION_NAME.contains("SNAPSHOT") == false
}
def getReleaseRepositoryUrl() {
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}
def getSnapshotRepositoryUrl() {
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: "https://oss.sonatype.org/content/repositories/snapshots/"
}
def getRepositoryUsername() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: getSnapshotRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
}

View File

@@ -1,3 +0,0 @@
POM_NAME=which provides simple Tranformations to Glide
POM_ARTIFACT_ID=glide-transformations
POM_PACKAGING=aar

View File

@@ -0,0 +1 @@
-dontwarn jp.co.cyberagent.android.gpuimage.**

View File

@@ -8,7 +8,7 @@ import android.test.ApplicationTestCase;
*/ */
public class ApplicationTest extends ApplicationTestCase<Application> { public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() { public ApplicationTest() {
super(Application.class); super(Application.class);
} }
} }

View File

@@ -16,84 +16,92 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.support.v8.renderscript.Allocation; import android.os.Build;
import android.support.v8.renderscript.Element; import android.renderscript.RSRuntimeException;
import android.support.v8.renderscript.RenderScript; import com.bumptech.glide.Glide;
import android.support.v8.renderscript.ScriptIntrinsicBlur; import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import jp.wasabeef.glide.transformations.internal.FastBlur;
import jp.wasabeef.glide.transformations.internal.RSBlur;
public class BlurTransformation implements Transformation<Bitmap> { public class BlurTransformation implements Transformation<Bitmap> {
private static int MAX_RADIUS = 25; private static int MAX_RADIUS = 25;
private static int DEFAULT_DOWN_SAMPLING = 1; private static int DEFAULT_DOWN_SAMPLING = 1;
private Context mContext; private Context mContext;
private BitmapPool mBitmapPool; private BitmapPool mBitmapPool;
private int mRadius; private int mRadius;
private int mSampling; private int mSampling;
public BlurTransformation(Context context, BitmapPool pool) { public BlurTransformation(Context context) {
this(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING); this(context, Glide.get(context).getBitmapPool(), MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, BitmapPool pool) {
this(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, BitmapPool pool, int radius) {
this(context, pool, radius, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, int radius) {
this(context, Glide.get(context).getBitmapPool(), radius, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, int radius, int sampling) {
this(context, Glide.get(context).getBitmapPool(), radius, sampling);
}
public BlurTransformation(Context context, BitmapPool pool, int radius, int sampling) {
mContext = context.getApplicationContext();
mBitmapPool = pool;
mRadius = radius;
mSampling = sampling;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
int scaledWidth = width / mSampling;
int scaledHeight = height / mSampling;
Bitmap bitmap = mBitmapPool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
} }
public BlurTransformation(Context context, BitmapPool pool, int radius) { Canvas canvas = new Canvas(bitmap);
this(context, pool, radius, DEFAULT_DOWN_SAMPLING); canvas.scale(1 / (float) mSampling, 1 / (float) mSampling);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(source, 0, 0, paint);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
try {
bitmap = RSBlur.blur(mContext, bitmap, mRadius);
} catch (RSRuntimeException e) {
bitmap = FastBlur.blur(bitmap, mRadius, true);
}
} else {
bitmap = FastBlur.blur(bitmap, mRadius, true);
} }
public BlurTransformation(Context context, BitmapPool pool, int radius, int sampling) { return BitmapResource.obtain(bitmap, mBitmapPool);
mContext = context; }
mBitmapPool = pool;
mRadius = radius;
mSampling = sampling;
}
@Override @Override public String getId() {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { return "BlurTransformation(radius=" + mRadius + ", sampling=" + mSampling + ")";
Bitmap source = resource.get(); }
int width = source.getWidth();
int height = source.getHeight();
int scaledWidth = width / mSampling;
int scaledHeight = height / mSampling;
Bitmap bitmap = mBitmapPool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
canvas.scale(1 / (float) mSampling, 1 / (float) mSampling);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(source, 0, 0, paint);
RenderScript rs = RenderScript.create(mContext);
Allocation input = Allocation.createFromBitmap(rs, bitmap,
Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
Allocation output = Allocation.createTyped(rs, input.getType());
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blur.setInput(input);
blur.setRadius(mRadius);
blur.forEach(output);
output.copyTo(bitmap);
rs.destroy();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "BlurTransformation(radius=" + mRadius + ", sampling=" + mSampling + ")";
}
} }

View File

@@ -16,53 +16,57 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation; import android.content.Context;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffColorFilter;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
public class ColorFilterTransformation implements Transformation<Bitmap> { public class ColorFilterTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool; private BitmapPool mBitmapPool;
private int mColor; private int mColor;
public ColorFilterTransformation(BitmapPool pool, int color) { public ColorFilterTransformation(Context context, int color) {
mBitmapPool = pool; this(Glide.get(context).getBitmapPool(), color);
mColor = color; }
public ColorFilterTransformation(BitmapPool pool, int color) {
mBitmapPool = pool;
mColor = color;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
Bitmap.Config config =
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(width, height, config);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, config);
} }
@Override Canvas canvas = new Canvas(bitmap);
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { Paint paint = new Paint();
Bitmap source = resource.get(); paint.setAntiAlias(true);
paint.setColorFilter(new PorterDuffColorFilter(mColor, PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(source, 0, 0, paint);
int width = source.getWidth(); return BitmapResource.obtain(bitmap, mBitmapPool);
int height = source.getHeight(); }
Bitmap.Config config = @Override public String getId() {
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888; return "ColorFilterTransformation(color=" + mColor + ")";
Bitmap bitmap = mBitmapPool.get(width, height, config); }
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, config);
}
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColorFilter(new PorterDuffColorFilter(mColor, PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(source, 0, 0, paint);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "ColorFilterTransformation(color=" + mColor + ")";
}
} }

View File

@@ -16,58 +16,63 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation; import android.content.Context;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapShader; import android.graphics.BitmapShader;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.Paint; import android.graphics.Paint;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
public class CropCircleTransformation implements Transformation<Bitmap> { public class CropCircleTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool; private BitmapPool mBitmapPool;
public CropCircleTransformation(BitmapPool pool) { public CropCircleTransformation(Context context) {
this.mBitmapPool = pool; this(Glide.get(context).getBitmapPool());
}
public CropCircleTransformation(BitmapPool pool) {
this.mBitmapPool = pool;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int size = Math.min(source.getWidth(), source.getHeight());
int width = (source.getWidth() - size) / 2;
int height = (source.getHeight() - size) / 2;
Bitmap bitmap = mBitmapPool.get(size, size, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
} }
@Override Canvas canvas = new Canvas(bitmap);
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { Paint paint = new Paint();
Bitmap source = resource.get(); BitmapShader shader =
int size = Math.min(source.getWidth(), source.getHeight()); new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
if (width != 0 || height != 0) {
int width = (source.getWidth() - size) / 2; // source isn't square, move viewport to center
int height = (source.getHeight() - size) / 2; Matrix matrix = new Matrix();
matrix.setTranslate(-width, -height);
Bitmap bitmap = mBitmapPool.get(size, size, Bitmap.Config.ARGB_8888); shader.setLocalMatrix(matrix);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(source, BitmapShader.TileMode.CLAMP,
BitmapShader.TileMode.CLAMP);
if (width != 0 || height != 0) {
Matrix matrix = new Matrix();
matrix.setTranslate(-width, -height);
shader.setLocalMatrix(matrix);
}
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return BitmapResource.obtain(bitmap, mBitmapPool);
} }
paint.setShader(shader);
paint.setAntiAlias(true);
@Override float r = size / 2f;
public String getId() { canvas.drawCircle(r, r, r, paint);
return "CropCircleTransformation()";
} return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override public String getId() {
return "CropCircleTransformation()";
}
} }

View File

@@ -16,43 +16,47 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import android.content.Context;
import android.graphics.Bitmap;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource; import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.graphics.Bitmap;
public class CropSquareTransformation implements Transformation<Bitmap> { public class CropSquareTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool; private BitmapPool mBitmapPool;
private int mWidth; private int mWidth;
private int mHeight; private int mHeight;
public CropSquareTransformation(BitmapPool pool) { public CropSquareTransformation(Context context) {
this.mBitmapPool = pool; this(Glide.get(context).getBitmapPool());
}
public CropSquareTransformation(BitmapPool pool) {
this.mBitmapPool = pool;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int size = Math.min(source.getWidth(), source.getHeight());
mWidth = (source.getWidth() - size) / 2;
mHeight = (source.getHeight() - size) / 2;
Bitmap.Config config =
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(mWidth, mHeight, config);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(source, mWidth, mHeight, size, size);
} }
@Override return BitmapResource.obtain(bitmap, mBitmapPool);
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { }
Bitmap source = resource.get();
int size = Math.min(source.getWidth(), source.getHeight());
mWidth = (source.getWidth() - size) / 2; @Override public String getId() {
mHeight = (source.getHeight() - size) / 2; return "CropSquareTransformation(width=" + mWidth + ", height=" + mHeight + ")";
}
Bitmap.Config config =
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(mWidth, mHeight, config);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(source, mWidth, mHeight, size, size);
}
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "CropSquareTransformation(width=" + mWidth + ", height=" + mHeight + ")";
}
} }

View File

@@ -16,91 +16,101 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.RectF;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource; import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.RectF;
public class CropTransformation implements Transformation<Bitmap> { public class CropTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool; public enum CropType {
private int mWidth; TOP,
private int mHeight; CENTER,
BOTTOM
}
private CropType mCropType = CropType.CENTER; private BitmapPool mBitmapPool;
private int mWidth;
private int mHeight;
public CropTransformation(BitmapPool pool) { private CropType mCropType = CropType.CENTER;
mBitmapPool = pool;
public CropTransformation(Context context) {
this(Glide.get(context).getBitmapPool());
}
public CropTransformation(BitmapPool pool) {
this(pool, 0, 0);
}
public CropTransformation(Context context, int width, int height) {
this(Glide.get(context).getBitmapPool(), width, height);
}
public CropTransformation(BitmapPool pool, int width, int height) {
this(pool, width, height, CropType.CENTER);
}
public CropTransformation(Context context, int width, int height, CropType cropType) {
this(Glide.get(context).getBitmapPool(), width, height, cropType);
}
public CropTransformation(BitmapPool pool, int width, int height, CropType cropType) {
mBitmapPool = pool;
mWidth = width;
mHeight = height;
mCropType = cropType;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
mWidth = mWidth == 0 ? source.getWidth() : mWidth;
mHeight = mHeight == 0 ? source.getHeight() : mHeight;
Bitmap.Config config =
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(mWidth, mHeight, config);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(mWidth, mHeight, config);
} }
public CropTransformation(BitmapPool pool, int width, int height) { float scaleX = (float) mWidth / source.getWidth();
mBitmapPool = pool; float scaleY = (float) mHeight / source.getHeight();
mWidth = width; float scale = Math.max(scaleX, scaleY);
mHeight = height;
} float scaledWidth = scale * source.getWidth();
float scaledHeight = scale * source.getHeight();
public CropTransformation(BitmapPool pool, int width, int height, CropType cropType) { float left = (mWidth - scaledWidth) / 2;
mBitmapPool = pool; float top = getTop(scaledHeight);
mWidth = width; RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
mHeight = height;
mCropType = cropType; Canvas canvas = new Canvas(bitmap);
} canvas.drawBitmap(source, null, targetRect, null);
@Override return BitmapResource.obtain(bitmap, mBitmapPool);
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { }
Bitmap source = resource.get();
mWidth = mWidth == 0 ? source.getWidth() : mWidth; @Override public String getId() {
mHeight = mHeight == 0 ? source.getHeight() : mHeight; return "CropTransformation(width=" + mWidth + ", height=" + mHeight + ", cropType=" + mCropType
+ ")";
Bitmap.Config config = }
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(mWidth, mHeight, config); private float getTop(float scaledHeight) {
if (bitmap == null) { switch (mCropType) {
bitmap = Bitmap.createBitmap(mWidth, mHeight, config); case TOP:
} return 0;
case CENTER:
float scaleX = (float) mWidth / source.getWidth(); return (mHeight - scaledHeight) / 2;
float scaleY = (float) mHeight / source.getHeight(); case BOTTOM:
float scale = Math.max(scaleX, scaleY); return mHeight - scaledHeight;
default:
float scaledWidth = scale * source.getWidth(); return 0;
float scaledHeight = scale * source.getHeight();
float left = (mWidth - scaledWidth) / 2;
float top = getTop(scaledHeight);
RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(source, null, targetRect, null);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "CropTransformation(width=" + mWidth + ", height=" + mHeight + ", cropType="
+ mCropType + ")";
}
private float getTop(float scaledHeight) {
switch (mCropType) {
case TOP:
return 0;
case CENTER:
return (mHeight - scaledHeight) / 2;
case BOTTOM:
return mHeight - scaledHeight;
default:
return 0;
}
}
public enum CropType {
TOP,
CENTER,
BOTTOM
} }
}
} }

View File

@@ -16,51 +16,55 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation; import android.content.Context;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.ColorMatrix; import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter; import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint; import android.graphics.Paint;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
public class GrayscaleTransformation implements Transformation<Bitmap> { public class GrayscaleTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool; private BitmapPool mBitmapPool;
public GrayscaleTransformation(BitmapPool pool) { public GrayscaleTransformation(Context context) {
mBitmapPool = pool; this(Glide.get(context).getBitmapPool());
}
public GrayscaleTransformation(BitmapPool pool) {
mBitmapPool = pool;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
Bitmap.Config config =
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(width, height, config);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, config);
} }
@Override Canvas canvas = new Canvas(bitmap);
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { ColorMatrix saturation = new ColorMatrix();
Bitmap source = resource.get(); saturation.setSaturation(0f);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(saturation));
canvas.drawBitmap(source, 0, 0, paint);
int width = source.getWidth(); return BitmapResource.obtain(bitmap, mBitmapPool);
int height = source.getHeight(); }
Bitmap.Config config = @Override public String getId() {
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888; return "GrayscaleTransformation()";
Bitmap bitmap = mBitmapPool.get(width, height, config); }
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, config);
}
Canvas canvas = new Canvas(bitmap);
ColorMatrix saturation = new ColorMatrix();
saturation.setSaturation(0f);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(saturation));
canvas.drawBitmap(source, 0, 0, paint);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "GrayscaleTransformation()";
}
} }

View File

@@ -0,0 +1,85 @@
package jp.wasabeef.glide.transformations;
/**
* Copyright (C) 2015 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.Drawable;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import jp.wasabeef.glide.transformations.internal.Utils;
public class MaskTransformation implements Transformation<Bitmap> {
private static Paint sMaskingPaint = new Paint();
private Context mContext;
private BitmapPool mBitmapPool;
private int mMaskId;
static {
sMaskingPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
}
/**
* @param maskId If you change the mask file, please also rename the mask file, or Glide will get
* the cache with the old mask. Because getId() return the same values if using the
* same make file name. If you have a good idea please tell us, thanks.
*/
public MaskTransformation(Context context, int maskId) {
this(context, Glide.get(context).getBitmapPool(), maskId);
}
public MaskTransformation(Context context, BitmapPool pool, int maskId) {
mBitmapPool = pool;
mContext = context.getApplicationContext();
mMaskId = maskId;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
Bitmap result = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
}
Drawable mask = Utils.getMaskDrawable(mContext, mMaskId);
Canvas canvas = new Canvas(result);
mask.setBounds(0, 0, width, height);
mask.draw(canvas);
canvas.drawBitmap(source, 0, 0, sMaskingPaint);
return BitmapResource.obtain(result, mBitmapPool);
}
@Override public String getId() {
return "MaskTransformation(maskId=" + mContext.getResources().getResourceEntryName(mMaskId)
+ ")";
}
}

View File

@@ -16,55 +16,240 @@ package jp.wasabeef.glide.transformations;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation; import android.content.Context;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapShader; import android.graphics.BitmapShader;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Shader; import android.graphics.Shader;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
public class RoundedCornersTransformation implements Transformation<Bitmap> { public class RoundedCornersTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool; public enum CornerType {
ALL,
TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT,
TOP, BOTTOM, LEFT, RIGHT,
OTHER_TOP_LEFT, OTHER_TOP_RIGHT, OTHER_BOTTOM_LEFT, OTHER_BOTTOM_RIGHT,
DIAGONAL_FROM_TOP_LEFT, DIAGONAL_FROM_TOP_RIGHT
}
private int radius; private BitmapPool mBitmapPool;
private int margin; private int mRadius;
private int mDiameter;
private int mMargin;
private CornerType mCornerType;
public RoundedCornersTransformation(BitmapPool pool, int radius, int margin) { public RoundedCornersTransformation(Context context, int radius, int margin) {
this.radius = radius; this(context, radius, margin, CornerType.ALL);
this.margin = margin; }
mBitmapPool = pool;
public RoundedCornersTransformation(BitmapPool pool, int radius, int margin) {
this(pool, radius, margin, CornerType.ALL);
}
public RoundedCornersTransformation(Context context, int radius, int margin,
CornerType cornerType) {
this(Glide.get(context).getBitmapPool(), radius, margin, cornerType);
}
public RoundedCornersTransformation(BitmapPool pool, int radius, int margin,
CornerType cornerType) {
mBitmapPool = pool;
mRadius = radius;
mDiameter = mRadius * 2;
mMargin = margin;
mCornerType = cornerType;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
Bitmap bitmap = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
} }
@Override Canvas canvas = new Canvas(bitmap);
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { Paint paint = new Paint();
Bitmap source = resource.get(); paint.setAntiAlias(true);
paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
drawRoundRect(canvas, paint, width, height);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
int width = source.getWidth(); private void drawRoundRect(Canvas canvas, Paint paint, float width, float height) {
int height = source.getHeight(); float right = width - mMargin;
float bottom = height - mMargin;
Bitmap bitmap = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888); switch (mCornerType) {
if (bitmap == null) { case ALL:
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); canvas.drawRoundRect(new RectF(mMargin, mMargin, right, bottom), mRadius, mRadius, paint);
} break;
case TOP_LEFT:
Canvas canvas = new Canvas(bitmap); drawTopLeftRoundRect(canvas, paint, right, bottom);
Paint paint = new Paint(); break;
paint.setAntiAlias(true); case TOP_RIGHT:
paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); drawTopRightRoundRect(canvas, paint, right, bottom);
canvas.drawRoundRect(new RectF(margin, margin, width - margin, height - margin), break;
radius, radius, paint); case BOTTOM_LEFT:
drawBottomLeftRoundRect(canvas, paint, right, bottom);
return BitmapResource.obtain(bitmap, mBitmapPool); break;
case BOTTOM_RIGHT:
drawBottomRightRoundRect(canvas, paint, right, bottom);
break;
case TOP:
drawTopRoundRect(canvas, paint, right, bottom);
break;
case BOTTOM:
drawBottomRoundRect(canvas, paint, right, bottom);
break;
case LEFT:
drawLeftRoundRect(canvas, paint, right, bottom);
break;
case RIGHT:
drawRightRoundRect(canvas, paint, right, bottom);
break;
case OTHER_TOP_LEFT:
drawOtherTopLeftRoundRect(canvas, paint, right, bottom);
break;
case OTHER_TOP_RIGHT:
drawOtherTopRightRoundRect(canvas, paint, right, bottom);
break;
case OTHER_BOTTOM_LEFT:
drawOtherBottomLeftRoundRect(canvas, paint, right, bottom);
break;
case OTHER_BOTTOM_RIGHT:
drawOtherBottomRightRoundRect(canvas, paint, right, bottom);
break;
case DIAGONAL_FROM_TOP_LEFT:
drawDiagonalFromTopLeftRoundRect(canvas, paint, right, bottom);
break;
case DIAGONAL_FROM_TOP_RIGHT:
drawDiagonalFromTopRightRoundRect(canvas, paint, right, bottom);
break;
default:
canvas.drawRoundRect(new RectF(mMargin, mMargin, right, bottom), mRadius, mRadius, paint);
break;
} }
}
@Override private void drawTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
public String getId() { canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, mMargin + mDiameter),
return "RoundedTransformation(radius=" + radius + ", margin=" + margin + ")"; mRadius, mRadius, paint);
} canvas.drawRect(new RectF(mMargin, mMargin + mRadius, mMargin + mRadius, bottom), paint);
canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint);
}
private void drawTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, mMargin + mDiameter), mRadius,
mRadius, paint);
canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint);
canvas.drawRect(new RectF(right - mRadius, mMargin + mRadius, right, bottom), paint);
}
private void drawBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, mMargin + mDiameter, bottom),
mRadius, mRadius, paint);
canvas.drawRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom - mRadius), paint);
canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint);
}
private void drawBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - mDiameter, bottom - mDiameter, right, bottom), mRadius,
mRadius, paint);
canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint);
canvas.drawRect(new RectF(right - mRadius, mMargin, right, bottom - mRadius), paint);
}
private void drawTopRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right, bottom), paint);
}
private void drawBottomRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin, mMargin, right, bottom - mRadius), paint);
}
private void drawLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint);
}
private void drawRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint);
}
private void drawOtherTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius,
paint);
canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom - mRadius), paint);
}
private void drawOtherTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius,
paint);
canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom - mRadius), paint);
}
private void drawOtherBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius,
paint);
canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right - mRadius, bottom), paint);
}
private void drawOtherBottomRightRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius,
paint);
canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius,
paint);
canvas.drawRect(new RectF(mMargin + mRadius, mMargin + mRadius, right, bottom), paint);
}
private void drawDiagonalFromTopLeftRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, mMargin + mDiameter),
mRadius, mRadius, paint);
canvas.drawRoundRect(new RectF(right - mDiameter, bottom - mDiameter, right, bottom), mRadius,
mRadius, paint);
canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right - mDiameter, bottom), paint);
canvas.drawRect(new RectF(mMargin + mDiameter, mMargin, right, bottom - mRadius), paint);
}
private void drawDiagonalFromTopRightRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, mMargin + mDiameter), mRadius,
mRadius, paint);
canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, mMargin + mDiameter, bottom),
mRadius, mRadius, paint);
canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom - mRadius), paint);
canvas.drawRect(new RectF(mMargin + mRadius, mMargin + mRadius, right, bottom), paint);
}
@Override public String getId() {
return "RoundedTransformation(radius=" + mRadius + ", margin=" + mMargin + ", diameter="
+ mDiameter + ", cornerType=" + mCornerType.name() + ")";
}
} }

View File

@@ -16,56 +16,38 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageBrightnessFilter; import jp.co.cyberagent.android.gpuimage.GPUImageBrightnessFilter;
/** /**
* brightness value ranges from -1.0 to 1.0, with 0.0 as the normal level * brightness value ranges from -1.0 to 1.0, with 0.0 as the normal level
*/ */
public class BrightnessFilterTransformation implements Transformation<Bitmap> { public class BrightnessFilterTransformation extends GPUFilterTransformation {
private Context mContext; private float mBrightness;
private BitmapPool mBitmapPool;
private GPUImageBrightnessFilter mFilter = new GPUImageBrightnessFilter(); public BrightnessFilterTransformation(Context context) {
private float mBrightness; this(context, Glide.get(context).getBitmapPool());
}
public BrightnessFilterTransformation(Context context, BitmapPool pool) { public BrightnessFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, 0.0f);
mBitmapPool = pool; }
}
public BrightnessFilterTransformation(Context context, BitmapPool pool, float brightness) { public BrightnessFilterTransformation(Context context, float brightness) {
mContext = context; this(context, Glide.get(context).getBitmapPool(), brightness);
mBitmapPool = pool; }
mBrightness = brightness;
mFilter.setBrightness(mBrightness);
}
@Override public BrightnessFilterTransformation(Context context, BitmapPool pool, float brightness) {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { super(context, pool, new GPUImageBrightnessFilter());
Bitmap source = resource.get(); mBrightness = brightness;
GPUImageBrightnessFilter filter = getFilter();
filter.setBrightness(mBrightness);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "BrightnessFilterTransformation(brightness=" + mBrightness + ")";
gpuImage.setFilter(mFilter); }
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "BrightnessFilterTransformation(brightness=" + mBrightness + ")";
}
} }

View File

@@ -16,56 +16,38 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageContrastFilter; import jp.co.cyberagent.android.gpuimage.GPUImageContrastFilter;
/** /**
* contrast value ranges from 0.0 to 4.0, with 1.0 as the normal level * contrast value ranges from 0.0 to 4.0, with 1.0 as the normal level
*/ */
public class ContrastFilterTransformation implements Transformation<Bitmap> { public class ContrastFilterTransformation extends GPUFilterTransformation {
private Context mContext; private float mContrast;
private BitmapPool mBitmapPool;
private GPUImageContrastFilter mFilter = new GPUImageContrastFilter(); public ContrastFilterTransformation(Context context) {
private float mContrast; this(context, Glide.get(context).getBitmapPool());
}
public ContrastFilterTransformation(Context context, BitmapPool pool) { public ContrastFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, 1.0f);
mBitmapPool = pool; }
}
public ContrastFilterTransformation(Context context, BitmapPool pool, float contrast) { public ContrastFilterTransformation(Context context, float contrast) {
mContext = context; this(context, Glide.get(context).getBitmapPool(), contrast);
mBitmapPool = pool; }
mContrast = contrast;
mFilter.setContrast(mContrast);
}
@Override public ContrastFilterTransformation(Context context, BitmapPool pool, float contrast) {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { super(context, pool, new GPUImageContrastFilter());
Bitmap source = resource.get(); mContrast = contrast;
GPUImageContrastFilter filter = getFilter();
filter.setContrast(mContrast);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "ContrastFilterTransformation(contrast=" + mContrast + ")";
gpuImage.setFilter(mFilter); }
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "ContrastFilterTransformation(contrast=" + mContrast + ")";
}
} }

View File

@@ -0,0 +1,65 @@
package jp.wasabeef.glide.transformations.gpu;
/**
* Copyright (C) 2015 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.content.Context;
import android.graphics.Bitmap;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageFilter;
public class GPUFilterTransformation implements Transformation<Bitmap> {
private Context mContext;
private BitmapPool mBitmapPool;
private GPUImageFilter mFilter;
public GPUFilterTransformation(Context context, GPUImageFilter filter) {
this(context, Glide.get(context).getBitmapPool(), filter);
}
public GPUFilterTransformation(Context context, BitmapPool pool, GPUImageFilter filter) {
mContext = context.getApplicationContext();
mBitmapPool = pool;
mFilter = filter;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
GPUImage gpuImage = new GPUImage(mContext);
gpuImage.setImage(source);
gpuImage.setFilter(mFilter);
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override public String getId() {
return getClass().getSimpleName();
}
@SuppressWarnings("unchecked") public <T> T getFilter() {
return (T) mFilter;
}
}

View File

@@ -16,43 +16,25 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageColorInvertFilter; import jp.co.cyberagent.android.gpuimage.GPUImageColorInvertFilter;
public class InvertFilterTransformation implements Transformation<Bitmap> { /**
* Invert all the colors in the image.
*/
public class InvertFilterTransformation extends GPUFilterTransformation {
private Context mContext; public InvertFilterTransformation(Context context) {
private BitmapPool mBitmapPool; this(context, Glide.get(context).getBitmapPool());
}
public InvertFilterTransformation(Context context, BitmapPool pool) { public InvertFilterTransformation(Context context, BitmapPool pool) {
mContext = context; super(context, pool, new GPUImageColorInvertFilter());
mBitmapPool = pool; }
}
@Override @Override public String getId() {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { return "InvertFilterTransformation()";
Bitmap source = resource.get(); }
GPUImage gpuImage = new GPUImage(mContext);
gpuImage.setImage(source);
gpuImage.setFilter(new GPUImageColorInvertFilter());
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "InvertFilterTransformation()";
}
} }

View File

@@ -16,57 +16,41 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageKuwaharaFilter; import jp.co.cyberagent.android.gpuimage.GPUImageKuwaharaFilter;
/** /**
* The radius to sample from when creating the brush-stroke effect, with a default of 3. * Kuwahara all the colors in the image.
*
* The radius to sample from when creating the brush-stroke effect, with a default of 25.
* The larger the radius, the slower the filter. * The larger the radius, the slower the filter.
*/ */
public class KuwaharaFilterTransformation implements Transformation<Bitmap> { public class KuwaharaFilterTransformation extends GPUFilterTransformation {
private Context mContext; private int mRadius;
private BitmapPool mBitmapPool;
private GPUImageKuwaharaFilter mFilter = new GPUImageKuwaharaFilter(); public KuwaharaFilterTransformation(Context context) {
private int mRadius; this(context, Glide.get(context).getBitmapPool());
}
public KuwaharaFilterTransformation(Context context, BitmapPool pool) { public KuwaharaFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, 25);
mBitmapPool = pool; }
}
public KuwaharaFilterTransformation(Context context, BitmapPool pool, int radius) { public KuwaharaFilterTransformation(Context context, int radius) {
mContext = context; this(context, Glide.get(context).getBitmapPool(), radius);
mBitmapPool = pool; }
mRadius = radius;
mFilter.setRadius(mRadius);
}
@Override public KuwaharaFilterTransformation(Context context, BitmapPool pool, int radius) {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { super(context, pool, new GPUImageKuwaharaFilter());
Bitmap source = resource.get(); mRadius = radius;
GPUImageKuwaharaFilter filter = getFilter();
filter.setRadius(mRadius);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "KuwaharaFilterTransformation(radius=" + mRadius + ")";
gpuImage.setFilter(mFilter); }
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "KuwaharaFilterTransformation(radius=" + mRadius + ")";
}
} }

View File

@@ -16,53 +16,40 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImagePixelationFilter; import jp.co.cyberagent.android.gpuimage.GPUImagePixelationFilter;
public class PixelationFilterTransformation implements Transformation<Bitmap> { /**
* Applies a Pixelation effect to the image.
*
* The pixel with a default of 10.0.
*/
public class PixelationFilterTransformation extends GPUFilterTransformation {
private Context mContext; private float mPixel;
private BitmapPool mBitmapPool;
private GPUImagePixelationFilter mFilter = new GPUImagePixelationFilter(); public PixelationFilterTransformation(Context context) {
private float mPixel; this(context, Glide.get(context).getBitmapPool());
}
public PixelationFilterTransformation(Context context, BitmapPool pool) { public PixelationFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, 10f);
mBitmapPool = pool; }
}
public PixelationFilterTransformation(Context context, BitmapPool pool, float pixel) { public PixelationFilterTransformation(Context context, float pixel) {
mContext = context; this(context, Glide.get(context).getBitmapPool(), pixel);
mBitmapPool = pool; }
mPixel = pixel;
mFilter.setPixel(mPixel);
}
@Override public PixelationFilterTransformation(Context context, BitmapPool pool, float pixel) {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { super(context, pool, new GPUImagePixelationFilter());
Bitmap source = resource.get(); mPixel = pixel;
GPUImagePixelationFilter filter = getFilter();
filter.setPixel(mPixel);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "PixelationFilterTransformation(pixel=" + mPixel + ")";
gpuImage.setFilter(mFilter); }
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "PixelationFilterTransformation(pixel=" + mPixel + ")";
}
} }

View File

@@ -16,53 +16,40 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageSepiaFilter; import jp.co.cyberagent.android.gpuimage.GPUImageSepiaFilter;
public class SepiaFilterTransformation implements Transformation<Bitmap> { /**
* Applies a simple sepia effect.
*
* The intensity with a default of 1.0.
*/
public class SepiaFilterTransformation extends GPUFilterTransformation {
private Context mContext; private float mIntensity;
private BitmapPool mBitmapPool;
private GPUImageSepiaFilter mFilter = new GPUImageSepiaFilter(); public SepiaFilterTransformation(Context context) {
private float mIntensity; this(context, Glide.get(context).getBitmapPool());
}
public SepiaFilterTransformation(Context context, BitmapPool pool) { public SepiaFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, 1.0f);
mBitmapPool = pool; }
}
public SepiaFilterTransformation(Context context, BitmapPool pool, float intensity) { public SepiaFilterTransformation(Context context, float intensity) {
mContext = context; this(context, Glide.get(context).getBitmapPool(), intensity);
mBitmapPool = pool; }
mIntensity = intensity;
mFilter.setIntensity(mIntensity);
}
@Override public SepiaFilterTransformation(Context context, BitmapPool pool, float intensity) {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { super(context, pool, new GPUImageSepiaFilter());
Bitmap source = resource.get(); mIntensity = intensity;
GPUImageSepiaFilter filter = getFilter();
filter.setIntensity(mIntensity);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "SepiaFilterTransformation(intensity=" + mIntensity + ")";
gpuImage.setFilter(mFilter); }
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "SepiaFilterTransformation(intensity=" + mIntensity + ")";
}
} }

View File

@@ -16,43 +16,22 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageSketchFilter; import jp.co.cyberagent.android.gpuimage.GPUImageSketchFilter;
public class SketchFilterTransformation implements Transformation<Bitmap> { public class SketchFilterTransformation extends GPUFilterTransformation {
private Context mContext; public SketchFilterTransformation(Context context) {
private BitmapPool mBitmapPool; this(context, Glide.get(context).getBitmapPool());
}
public SketchFilterTransformation(Context context, BitmapPool pool) { public SketchFilterTransformation(Context context, BitmapPool pool) {
mContext = context; super(context, pool, new GPUImageSketchFilter());
mBitmapPool = pool; }
}
@Override @Override public String getId() {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { return "SketchFilterTransformation()";
Bitmap source = resource.get(); }
GPUImage gpuImage = new GPUImage(mContext);
gpuImage.setImage(source);
gpuImage.setFilter(new GPUImageSketchFilter());
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "SketchFilterTransformation()";
}
} }

View File

@@ -16,68 +16,52 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PointF; import android.graphics.PointF;
import com.bumptech.glide.Glide;
import jp.co.cyberagent.android.gpuimage.GPUImage; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImageSwirlFilter; import jp.co.cyberagent.android.gpuimage.GPUImageSwirlFilter;
public class SwirlFilterTransformation implements Transformation<Bitmap> { /**
* Creates a swirl distortion on the image.
*/
public class SwirlFilterTransformation extends GPUFilterTransformation {
private Context mContext; private float mRadius;
private BitmapPool mBitmapPool; private float mAngle;
private PointF mCenter;
private GPUImageSwirlFilter mFilter = new GPUImageSwirlFilter(); public SwirlFilterTransformation(Context context) {
private float mRadius; this(context, Glide.get(context).getBitmapPool());
private float mAngle; }
private PointF mCenter;
public SwirlFilterTransformation(Context context, BitmapPool pool) { public SwirlFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, .5f, 1.0f, new PointF(0.5f, 0.5f));
mBitmapPool = pool; }
mCenter = new PointF();
}
/** public SwirlFilterTransformation(Context context, float radius, float angle, PointF center) {
* @param radius from 0.0 to 1.0, default 0.5 this(context, Glide.get(context).getBitmapPool(), radius, angle, center);
* @param angle minimum 0.0, default 1.0 }
* @param center default (0.5, 0.5)
*/
public SwirlFilterTransformation(Context context, BitmapPool pool,
float radius, float angle, PointF center) {
mContext = context;
mBitmapPool = pool;
mRadius = radius;
mAngle = angle;
mCenter = center;
mFilter.setRadius(mRadius);
mFilter.setAngle(mAngle);
mFilter.setCenter(mCenter);
}
@Override /**
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { * @param radius from 0.0 to 1.0, default 0.5
Bitmap source = resource.get(); * @param angle minimum 0.0, default 1.0
* @param center default (0.5, 0.5)
*/
public SwirlFilterTransformation(Context context, BitmapPool pool, float radius, float angle,
PointF center) {
super(context, pool, new GPUImageSwirlFilter());
mRadius = radius;
mAngle = angle;
mCenter = center;
GPUImageSwirlFilter filter = getFilter();
filter.setRadius(mRadius);
filter.setAngle(mAngle);
filter.setCenter(mCenter);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "SwirlFilterTransformation(radius=" + mRadius +
gpuImage.setFilter(mFilter); ",angle=" + mAngle + ",center=" + mCenter.toString() + ")";
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied(); }
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "SwirlFilterTransformation(radius=" + mRadius +
",angle=" + mAngle + ",center=" + mCenter.toString() + ")";
}
} }

View File

@@ -16,58 +16,45 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageToonFilter; import jp.co.cyberagent.android.gpuimage.GPUImageToonFilter;
public class ToonFilterTransformation implements Transformation<Bitmap> { /**
* The threshold at which to apply the edges, default of 0.2.
* The levels of quantization for the posterization of colors within the scene,
* with a default of 10.0.
*/
public class ToonFilterTransformation extends GPUFilterTransformation {
private Context mContext; private float mThreshold;
private BitmapPool mBitmapPool; private float mQuantizationLevels;
private GPUImageToonFilter mFilter = new GPUImageToonFilter(); public ToonFilterTransformation(Context context) {
private float mThreshold; this(context, Glide.get(context).getBitmapPool());
private float mQuantizationLevels; }
public ToonFilterTransformation(Context context, BitmapPool pool) { public ToonFilterTransformation(Context context, BitmapPool pool) {
mContext = context; this(context, pool, .2f, 10.0f);
mBitmapPool = pool; }
}
public ToonFilterTransformation(Context context, BitmapPool pool, public ToonFilterTransformation(Context context, float threshold, float quantizationLevels) {
float threshold, float quantizationLevels) { this(context, Glide.get(context).getBitmapPool(), threshold, quantizationLevels);
mContext = context; }
mBitmapPool = pool;
mThreshold = threshold;
mQuantizationLevels = quantizationLevels;
mFilter.setThreshold(mThreshold);
mFilter.setQuantizationLevels(mQuantizationLevels);
}
@Override public ToonFilterTransformation(Context context, BitmapPool pool, float threshold,
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { float quantizationLevels) {
Bitmap source = resource.get(); super(context, pool, new GPUImageToonFilter());
mThreshold = threshold;
mQuantizationLevels = quantizationLevels;
GPUImageToonFilter filter = getFilter();
filter.setThreshold(mThreshold);
filter.setQuantizationLevels(mQuantizationLevels);
}
GPUImage gpuImage = new GPUImage(mContext); @Override public String getId() {
gpuImage.setImage(source); return "ToonFilterTransformation(threshold=" + mThreshold +
gpuImage.setFilter(mFilter); ",quantizationLevels=" + mQuantizationLevels + ")";
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied(); }
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "ToonFilterTransformation(threshold=" + mThreshold +
",quantizationLevels=" + mQuantizationLevels + ")";
}
} }

View File

@@ -16,75 +16,55 @@ package jp.wasabeef.glide.transformations.gpu;
* limitations under the License. * limitations under the License.
*/ */
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PointF; import android.graphics.PointF;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import java.util.Arrays; import java.util.Arrays;
import jp.co.cyberagent.android.gpuimage.GPUImage;
import jp.co.cyberagent.android.gpuimage.GPUImageVignetteFilter; import jp.co.cyberagent.android.gpuimage.GPUImageVignetteFilter;
/** /**
* Performs a vignetting effect, fading out the image at the edges * Performs a vignetting effect, fading out the image at the edges
* x: * The directional intensity of the vignetting,
* y: The directional intensity of the vignetting, with a default of x = 0.75, y = 0.5 * with a default of x = 0.5, y = 0.5, start = 0, end = 0.75
*/ */
public class VignetteFilterTransformation implements Transformation<Bitmap> { public class VignetteFilterTransformation extends GPUFilterTransformation {
private Context mContext; private PointF mCenter;
private BitmapPool mBitmapPool; private float[] mVignetteColor;
private float mVignetteStart;
private float mVignetteEnd;
private GPUImageVignetteFilter mFilter = new GPUImageVignetteFilter(); public VignetteFilterTransformation(Context context) {
private PointF mCenter; this(context, Glide.get(context).getBitmapPool());
private float[] mVignetteColor; }
private float mVignetteStart;
private float mVignetteEnd;
public VignetteFilterTransformation(Context context, BitmapPool pool) {
this(context, pool, new PointF(0.5f, 0.5f), new float[] { 0.0f, 0.0f, 0.0f }, 0.0f, 0.75f);
}
public VignetteFilterTransformation(Context context, BitmapPool pool) { public VignetteFilterTransformation(Context context, PointF center, float[] color, float start,
mContext = context; float end) {
mBitmapPool = pool; this(context, Glide.get(context).getBitmapPool(), center, color, start, end);
mCenter = new PointF(); }
}
public VignetteFilterTransformation(Context context, BitmapPool pool, public VignetteFilterTransformation(Context context, BitmapPool pool, PointF center,
PointF center, float[] color, float start, float end) { float[] color, float start, float end) {
mContext = context; super(context, pool, new GPUImageVignetteFilter());
mBitmapPool = pool; mCenter = center;
mCenter = center; mVignetteColor = color;
mVignetteColor = color; mVignetteStart = start;
mVignetteStart = start; mVignetteEnd = end;
mVignetteEnd = end; GPUImageVignetteFilter filter = getFilter();
mFilter.setVignetteCenter(mCenter); filter.setVignetteCenter(mCenter);
mFilter.setVignetteColor(mVignetteColor); filter.setVignetteColor(mVignetteColor);
mFilter.setVignetteStart(mVignetteStart); filter.setVignetteStart(mVignetteStart);
mFilter.setVignetteEnd(mVignetteEnd); filter.setVignetteEnd(mVignetteEnd);
} }
@Override @Override public String getId() {
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) { return "VignetteFilterTransformation(center=" + mCenter.toString() +
Bitmap source = resource.get(); ",color=" + Arrays.toString(mVignetteColor) +
",start=" + mVignetteStart + ",end=" + mVignetteEnd + ")";
GPUImage gpuImage = new GPUImage(mContext); }
gpuImage.setImage(source);
gpuImage.setFilter(mFilter);
Bitmap bitmap = gpuImage.getBitmapWithFilterApplied();
source.recycle();
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override
public String getId() {
return "VignetteFilterTransformation(center=" + mCenter.toString() +
",color=" + Arrays.toString(mVignetteColor) +
",start=" + mVignetteStart + ",end=" + mVignetteEnd + ")";
}
} }

View File

@@ -0,0 +1,257 @@
package jp.wasabeef.glide.transformations.internal;
import android.graphics.Bitmap;
/**
* Copyright (C) 2015 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class FastBlur {
public static Bitmap blur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {
// Stack Blur v1.0 from
// http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
//
// Java Author: Mario Klingemann <mario at quasimondo.com>
// http://incubator.quasimondo.com
// created Feburary 29, 2004
// Android port : Yahel Bouaziz <yahel at kayenko.com>
// http://www.kayenko.com
// ported april 5th, 2012
// This is a compromise between Gaussian Blur and Box blur
// It creates much better looking blurs than Box Blur, but is
// 7x faster than my Gaussian Blur implementation.
//
// I called it Stack Blur because this describes best how this
// filter works internally: it creates a kind of moving stack
// of colors whilst scanning through the image. Thereby it
// just has to add one new block of color to the right side
// of the stack and remove the leftmost color. The remaining
// colors on the topmost layer of the stack are either added on
// or reduced by one, depending on if they are on the right or
// on the left side of the stack.
//
// If you are using this algorithm in your code please add
// the following line:
//
// Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com>
Bitmap bitmap;
if (canReuseInBitmap) {
bitmap = sentBitmap;
} else {
bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
}
if (radius < 1) {
return (null);
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int wm = w - 1;
int hm = h - 1;
int wh = w * h;
int div = radius + radius + 1;
int r[] = new int[wh];
int g[] = new int[wh];
int b[] = new int[wh];
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
int vmin[] = new int[Math.max(w, h)];
int divsum = (div + 1) >> 1;
divsum *= divsum;
int dv[] = new int[256 * divsum];
for (i = 0; i < 256 * divsum; i++) {
dv[i] = (i / divsum);
}
yw = yi = 0;
int[][] stack = new int[div][3];
int stackpointer;
int stackstart;
int[] sir;
int rbs;
int r1 = radius + 1;
int routsum, goutsum, boutsum;
int rinsum, ginsum, binsum;
for (y = 0; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, 0))];
sir = stack[i + radius];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rbs = r1 - Math.abs(i);
rsum += sir[0] * rbs;
gsum += sir[1] * rbs;
bsum += sir[2] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
}
stackpointer = radius;
for (x = 0; x < w; x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm);
}
p = pix[yw + vmin[x]];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[(stackpointer) % div];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi++;
}
yw += w;
}
for (x = 0; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius * w;
for (i = -radius; i <= radius; i++) {
yi = Math.max(0, yp) + x;
sir = stack[i + radius];
sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
if (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
for (y = 0; y < h; y++) {
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (x == 0) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];
sir[0] = r[p];
sir[1] = g[p];
sir[2] = b[p];
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[stackpointer];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi += w;
}
}
bitmap.setPixels(pix, 0, w, 0, 0, w, h);
return (bitmap);
}
}

View File

@@ -0,0 +1,55 @@
package jp.wasabeef.glide.transformations.internal;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RSRuntimeException;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
/**
* Copyright (C) 2015 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class RSBlur {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static Bitmap blur(Context context, Bitmap bitmap, int radius) throws RSRuntimeException {
RenderScript rs = null;
try {
rs = RenderScript.create(context);
rs.setMessageHandler(new RenderScript.RSMessageHandler());
Allocation input =
Allocation.createFromBitmap(rs, bitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
Allocation output = Allocation.createTyped(rs, input.getType());
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blur.setInput(input);
blur.setRadius(radius);
blur.forEach(output);
output.copyTo(bitmap);
} finally {
if (rs != null) {
rs.destroy();
}
}
return bitmap;
}
}

View File

@@ -0,0 +1,43 @@
package jp.wasabeef.glide.transformations.internal;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
/**
* Copyright (C) 2015 Wasabeef
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public final class Utils {
private Utils() {
// Utility class.
}
public static Drawable getMaskDrawable(Context context, int maskId) {
Drawable drawable;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
drawable = context.getDrawable(maskId);
} else {
drawable = context.getResources().getDrawable(maskId);
}
if (drawable == null) {
throw new IllegalArgumentException("maskId is invalid");
}
return drawable;
}
}