github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/encoding_copyrect.go (about) 1 package vnc2video 2 3 import ( 4 "encoding/binary" 5 "image" 6 "image/draw" 7 "github.com/amitbet/vnc2video/logger" 8 ) 9 10 type CopyRectEncoding struct { 11 SX, SY uint16 12 Image draw.Image 13 } 14 15 func (*CopyRectEncoding) Supported(Conn) bool { 16 return true 17 } 18 func (*CopyRectEncoding) Reset() error { 19 return nil 20 } 21 func (*CopyRectEncoding) Type() EncodingType { return EncCopyRect } 22 23 func (enc *CopyRectEncoding) SetTargetImage(img draw.Image) { 24 //logger.Tracef("!!!!!!!!!!!!!setting image: %v", img.Bounds()) 25 enc.Image = img 26 } 27 28 func (enc *CopyRectEncoding) Read(c Conn, rect *Rectangle) error { 29 logger.Tracef("Reading: CopyRect %v", rect) 30 if err := binary.Read(c, binary.BigEndian, &enc.SX); err != nil { 31 return err 32 } 33 if err := binary.Read(c, binary.BigEndian, &enc.SY); err != nil { 34 return err 35 } 36 cpyIm := image.NewRGBA(image.Rectangle{Min: image.Point{0, 0}, Max: image.Point{int(rect.Width), int(rect.Height)}}) 37 for x := 0; x < int(rect.Width); x++ { 38 for y := 0; y < int(rect.Height); y++ { 39 col := enc.Image.At(x+int(enc.SX), y+int(enc.SY)) 40 cpyIm.Set(x, y, col) 41 } 42 } 43 44 for x := 0; x < int(rect.Width); x++ { 45 for y := 0; y < int(rect.Height); y++ { 46 col := cpyIm.At(x, y) 47 enc.Image.Set(int(rect.X)+x, int(rect.Y)+y, col) 48 } 49 } 50 51 return nil 52 } 53 54 func (enc *CopyRectEncoding) Write(c Conn, rect *Rectangle) error { 55 if err := binary.Write(c, binary.BigEndian, enc.SX); err != nil { 56 return err 57 } 58 if err := binary.Write(c, binary.BigEndian, enc.SY); err != nil { 59 return err 60 } 61 return nil 62 }