Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
How to contribute android-gpuimage
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yuji Koketsu
November 16, 2018
Programming
660
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How to contribute android-gpuimage
Yuji Koketsu
November 16, 2018
More Decks by Yuji Koketsu
See All by Yuji Koketsu
AutoSizingTextView
kettsun0123
0
230
Replace with dagger.android
kettsun0123
0
2.4k
Android Instant Apps or Progressive Web Apps
kettsun0123
1
480
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
260
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
480
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
210
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
560
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
470
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
420
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
210
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
770
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
300
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
430
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Producing Creativity
orderedlist
PRO
348
40k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
650
Discover your Explorer Soul
emna__ayadi
2
1.2k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
380
The Limits of Empathy - UXLibs8
cassininazir
1
600
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Transcript
How to contribute android-gpuimage
About Me Yuji Koketsu @kettsun0123 CATS
android-gpuimageͱ GPUImage2͕ͱʹͳ͍ͬͯΔFilterΛ͔͚Δ ϥΠϒϥϦ
࣍ 1. ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. ·ͱΊ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ ࠷؆୯ͳContributeFilterΛՃ͢Δ͜ͱ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ ·ͩ·ͩFilter͕Γͳ͍
ࠓ͙͢Ͱ͖Δʂcontributeͷํ GPUImage2(iOS)ΛࢀߟʹFilterΛ࡞ͬͯPRΛग़͢
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 1. Ճ͢ΔFilterΛܾΊΔ 2. ຊՈGPUImage2ΛࢀߟʹFilterΛ࣮͢Δ 3. sampleͰ࡞ͬͨFilterΛ͑ΔΑ͏ʹ͢Δ 4. PRΛग़͢
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 1. Ճ͢ΔFilterΛܾΊΔ README͔ΒબͿ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. FilterΛ࣮͢Δ GPUImage2/framework/Source/Operations/Shaders
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. FilterΛ࣮͢Δ varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture;
uniform highp float threshold; const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); void main() { highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); highp float luminance = dot(textureColor.rgb, W); highp float thresholdResult = step(luminance, threshold); highp vec3 finalColor = abs(thresholdResult - textureColor.rgb); gl_FragColor = vec4(finalColor, textureColor.w); } Operations/Shaders/Solarize_GLES.fsh
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. FilterΛ࣮͢Δ public static final String SOLARIZE_FRAGMENT_SHADER = ""
+ "varying highp vec2 textureCoordinate;\n" + "\n" + "uniform sampler2D inputImageTexture;\n" + "uniform highp float threshold;\n" + "\n" + "const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);\n" + "\n" + "void main()\n" + "{\n" + " highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" + " highp float luminance = dot(textureColor.rgb, W);\n" + " highp float thresholdResult = step(luminance, threshold);\n" + " highp vec3 finalColor = abs(thresholdResult - textureColor.rgb);\n" + " \n" + " gl_FragColor = vec4(finalColor, textureColor.w);\n" + "}"; /filter/GPUImageSolarizeFilter.java
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. FilterΛ࣮͢Δ public static final String SOLARIZE_FRAGMENT_SHADER = ""
+ "varying highp vec2 textureCoordinate;\n" + "\n" + "uniform sampler2D inputImageTexture;\n" + "uniform highp float threshold;\n" + "\n" + "const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);\n" + "\n" + "void main()\n" + "{\n" + " highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" + " highp float luminance = dot(textureColor.rgb, W);\n" + " highp float thresholdResult = step(luminance, threshold);\n" + " highp vec3 finalColor = abs(thresholdResult - textureColor.rgb);\n" + " \n" + " gl_FragColor = vec4(finalColor, textureColor.w);\n" + "}"; /filter/GPUImageSolarizeFilter.java มΛ४උ͢Δ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. FilterΛ࣮͢Δ /filter/GPUImageSolarizeFilter.java @Override public void onInit() { super.onInit();
uniformThresholdLocation = GLES20.glGetUniformLocation(getProgram(), "threshold"); }
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 2. FilterΛ࣮͢Δ /filter/GPUImageSolarizeFilter.java @Override public void onInitialized() { super.onInitialized();
setThreshold(threshold); } public void setThreshold(final float threshold) { this.threshold = threshold; setFloat(uniformThresholdLocation, threshold); } ֎෦͔ΒΛͤΔΑ͏ʹ͢Δ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ sample/GPUImageFilterTools.kt FilterTypeʹՃ private enum class FilterType {
CONTRAST, GRAYSCALE, SHARPEN, SEPIA, SOBEL_EDGE_DETECTION, THRESHOLD_EDGE_DETECTION, THREE_X_THREE_CONVOLUTION, FILTER_GROUP, EMBOSS, …, SOLARIZE }
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ fun showDialog( context: Context, listener: (filter: GPUImageFilter)
-> Unit ) { val filters = FilterList().apply { addFilter("Contrast", FilterType.CONTRAST) addFilter("Invert", FilterType.INVERT) addFilter("Pixelation", FilterType.PIXELATION) addFilter("Hue", FilterType.HUE) addFilter("Gamma", FilterType.GAMMA) addFilter("Brightness", FilterType.BRIGHTNESS) addFilter("Sepia", FilterType.SEPIA) addFilter("Grayscale", FilterType.GRAYSCALE) … addFilter("Solarize", FilterType.SOLARIZE) } … } sample/GPUImageFilterTools.kt FilterListʹՃ
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ sample/GPUImageFilterTools.kt ࡞ͬͨFilterΛબͰ͖ΔΑ͏ʹ private fun createFilterForType(context: Context, type:
FilterType): GPUImageFilter { return when (type) { FilterType.CONTRAST -> GPUImageContrastFilter(2.0f) FilterType.GAMMA -> GPUImageGammaFilter(2.0f) FilterType.INVERT -> GPUImageColorInvertFilter() FilterType.PIXELATION -> GPUImagePixelationFilter() FilterType.HUE -> GPUImageHueFilter(90.0f) FilterType.BRIGHTNESS -> GPUImageBrightnessFilter(1.5f) FilterType.GRAYSCALE -> GPUImageGrayscaleFilter() FilterType.LEVELS_FILTER_MIN -> GPUImageLevelsFilter() FilterType.HALFTONE -> GPUImageHalftoneFilter() FilterType.BILATERAL_BLUR -> GPUImageBilateralBlurFilter() FilterType.TRANSFORM2D -> GPUImageTransformFilter() … FilterType.SOLARIZE -> GPUImageSolarizeFilter() } }
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ Ϧετʹදࣔ͞ΕΔΑ͏ʹͳΓ·ͨ͠
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ ͜ͷ··Ͱ֬ೝͰ͖ͳ͍ͷͰ AdjusterΛ࡞ͬͯFilterͱͯ͠ಈ͔͢
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ sample/GPUImageFilterTools.kt AdjusterΫϥεΛ࡞ class FilterAdjuster(filter: GPUImageFilter) { …
private inner class BilateralAdjuster(filter: GPUImageBilateralBlurFilter) : Adjuster<GPUImageBilateralBlurFilter>(filter) { override fun adjust(percentage: Int) { filter.setDistanceNormalizationFactor(range(percentage, 0.0f, 15.0f)) } } … private inner class SolarizeAdjuster(filter: GPUImageSolarizeFilter) : Adjuster<GPUImageSolarizeFilter>(filter) { override fun adjust(percentage: Int) { filter.setThreshold(range(percentage, 0.0f, 1.0f)) } } }
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ sample/GPUImageFilterTools.kt ࡞ͬͨAdjusterΛՃ class FilterAdjuster(filter: GPUImageFilter) { private
val adjuster: Adjuster<out GPUImageFilter>? init { adjuster = when (filter) { … is GPUImageLevelsFilter -> LevelsMinMidAdjuster(filter) is GPUImageBilateralBlurFilter -> BilateralAdjuster(filter) is GPUImageTransformFilter -> RotateAdjuster(filter) is GPUImageSolarizeFilter -> SolarizeAdjuster(filter) else -> null } }
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ ಈ͖·ͨ͠
ࠓ͙͢Ͱ͖Δʂcontributeͷํ 4. PRΛग़͢ - [x] Color Inversion - [x] Solarize
- [x] Vibrance - [x] Highlight and Shadow Tint ࡞ͬͨFilterͷCheckboxΛΕͣʹ㾎
ࠓ͙͢Ͱ͖Δʂcontributeͷํ ௨ৗͷखॱͰPRΛग़ͤOK 4. PRΛग़͢
ࠓ͙͢Ͱ͖Δʂcontributeͷํ CLA͕ඞཁͳͷͰɺCONTRIBUTING.mdͷϦϯΫ͔Β 4. PRΛग़͢
·ͱΊ
·ͱΊ 1. Ճ͢ΔFilterΛܾΊΔ 2. ຊՈGPUImage2ΛࢀߟʹFilterΛ࣮͢Δ 3. sampleͰ࡞ͬͨFilterΛ͑ΔΑ͏ʹ͢Δ 4. PRΛग़͢ ※࠶ܝ
·ͱΊ ͱͯ؆୯
·ͱΊ Thanks:)