$30 off During Our Annual Pro Sale. View Details »

How to contribute android-gpuimage

Yuji Koketsu
November 16, 2018

How to contribute android-gpuimage

Yuji Koketsu

November 16, 2018
Tweet

More Decks by Yuji Koketsu

Other Decks in Programming

Transcript

  1. How to contribute
    android-gpuimage

    View Slide

  2. About Me
    Yuji Koketsu
    @kettsun0123 CATS

    View Slide

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

    View Slide

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

    View Slide

  5. ࠓ͙͢Ͱ͖Δʂcontributeͷ࢓ํ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. ·ͱΊ

    View Slide

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

    View Slide

  30. ·ͱΊ
    ͱͯ΋؆୯

    View Slide

  31. ·ͱΊ
    Thanks:)

    View Slide