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 }