status-im/status-go

View on GitHub
images/status_indicator.go

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
package images

import (
    "bytes"
    "image"
    "image/color"
    "image/png"
    "math"

    "github.com/fogleman/gg"
)

func AddStatusIndicatorToImage(inputImage []byte, innerColor color.Color, indicatorSize, indicatorBorder, indicatorCenterToEdge float64) ([]byte, error) {
    // decode the input image
    img, _, err := image.Decode(bytes.NewReader(inputImage))
    if err != nil {
        return nil, err
    }

    // get the dimensions of the image
    width := img.Bounds().Max.X
    height := img.Bounds().Max.Y

    indicatorOuterRadius := (indicatorSize / 2) + indicatorBorder

    // calculate the center point
    x := float64(width) - indicatorCenterToEdge
    y := float64(height) - indicatorCenterToEdge

    // create a new gg.Context instance
    dc := gg.NewContext(width, height)
    dc.DrawImage(img, 0, 0)

    // Loop through each pixel in the hole and set it to transparent
    dc.SetColor(color.Transparent)
    for i := x - indicatorOuterRadius; i <= x+indicatorOuterRadius; i++ {
        for j := y - indicatorOuterRadius; j <= y+indicatorOuterRadius; j++ {
            if math.Pow(i-x, 2)+math.Pow(j-y, 2) <= math.Pow(indicatorOuterRadius, 2) {
                dc.SetPixel(int(i), int(j))
            }
        }
    }

    // draw inner circle
    dc.DrawCircle(x, y, indicatorOuterRadius-indicatorBorder)
    dc.SetColor(innerColor)
    dc.Fill()

    // encode the modified image as PNG and return as []byte
    var outputImage bytes.Buffer
    err = png.Encode(&outputImage, dc.Image())
    if err != nil {
        return nil, err
    }
    return outputImage.Bytes(), nil
}