Slide 1

Slide 1 text

How to contribute android-gpuimage

Slide 2

Slide 2 text

About Me Yuji Koketsu @kettsun0123 CATS

Slide 3

Slide 3 text

android-gpuimageͱ͸ GPUImage2͕΋ͱʹͳ͍ͬͯΔFilterΛ͔͚Δ ϥΠϒϥϦ

Slide 4

Slide 4 text

໨࣍ 1. ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 2. ·ͱΊ

Slide 5

Slide 5 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ

Slide 6

Slide 6 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ ࠷΋؆୯ͳContribute͸FilterΛ௥Ճ͢Δ͜ͱ

Slide 7

Slide 7 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ ·ͩ·ͩFilter͕଍Γͳ͍

Slide 8

Slide 8 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ GPUImage2(iOS)ΛࢀߟʹFilterΛ࡞ͬͯPRΛग़͢

Slide 9

Slide 9 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 1. ௥Ճ͢ΔFilterΛܾΊΔ 2. ຊՈGPUImage2ΛࢀߟʹFilterΛ࣮૷͢Δ 3. sampleͰ࡞ͬͨFilterΛ࢖͑ΔΑ͏ʹ͢Δ 4. PRΛग़͢

Slide 10

Slide 10 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 1. ௥Ճ͢ΔFilterΛܾΊΔ README͔ΒબͿ

Slide 11

Slide 11 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 2. FilterΛ࣮૷͢Δ GPUImage2/framework/Source/Operations/Shaders

Slide 12

Slide 12 text

ࠓ͙͢Ͱ͖Δʂ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

Slide 13

Slide 13 text

ࠓ͙͢Ͱ͖Δʂ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

Slide 14

Slide 14 text

ࠓ͙͢Ͱ͖Δʂ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 ม਺Λ४උ͢Δ

Slide 15

Slide 15 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 2. FilterΛ࣮૷͢Δ /filter/GPUImageSolarizeFilter.java @Override public void onInit() { super.onInit(); uniformThresholdLocation = GLES20.glGetUniformLocation(getProgram(), "threshold"); }

Slide 16

Slide 16 text

ࠓ͙͢Ͱ͖Δʂ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); } ֎෦͔Β஋Λ౉ͤΔΑ͏ʹ͢Δ

Slide 17

Slide 17 text

ࠓ͙͢Ͱ͖Δʂ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 }

Slide 18

Slide 18 text

ࠓ͙͢Ͱ͖Δʂ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ʹ௥Ճ

Slide 19

Slide 19 text

ࠓ͙͢Ͱ͖Δʂ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() } }

Slide 20

Slide 20 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ Ϧετʹදࣔ͞ΕΔΑ͏ʹͳΓ·ͨ͠

Slide 21

Slide 21 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ ͜ͷ··Ͱ͸֬ೝͰ͖ͳ͍ͷͰ AdjusterΛ࡞ͬͯFilterͱͯ͠ಈ͔͢

Slide 22

Slide 22 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ sample/GPUImageFilterTools.kt AdjusterΫϥεΛ࡞੒ class FilterAdjuster(filter: GPUImageFilter) { … private inner class BilateralAdjuster(filter: GPUImageBilateralBlurFilter) : Adjuster(filter) { override fun adjust(percentage: Int) { filter.setDistanceNormalizationFactor(range(percentage, 0.0f, 15.0f)) } } … private inner class SolarizeAdjuster(filter: GPUImageSolarizeFilter) : Adjuster(filter) { override fun adjust(percentage: Int) { filter.setThreshold(range(percentage, 0.0f, 1.0f)) } } }

Slide 23

Slide 23 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ sample/GPUImageFilterTools.kt ࡞ͬͨAdjusterΛ௥Ճ class FilterAdjuster(filter: GPUImageFilter) { private val adjuster: Adjuster? init { adjuster = when (filter) { … is GPUImageLevelsFilter -> LevelsMinMidAdjuster(filter) is GPUImageBilateralBlurFilter -> BilateralAdjuster(filter) is GPUImageTransformFilter -> RotateAdjuster(filter) is GPUImageSolarizeFilter -> SolarizeAdjuster(filter) else -> null } }

Slide 24

Slide 24 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 3. sampleͰࢼͤΔΑ͏ʹ͢Δ ಈ͖·ͨ͠

Slide 25

Slide 25 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ 4. PRΛग़͢ - [x] Color Inversion - [x] Solarize - [x] Vibrance - [x] Highlight and Shadow Tint ࡞ͬͨFilterͷCheckboxΛ๨Εͣʹ㾎

Slide 26

Slide 26 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ ௨ৗͷखॱͰPRΛग़ͤ͹OK 4. PRΛग़͢

Slide 27

Slide 27 text

ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ CLA͕ඞཁͳͷͰɺCONTRIBUTING.mdͷϦϯΫ͔Β 4. PRΛग़͢

Slide 28

Slide 28 text

·ͱΊ

Slide 29

Slide 29 text

·ͱΊ 1. ௥Ճ͢ΔFilterΛܾΊΔ 2. ຊՈGPUImage2ΛࢀߟʹFilterΛ࣮૷͢Δ 3. sampleͰ࡞ͬͨFilterΛ࢖͑ΔΑ͏ʹ͢Δ 4. PRΛग़͢ ※࠶ܝ

Slide 30

Slide 30 text

·ͱΊ ͱͯ΋؆୯

Slide 31

Slide 31 text

·ͱΊ Thanks:)