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  }