diff --git a/internal/api/room/screen.go b/internal/api/room/screen.go index b453e45f..f94f66b3 100644 --- a/internal/api/room/screen.go +++ b/internal/api/room/screen.go @@ -1,8 +1,6 @@ package room import ( - "bytes" - "image/jpeg" "net/http" "strconv" @@ -83,11 +81,8 @@ func (h *RoomHandler) screenShotGet(w http.ResponseWriter, r *http.Request) { } img := h.desktop.GetScreenshotImage() - out := new(bytes.Buffer) - - if err := jpeg.Encode(out, img, &jpeg.Options{ - Quality: quality, - }); err != nil { + bytes, err := utils.CreateJPGImage(img, quality) + if err != nil { utils.HttpInternalServerError(w, err) return } @@ -95,7 +90,7 @@ func (h *RoomHandler) screenShotGet(w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.Header().Set("Content-Type", "image/jpeg") //nolint - w.Write(out.Bytes()) + w.Write(bytes) } func (h *RoomHandler) screenCastGet(w http.ResponseWriter, r *http.Request) { diff --git a/internal/utils/cursor.go b/internal/utils/cursor.go deleted file mode 100644 index ebd806dd..00000000 --- a/internal/utils/cursor.go +++ /dev/null @@ -1,29 +0,0 @@ -package utils - -import ( - "bytes" - "encoding/base64" - "image/png" - - "demodesk/neko/internal/types" -) - -func GetCursorImage(cursor *types.CursorImage) ([]byte, error) { - out := new(bytes.Buffer) - err := png.Encode(out, cursor.Image) - if err != nil { - return nil, err - } - - return out.Bytes(), nil -} - -func GetCursorImageURI(cursor *types.CursorImage) (string, error) { - img, err := GetCursorImage(cursor) - if err != nil { - return "", err - } - - uri := "data:image/png;base64," + base64.StdEncoding.EncodeToString(img) - return uri, nil -} diff --git a/internal/utils/image.go b/internal/utils/image.go new file mode 100644 index 00000000..feefcd8c --- /dev/null +++ b/internal/utils/image.go @@ -0,0 +1,39 @@ +package utils + +import ( + "bytes" + "encoding/base64" + "image" + "image/jpeg" + "image/png" +) + +func CreatePNGImage(img *image.RGBA) ([]byte, error) { + out := new(bytes.Buffer) + err := png.Encode(out, img) + if err != nil { + return nil, err + } + + return out.Bytes(), nil +} + +func CreateJPGImage(img *image.RGBA, quality int) ([]byte, error) { + out := new(bytes.Buffer) + err := jpeg.Encode(out, img, &jpeg.Options{ Quality: quality }) + if err != nil { + return nil, err + } + + return out.Bytes(), nil +} + +func CreatePNGImageURI(img *image.RGBA) (string, error) { + data, err := CreatePNGImage(img) + if err != nil { + return "", err + } + + uri := "data:image/png;base64," + base64.StdEncoding.EncodeToString(data) + return uri, nil +} diff --git a/internal/webrtc/send.go b/internal/webrtc/send.go index e3facb9f..573b22d6 100644 --- a/internal/webrtc/send.go +++ b/internal/webrtc/send.go @@ -55,7 +55,7 @@ func (peer *WebRTCPeerCtx) SendCursorImage(cur *types.CursorImage) error { return fmt.Errorf("no data channel") } - img, err := utils.GetCursorImage(cur) + img, err := utils.CreatePNGImage(cur.Image) if err != nil { return err }