github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/encoding.go (about)

     1  package vnc2video
     2  
     3  import (
     4  	"bytes"
     5  	"image"
     6  	"image/draw"
     7  	"sync"
     8  )
     9  
    10  // EncodingType represents a known VNC encoding type.
    11  type EncodingType int32
    12  
    13  //go:generate stringer -type=EncodingType
    14  
    15  const (
    16  	// EncRaw raw encoding
    17  	EncRaw EncodingType = 0
    18  	// EncCopyRect copyrect encoding
    19  	EncCopyRect EncodingType = 1
    20  
    21  	EncRRE                           EncodingType = 2
    22  	EncCoRRE                         EncodingType = 4
    23  	EncHextile                       EncodingType = 5
    24  	EncZlib                          EncodingType = 6
    25  	EncTight                         EncodingType = 7
    26  	EncZlibHex                       EncodingType = 8
    27  	EncUltra1                        EncodingType = 9
    28  	EncUltra2                        EncodingType = 10
    29  	EncJPEG                          EncodingType = 21
    30  	EncJRLE                          EncodingType = 22
    31  	EncTRLE                          EncodingType = 15
    32  	EncZRLE                          EncodingType = 16
    33  	EncAtenAST2100                   EncodingType = 0x57
    34  	EncAtenASTJPEG                   EncodingType = 0x58
    35  	EncAtenHermon                    EncodingType = 0x59
    36  	EncAtenYarkon                    EncodingType = 0x60
    37  	EncAtenPilot3                    EncodingType = 0x61
    38  	EncJPEGQualityLevelPseudo10      EncodingType = -23
    39  	EncJPEGQualityLevelPseudo9       EncodingType = -24
    40  	EncJPEGQualityLevelPseudo8       EncodingType = -25
    41  	EncJPEGQualityLevelPseudo7       EncodingType = -26
    42  	EncJPEGQualityLevelPseudo6       EncodingType = -27
    43  	EncJPEGQualityLevelPseudo5       EncodingType = -28
    44  	EncJPEGQualityLevelPseudo4       EncodingType = -29
    45  	EncJPEGQualityLevelPseudo3       EncodingType = -30
    46  	EncJPEGQualityLevelPseudo2       EncodingType = -31
    47  	EncJPEGQualityLevelPseudo1       EncodingType = -32
    48  	EncPointerPosPseudo              EncodingType = -232
    49  	EncCursorPseudo                  EncodingType = -239
    50  	EncXCursorPseudo                 EncodingType = -240
    51  	EncDesktopSizePseudo             EncodingType = -223
    52  	EncLastRectPseudo                EncodingType = -224
    53  	EncCompressionLevel10            EncodingType = -247
    54  	EncCompressionLevel9             EncodingType = -248
    55  	EncCompressionLevel8             EncodingType = -249
    56  	EncCompressionLevel7             EncodingType = -250
    57  	EncCompressionLevel6             EncodingType = -251
    58  	EncCompressionLevel5             EncodingType = -252
    59  	EncCompressionLevel4             EncodingType = -253
    60  	EncCompressionLevel3             EncodingType = -254
    61  	EncCompressionLevel2             EncodingType = -255
    62  	EncCompressionLevel1             EncodingType = -256
    63  	EncQEMUPointerMotionChangePseudo EncodingType = -257
    64  	EncQEMUExtendedKeyEventPseudo    EncodingType = -258
    65  	EncTightPng                      EncodingType = -260
    66  	EncDesktopNamePseudo             EncodingType = -307
    67  	EncExtendedDesktopSizePseudo     EncodingType = -308
    68  	EncXvpPseudo                     EncodingType = -309
    69  	EncClientRedirect                EncodingType = -311
    70  	EncFencePseudo                   EncodingType = -312
    71  	EncContinuousUpdatesPseudo       EncodingType = -313
    72  	EncExtendedClipboardPseudo       EncodingType = -1063131698 //C0A1E5CE
    73  )
    74  
    75  var bPool = sync.Pool{
    76  	New: func() interface{} {
    77  		// The Pool's New function should generally only return pointer
    78  		// types, since a pointer can be put into the return interface
    79  		// value without an allocation:
    80  		return new(bytes.Buffer)
    81  	},
    82  }
    83  
    84  type Renderer interface {
    85  	SetTargetImage(draw.Image)
    86  }
    87  
    88  // Encoding represents interface for vnc encoding
    89  type Encoding interface {
    90  	Type() EncodingType
    91  	Read(Conn, *Rectangle) error
    92  	Write(Conn, *Rectangle) error
    93  	Supported(Conn) bool
    94  	Reset() error
    95  }
    96  
    97  func setBit(n uint8, pos uint8) uint8 {
    98  	n |= (1 << pos)
    99  	return n
   100  }
   101  
   102  func clrBit(n uint8, pos uint8) uint8 {
   103  	n = n &^ (1 << pos)
   104  	return n
   105  }
   106  
   107  func hasBit(n uint8, pos uint8) bool {
   108  	v := n & (1 << pos)
   109  	return (v > 0)
   110  }
   111  
   112  func getBit(n uint8, pos uint8) uint8 {
   113  	n = n & (1 << pos)
   114  	return n
   115  }
   116  
   117  func newRGBAImage(rgba []byte, rect *Rectangle) image.Image {
   118  	img := &image.RGBA{Stride: 4 * int(rect.Width)}
   119  	img.Pix = rgba
   120  	img.Rect.Max.X = int(rect.Width)
   121  	img.Rect.Max.Y = int(rect.Height)
   122  	return img
   123  }