commit
ee8998483b
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,12 @@
|
||||
.nofail
|
||||
.fail
|
||||
load-module module-augment-properties
|
||||
load-module module-always-sink
|
||||
.ifexists module-xrdp-sink.so
|
||||
load-module module-xrdp-sink
|
||||
.endif
|
||||
.ifexists module-xrdp-source.so
|
||||
load-module module-xrdp-source
|
||||
load-module module-always-sink
|
||||
.endif
|
||||
load-module module-native-protocol-unix
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
EXTRA_DIST = bootstrap readme.txt
|
||||
|
||||
SUBDIRS = \
|
||||
module \
|
||||
xrdpdev \
|
||||
xrdpkeyb \
|
||||
xrdpmouse
|
@ -1,36 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
which autoconf
|
||||
if ! test $? -eq 0
|
||||
then
|
||||
echo "error, install autoconf"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
which automake
|
||||
if ! test $? -eq 0
|
||||
then
|
||||
echo "error, install automake"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
which libtool
|
||||
if ! test $? -eq 0
|
||||
then
|
||||
echo "error, install libtool"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
which pkg-config
|
||||
if ! test $? -eq 0
|
||||
then
|
||||
echo "error, install pkg-config"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
touch configure.ac
|
||||
touch NEWS
|
||||
touch AUTHORS
|
||||
touch README
|
||||
touch ChangeLog
|
||||
autoreconf -fvi
|
@ -1,35 +0,0 @@
|
||||
# Process this file with autoconf to produce a configure script
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT([xrdpmod], [0.1.0], [xrdp-devel@lists.sourceforge.net])
|
||||
AC_CONFIG_HEADERS(config_ac.h:config_ac-h.in)
|
||||
AM_INIT_AUTOMAKE([1.6 foreign])
|
||||
AC_PROG_CC
|
||||
AC_C_CONST
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
AM_CONDITIONAL(GOT_PREFIX, test "x${prefix}" != "xNONE"])
|
||||
|
||||
AC_CHECK_HEADER([xorg/xorg-server.h], [],
|
||||
[AC_MSG_ERROR([please install xserver-xorg-dev or xorg-x11-server-sdk])])
|
||||
|
||||
PKG_CHECK_MODULES([XORG_SERVER], [xorg-server >= 0])
|
||||
AC_SUBST([XORG_SERVER_CFLAGS])
|
||||
AC_SUBST([XORG_SERVER_LIBS])
|
||||
|
||||
moduledir=`pkg-config xorg-server --variable=moduledir`
|
||||
AC_SUBST([moduledir])
|
||||
|
||||
if test "x${prefix}" = "xNONE" ; then
|
||||
sysconfdir="/etc";
|
||||
fi
|
||||
|
||||
AC_CONFIG_FILES([Makefile
|
||||
module/Makefile
|
||||
xrdpdev/Makefile
|
||||
xrdpkeyb/Makefile
|
||||
xrdpmouse/Makefile
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
|
@ -1,22 +0,0 @@
|
||||
EXTRA_DIST =
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(XORG_SERVER_CFLAGS) \
|
||||
-I../../../common
|
||||
|
||||
libxorgxrdp_la_LTLIBRARIES = libxorgxrdp.la
|
||||
|
||||
libxorgxrdp_la_LDFLAGS = -module -avoid-version
|
||||
|
||||
libxorgxrdp_ladir = $(moduledir)
|
||||
|
||||
libxorgxrdp_la_SOURCES = rdpDraw.c rdpPri.c rdpGC.c rdpFillSpans.c \
|
||||
rdpSetSpans.c rdpPutImage.c rdpCopyArea.c rdpCopyPlane.c rdpPolyPoint.c \
|
||||
rdpPolylines.c rdpPolySegment.c rdpPolyRectangle.c rdpPolyArc.c \
|
||||
rdpFillPolygon.c rdpPolyFillRect.c rdpPolyFillArc.c rdpPolyText8.c \
|
||||
rdpPolyText16.c rdpImageText8.c rdpImageText16.c rdpImageGlyphBlt.c \
|
||||
rdpPolyGlyphBlt.c rdpPushPixels.c rdpCursor.c rdpMain.c rdpRandR.c \
|
||||
rdpMisc.c rdpReg.c rdpComposite.c rdpGlyphs.c rdpPixmap.c rdpInput.c \
|
||||
rdpClientCon.c rdpCapture.c rdpTrapezoids.c rdpXv.c rdpSimd.c
|
||||
|
||||
libxorgxrdp_la_LIBADD =
|
@ -1,41 +0,0 @@
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;The first six integer or pointer arguments are passed in registers
|
||||
;RDI, RSI, RDX, RCX, R8, and R9
|
||||
|
||||
;int
|
||||
;cpuid_amd64(int eax_in, int ecx_in, int *eax, int *ebx, int *ecx, int *edx)
|
||||
|
||||
PROC cpuid_amd64
|
||||
; save registers
|
||||
push rbx
|
||||
|
||||
push rdx
|
||||
push rcx
|
||||
push r8
|
||||
push r9
|
||||
|
||||
mov rax, rdi
|
||||
mov rcx, rsi
|
||||
cpuid
|
||||
pop rdi
|
||||
mov [rdi], edx
|
||||
pop rdi
|
||||
mov [rdi], ecx
|
||||
pop rdi
|
||||
mov [rdi], ebx
|
||||
pop rdi
|
||||
mov [rdi], eax
|
||||
mov eax, 0
|
||||
; restore registers
|
||||
pop rbx
|
||||
ret;
|
||||
align 16
|
||||
|
@ -1,39 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
amd64 asm functions
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __FUNCS_AMD64_H
|
||||
#define __FUNCS_AMD64_H
|
||||
|
||||
int
|
||||
cpuid_amd64(int eax_in, int ecx_in, int *eax, int *ebx, int *ecx, int *edx);
|
||||
int
|
||||
yv12_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
i420_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
yuy2_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
uyvy_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
|
||||
#endif
|
||||
|
@ -1,248 +0,0 @@
|
||||
;
|
||||
;Copyright 2014 Jay Sorg
|
||||
;
|
||||
;Permission to use, copy, modify, distribute, and sell this software and its
|
||||
;documentation for any purpose is hereby granted without fee, provided that
|
||||
;the above copyright notice appear in all copies and that both that
|
||||
;copyright notice and this permission notice appear in supporting
|
||||
;documentation.
|
||||
;
|
||||
;The above copyright notice and this permission notice shall be included in
|
||||
;all copies or substantial portions of the Software.
|
||||
;
|
||||
;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
;OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
;AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
;CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
;
|
||||
;I420 to RGB32
|
||||
;amd64 SSE2 32 bit
|
||||
;
|
||||
; RGB to YUV
|
||||
; 0.299 0.587 0.114
|
||||
; -0.14713 -0.28886 0.436
|
||||
; 0.615 -0.51499 -0.10001
|
||||
; YUV to RGB
|
||||
; 1 0 1.13983
|
||||
; 1 -0.39465 -0.58060
|
||||
; 1 2.03211 0
|
||||
; shift left 12
|
||||
; 4096 0 4669
|
||||
; 4096 -1616 -2378
|
||||
; 4096 9324 0
|
||||
|
||||
SECTION .data
|
||||
align 16
|
||||
c128 times 8 dw 128
|
||||
c4669 times 8 dw 4669
|
||||
c1616 times 8 dw 1616
|
||||
c2378 times 8 dw 2378
|
||||
c9324 times 8 dw 9324
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
do8_uv:
|
||||
|
||||
; v
|
||||
movd xmm1, [rbx] ; 4 at a time
|
||||
lea rbx, [rbx + 4]
|
||||
punpcklbw xmm1, xmm1
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm1, xmm6
|
||||
movdqa xmm7, [rel c128]
|
||||
psubw xmm1, xmm7
|
||||
psllw xmm1, 4
|
||||
|
||||
; v
|
||||
movd xmm2, [rdx] ; 4 at a time
|
||||
lea rdx, [rdx + 4]
|
||||
punpcklbw xmm2, xmm2
|
||||
punpcklbw xmm2, xmm6
|
||||
psubw xmm2, xmm7
|
||||
psllw xmm2, 4
|
||||
|
||||
do8:
|
||||
|
||||
; y
|
||||
movq xmm0, [rsi] ; 8 at a time
|
||||
lea rsi, [rsi + 8]
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm0, xmm6
|
||||
|
||||
; r = y + hiword(4669 * (v << 4))
|
||||
movdqa xmm4, [rel c4669]
|
||||
pmulhw xmm4, xmm1
|
||||
movdqa xmm3, xmm0
|
||||
paddw xmm3, xmm4
|
||||
|
||||
; g = y - hiword(1616 * (u << 4)) - hiword(2378 * (v << 4))
|
||||
movdqa xmm5, [rel c1616]
|
||||
pmulhw xmm5, xmm2
|
||||
movdqa xmm6, [rel c2378]
|
||||
pmulhw xmm6, xmm1
|
||||
movdqa xmm4, xmm0
|
||||
psubw xmm4, xmm5
|
||||
psubw xmm4, xmm6
|
||||
|
||||
; b = y + hiword(9324 * (u << 4))
|
||||
movdqa xmm6, [rel c9324]
|
||||
pmulhw xmm6, xmm2
|
||||
movdqa xmm5, xmm0
|
||||
paddw xmm5, xmm6
|
||||
|
||||
packuswb xmm3, xmm3 ; b
|
||||
packuswb xmm4, xmm4 ; g
|
||||
punpcklbw xmm3, xmm4 ; gb
|
||||
|
||||
pxor xmm4, xmm4 ; a
|
||||
packuswb xmm5, xmm5 ; r
|
||||
punpcklbw xmm5, xmm4 ; ar
|
||||
|
||||
movdqa xmm4, xmm3
|
||||
punpcklwd xmm3, xmm5 ; argb
|
||||
movdqa [rdi], xmm3
|
||||
lea rdi, [rdi + 16]
|
||||
punpckhwd xmm4, xmm5 ; argb
|
||||
movdqa [rdi], xmm4
|
||||
lea rdi, [rdi + 16]
|
||||
|
||||
ret;
|
||||
|
||||
;The first six integer or pointer arguments are passed in registers
|
||||
; RDI, RSI, RDX, RCX, R8, and R9
|
||||
|
||||
;int
|
||||
;i420_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC i420_to_rgb32_amd64_sse2
|
||||
push rbx
|
||||
push rsi
|
||||
push rdi
|
||||
push rbp
|
||||
|
||||
push rdi
|
||||
push rdx
|
||||
mov rdi, rcx ; rgbs
|
||||
|
||||
mov rcx, rsi ; width
|
||||
mov rdx, rcx
|
||||
pop rbp ; height
|
||||
mov rax, rbp
|
||||
shr rbp, 1
|
||||
imul rax, rcx ; rax = width * height
|
||||
|
||||
pop rsi ; y
|
||||
|
||||
mov rbx, rsi ; u = y + width * height
|
||||
add rbx, rax
|
||||
|
||||
; local vars
|
||||
; char* yptr1
|
||||
; char* yptr2
|
||||
; char* uptr
|
||||
; char* vptr
|
||||
; int* rgbs1
|
||||
; int* rgbs2
|
||||
; int width
|
||||
sub rsp, 56 ; local vars, 56 bytes
|
||||
mov [rsp + 0], rsi ; save y1
|
||||
add rsi, rdx
|
||||
mov [rsp + 8], rsi ; save y2
|
||||
mov [rsp + 16], rbx ; save u
|
||||
shr rax, 2
|
||||
add rbx, rax ; v = u + (width * height / 4)
|
||||
mov [rsp + 24], rbx ; save v
|
||||
|
||||
mov [rsp + 32], rdi ; save rgbs1
|
||||
mov rax, rdx
|
||||
shl rax, 2
|
||||
add rdi, rax
|
||||
mov [rsp + 40], rdi ; save rgbs2
|
||||
|
||||
loop_y:
|
||||
|
||||
mov rcx, rdx ; width
|
||||
shr rcx, 3
|
||||
|
||||
; save rdx
|
||||
mov [rsp + 48], rdx
|
||||
|
||||
;prefetchnta 4096[rsp + 0] ; y
|
||||
;prefetchnta 1024[rsp + 16] ; u
|
||||
;prefetchnta 1024[rsp + 24] ; v
|
||||
|
||||
loop_x:
|
||||
|
||||
mov rsi, [rsp + 0] ; y1
|
||||
mov rbx, [rsp + 16] ; u
|
||||
mov rdx, [rsp + 24] ; v
|
||||
mov rdi, [rsp + 32] ; rgbs1
|
||||
|
||||
; y1
|
||||
call do8_uv
|
||||
|
||||
mov [rsp + 0], rsi ; y1
|
||||
mov [rsp + 32], rdi ; rgbs1
|
||||
|
||||
mov rsi, [rsp + 8] ; y2
|
||||
mov rdi, [rsp + 40] ; rgbs2
|
||||
|
||||
; y2
|
||||
call do8
|
||||
|
||||
mov [rsp + 8], rsi ; y2
|
||||
mov [rsp + 16], rbx ; u
|
||||
mov [rsp + 24], rdx ; v
|
||||
mov [rsp + 40], rdi ; rgbs2
|
||||
|
||||
dec rcx ; width
|
||||
jnz loop_x
|
||||
|
||||
; restore rdx
|
||||
mov rdx, [rsp + 48]
|
||||
|
||||
; update y1 and 2
|
||||
mov rax, [rsp + 0]
|
||||
mov rbx, rdx
|
||||
add rax, rbx
|
||||
mov [rsp + 0], rax
|
||||
|
||||
mov rax, [rsp + 8]
|
||||
add rax, rbx
|
||||
mov [rsp + 8], rax
|
||||
|
||||
; update rgb1 and 2
|
||||
mov rax, [rsp + 32]
|
||||
mov rbx, rdx
|
||||
shl rbx, 2
|
||||
add rax, rbx
|
||||
mov [rsp + 32], rax
|
||||
|
||||
mov rax, [rsp + 40]
|
||||
add rax, rbx
|
||||
mov [rsp + 40], rax
|
||||
|
||||
mov rcx, rbp
|
||||
dec rcx ; height
|
||||
mov rbp, rcx
|
||||
jnz loop_y
|
||||
|
||||
add rsp, 56
|
||||
|
||||
mov rax, 0
|
||||
pop rbp
|
||||
pop rdi
|
||||
pop rsi
|
||||
pop rbx
|
||||
ret
|
||||
align 16
|
||||
|
||||
|
@ -1,17 +0,0 @@
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;int
|
||||
;uyvy_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC uyvy_to_rgb32_amd64_sse2
|
||||
push rbx
|
||||
mov rax, 0
|
||||
pop rbx
|
||||
ret
|
||||
align 16
|
||||
|
@ -1,17 +0,0 @@
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;int
|
||||
;yuy2_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC yuy2_to_rgb32_amd64_sse2
|
||||
push rbx
|
||||
mov rax, 0
|
||||
pop rbx
|
||||
ret
|
||||
align 16
|
||||
|
@ -1,248 +0,0 @@
|
||||
;
|
||||
;Copyright 2014 Jay Sorg
|
||||
;
|
||||
;Permission to use, copy, modify, distribute, and sell this software and its
|
||||
;documentation for any purpose is hereby granted without fee, provided that
|
||||
;the above copyright notice appear in all copies and that both that
|
||||
;copyright notice and this permission notice appear in supporting
|
||||
;documentation.
|
||||
;
|
||||
;The above copyright notice and this permission notice shall be included in
|
||||
;all copies or substantial portions of the Software.
|
||||
;
|
||||
;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
;OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
;AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
;CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
;
|
||||
;YV12 to RGB32
|
||||
;amd64 SSE2 32 bit
|
||||
;
|
||||
; RGB to YUV
|
||||
; 0.299 0.587 0.114
|
||||
; -0.14713 -0.28886 0.436
|
||||
; 0.615 -0.51499 -0.10001
|
||||
; YUV to RGB
|
||||
; 1 0 1.13983
|
||||
; 1 -0.39465 -0.58060
|
||||
; 1 2.03211 0
|
||||
; shift left 12
|
||||
; 4096 0 4669
|
||||
; 4096 -1616 -2378
|
||||
; 4096 9324 0
|
||||
|
||||
SECTION .data
|
||||
align 16
|
||||
c128 times 8 dw 128
|
||||
c4669 times 8 dw 4669
|
||||
c1616 times 8 dw 1616
|
||||
c2378 times 8 dw 2378
|
||||
c9324 times 8 dw 9324
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
do8_uv:
|
||||
|
||||
; u
|
||||
movd xmm1, [rbx] ; 4 at a time
|
||||
lea rbx, [rbx + 4]
|
||||
punpcklbw xmm1, xmm1
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm1, xmm6
|
||||
movdqa xmm7, [rel c128]
|
||||
psubw xmm1, xmm7
|
||||
psllw xmm1, 4
|
||||
|
||||
; v
|
||||
movd xmm2, [rdx] ; 4 at a time
|
||||
lea rdx, [rdx + 4]
|
||||
punpcklbw xmm2, xmm2
|
||||
punpcklbw xmm2, xmm6
|
||||
psubw xmm2, xmm7
|
||||
psllw xmm2, 4
|
||||
|
||||
do8:
|
||||
|
||||
; y
|
||||
movq xmm0, [rsi] ; 8 at a time
|
||||
lea rsi, [rsi + 8]
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm0, xmm6
|
||||
|
||||
; r = y + hiword(4669 * (v << 4))
|
||||
movdqa xmm4, [rel c4669]
|
||||
pmulhw xmm4, xmm2
|
||||
movdqa xmm3, xmm0
|
||||
paddw xmm3, xmm4
|
||||
|
||||
; g = y - hiword(1616 * (u << 4)) - hiword(2378 * (v << 4))
|
||||
movdqa xmm5, [rel c1616]
|
||||
pmulhw xmm5, xmm1
|
||||
movdqa xmm6, [rel c2378]
|
||||
pmulhw xmm6, xmm2
|
||||
movdqa xmm4, xmm0
|
||||
psubw xmm4, xmm5
|
||||
psubw xmm4, xmm6
|
||||
|
||||
; b = y + hiword(9324 * (u << 4))
|
||||
movdqa xmm6, [rel c9324]
|
||||
pmulhw xmm6, xmm1
|
||||
movdqa xmm5, xmm0
|
||||
paddw xmm5, xmm6
|
||||
|
||||
packuswb xmm3, xmm3 ; b
|
||||
packuswb xmm4, xmm4 ; g
|
||||
punpcklbw xmm3, xmm4 ; gb
|
||||
|
||||
pxor xmm4, xmm4 ; a
|
||||
packuswb xmm5, xmm5 ; r
|
||||
punpcklbw xmm5, xmm4 ; ar
|
||||
|
||||
movdqa xmm4, xmm3
|
||||
punpcklwd xmm3, xmm5 ; argb
|
||||
movdqa [rdi], xmm3
|
||||
lea rdi, [rdi + 16]
|
||||
punpckhwd xmm4, xmm5 ; argb
|
||||
movdqa [rdi], xmm4
|
||||
lea rdi, [rdi + 16]
|
||||
|
||||
ret;
|
||||
|
||||
;The first six integer or pointer arguments are passed in registers
|
||||
; RDI, RSI, RDX, RCX, R8, and R9
|
||||
|
||||
;int
|
||||
;yv12_to_rgb32_amd64_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC yv12_to_rgb32_amd64_sse2
|
||||
push rbx
|
||||
push rsi
|
||||
push rdi
|
||||
push rbp
|
||||
|
||||
push rdi
|
||||
push rdx
|
||||
mov rdi, rcx ; rgbs
|
||||
|
||||
mov rcx, rsi ; width
|
||||
mov rdx, rcx
|
||||
pop rbp ; height
|
||||
mov rax, rbp
|
||||
shr rbp, 1
|
||||
imul rax, rcx ; rax = width * height
|
||||
|
||||
pop rsi ; y
|
||||
|
||||
mov rbx, rsi ; u = y + width * height
|
||||
add rbx, rax
|
||||
|
||||
; local vars
|
||||
; char* yptr1
|
||||
; char* yptr2
|
||||
; char* uptr
|
||||
; char* vptr
|
||||
; int* rgbs1
|
||||
; int* rgbs2
|
||||
; int width
|
||||
sub rsp, 56 ; local vars, 56 bytes
|
||||
mov [rsp + 0], rsi ; save y1
|
||||
add rsi, rdx
|
||||
mov [rsp + 8], rsi ; save y2
|
||||
mov [rsp + 16], rbx ; save u
|
||||
shr rax, 2
|
||||
add rbx, rax ; v = u + (width * height / 4)
|
||||
mov [rsp + 24], rbx ; save v
|
||||
|
||||
mov [rsp + 32], rdi ; save rgbs1
|
||||
mov rax, rdx
|
||||
shl rax, 2
|
||||
add rdi, rax
|
||||
mov [rsp + 40], rdi ; save rgbs2
|
||||
|
||||
loop_y:
|
||||
|
||||
mov rcx, rdx ; width
|
||||
shr rcx, 3
|
||||
|
||||
; save rdx
|
||||
mov [rsp + 48], rdx
|
||||
|
||||
;prefetchnta 4096[rsp + 0] ; y
|
||||
;prefetchnta 1024[rsp + 16] ; u
|
||||
;prefetchnta 1024[rsp + 24] ; v
|
||||
|
||||
loop_x:
|
||||
|
||||
mov rsi, [rsp + 0] ; y1
|
||||
mov rbx, [rsp + 16] ; u
|
||||
mov rdx, [rsp + 24] ; v
|
||||
mov rdi, [rsp + 32] ; rgbs1
|
||||
|
||||
; y1
|
||||
call do8_uv
|
||||
|
||||
mov [rsp + 0], rsi ; y1
|
||||
mov [rsp + 32], rdi ; rgbs1
|
||||
|
||||
mov rsi, [rsp + 8] ; y2
|
||||
mov rdi, [rsp + 40] ; rgbs2
|
||||
|
||||
; y2
|
||||
call do8
|
||||
|
||||
mov [rsp + 8], rsi ; y2
|
||||
mov [rsp + 16], rbx ; u
|
||||
mov [rsp + 24], rdx ; v
|
||||
mov [rsp + 40], rdi ; rgbs2
|
||||
|
||||
dec rcx ; width
|
||||
jnz loop_x
|
||||
|
||||
; restore rdx
|
||||
mov rdx, [rsp + 48]
|
||||
|
||||
; update y1 and 2
|
||||
mov rax, [rsp + 0]
|
||||
mov rbx, rdx
|
||||
add rax, rbx
|
||||
mov [rsp + 0], rax
|
||||
|
||||
mov rax, [rsp + 8]
|
||||
add rax, rbx
|
||||
mov [rsp + 8], rax
|
||||
|
||||
; update rgb1 and 2
|
||||
mov rax, [rsp + 32]
|
||||
mov rbx, rdx
|
||||
shl rbx, 2
|
||||
add rax, rbx
|
||||
mov [rsp + 32], rax
|
||||
|
||||
mov rax, [rsp + 40]
|
||||
add rax, rbx
|
||||
mov [rsp + 40], rax
|
||||
|
||||
mov rcx, rbp
|
||||
dec rcx ; height
|
||||
mov rbp, rcx
|
||||
jnz loop_y
|
||||
|
||||
add rsp, 56
|
||||
|
||||
mov rax, 0
|
||||
pop rbp
|
||||
pop rdi
|
||||
pop rsi
|
||||
pop rbx
|
||||
ret
|
||||
align 16
|
||||
|
||||
|
@ -1,372 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDP_H
|
||||
#define _RDP_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
#include <scrnintstr.h>
|
||||
#include <gcstruct.h>
|
||||
#include <mipointer.h>
|
||||
#include <randrstr.h>
|
||||
|
||||
#include "rdpPri.h"
|
||||
|
||||
#define XRDP_MODULE_NAME "XRDPMOD"
|
||||
#define XRDP_DRIVER_NAME "XRDPDEV"
|
||||
#define XRDP_MOUSE_NAME "XRDPMOUSE"
|
||||
#define XRDP_KEYB_NAME "XRDPKEYB"
|
||||
#define XRDP_VERSION 1000
|
||||
|
||||
#define PACKAGE_VERSION_MAJOR 1
|
||||
#define PACKAGE_VERSION_MINOR 0
|
||||
#define PACKAGE_VERSION_PATCHLEVEL 0
|
||||
|
||||
#define COLOR8(r, g, b) \
|
||||
((((r) >> 5) << 0) | (((g) >> 5) << 3) | (((b) >> 6) << 6))
|
||||
#define COLOR15(r, g, b) \
|
||||
((((r) >> 3) << 10) | (((g) >> 3) << 5) | (((b) >> 3) << 0))
|
||||
#define COLOR16(r, g, b) \
|
||||
((((r) >> 3) << 11) | (((g) >> 2) << 5) | (((b) >> 3) << 0))
|
||||
#define COLOR24(r, g, b) \
|
||||
((((r) >> 0) << 0) | (((g) >> 0) << 8) | (((b) >> 0) << 16))
|
||||
#define SPLITCOLOR32(r, g, b, c) \
|
||||
do { \
|
||||
r = ((c) >> 16) & 0xff; \
|
||||
g = ((c) >> 8) & 0xff; \
|
||||
b = (c) & 0xff; \
|
||||
} while (0)
|
||||
|
||||
/* PIXMAN_a8b8g8r8 */
|
||||
#define XRDP_a8b8g8r8 \
|
||||
((32 << 24) | (3 << 16) | (8 << 12) | (8 << 8) | (8 << 4) | 8)
|
||||
/* PIXMAN_a8r8g8b8 */
|
||||
#define XRDP_a8r8g8b8 \
|
||||
((32 << 24) | (2 << 16) | (8 << 12) | (8 << 8) | (8 << 4) | 8)
|
||||
/* PIXMAN_r5g6b5 */
|
||||
#define XRDP_r5g6b5 \
|
||||
((16 << 24) | (2 << 16) | (0 << 12) | (5 << 8) | (6 << 4) | 5)
|
||||
/* PIXMAN_a1r5g5b5 */
|
||||
#define XRDP_a1r5g5b5 \
|
||||
((16 << 24) | (2 << 16) | (1 << 12) | (5 << 8) | (5 << 4) | 5)
|
||||
/* PIXMAN_r3g3b2 */
|
||||
#define XRDP_r3g3b2 \
|
||||
((8 << 24) | (2 << 16) | (0 << 12) | (3 << 8) | (3 << 4) | 2)
|
||||
|
||||
#define PixelDPI 100
|
||||
#define PixelToMM(_size) (((_size) * 254 + (PixelDPI) * 5) / ((PixelDPI) * 10))
|
||||
|
||||
#define RDPMIN(_val1, _val2) ((_val1) < (_val2) ? (_val1) : (_val2))
|
||||
#define RDPMAX(_val1, _val2) ((_val1) < (_val2) ? (_val2) : (_val1))
|
||||
#define RDPCLAMP(_val, _lo, _hi) \
|
||||
(_val) < (_lo) ? (_lo) : (_val) > (_hi) ? (_hi) : (_val)
|
||||
#define RDPALIGN(_val, _al) ((((long)(_val)) + ((_al) - 1)) & ~((_al) - 1))
|
||||
|
||||
#define XRDP_CD_NODRAW 0
|
||||
#define XRDP_CD_NOCLIP 1
|
||||
#define XRDP_CD_CLIP 2
|
||||
|
||||
#if 0
|
||||
#define RegionCopy DONOTUSE
|
||||
#define RegionTranslate DONOTUSE
|
||||
#define RegionNotEmpty DONOTUSE
|
||||
#define RegionIntersect DONOTUSE
|
||||
#define RegionContainsRect DONOTUSE
|
||||
#define RegionInit DONOTUSE
|
||||
#define RegionUninit DONOTUSE
|
||||
#define RegionFromRects DONOTUSE
|
||||
#define RegionDestroy DONOTUSE
|
||||
#define RegionCreate DONOTUSE
|
||||
#define RegionUnion DONOTUSE
|
||||
#define RegionSubtract DONOTUSE
|
||||
#define RegionInverse DONOTUSE
|
||||
#define RegionExtents DONOTUSE
|
||||
#define RegionReset DONOTUSE
|
||||
#define RegionBreak DONOTUSE
|
||||
#define RegionUnionRect DONOTUSE
|
||||
#endif
|
||||
|
||||
struct image_data
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
int bpp;
|
||||
int Bpp;
|
||||
int lineBytes;
|
||||
char *pixels;
|
||||
char *shmem_pixels;
|
||||
int shmem_id;
|
||||
int shmem_offset;
|
||||
int shmem_lineBytes;
|
||||
};
|
||||
|
||||
/* defined in rdpClientCon.h */
|
||||
typedef struct _rdpClientCon rdpClientCon;
|
||||
|
||||
struct _rdpPointer
|
||||
{
|
||||
int cursor_x;
|
||||
int cursor_y;
|
||||
int old_button_mask;
|
||||
int button_mask;
|
||||
DeviceIntPtr device;
|
||||
};
|
||||
typedef struct _rdpPointer rdpPointer;
|
||||
|
||||
struct _rdpKeyboard
|
||||
{
|
||||
int pause_spe;
|
||||
int ctrl_down;
|
||||
int alt_down;
|
||||
int shift_down;
|
||||
int tab_down;
|
||||
/* this is toggled every time num lock key is released, not like the
|
||||
above *_down vars */
|
||||
int scroll_lock_down;
|
||||
DeviceIntPtr device;
|
||||
};
|
||||
typedef struct _rdpKeyboard rdpKeyboard;
|
||||
|
||||
|
||||
struct _rdpPixmapRec
|
||||
{
|
||||
int status;
|
||||
int rdpindex;
|
||||
int con_number;
|
||||
int is_dirty;
|
||||
int is_scratch;
|
||||
int is_alpha_dirty_not;
|
||||
/* number of times used in a remote operation
|
||||
if this gets above XRDP_USE_COUNT_THRESHOLD
|
||||
then we force remote the pixmap */
|
||||
int use_count;
|
||||
int kind_width;
|
||||
struct rdp_draw_item *draw_item_head;
|
||||
struct rdp_draw_item *draw_item_tail;
|
||||
};
|
||||
typedef struct _rdpPixmapRec rdpPixmapRec;
|
||||
typedef struct _rdpPixmapRec * rdpPixmapPtr;
|
||||
#define GETPIXPRIV(_dev, _pPixmap) (rdpPixmapPtr) \
|
||||
rdpGetPixmapPrivate(&((_pPixmap)->devPrivates), (_dev)->privateKeyRecPixmap)
|
||||
|
||||
struct _rdpCounts
|
||||
{
|
||||
CARD32 rdpFillSpansCallCount; /* 1 */
|
||||
CARD32 rdpSetSpansCallCount;
|
||||
CARD32 rdpPutImageCallCount;
|
||||
CARD32 rdpCopyAreaCallCount;
|
||||
CARD32 rdpCopyPlaneCallCount;
|
||||
CARD32 rdpPolyPointCallCount;
|
||||
CARD32 rdpPolylinesCallCount;
|
||||
CARD32 rdpPolySegmentCallCount;
|
||||
CARD32 rdpPolyRectangleCallCount;
|
||||
CARD32 rdpPolyArcCallCount; /* 10 */
|
||||
CARD32 rdpFillPolygonCallCount;
|
||||
CARD32 rdpPolyFillRectCallCount;
|
||||
CARD32 rdpPolyFillArcCallCount;
|
||||
CARD32 rdpPolyText8CallCount;
|
||||
CARD32 rdpPolyText16CallCount;
|
||||
CARD32 rdpImageText8CallCount;
|
||||
CARD32 rdpImageText16CallCount;
|
||||
CARD32 rdpImageGlyphBltCallCount;
|
||||
CARD32 rdpPolyGlyphBltCallCount;
|
||||
CARD32 rdpPushPixelsCallCount; /* 20 */
|
||||
CARD32 rdpCompositeCallCount;
|
||||
CARD32 rdpCopyWindowCallCount; /* 22 */
|
||||
CARD32 rdpTrapezoidsCallCount;
|
||||
CARD32 callCount[64 - 23];
|
||||
};
|
||||
|
||||
typedef int (*yuv_to_rgb32_proc)(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
|
||||
typedef int (*copy_box_proc)(char *s8, int src_stride,
|
||||
char *d8, int dst_stride,
|
||||
int width, int height);
|
||||
|
||||
/* move this to common header */
|
||||
struct _rdpRec
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
int depth;
|
||||
int paddedWidthInBytes;
|
||||
int sizeInBytes;
|
||||
int num_modes;
|
||||
int bitsPerPixel;
|
||||
int Bpp;
|
||||
int Bpp_mask;
|
||||
char *pfbMemory_alloc;
|
||||
char *pfbMemory;
|
||||
ScreenPtr pScreen;
|
||||
rdpDevPrivateKey privateKeyRecGC;
|
||||
rdpDevPrivateKey privateKeyRecPixmap;
|
||||
|
||||
CopyWindowProcPtr CopyWindow;
|
||||
CreateGCProcPtr CreateGC;
|
||||
CreatePixmapProcPtr CreatePixmap;
|
||||
DestroyPixmapProcPtr DestroyPixmap;
|
||||
ModifyPixmapHeaderProcPtr ModifyPixmapHeader;
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
CompositeProcPtr Composite;
|
||||
GlyphsProcPtr Glyphs;
|
||||
TrapezoidsProcPtr Trapezoids;
|
||||
|
||||
/* keyboard and mouse */
|
||||
miPointerScreenFuncPtr pCursorFuncs;
|
||||
/* mouse */
|
||||
rdpPointer pointer;
|
||||
/* keyboard */
|
||||
rdpKeyboard keyboard;
|
||||
|
||||
/* RandR */
|
||||
RRSetConfigProcPtr rrSetConfig;
|
||||
RRGetInfoProcPtr rrGetInfo;
|
||||
RRScreenSetSizeProcPtr rrScreenSetSize;
|
||||
RRCrtcSetProcPtr rrCrtcSet;
|
||||
RRCrtcSetGammaProcPtr rrCrtcSetGamma;
|
||||
RRCrtcGetGammaProcPtr rrCrtcGetGamma;
|
||||
RROutputSetPropertyProcPtr rrOutputSetProperty;
|
||||
RROutputValidateModeProcPtr rrOutputValidateMode;
|
||||
RRModeDestroyProcPtr rrModeDestroy;
|
||||
RROutputGetPropertyProcPtr rrOutputGetProperty;
|
||||
RRGetPanningProcPtr rrGetPanning;
|
||||
RRSetPanningProcPtr rrSetPanning;
|
||||
|
||||
int listen_sck;
|
||||
char uds_data[256];
|
||||
rdpClientCon *clientConHead;
|
||||
rdpClientCon *clientConTail;
|
||||
|
||||
rdpPixmapRec screenPriv;
|
||||
int sendUpdateScheduled; /* boolean */
|
||||
OsTimerPtr sendUpdateTimer;
|
||||
|
||||
int do_dirty_os; /* boolean */
|
||||
int do_dirty_ons; /* boolean */
|
||||
int disconnect_scheduled; /* boolean */
|
||||
int do_kill_disconnected; /* boolean */
|
||||
|
||||
OsTimerPtr disconnectTimer;
|
||||
int disconnectScheduled; /* boolean */
|
||||
int disconnect_timeout_s;
|
||||
int disconnect_time_ms;
|
||||
|
||||
int conNumber;
|
||||
|
||||
struct _rdpCounts counts;
|
||||
|
||||
yuv_to_rgb32_proc i420_to_rgb32;
|
||||
yuv_to_rgb32_proc yv12_to_rgb32;
|
||||
yuv_to_rgb32_proc yuy2_to_rgb32;
|
||||
yuv_to_rgb32_proc uyvy_to_rgb32;
|
||||
char *xv_data;
|
||||
int xv_data_bytes;
|
||||
int xv_timer_schedualed;
|
||||
OsTimerPtr xv_timer;
|
||||
|
||||
copy_box_proc a8r8g8b8_to_a8b8g8r8_box;
|
||||
|
||||
};
|
||||
typedef struct _rdpRec rdpRec;
|
||||
typedef struct _rdpRec * rdpPtr;
|
||||
#define XRDPPTR(_p) ((rdpPtr)((_p)->driverPrivate))
|
||||
|
||||
struct _rdpGCRec
|
||||
{
|
||||
GCFuncs *funcs;
|
||||
GCOps *ops;
|
||||
};
|
||||
typedef struct _rdpGCRec rdpGCRec;
|
||||
typedef struct _rdpGCRec * rdpGCPtr;
|
||||
|
||||
#define RDI_FILL 1
|
||||
#define RDI_IMGLL 2 /* lossless */
|
||||
#define RDI_IMGLY 3 /* lossy */
|
||||
#define RDI_LINE 4
|
||||
#define RDI_SCRBLT 5
|
||||
#define RDI_TEXT 6
|
||||
|
||||
struct urdp_draw_item_fill
|
||||
{
|
||||
int opcode;
|
||||
int fg_color;
|
||||
int bg_color;
|
||||
int pad0;
|
||||
};
|
||||
|
||||
struct urdp_draw_item_img
|
||||
{
|
||||
int opcode;
|
||||
int pad0;
|
||||
};
|
||||
|
||||
struct urdp_draw_item_line
|
||||
{
|
||||
int opcode;
|
||||
int fg_color;
|
||||
int bg_color;
|
||||
int width;
|
||||
xSegment* segs;
|
||||
int nseg;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct urdp_draw_item_scrblt
|
||||
{
|
||||
int srcx;
|
||||
int srcy;
|
||||
int dstx;
|
||||
int dsty;
|
||||
int cx;
|
||||
int cy;
|
||||
};
|
||||
|
||||
struct urdp_draw_item_text
|
||||
{
|
||||
int opcode;
|
||||
int fg_color;
|
||||
struct rdp_text* rtext; /* in rdpglyph.h */
|
||||
};
|
||||
|
||||
union urdp_draw_item
|
||||
{
|
||||
struct urdp_draw_item_fill fill;
|
||||
struct urdp_draw_item_img img;
|
||||
struct urdp_draw_item_line line;
|
||||
struct urdp_draw_item_scrblt scrblt;
|
||||
struct urdp_draw_item_text text;
|
||||
};
|
||||
|
||||
struct rdp_draw_item
|
||||
{
|
||||
int type; /* RDI_FILL, RDI_IMGLL, ... */
|
||||
int flags;
|
||||
struct rdp_draw_item* prev;
|
||||
struct rdp_draw_item* next;
|
||||
RegionPtr reg;
|
||||
union urdp_draw_item u;
|
||||
};
|
||||
|
||||
#define XRDP_USE_COUNT_THRESHOLD 1
|
||||
#endif
|
@ -1,788 +0,0 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Laxmikant Rashinkar 2014
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Routines to copy regions from framebuffer to shared memory
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpCapture.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
#define RDP_MAX_TILES 1024
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpLimitRects(RegionPtr reg, int max_rects, BoxPtr *rects)
|
||||
{
|
||||
int nrects;
|
||||
|
||||
nrects = REGION_NUM_RECTS(reg);
|
||||
if (nrects > max_rects)
|
||||
{
|
||||
nrects = 1;
|
||||
*rects = rdpRegionExtents(reg);
|
||||
}
|
||||
else
|
||||
{
|
||||
*rects = REGION_RECTS(reg);
|
||||
}
|
||||
return nrects;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* copy rects with no error checking */
|
||||
static int
|
||||
rdpCopyBox_a8r8g8b8_to_a8r8g8b8(rdpClientCon *clientCon,
|
||||
void *src, int src_stride, int srcx, int srcy,
|
||||
void *dst, int dst_stride, int dstx, int dsty,
|
||||
BoxPtr rects, int num_rects)
|
||||
{
|
||||
char *s8;
|
||||
char *d8;
|
||||
int index;
|
||||
int jndex;
|
||||
int bytes;
|
||||
int height;
|
||||
BoxPtr box;
|
||||
|
||||
for (index = 0; index < num_rects; index++)
|
||||
{
|
||||
box = rects + index;
|
||||
s8 = ((char *) src) + (box->y1 - srcy) * src_stride;
|
||||
s8 += (box->x1 - srcx) * 4;
|
||||
d8 = ((char *) dst) + (box->y1 - dsty) * dst_stride;
|
||||
d8 += (box->x1 - dstx) * 4;
|
||||
bytes = box->x2 - box->x1;
|
||||
bytes *= 4;
|
||||
height = box->y2 - box->y1;
|
||||
for (jndex = 0; jndex < height; jndex++)
|
||||
{
|
||||
g_memcpy(d8, s8, bytes);
|
||||
d8 += dst_stride;
|
||||
s8 += src_stride;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpFillBox_yuvalp(int ax, int ay,
|
||||
void *dst, int dst_stride)
|
||||
{
|
||||
dst = ((char *) dst) + (ay << 8) * (dst_stride >> 8) + (ax << 8);
|
||||
g_memset(dst, 0, 64 * 64 * 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* copy rects with no error checking
|
||||
* convert ARGB32 to 64x64 linear planar YUVA */
|
||||
/* http://msdn.microsoft.com/en-us/library/ff635643.aspx
|
||||
* 0.299 -0.168935 0.499813
|
||||
* 0.587 -0.331665 -0.418531
|
||||
* 0.114 0.50059 -0.081282
|
||||
y = r * 0.299000 + g * 0.587000 + b * 0.114000;
|
||||
u = r * -0.168935 + g * -0.331665 + b * 0.500590;
|
||||
v = r * 0.499813 + g * -0.418531 + b * -0.081282; */
|
||||
/* 19595 38470 7471
|
||||
-11071 -21736 32807
|
||||
32756 -27429 -5327 */
|
||||
static int
|
||||
rdpCopyBox_a8r8g8b8_to_yuvalp(int ax, int ay,
|
||||
void *src, int src_stride,
|
||||
void *dst, int dst_stride,
|
||||
BoxPtr rects, int num_rects)
|
||||
{
|
||||
char *s8;
|
||||
char *d8;
|
||||
char *yptr;
|
||||
char *uptr;
|
||||
char *vptr;
|
||||
char *aptr;
|
||||
int *s32;
|
||||
int index;
|
||||
int jndex;
|
||||
int kndex;
|
||||
int width;
|
||||
int height;
|
||||
int pixel;
|
||||
int a;
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int y;
|
||||
int u;
|
||||
int v;
|
||||
BoxPtr box;
|
||||
|
||||
dst = ((char *) dst) + (ay << 8) * (dst_stride >> 8) + (ax << 8);
|
||||
for (index = 0; index < num_rects; index++)
|
||||
{
|
||||
box = rects + index;
|
||||
s8 = ((char *) src) + box->y1 * src_stride;
|
||||
s8 += box->x1 * 4;
|
||||
d8 = ((char *) dst) + (box->y1 - ay) * 64;
|
||||
d8 += box->x1 - ax;
|
||||
width = box->x2 - box->x1;
|
||||
height = box->y2 - box->y1;
|
||||
for (jndex = 0; jndex < height; jndex++)
|
||||
{
|
||||
s32 = (int *) s8;
|
||||
yptr = d8;
|
||||
uptr = yptr + 64 * 64;
|
||||
vptr = uptr + 64 * 64;
|
||||
aptr = vptr + 64 * 64;
|
||||
kndex = 0;
|
||||
while (kndex < width)
|
||||
{
|
||||
pixel = *(s32++);
|
||||
a = (pixel >> 24) & 0xff;
|
||||
r = (pixel >> 16) & 0xff;
|
||||
g = (pixel >> 8) & 0xff;
|
||||
b = (pixel >> 0) & 0xff;
|
||||
y = (r * 19595 + g * 38470 + b * 7471) >> 16;
|
||||
u = (r * -11071 + g * -21736 + b * 32807) >> 16;
|
||||
v = (r * 32756 + g * -27429 + b * -5327) >> 16;
|
||||
u = u + 128;
|
||||
v = v + 128;
|
||||
y = max(y, 0);
|
||||
u = max(u, 0);
|
||||
v = max(v, 0);
|
||||
y = min(y, 255);
|
||||
u = min(u, 255);
|
||||
v = min(v, 255);
|
||||
*(yptr++) = y;
|
||||
*(uptr++) = u;
|
||||
*(vptr++) = v;
|
||||
*(aptr++) = a;
|
||||
kndex++;
|
||||
}
|
||||
d8 += 64;
|
||||
s8 += src_stride;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
a8r8g8b8_to_a8b8g8r8_box(char *s8, int src_stride,
|
||||
char *d8, int dst_stride,
|
||||
int width, int height)
|
||||
{
|
||||
int index;
|
||||
int jndex;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
unsigned int *s32;
|
||||
unsigned int *d32;
|
||||
|
||||
for (index = 0; index < height; index++)
|
||||
{
|
||||
s32 = (unsigned int *) s8;
|
||||
d32 = (unsigned int *) d8;
|
||||
for (jndex = 0; jndex < width; jndex++)
|
||||
{
|
||||
SPLITCOLOR32(red, green, blue, *s32);
|
||||
*d32 = COLOR24(red, green, blue);
|
||||
s32++;
|
||||
d32++;
|
||||
}
|
||||
d8 += dst_stride;
|
||||
s8 += src_stride;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* copy rects with no error checking */
|
||||
static int
|
||||
rdpCopyBox_a8r8g8b8_to_a8b8g8r8(rdpClientCon *clientCon,
|
||||
void *src, int src_stride, int srcx, int srcy,
|
||||
void *dst, int dst_stride, int dstx, int dsty,
|
||||
BoxPtr rects, int num_rects)
|
||||
{
|
||||
char *s8;
|
||||
char *d8;
|
||||
int index;
|
||||
int bytes;
|
||||
int width;
|
||||
int height;
|
||||
BoxPtr box;
|
||||
copy_box_proc copy_box;
|
||||
|
||||
copy_box = clientCon->dev->a8r8g8b8_to_a8b8g8r8_box;
|
||||
for (index = 0; index < num_rects; index++)
|
||||
{
|
||||
box = rects + index;
|
||||
s8 = ((char *) src) + (box->y1 - srcy) * src_stride;
|
||||
s8 += (box->x1 - srcx) * 4;
|
||||
d8 = ((char *) dst) + (box->y1 - dsty) * dst_stride;
|
||||
d8 += (box->x1 - dstx) * 4;
|
||||
bytes = box->x2 - box->x1;
|
||||
bytes *= 4;
|
||||
width = box->x2 - box->x1;
|
||||
height = box->y2 - box->y1;
|
||||
copy_box(s8, src_stride, d8, dst_stride, width, height);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static Bool
|
||||
rdpCapture0(rdpClientCon *clientCon,
|
||||
RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||
void *src, int src_width, int src_height,
|
||||
int src_stride, int src_format,
|
||||
void *dst, int dst_width, int dst_height,
|
||||
int dst_stride, int dst_format, int max_rects)
|
||||
{
|
||||
BoxPtr psrc_rects;
|
||||
BoxRec rect;
|
||||
RegionRec reg;
|
||||
char *src_rect;
|
||||
char *dst_rect;
|
||||
int num_rects;
|
||||
int src_bytespp;
|
||||
int dst_bytespp;
|
||||
int width;
|
||||
int height;
|
||||
int src_offset;
|
||||
int dst_offset;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
Bool rv;
|
||||
unsigned int *s32;
|
||||
unsigned short *d16;
|
||||
unsigned char *d8;
|
||||
|
||||
LLOGLN(10, ("rdpCapture0:"));
|
||||
|
||||
rv = TRUE;
|
||||
|
||||
rect.x1 = 0;
|
||||
rect.y1 = 0;
|
||||
rect.x2 = RDPMIN(dst_width, src_width);
|
||||
rect.y2 = RDPMIN(dst_height, src_height);
|
||||
rdpRegionInit(®, &rect, 0);
|
||||
rdpRegionIntersect(®, in_reg, ®);
|
||||
|
||||
psrc_rects = 0;
|
||||
num_rects = rdpLimitRects(®, max_rects, &psrc_rects);
|
||||
if (num_rects < 1)
|
||||
{
|
||||
rdpRegionUninit(®);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*num_out_rects = num_rects;
|
||||
|
||||
*out_rects = (BoxPtr) g_malloc(sizeof(BoxRec) * num_rects, 0);
|
||||
for (i = 0; i < num_rects; i++)
|
||||
{
|
||||
rect = psrc_rects[i];
|
||||
(*out_rects)[i] = rect;
|
||||
}
|
||||
|
||||
if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_a8r8g8b8))
|
||||
{
|
||||
rdpCopyBox_a8r8g8b8_to_a8r8g8b8(clientCon,
|
||||
src, src_stride, 0, 0,
|
||||
dst, dst_stride, 0, 0,
|
||||
psrc_rects, num_rects);
|
||||
}
|
||||
else if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_a8b8g8r8))
|
||||
{
|
||||
rdpCopyBox_a8r8g8b8_to_a8b8g8r8(clientCon,
|
||||
src, src_stride, 0, 0,
|
||||
dst, dst_stride, 0, 0,
|
||||
psrc_rects, num_rects);
|
||||
}
|
||||
else if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_r5g6b5))
|
||||
{
|
||||
src_bytespp = 4;
|
||||
dst_bytespp = 2;
|
||||
|
||||
for (i = 0; i < num_rects; i++)
|
||||
{
|
||||
/* get rect to copy */
|
||||
rect = (*out_rects)[i];
|
||||
|
||||
/* get rect dimensions */
|
||||
width = rect.x2 - rect.x1;
|
||||
height = rect.y2 - rect.y1;
|
||||
|
||||
/* point to start of each rect in respective memory */
|
||||
src_offset = rect.y1 * src_stride + rect.x1 * src_bytespp;
|
||||
dst_offset = rect.y1 * dst_stride + rect.x1 * dst_bytespp;
|
||||
src_rect = src + src_offset;
|
||||
dst_rect = dst + dst_offset;
|
||||
|
||||
/* copy one line at a time */
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
s32 = (unsigned int *) src_rect;
|
||||
d16 = (unsigned short *) dst_rect;
|
||||
for (k = 0; k < width; k++)
|
||||
{
|
||||
SPLITCOLOR32(red, green, blue, *s32);
|
||||
*d16 = COLOR16(red, green, blue);
|
||||
s32++;
|
||||
d16++;
|
||||
}
|
||||
src_rect += src_stride;
|
||||
dst_rect += dst_stride;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_a1r5g5b5))
|
||||
{
|
||||
src_bytespp = 4;
|
||||
dst_bytespp = 2;
|
||||
|
||||
for (i = 0; i < num_rects; i++)
|
||||
{
|
||||
/* get rect to copy */
|
||||
rect = (*out_rects)[i];
|
||||
|
||||
/* get rect dimensions */
|
||||
width = rect.x2 - rect.x1;
|
||||
height = rect.y2 - rect.y1;
|
||||
|
||||
/* point to start of each rect in respective memory */
|
||||
src_offset = rect.y1 * src_stride + rect.x1 * src_bytespp;
|
||||
dst_offset = rect.y1 * dst_stride + rect.x1 * dst_bytespp;
|
||||
src_rect = src + src_offset;
|
||||
dst_rect = dst + dst_offset;
|
||||
|
||||
/* copy one line at a time */
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
s32 = (unsigned int *) src_rect;
|
||||
d16 = (unsigned short *) dst_rect;
|
||||
for (k = 0; k < width; k++)
|
||||
{
|
||||
SPLITCOLOR32(red, green, blue, *s32);
|
||||
*d16 = COLOR15(red, green, blue);
|
||||
s32++;
|
||||
d16++;
|
||||
}
|
||||
src_rect += src_stride;
|
||||
dst_rect += dst_stride;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_r3g3b2))
|
||||
{
|
||||
src_bytespp = 4;
|
||||
dst_bytespp = 1;
|
||||
|
||||
for (i = 0; i < num_rects; i++)
|
||||
{
|
||||
/* get rect to copy */
|
||||
rect = (*out_rects)[i];
|
||||
|
||||
/* get rect dimensions */
|
||||
width = rect.x2 - rect.x1;
|
||||
height = rect.y2 - rect.y1;
|
||||
|
||||
/* point to start of each rect in respective memory */
|
||||
src_offset = rect.y1 * src_stride + rect.x1 * src_bytespp;
|
||||
dst_offset = rect.y1 * dst_stride + rect.x1 * dst_bytespp;
|
||||
src_rect = src + src_offset;
|
||||
dst_rect = dst + dst_offset;
|
||||
|
||||
/* copy one line at a time */
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
s32 = (unsigned int *) src_rect;
|
||||
d8 = (unsigned char *) dst_rect;
|
||||
for (k = 0; k < width; k++)
|
||||
{
|
||||
SPLITCOLOR32(red, green, blue, *s32);
|
||||
*d8 = COLOR8(red, green, blue);
|
||||
s32++;
|
||||
d8++;
|
||||
}
|
||||
src_rect += src_stride;
|
||||
dst_rect += dst_stride;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture0: unimp color conversion"));
|
||||
}
|
||||
rdpRegionUninit(®);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* make out_rects always multiple of 16 width and height */
|
||||
static Bool
|
||||
rdpCapture1(rdpClientCon *clientCon,
|
||||
RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||
void *src, int src_width, int src_height,
|
||||
int src_stride, int src_format,
|
||||
void *dst, int dst_width, int dst_height,
|
||||
int dst_stride, int dst_format, int max_rects)
|
||||
{
|
||||
BoxPtr psrc_rects;
|
||||
BoxRec rect;
|
||||
RegionRec reg;
|
||||
char *src_rect;
|
||||
char *dst_rect;
|
||||
int num_regions;
|
||||
int src_bytespp;
|
||||
int dst_bytespp;
|
||||
int width;
|
||||
int height;
|
||||
int min_width;
|
||||
int min_height;
|
||||
int src_offset;
|
||||
int dst_offset;
|
||||
int index;
|
||||
int jndex;
|
||||
int kndex;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int ex;
|
||||
int ey;
|
||||
Bool rv;
|
||||
unsigned int *s32;
|
||||
unsigned int *d32;
|
||||
|
||||
LLOGLN(10, ("rdpCapture1:"));
|
||||
|
||||
rv = TRUE;
|
||||
|
||||
min_width = RDPMIN(dst_width, src_width);
|
||||
min_height = RDPMIN(dst_height, src_height);
|
||||
|
||||
rect.x1 = 0;
|
||||
rect.y1 = 0;
|
||||
rect.x2 = min_width;
|
||||
rect.y2 = min_height;
|
||||
rdpRegionInit(®, &rect, 0);
|
||||
rdpRegionIntersect(®, in_reg, ®);
|
||||
|
||||
num_regions = REGION_NUM_RECTS(®);
|
||||
|
||||
if (num_regions > max_rects)
|
||||
{
|
||||
num_regions = 1;
|
||||
psrc_rects = rdpRegionExtents(®);
|
||||
}
|
||||
else
|
||||
{
|
||||
psrc_rects = REGION_RECTS(®);
|
||||
}
|
||||
|
||||
if (num_regions < 1)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*num_out_rects = num_regions;
|
||||
|
||||
*out_rects = (BoxPtr) g_malloc(sizeof(BoxRec) * num_regions * 4, 0);
|
||||
index = 0;
|
||||
while (index < num_regions)
|
||||
{
|
||||
rect = psrc_rects[index];
|
||||
width = rect.x2 - rect.x1;
|
||||
height = rect.y2 - rect.y1;
|
||||
ex = ((width + 15) & ~15) - width;
|
||||
if (ex != 0)
|
||||
{
|
||||
rect.x2 += ex;
|
||||
if (rect.x2 > min_width)
|
||||
{
|
||||
rect.x1 -= rect.x2 - min_width;
|
||||
rect.x2 = min_width;
|
||||
}
|
||||
if (rect.x1 < 0)
|
||||
{
|
||||
rect.x1 += 16;
|
||||
}
|
||||
}
|
||||
ey = ((height + 15) & ~15) - height;
|
||||
if (ey != 0)
|
||||
{
|
||||
rect.y2 += ey;
|
||||
if (rect.y2 > min_height)
|
||||
{
|
||||
rect.y1 -= rect.y2 - min_height;
|
||||
rect.y2 = min_height;
|
||||
}
|
||||
if (rect.y1 < 0)
|
||||
{
|
||||
rect.y1 += 16;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if (rect.x1 < 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: error"));
|
||||
}
|
||||
if (rect.y1 < 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: error"));
|
||||
}
|
||||
if (rect.x2 > min_width)
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: error"));
|
||||
}
|
||||
if (rect.y2 > min_height)
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: error"));
|
||||
}
|
||||
if ((rect.x2 - rect.x1) % 16 != 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: error"));
|
||||
}
|
||||
if ((rect.y2 - rect.y1) % 16 != 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: error"));
|
||||
}
|
||||
#endif
|
||||
(*out_rects)[index] = rect;
|
||||
index++;
|
||||
}
|
||||
|
||||
if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_a8b8g8r8))
|
||||
{
|
||||
src_bytespp = 4;
|
||||
dst_bytespp = 4;
|
||||
|
||||
for (index = 0; index < num_regions; index++)
|
||||
{
|
||||
/* get rect to copy */
|
||||
rect = (*out_rects)[index];
|
||||
|
||||
/* get rect dimensions */
|
||||
width = rect.x2 - rect.x1;
|
||||
height = rect.y2 - rect.y1;
|
||||
|
||||
/* point to start of each rect in respective memory */
|
||||
src_offset = rect.y1 * src_stride + rect.x1 * src_bytespp;
|
||||
dst_offset = rect.y1 * dst_stride + rect.x1 * dst_bytespp;
|
||||
src_rect = src + src_offset;
|
||||
dst_rect = dst + dst_offset;
|
||||
|
||||
/* copy one line at a time */
|
||||
for (jndex = 0; jndex < height; jndex++)
|
||||
{
|
||||
s32 = (unsigned int *) src_rect;
|
||||
d32 = (unsigned int *) dst_rect;
|
||||
for (kndex = 0; kndex < width; kndex++)
|
||||
{
|
||||
SPLITCOLOR32(red, green, blue, *s32);
|
||||
*d32 = COLOR24(red, green, blue);
|
||||
s32++;
|
||||
d32++;
|
||||
}
|
||||
src_rect += src_stride;
|
||||
dst_rect += dst_stride;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLOGLN(0, ("rdpCapture1: unimp color conversion"));
|
||||
}
|
||||
rdpRegionUninit(®);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static Bool
|
||||
rdpCapture2(rdpClientCon *clientCon,
|
||||
RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||
void *src, int src_width, int src_height,
|
||||
int src_stride, int src_format,
|
||||
void *dst, int dst_width, int dst_height,
|
||||
int dst_stride, int dst_format, int max_rects)
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int out_rect_index;
|
||||
int num_rects;
|
||||
int rcode;
|
||||
BoxRec rect;
|
||||
BoxRec extents_rect;
|
||||
BoxPtr rects;
|
||||
RegionRec tile_reg;
|
||||
RegionRec lin_reg;
|
||||
RegionRec temp_reg;
|
||||
RegionPtr pin_reg;
|
||||
|
||||
LLOGLN(10, ("rdpCapture2:"));
|
||||
|
||||
*out_rects = (BoxPtr) g_malloc(sizeof(BoxRec) * RDP_MAX_TILES, 0);
|
||||
if (*out_rects == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
out_rect_index = 0;
|
||||
|
||||
/* clip for smaller of 2 */
|
||||
rect.x1 = 0;
|
||||
rect.y1 = 0;
|
||||
rect.x2 = min(dst_width, src_width);
|
||||
rect.y2 = min(dst_height, src_height);
|
||||
rdpRegionInit(&temp_reg, &rect, 0);
|
||||
rdpRegionIntersect(&temp_reg, in_reg, &temp_reg);
|
||||
|
||||
/* limit the numer of rects */
|
||||
num_rects = REGION_NUM_RECTS(&temp_reg);
|
||||
if (num_rects > max_rects)
|
||||
{
|
||||
LLOGLN(10, ("rdpCapture2: too many rects"));
|
||||
rdpRegionInit(&lin_reg, rdpRegionExtents(&temp_reg), 0);
|
||||
pin_reg = &lin_reg;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLOGLN(10, ("rdpCapture2: not too many rects"));
|
||||
rdpRegionInit(&lin_reg, NullBox, 0);
|
||||
pin_reg = &temp_reg;
|
||||
}
|
||||
extents_rect = *rdpRegionExtents(pin_reg);
|
||||
y = extents_rect.y1 & ~63;
|
||||
while (y < extents_rect.y2)
|
||||
{
|
||||
x = extents_rect.x1 & ~63;
|
||||
while (x < extents_rect.x2)
|
||||
{
|
||||
rect.x1 = x;
|
||||
rect.y1 = y;
|
||||
rect.x2 = rect.x1 + 64;
|
||||
rect.y2 = rect.y1 + 64;
|
||||
rcode = rdpRegionContainsRect(pin_reg, &rect);
|
||||
LLOGLN(10, ("rdpCapture2: rcode %d", rcode));
|
||||
|
||||
if (rcode != rgnOUT)
|
||||
{
|
||||
if (rcode == rgnPART)
|
||||
{
|
||||
LLOGLN(10, ("rdpCapture2: rgnPART"));
|
||||
rdpFillBox_yuvalp(x, y, dst, dst_stride);
|
||||
rdpRegionInit(&tile_reg, &rect, 0);
|
||||
rdpRegionIntersect(&tile_reg, pin_reg, &tile_reg);
|
||||
rects = REGION_RECTS(&tile_reg);
|
||||
num_rects = REGION_NUM_RECTS(&tile_reg);
|
||||
rdpCopyBox_a8r8g8b8_to_yuvalp(x, y,
|
||||
src, src_stride,
|
||||
dst, dst_stride,
|
||||
rects, num_rects);
|
||||
rdpRegionUninit(&tile_reg);
|
||||
}
|
||||
else /* rgnIN */
|
||||
{
|
||||
LLOGLN(10, ("rdpCapture2: rgnIN"));
|
||||
rdpCopyBox_a8r8g8b8_to_yuvalp(x, y,
|
||||
src, src_stride,
|
||||
dst, dst_stride,
|
||||
&rect, 1);
|
||||
}
|
||||
(*out_rects)[out_rect_index] = rect;
|
||||
out_rect_index++;
|
||||
if (out_rect_index >= RDP_MAX_TILES)
|
||||
{
|
||||
g_free(*out_rects);
|
||||
*out_rects = NULL;
|
||||
rdpRegionUninit(&temp_reg);
|
||||
rdpRegionUninit(&lin_reg);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
x += 64;
|
||||
}
|
||||
y += 64;
|
||||
}
|
||||
*num_out_rects = out_rect_index;
|
||||
rdpRegionUninit(&temp_reg);
|
||||
rdpRegionUninit(&lin_reg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy an array of rectangles from one memory area to another
|
||||
*****************************************************************************/
|
||||
Bool
|
||||
rdpCapture(rdpClientCon *clientCon,
|
||||
RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||
void *src, int src_width, int src_height,
|
||||
int src_stride, int src_format,
|
||||
void *dst, int dst_width, int dst_height,
|
||||
int dst_stride, int dst_format, int mode)
|
||||
{
|
||||
LLOGLN(10, ("rdpCapture:"));
|
||||
LLOGLN(10, ("rdpCapture: src %p dst %p", src, dst));
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
return rdpCapture0(clientCon, in_reg, out_rects, num_out_rects,
|
||||
src, src_width, src_height,
|
||||
src_stride, src_format,
|
||||
dst, dst_width, dst_height,
|
||||
dst_stride, dst_format, 15);
|
||||
case 1:
|
||||
return rdpCapture1(clientCon, in_reg, out_rects, num_out_rects,
|
||||
src, src_width, src_height,
|
||||
src_stride, src_format,
|
||||
dst, dst_width, dst_height,
|
||||
dst_stride, dst_format, 15);
|
||||
case 2:
|
||||
return rdpCapture2(clientCon, in_reg, out_rects, num_out_rects,
|
||||
src, src_width, src_height,
|
||||
src_stride, src_format,
|
||||
dst, dst_width, dst_height,
|
||||
dst_stride, dst_format, 15);
|
||||
default:
|
||||
LLOGLN(0, ("rdpCapture: unimp mode"));
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Laxmikant Rashinkar 2014
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Routines to copy regions from framebuffer to shared memory
|
||||
*/
|
||||
|
||||
#ifndef __RDPCAPTURE_H
|
||||
#define __RDPCAPTURE_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpCapture(rdpClientCon *clientCon,
|
||||
RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||
void *src, int src_width, int src_height,
|
||||
int src_stride, int src_format,
|
||||
void *dst, int dst_width, int dst_height,
|
||||
int dst_stride, int dst_format, int mode);
|
||||
|
||||
extern _X_EXPORT int
|
||||
a8r8g8b8_to_a8b8g8r8_box(char *s8, int src_stride,
|
||||
char *d8, int dst_stride,
|
||||
int width, int height);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,168 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Client connection to xrdp
|
||||
|
||||
*/
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
/* in xrdp/common */
|
||||
#include "xrdp_client_info.h"
|
||||
#include "xrdp_constants.h"
|
||||
|
||||
#ifndef _RDPCLIENTCON_H
|
||||
#define _RDPCLIENTCON_H
|
||||
|
||||
/* used in rdpGlyphs.c */
|
||||
struct font_cache
|
||||
{
|
||||
int offset;
|
||||
int baseline;
|
||||
int width;
|
||||
int height;
|
||||
int crc;
|
||||
int stamp;
|
||||
};
|
||||
|
||||
struct rdpup_os_bitmap
|
||||
{
|
||||
int used;
|
||||
PixmapPtr pixmap;
|
||||
rdpPixmapPtr priv;
|
||||
int stamp;
|
||||
};
|
||||
|
||||
/* one of these for each client */
|
||||
struct _rdpClientCon
|
||||
{
|
||||
rdpPtr dev;
|
||||
|
||||
int sck;
|
||||
int sckControlListener;
|
||||
int sckControl;
|
||||
struct stream *out_s;
|
||||
struct stream *in_s;
|
||||
|
||||
int rectIdAck;
|
||||
int rectId;
|
||||
int connected; /* boolean */
|
||||
int begin; /* boolean */
|
||||
int count;
|
||||
int sckClosed; /* boolean */
|
||||
struct rdpup_os_bitmap *osBitmaps;
|
||||
int maxOsBitmaps;
|
||||
int osBitmapStamp;
|
||||
int osBitmapAllocSize;
|
||||
int osBitmapNumUsed;
|
||||
int doComposite;
|
||||
int doGlyphCache;
|
||||
int canDoPixToPix;
|
||||
int doMultimon;
|
||||
|
||||
int rdp_bpp; /* client depth */
|
||||
int rdp_Bpp;
|
||||
int rdp_Bpp_mask;
|
||||
int rdp_width;
|
||||
int rdp_height;
|
||||
int rdp_format; /* XRDP_a8r8g8b8, XRDP_r5g6b5, ... */
|
||||
int cap_width;
|
||||
int cap_height;
|
||||
|
||||
int rdpIndex; /* current os target */
|
||||
|
||||
int conNumber;
|
||||
|
||||
/* rdpGlyphs.c */
|
||||
struct font_cache font_cache[12][256];
|
||||
int font_stamp;
|
||||
|
||||
struct xrdp_client_info client_info;
|
||||
|
||||
char *shmemptr;
|
||||
int shmemid;
|
||||
int shmem_lineBytes;
|
||||
RegionPtr shmRegion;
|
||||
int rect_id;
|
||||
int rect_id_ack;
|
||||
|
||||
OsTimerPtr updateTimer;
|
||||
int updateSchedualed; /* boolean */
|
||||
|
||||
RegionPtr dirtyRegion;
|
||||
|
||||
struct _rdpClientCon *next;
|
||||
};
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpClientConBeginUpdate(rdpPtr dev, rdpClientCon *clientCon);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConEndUpdate(rdpPtr dev, rdpClientCon *clientCon);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConSetFgcolor(rdpPtr dev, rdpClientCon *clientCon, int fgcolor);
|
||||
extern _X_EXPORT void
|
||||
rdpClientConSendArea(rdpPtr dev, rdpClientCon *clientCon,
|
||||
struct image_data *id, int x, int y, int w, int h);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConFillRect(rdpPtr dev, rdpClientCon *clientCon,
|
||||
short x, short y, int cx, int cy);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConCheck(ScreenPtr pScreen);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConInit(rdpPtr dev);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConDeinit(rdpPtr dev);
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpClientConDeleteOsSurface(rdpPtr dev, rdpClientCon *clientCon, int rdpindex);
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpClientConRemoveOsBitmap(rdpPtr dev, rdpClientCon *clientCon, int rdpindex);
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpClientConScheduleDeferredUpdate(rdpPtr dev);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConCheckDirtyScreen(rdpPtr dev, rdpClientCon *clientCon);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConAddDirtyScreenReg(rdpPtr dev, rdpClientCon *clientCon,
|
||||
RegionPtr reg);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConAddDirtyScreenBox(rdpPtr dev, rdpClientCon *clientCon,
|
||||
BoxPtr box);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConAddDirtyScreen(rdpPtr dev, rdpClientCon *clientCon,
|
||||
int x, int y, int cx, int cy);
|
||||
extern _X_EXPORT void
|
||||
rdpClientConGetScreenImageRect(rdpPtr dev, rdpClientCon *clientCon,
|
||||
struct image_data *id);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConAddAllReg(rdpPtr dev, RegionPtr reg, DrawablePtr pDrawable);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConAddAllBox(rdpPtr dev, BoxPtr box, DrawablePtr pDrawable);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConSetCursor(rdpPtr dev, rdpClientCon *clientCon,
|
||||
short x, short y, char *cur_data, char *cur_mask);
|
||||
extern _X_EXPORT int
|
||||
rdpClientConSetCursorEx(rdpPtr dev, rdpClientCon *clientCon,
|
||||
short x, short y, char *cur_data,
|
||||
char *cur_mask, int bpp);
|
||||
|
||||
#endif
|
@ -1,94 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
composite(alpha blending) calls
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "mipict.h"
|
||||
#include <picture.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpComposite.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpCompositeOrg(PictureScreenPtr ps, rdpPtr dev,
|
||||
CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
|
||||
INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask,
|
||||
INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
|
||||
{
|
||||
ps->Composite = dev->Composite;
|
||||
ps->Composite(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask,
|
||||
xDst, yDst, width, height);
|
||||
ps->Composite = rdpComposite;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
|
||||
INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst,
|
||||
INT16 yDst, CARD16 width, CARD16 height)
|
||||
{
|
||||
ScreenPtr pScreen;
|
||||
rdpPtr dev;
|
||||
PictureScreenPtr ps;
|
||||
BoxRec box;
|
||||
RegionRec reg;
|
||||
|
||||
LLOGLN(10, ("rdpComposite:"));
|
||||
pScreen = pDst->pDrawable->pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
dev->counts.rdpCompositeCallCount++;
|
||||
box.x1 = xDst + pDst->pDrawable->x;
|
||||
box.y1 = yDst + pDst->pDrawable->y;
|
||||
box.x2 = box.x1 + width;
|
||||
box.y2 = box.y1 + height;
|
||||
rdpRegionInit(®, &box, 0);
|
||||
if (pDst->pCompositeClip != NULL)
|
||||
{
|
||||
rdpRegionIntersect(®, pDst->pCompositeClip, ®);
|
||||
}
|
||||
ps = GetPictureScreen(pScreen);
|
||||
/* do original call */
|
||||
rdpCompositeOrg(ps, dev, op, pSrc, pMask, pDst, xSrc, ySrc,
|
||||
xMask, yMask, xDst, yDst, width, height);
|
||||
rdpClientConAddAllReg(dev, ®, pDst->pDrawable);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
composite(alpha blending) calls
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDPCOMPOSITE_H
|
||||
#define _RDPCOMPOSITE_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
|
||||
INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst,
|
||||
INT16 yDst, CARD16 width, CARD16 height);
|
||||
|
||||
#endif
|
@ -1,94 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpCopyArea.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static RegionPtr
|
||||
rdpCopyAreaOrg(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
|
||||
int srcx, int srcy, int w, int h, int dstx, int dsty)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
RegionPtr rv;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
rv = pGC->ops->CopyArea(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
RegionPtr
|
||||
rdpCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
|
||||
int srcx, int srcy, int w, int h, int dstx, int dsty)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionPtr rv;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpCopyArea:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpCopyAreaCallCount++;
|
||||
box.x1 = dstx + pDst->x;
|
||||
box.y1 = dsty + pDst->y;
|
||||
box.x2 = box.x1 + w;
|
||||
box.y2 = box.y1 + h;
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDst, pGC);
|
||||
LLOGLN(10, ("rdpCopyArea: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rv = rdpCopyAreaOrg(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDst);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
return rv;
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2013 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPCOPYAREA_H
|
||||
#define __RDPCOPYAREA_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
RegionPtr
|
||||
rdpCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
|
||||
int srcx, int srcy, int w, int h, int dstx, int dsty);
|
||||
|
||||
#endif
|
@ -1,98 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpCopyPlane.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static RegionPtr
|
||||
rdpCopyPlaneOrg(DrawablePtr pSrc, DrawablePtr pDst,
|
||||
GCPtr pGC, int srcx, int srcy, int w, int h,
|
||||
int dstx, int dsty, unsigned long bitPlane)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
RegionPtr rv;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
rv = pGC->ops->CopyPlane(pSrc, pDst, pGC, srcx, srcy,
|
||||
w, h, dstx, dsty, bitPlane);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
RegionPtr
|
||||
rdpCopyPlane(DrawablePtr pSrc, DrawablePtr pDst,
|
||||
GCPtr pGC, int srcx, int srcy, int w, int h,
|
||||
int dstx, int dsty, unsigned long bitPlane)
|
||||
{
|
||||
RegionPtr rv;
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpCopyPlane:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpCopyPlaneCallCount++;
|
||||
box.x1 = pDst->x + dstx;
|
||||
box.y1 = pDst->y + dsty;
|
||||
box.x2 = box.x1 + w;
|
||||
box.y2 = box.x1 + h;
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDst, pGC);
|
||||
LLOGLN(10, ("rdpCopyPlane: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rv = rdpCopyPlaneOrg(pSrc, pDst, pGC, srcx, srcy, w, h,
|
||||
dstx, dsty, bitPlane);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDst);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
return rv;
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPCOPYPLANE_H
|
||||
#define __RDPCOPYPLANE_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
RegionPtr
|
||||
rdpCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
|
||||
GCPtr pGC, int srcx, int srcy, int width, int height,
|
||||
int dstx, int dsty, unsigned long bitPlane);
|
||||
|
||||
#endif
|
@ -1,358 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
cursor
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
#include <cursor.h>
|
||||
#include <cursorstr.h>
|
||||
|
||||
#include <X11/Xarch.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpMain.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpCursor.h"
|
||||
|
||||
#ifndef X_BYTE_ORDER
|
||||
#warning X_BYTE_ORDER not defined
|
||||
#endif
|
||||
|
||||
#if (X_BYTE_ORDER == X_LITTLE_ENDIAN)
|
||||
/* Copied from Xvnc/lib/font/util/utilbitmap.c */
|
||||
static unsigned char g_reverse_byte[0x100] =
|
||||
{
|
||||
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
|
||||
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
|
||||
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
||||
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
|
||||
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
|
||||
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
||||
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
|
||||
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
|
||||
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
||||
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
|
||||
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
|
||||
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
||||
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
|
||||
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
|
||||
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
||||
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
|
||||
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
|
||||
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
||||
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
|
||||
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
|
||||
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
||||
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
|
||||
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
|
||||
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
||||
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
|
||||
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
|
||||
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
||||
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
|
||||
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
|
||||
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
||||
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
|
||||
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
|
||||
};
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs)
|
||||
{
|
||||
LLOGLN(10, ("rdpSpriteRealizeCursor:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs)
|
||||
{
|
||||
LLOGLN(10, ("rdpSpriteUnrealizeCursor:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
get_pixel_safe(char *data, int x, int y, int width, int height, int bpp)
|
||||
{
|
||||
int start;
|
||||
int shift;
|
||||
int c;
|
||||
unsigned int *src32;
|
||||
|
||||
if (x < 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (y < 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (x >= width)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (y >= height)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (bpp == 1)
|
||||
{
|
||||
width = (width + 7) / 8;
|
||||
start = (y * width) + x / 8;
|
||||
shift = x % 8;
|
||||
c = (unsigned char)(data[start]);
|
||||
#if (X_BYTE_ORDER == X_LITTLE_ENDIAN)
|
||||
return (g_reverse_byte[c] & (0x80 >> shift)) != 0;
|
||||
#else
|
||||
return (c & (0x80 >> shift)) != 0;
|
||||
#endif
|
||||
}
|
||||
else if (bpp == 32)
|
||||
{
|
||||
src32 = (unsigned int*)data;
|
||||
return src32[y * width + x];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
set_pixel_safe(char *data, int x, int y, int width, int height, int bpp,
|
||||
int pixel)
|
||||
{
|
||||
int start;
|
||||
int shift;
|
||||
unsigned int *dst32;
|
||||
|
||||
if (x < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (y < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (x >= width)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (y >= height)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (bpp == 1)
|
||||
{
|
||||
width = (width + 7) / 8;
|
||||
start = (y * width) + x / 8;
|
||||
shift = x % 8;
|
||||
|
||||
if (pixel & 1)
|
||||
{
|
||||
data[start] = data[start] | (0x80 >> shift);
|
||||
}
|
||||
else
|
||||
{
|
||||
data[start] = data[start] & ~(0x80 >> shift);
|
||||
}
|
||||
}
|
||||
else if (bpp == 24)
|
||||
{
|
||||
*(data + (3 * (y * width + x)) + 0) = pixel >> 0;
|
||||
*(data + (3 * (y * width + x)) + 1) = pixel >> 8;
|
||||
*(data + (3 * (y * width + x)) + 2) = pixel >> 16;
|
||||
}
|
||||
else if (bpp == 32)
|
||||
{
|
||||
dst32 = (unsigned int*)data;
|
||||
dst32[y * width + x] = pixel;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpSpriteSetCursorCon(rdpClientCon *clientCon,
|
||||
DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs,
|
||||
int x, int y)
|
||||
{
|
||||
char cur_data[32 * (32 * 4)];
|
||||
char cur_mask[32 * (32 / 8)];
|
||||
char *mask;
|
||||
char *data;
|
||||
int i;
|
||||
int j;
|
||||
int w;
|
||||
int h;
|
||||
int p;
|
||||
int xhot;
|
||||
int yhot;
|
||||
int paddedRowBytes;
|
||||
int fgcolor;
|
||||
int bgcolor;
|
||||
int bpp;
|
||||
|
||||
LLOGLN(10, ("rdpSpriteSetCursorCon:"));
|
||||
|
||||
w = pCurs->bits->width;
|
||||
h = pCurs->bits->height;
|
||||
if ((pCurs->bits->argb != 0) &&
|
||||
(clientCon->client_info.pointer_flags & 1))
|
||||
{
|
||||
bpp = 32;
|
||||
paddedRowBytes = PixmapBytePad(w, 32);
|
||||
xhot = pCurs->bits->xhot;
|
||||
yhot = pCurs->bits->yhot;
|
||||
data = (char *)(pCurs->bits->argb);
|
||||
memset(cur_data, 0, sizeof(cur_data));
|
||||
memset(cur_mask, 0, sizeof(cur_mask));
|
||||
|
||||
for (j = 0; j < 32; j++)
|
||||
{
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
p = get_pixel_safe(data, i, j, paddedRowBytes / 4, h, 32);
|
||||
set_pixel_safe(cur_data, i, 31 - j, 32, 32, 32, p);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bpp = 0;
|
||||
paddedRowBytes = PixmapBytePad(w, 1);
|
||||
xhot = pCurs->bits->xhot;
|
||||
yhot = pCurs->bits->yhot;
|
||||
data = (char *)(pCurs->bits->source);
|
||||
mask = (char *)(pCurs->bits->mask);
|
||||
fgcolor = (((pCurs->foreRed >> 8) & 0xff) << 16) |
|
||||
(((pCurs->foreGreen >> 8) & 0xff) << 8) |
|
||||
((pCurs->foreBlue >> 8) & 0xff);
|
||||
bgcolor = (((pCurs->backRed >> 8) & 0xff) << 16) |
|
||||
(((pCurs->backGreen >> 8) & 0xff) << 8) |
|
||||
((pCurs->backBlue >> 8) & 0xff);
|
||||
memset(cur_data, 0, sizeof(cur_data));
|
||||
memset(cur_mask, 0, sizeof(cur_mask));
|
||||
|
||||
for (j = 0; j < 32; j++)
|
||||
{
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
p = get_pixel_safe(mask, i, j, paddedRowBytes * 8, h, 1);
|
||||
set_pixel_safe(cur_mask, i, 31 - j, 32, 32, 1, !p);
|
||||
|
||||
if (p != 0)
|
||||
{
|
||||
p = get_pixel_safe(data, i, j, paddedRowBytes * 8, h, 1);
|
||||
p = p ? fgcolor : bgcolor;
|
||||
set_pixel_safe(cur_data, i, 31 - j, 32, 32, 24, p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rdpClientConBeginUpdate(clientCon->dev, clientCon);
|
||||
rdpClientConSetCursorEx(clientCon->dev, clientCon, xhot, yhot,
|
||||
cur_data, cur_mask, bpp);
|
||||
rdpClientConEndUpdate(clientCon->dev, clientCon);
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs,
|
||||
int x, int y)
|
||||
{
|
||||
rdpPtr dev;
|
||||
rdpClientCon *clientCon;
|
||||
|
||||
LLOGLN(10, ("rdpSpriteSetCursor:"));
|
||||
if (pCurs == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (pCurs->bits == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dev = rdpGetDevFromScreen(pScr);
|
||||
clientCon = dev->clientConHead;
|
||||
while (clientCon != NULL)
|
||||
{
|
||||
rdpSpriteSetCursorCon(clientCon, pDev, pScr, pCurs, x, y);
|
||||
clientCon = clientCon->next;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScr, int x, int y)
|
||||
{
|
||||
LLOGLN(10, ("rdpSpriteMoveCursor:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpSpriteDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScr)
|
||||
{
|
||||
LLOGLN(10, ("rdpSpriteDeviceCursorInitialize:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpSpriteDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScr)
|
||||
{
|
||||
LLOGLN(10, ("rdpSpriteDeviceCursorCleanup:"));
|
||||
xorgxrdpDownDown(pScr);
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
misc draw calls
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPCURSOR_H
|
||||
#define __RDPCURSOR_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs);
|
||||
extern _X_EXPORT Bool
|
||||
rdpSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs);
|
||||
extern _X_EXPORT void
|
||||
rdpSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScr, CursorPtr pCurs,
|
||||
int x, int y);
|
||||
extern _X_EXPORT void
|
||||
rdpSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScr, int x, int y);
|
||||
extern _X_EXPORT Bool
|
||||
rdpSpriteDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScr);
|
||||
extern _X_EXPORT void
|
||||
rdpSpriteDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScr);
|
||||
|
||||
#endif
|
@ -1,411 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
misc draw calls
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
#include <dixfontstr.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpGlyphs.h"
|
||||
#include "rdpReg.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
/* return 0, draw nothing */
|
||||
/* return 1, draw with no clip */
|
||||
/* return 2, draw using clip */
|
||||
int
|
||||
rdpDrawGetClip(rdpPtr dev, RegionPtr pRegion, DrawablePtr pDrawable, GCPtr pGC)
|
||||
{
|
||||
WindowPtr pWindow;
|
||||
RegionPtr temp;
|
||||
BoxRec box;
|
||||
int rv;
|
||||
|
||||
rv = 0;
|
||||
|
||||
if (pDrawable->type == DRAWABLE_PIXMAP)
|
||||
{
|
||||
switch (pGC->clientClipType)
|
||||
{
|
||||
case CT_NONE:
|
||||
rv = 1;
|
||||
break;
|
||||
case CT_REGION:
|
||||
rv = 2;
|
||||
rdpRegionCopy(pRegion, pGC->clientClip);
|
||||
break;
|
||||
default:
|
||||
LLOGLN(0, ("rdpDrawGetClip: unimp clip type %d",
|
||||
pGC->clientClipType));
|
||||
break;
|
||||
}
|
||||
|
||||
if (rv == 2) /* check if the clip is the entire pixmap */
|
||||
{
|
||||
box.x1 = 0;
|
||||
box.y1 = 0;
|
||||
box.x2 = pDrawable->width;
|
||||
box.y2 = pDrawable->height;
|
||||
|
||||
if (rdpRegionContainsRect(pRegion, &box) == rgnIN)
|
||||
{
|
||||
rv = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (pDrawable->type == DRAWABLE_WINDOW)
|
||||
{
|
||||
pWindow = (WindowPtr)pDrawable;
|
||||
|
||||
if (pWindow->viewable)
|
||||
{
|
||||
if (pGC->subWindowMode == IncludeInferiors)
|
||||
{
|
||||
temp = &pWindow->borderClip;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = &pWindow->clipList;
|
||||
}
|
||||
|
||||
if (rdpRegionNotEmpty(temp))
|
||||
{
|
||||
switch (pGC->clientClipType)
|
||||
{
|
||||
case CT_NONE:
|
||||
rv = 2;
|
||||
rdpRegionCopy(pRegion, temp);
|
||||
break;
|
||||
case CT_REGION:
|
||||
rv = 2;
|
||||
rdpRegionCopy(pRegion, pGC->clientClip);
|
||||
rdpRegionTranslate(pRegion,
|
||||
pDrawable->x + pGC->clipOrg.x,
|
||||
pDrawable->y + pGC->clipOrg.y);
|
||||
rdpRegionIntersect(pRegion, pRegion, temp);
|
||||
break;
|
||||
default:
|
||||
LLOGLN(0, ("rdpDrawGetClip: unimp clip type %d",
|
||||
pGC->clientClipType));
|
||||
break;
|
||||
}
|
||||
|
||||
if (rv == 2) /* check if the clip is the entire screen */
|
||||
{
|
||||
box.x1 = 0;
|
||||
box.y1 = 0;
|
||||
box.x2 = dev->width;
|
||||
box.y2 = dev->height;
|
||||
|
||||
if (rdpRegionContainsRect(pRegion, &box) == rgnIN)
|
||||
{
|
||||
rv = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
GetTextBoundingBox(DrawablePtr pDrawable, FontPtr font, int x, int y,
|
||||
int n, BoxPtr pbox)
|
||||
{
|
||||
int maxAscent;
|
||||
int maxDescent;
|
||||
int maxCharWidth;
|
||||
|
||||
if (FONTASCENT(font) > FONTMAXBOUNDS(font, ascent))
|
||||
{
|
||||
maxAscent = FONTASCENT(font);
|
||||
}
|
||||
else
|
||||
{
|
||||
maxAscent = FONTMAXBOUNDS(font, ascent);
|
||||
}
|
||||
|
||||
if (FONTDESCENT(font) > FONTMAXBOUNDS(font, descent))
|
||||
{
|
||||
maxDescent = FONTDESCENT(font);
|
||||
}
|
||||
else
|
||||
{
|
||||
maxDescent = FONTMAXBOUNDS(font, descent);
|
||||
}
|
||||
|
||||
if (FONTMAXBOUNDS(font, rightSideBearing) >
|
||||
FONTMAXBOUNDS(font, characterWidth))
|
||||
{
|
||||
maxCharWidth = FONTMAXBOUNDS(font, rightSideBearing);
|
||||
}
|
||||
else
|
||||
{
|
||||
maxCharWidth = FONTMAXBOUNDS(font, characterWidth);
|
||||
}
|
||||
|
||||
pbox->x1 = pDrawable->x + x;
|
||||
pbox->y1 = pDrawable->y + y - maxAscent;
|
||||
pbox->x2 = pbox->x1 + maxCharWidth * n;
|
||||
pbox->y2 = pbox->y1 + maxAscent + maxDescent;
|
||||
|
||||
if (FONTMINBOUNDS(font, leftSideBearing) < 0)
|
||||
{
|
||||
pbox->x1 += FONTMINBOUNDS(font, leftSideBearing);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpDrawItemAdd(rdpPtr dev, rdpPixmapRec *priv, struct rdp_draw_item *di)
|
||||
{
|
||||
priv->is_alpha_dirty_not = FALSE;
|
||||
|
||||
if (priv->draw_item_tail == NULL)
|
||||
{
|
||||
priv->draw_item_tail = di;
|
||||
priv->draw_item_head = di;
|
||||
}
|
||||
else
|
||||
{
|
||||
di->prev = priv->draw_item_tail;
|
||||
priv->draw_item_tail->next = di;
|
||||
priv->draw_item_tail = di;
|
||||
}
|
||||
|
||||
if (priv == &(dev->screenPriv))
|
||||
{
|
||||
rdpClientConScheduleDeferredUpdate(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpDrawItemRemove(rdpPtr dev, rdpPixmapRec *priv, struct rdp_draw_item *di)
|
||||
{
|
||||
if (di->prev != NULL)
|
||||
{
|
||||
di->prev->next = di->next;
|
||||
}
|
||||
|
||||
if (di->next != NULL)
|
||||
{
|
||||
di->next->prev = di->prev;
|
||||
}
|
||||
|
||||
if (priv->draw_item_head == di)
|
||||
{
|
||||
priv->draw_item_head = di->next;
|
||||
}
|
||||
|
||||
if (priv->draw_item_tail == di)
|
||||
{
|
||||
priv->draw_item_tail = di->prev;
|
||||
}
|
||||
|
||||
if (di->type == RDI_LINE)
|
||||
{
|
||||
if (di->u.line.segs != NULL)
|
||||
{
|
||||
g_free(di->u.line.segs);
|
||||
}
|
||||
}
|
||||
|
||||
if (di->type == RDI_TEXT)
|
||||
{
|
||||
rdpGlyphDeleteRdpText(di->u.text.rtext);
|
||||
}
|
||||
|
||||
rdpRegionDestroy(di->reg);
|
||||
g_free(di);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpDrawItemRemoveAll(rdpPtr dev, rdpPixmapRec *priv)
|
||||
{
|
||||
struct rdp_draw_item *di;
|
||||
|
||||
di = priv->draw_item_head;
|
||||
|
||||
while (di != NULL)
|
||||
{
|
||||
rdpDrawItemRemove(dev, priv, di);
|
||||
di = priv->draw_item_head;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr pOldRegion)
|
||||
{
|
||||
ScreenPtr pScreen;
|
||||
rdpPtr dev;
|
||||
RegionRec reg;
|
||||
RegionRec clip;
|
||||
int dx;
|
||||
int dy;
|
||||
int num_clip_rects;
|
||||
int num_reg_rects;
|
||||
BoxPtr box;
|
||||
BoxRec box1;
|
||||
|
||||
LLOGLN(10, ("rdpCopyWindow:"));
|
||||
pScreen = pWin->drawable.pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
dev->counts.rdpCopyWindowCallCount++;
|
||||
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
rdpRegionCopy(®, pOldRegion);
|
||||
rdpRegionInit(&clip, NullBox, 0);
|
||||
rdpRegionCopy(&clip, &pWin->borderClip);
|
||||
dx = pWin->drawable.x - ptOldOrg.x;
|
||||
dy = pWin->drawable.y - ptOldOrg.y;
|
||||
|
||||
dev->pScreen->CopyWindow = dev->CopyWindow;
|
||||
dev->pScreen->CopyWindow(pWin, ptOldOrg, pOldRegion);
|
||||
dev->pScreen->CopyWindow = rdpCopyWindow;
|
||||
|
||||
num_clip_rects = REGION_NUM_RECTS(&clip);
|
||||
num_reg_rects = REGION_NUM_RECTS(®);
|
||||
|
||||
if ((num_clip_rects == 0) || (num_reg_rects == 0))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((num_clip_rects > 16) || (num_reg_rects > 16))
|
||||
{
|
||||
LLOGLN(10, ("rdpCopyWindow: big list"));
|
||||
box = rdpRegionExtents(®);
|
||||
box1 = *box;
|
||||
box1.x1 += dx;
|
||||
box1.y1 += dy;
|
||||
box1.x2 += dx;
|
||||
box1.y2 += dy;
|
||||
rdpClientConAddAllBox(dev, &box1, &(pWin->drawable));
|
||||
}
|
||||
else
|
||||
{
|
||||
rdpRegionTranslate(®, dx, dy);
|
||||
rdpRegionIntersect(®, ®, &clip);
|
||||
rdpClientConAddAllReg(dev, ®, &(pWin->drawable));
|
||||
}
|
||||
}
|
||||
rdpRegionUninit(®);
|
||||
rdpRegionUninit(&clip);
|
||||
}
|
||||
|
||||
#if XRDP_CLOSESCR == 1 /* before v1.13 */
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpCloseScreen(int index, ScreenPtr pScreen)
|
||||
{
|
||||
rdpPtr dev;
|
||||
Bool rv;
|
||||
|
||||
LLOGLN(0, ("rdpCloseScreen:"));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
dev->pScreen->CloseScreen = dev->CloseScreen;
|
||||
rv = dev->pScreen->CloseScreen(index, pScreen);
|
||||
dev->pScreen->CloseScreen = rdpCloseScreen;
|
||||
return rv;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpCloseScreen(ScreenPtr pScreen)
|
||||
{
|
||||
rdpPtr dev;
|
||||
Bool rv;
|
||||
|
||||
LLOGLN(0, ("rdpCloseScreen:"));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
dev->pScreen->CloseScreen = dev->CloseScreen;
|
||||
rv = dev->pScreen->CloseScreen(pScreen);
|
||||
dev->pScreen->CloseScreen = rdpCloseScreen;
|
||||
return rv;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
WindowPtr
|
||||
rdpGetRootWindowPtr(ScreenPtr pScreen)
|
||||
{
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 9, 0, 0, 0)
|
||||
return WindowTable[pScreen->myNum]; /* in globals.c */
|
||||
#else
|
||||
return pScreen->root;
|
||||
#endif
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
rdpPtr
|
||||
rdpGetDevFromScreen(ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr pScrn;
|
||||
rdpPtr dev;
|
||||
|
||||
if (pScreen == NULL)
|
||||
{
|
||||
pScrn = xf86Screens[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
pScrn = xf86Screens[pScreen->myNum];
|
||||
}
|
||||
dev = XRDPPTR(pScrn);
|
||||
return dev;
|
||||
}
|
@ -1,93 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
misc draw calls
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPDRAW_H
|
||||
#define __RDPDRAW_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
/* 1.1, 1.2, 1.3, 1.4 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11, 1.12 */
|
||||
#define XRDP_CLOSESCR 1
|
||||
#else
|
||||
/* 1.13 */
|
||||
#define XRDP_CLOSESCR 2
|
||||
#endif
|
||||
|
||||
/* true if drawable is window or pixmap is screen */
|
||||
#define XRDP_DRAWABLE_IS_VISIBLE(_dev, _drw) \
|
||||
(((_drw)->type == DRAWABLE_WINDOW && ((WindowPtr)(_drw))->viewable) || \
|
||||
((_drw)->type == DRAWABLE_PIXMAP && \
|
||||
((PixmapPtr)(_drw))->devPrivate.ptr == (_dev)->pfbMemory))
|
||||
|
||||
/******************************************************************************/
|
||||
#define GC_OP_VARS rdpPtr dev; rdpGCPtr priv; GCFuncs *oldFuncs
|
||||
|
||||
/******************************************************************************/
|
||||
#define GC_OP_PROLOGUE(_pGC) \
|
||||
do { \
|
||||
dev = rdpGetDevFromScreen((_pGC)->pScreen); \
|
||||
priv = (rdpGCPtr)rdpGetGCPrivate(_pGC, dev->privateKeyRecGC); \
|
||||
oldFuncs = (_pGC)->funcs; \
|
||||
(_pGC)->funcs = priv->funcs; \
|
||||
(_pGC)->ops = priv->ops; \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define GC_OP_EPILOGUE(_pGC) \
|
||||
do { \
|
||||
priv->ops = (_pGC)->ops; \
|
||||
(_pGC)->funcs = oldFuncs; \
|
||||
(_pGC)->ops = &g_rdpGCOps; \
|
||||
} while (0)
|
||||
|
||||
extern GCOps g_rdpGCOps; /* in rdpGC.c */
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpDrawGetClip(rdpPtr dev, RegionPtr pRegion, DrawablePtr pDrawable, GCPtr pGC);
|
||||
extern _X_EXPORT void
|
||||
GetTextBoundingBox(DrawablePtr pDrawable, FontPtr font, int x, int y,
|
||||
int n, BoxPtr pbox);
|
||||
extern _X_EXPORT int
|
||||
rdpDrawItemAdd(rdpPtr dev, rdpPixmapRec *priv, struct rdp_draw_item *di);
|
||||
extern _X_EXPORT int
|
||||
rdpDrawItemRemove(rdpPtr dev, rdpPixmapRec *priv, struct rdp_draw_item *di);
|
||||
extern _X_EXPORT int
|
||||
rdpDrawItemRemoveAll(rdpPtr dev, rdpPixmapRec *priv);
|
||||
extern _X_EXPORT void
|
||||
rdpCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr pOldRegion);
|
||||
#if XRDP_CLOSESCR == 1
|
||||
extern _X_EXPORT Bool
|
||||
rdpCloseScreen(int index, ScreenPtr pScreen);
|
||||
#else
|
||||
extern _X_EXPORT Bool
|
||||
rdpCloseScreen(ScreenPtr pScreen);
|
||||
#endif
|
||||
extern _X_EXPORT WindowPtr
|
||||
rdpGetRootWindowPtr(ScreenPtr pScreen);
|
||||
extern _X_EXPORT rdpPtr
|
||||
rdpGetDevFromScreen(ScreenPtr pScreen);
|
||||
|
||||
#endif
|
@ -1,119 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpFillPolygon.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpFillPolygonOrg(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int shape, int mode, int count,
|
||||
DDXPointPtr pPts)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->FillPolygon(pDrawable, pGC, shape, mode, count, pPts);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int shape, int mode, int count,
|
||||
DDXPointPtr pPts)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
int maxx;
|
||||
int maxy;
|
||||
int minx;
|
||||
int miny;
|
||||
int index;
|
||||
int x;
|
||||
int y;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpFillPolygon:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpFillPolygonCallCount++;
|
||||
box.x1 = 0;
|
||||
box.y1 = 0;
|
||||
box.x2 = 0;
|
||||
box.y2 = 0;
|
||||
if (count > 0)
|
||||
{
|
||||
maxx = pPts[0].x;
|
||||
maxy = pPts[0].y;
|
||||
minx = maxx;
|
||||
miny = maxy;
|
||||
for (index = 1; index < count; index++)
|
||||
{
|
||||
x = pPts[index].x;
|
||||
y = pPts[index].y;
|
||||
maxx = RDPMAX(x, maxx);
|
||||
minx = RDPMIN(x, minx);
|
||||
maxy = RDPMAX(y, maxy);
|
||||
miny = RDPMIN(y, miny);
|
||||
}
|
||||
box.x1 = pDrawable->x + minx;
|
||||
box.y1 = pDrawable->y + miny;
|
||||
box.x2 = pDrawable->x + maxx + 1;
|
||||
box.y2 = pDrawable->y + maxy + 1;
|
||||
}
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpFillPolygon: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpFillPolygonOrg(pDrawable, pGC, shape, mode, count, pPts);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPFILLPOLYGON_H
|
||||
#define __RDPFILLPOLYGON_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int shape, int mode, int count,
|
||||
DDXPointPtr pPts);
|
||||
|
||||
#endif
|
@ -1,62 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpFillSpans.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpFillSpansOrg(DrawablePtr pDrawable, GCPtr pGC, int nInit,
|
||||
DDXPointPtr pptInit, int *pwidthInit, int fSorted)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->FillSpans(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nInit,
|
||||
DDXPointPtr pptInit, int *pwidthInit, int fSorted)
|
||||
{
|
||||
LLOGLN(0, ("rdpFillSpans:"));
|
||||
/* do original call */
|
||||
rdpFillSpansOrg(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPFILLSPANS_H
|
||||
#define __RDPFILLSPANS_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
void
|
||||
rdpFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nInit,
|
||||
DDXPointPtr pptInit, int* pwidthInit, int fSorted);
|
||||
|
||||
#endif
|
@ -1,235 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
GC related calls
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpFillSpans.h"
|
||||
#include "rdpSetSpans.h"
|
||||
#include "rdpPutImage.h"
|
||||
#include "rdpCopyArea.h"
|
||||
#include "rdpCopyPlane.h"
|
||||
#include "rdpPolyPoint.h"
|
||||
#include "rdpPolylines.h"
|
||||
#include "rdpPolySegment.h"
|
||||
#include "rdpPolyRectangle.h"
|
||||
#include "rdpPolyArc.h"
|
||||
#include "rdpFillPolygon.h"
|
||||
#include "rdpPolyFillRect.h"
|
||||
#include "rdpPolyFillArc.h"
|
||||
#include "rdpPolyText8.h"
|
||||
#include "rdpPolyText16.h"
|
||||
#include "rdpImageText8.h"
|
||||
#include "rdpImageText16.h"
|
||||
#include "rdpImageGlyphBlt.h"
|
||||
#include "rdpPolyGlyphBlt.h"
|
||||
#include "rdpPushPixels.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpGC.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define GC_FUNC_VARS rdpPtr dev; rdpGCPtr priv;
|
||||
|
||||
/******************************************************************************/
|
||||
#define GC_FUNC_PROLOGUE(_pGC) \
|
||||
do { \
|
||||
dev = rdpGetDevFromScreen((_pGC)->pScreen); \
|
||||
priv = (rdpGCPtr)rdpGetGCPrivate(_pGC, dev->privateKeyRecGC); \
|
||||
(_pGC)->funcs = priv->funcs; \
|
||||
if (priv->ops != 0) \
|
||||
{ \
|
||||
(_pGC)->ops = priv->ops; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define GC_FUNC_EPILOGUE(_pGC) \
|
||||
do { \
|
||||
priv->funcs = (_pGC)->funcs; \
|
||||
(_pGC)->funcs = &g_rdpGCFuncs; \
|
||||
if (priv->ops != 0) \
|
||||
{ \
|
||||
priv->ops = (_pGC)->ops; \
|
||||
(_pGC)->ops = &g_rdpGCOps; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static void
|
||||
rdpValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr d);
|
||||
static void
|
||||
rdpChangeGC(GCPtr pGC, unsigned long mask);
|
||||
static void
|
||||
rdpCopyGC(GCPtr src, unsigned long mask, GCPtr dst);
|
||||
static void
|
||||
rdpDestroyGC(GCPtr pGC);
|
||||
static void
|
||||
rdpChangeClip(GCPtr pGC, int type, pointer pValue, int nrects);
|
||||
static void
|
||||
rdpDestroyClip(GCPtr pGC);
|
||||
static void
|
||||
rdpCopyClip(GCPtr dst, GCPtr src);
|
||||
|
||||
GCFuncs g_rdpGCFuncs =
|
||||
{
|
||||
rdpValidateGC, rdpChangeGC, rdpCopyGC, rdpDestroyGC, rdpChangeClip,
|
||||
rdpDestroyClip, rdpCopyClip
|
||||
};
|
||||
|
||||
GCOps g_rdpGCOps =
|
||||
{
|
||||
rdpFillSpans, rdpSetSpans, rdpPutImage, rdpCopyArea, rdpCopyPlane,
|
||||
rdpPolyPoint, rdpPolylines, rdpPolySegment, rdpPolyRectangle,
|
||||
rdpPolyArc, rdpFillPolygon, rdpPolyFillRect, rdpPolyFillArc,
|
||||
rdpPolyText8, rdpPolyText16, rdpImageText8, rdpImageText16,
|
||||
rdpImageGlyphBlt, rdpPolyGlyphBlt, rdpPushPixels
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr d)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpValidateGC:"));
|
||||
GC_FUNC_PROLOGUE(pGC);
|
||||
pGC->funcs->ValidateGC(pGC, changes, d);
|
||||
priv->ops = pGC->ops;
|
||||
GC_FUNC_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpChangeGC(GCPtr pGC, unsigned long mask)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpChangeGC:"));
|
||||
GC_FUNC_PROLOGUE(pGC);
|
||||
pGC->funcs->ChangeGC(pGC, mask);
|
||||
GC_FUNC_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpCopyGC(GCPtr src, unsigned long mask, GCPtr dst)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpCopyGC:"));
|
||||
GC_FUNC_PROLOGUE(dst);
|
||||
dst->funcs->CopyGC(src, mask, dst);
|
||||
GC_FUNC_EPILOGUE(dst);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpDestroyGC(GCPtr pGC)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpDestroyGC:"));
|
||||
GC_FUNC_PROLOGUE(pGC);
|
||||
pGC->funcs->DestroyGC(pGC);
|
||||
GC_FUNC_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpChangeClip(GCPtr pGC, int type, pointer pValue, int nrects)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpChangeClip:"));
|
||||
GC_FUNC_PROLOGUE(pGC);
|
||||
pGC->funcs->ChangeClip(pGC, type, pValue, nrects);
|
||||
GC_FUNC_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpDestroyClip(GCPtr pGC)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpDestroyClip:"));
|
||||
GC_FUNC_PROLOGUE(pGC);
|
||||
pGC->funcs->DestroyClip(pGC);
|
||||
GC_FUNC_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpCopyClip(GCPtr dst, GCPtr src)
|
||||
{
|
||||
GC_FUNC_VARS;
|
||||
|
||||
LLOGLN(10, ("rdpCopyClip:"));
|
||||
GC_FUNC_PROLOGUE(dst);
|
||||
dst->funcs->CopyClip(dst, src);
|
||||
GC_FUNC_EPILOGUE(dst);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpCreateGC(GCPtr pGC)
|
||||
{
|
||||
Bool rv;
|
||||
rdpPtr dev;
|
||||
ScreenPtr pScreen;
|
||||
rdpGCPtr priv;
|
||||
|
||||
LLOGLN(10, ("rdpCreateGC:"));
|
||||
pScreen = pGC->pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
priv = (rdpGCPtr)rdpGetGCPrivate(pGC, dev->privateKeyRecGC);
|
||||
pScreen->CreateGC = dev->CreateGC;
|
||||
rv = pScreen->CreateGC(pGC);
|
||||
if (rv)
|
||||
{
|
||||
priv->funcs = pGC->funcs;
|
||||
priv->ops = 0;
|
||||
pGC->funcs = &g_rdpGCFuncs;
|
||||
}
|
||||
pScreen->CreateGC = rdpCreateGC;
|
||||
return rv;
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
GC related calls
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDPGC_H
|
||||
#define _RDPGC_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpCreateGC(GCPtr pGC);
|
||||
|
||||
#endif
|
@ -1,105 +0,0 @@
|
||||
/*
|
||||
Copyright 2012-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
gylph(font) calls
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <picture.h>
|
||||
#include <glyphstr.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpGlyphs.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpReg.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpGlyphDeleteRdpText(struct rdp_text *rtext)
|
||||
{
|
||||
int index;
|
||||
|
||||
if (rtext == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
for (index = 0; index < rtext->num_chars; index++)
|
||||
{
|
||||
if (rtext->chars[index] != NULL)
|
||||
{
|
||||
g_free(rtext->chars[index]->data);
|
||||
g_free(rtext->chars[index]);
|
||||
}
|
||||
}
|
||||
rdpRegionDestroy(rtext->reg);
|
||||
rdpGlyphDeleteRdpText(rtext->next);
|
||||
g_free(rtext);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpGlyphsOrg(PictureScreenPtr ps, rdpPtr dev,
|
||||
CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat,
|
||||
INT16 xSrc, INT16 ySrc, int nlists, GlyphListPtr lists,
|
||||
GlyphPtr *glyphs)
|
||||
{
|
||||
ps->Glyphs = dev->Glyphs;
|
||||
ps->Glyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc,
|
||||
nlists, lists, glyphs);
|
||||
ps->Glyphs = rdpGlyphs;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat,
|
||||
INT16 xSrc, INT16 ySrc, int nlists, GlyphListPtr lists,
|
||||
GlyphPtr *glyphs)
|
||||
{
|
||||
ScreenPtr pScreen;
|
||||
rdpPtr dev;
|
||||
PictureScreenPtr ps;
|
||||
|
||||
LLOGLN(10, ("rdpGlyphs:"));
|
||||
pScreen = pDst->pDrawable->pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
ps = GetPictureScreen(pScreen);
|
||||
rdpGlyphsOrg(ps, dev, op, pSrc, pDst, maskFormat, xSrc, ySrc,
|
||||
nlists, lists, glyphs);
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
/*
|
||||
Copyright 2012-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
gylph(font) calls
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDPGLYPHS_H
|
||||
#define _RDPGLYPHS_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
struct rdp_font_char
|
||||
{
|
||||
int offset; /* x */
|
||||
int baseline; /* y */
|
||||
int width; /* cx */
|
||||
int height; /* cy */
|
||||
int incby;
|
||||
int bpp;
|
||||
char *data;
|
||||
int data_bytes;
|
||||
};
|
||||
|
||||
struct rdp_text
|
||||
{
|
||||
RegionPtr reg;
|
||||
int font;
|
||||
int x;
|
||||
int y;
|
||||
int flags;
|
||||
int mixmode;
|
||||
char data[256];
|
||||
int data_bytes;
|
||||
struct rdp_font_char* chars[256];
|
||||
int num_chars;
|
||||
struct rdp_text* next;
|
||||
};
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpGlyphDeleteRdpText(struct rdp_text* rtext);
|
||||
extern _X_EXPORT void
|
||||
rdpGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat,
|
||||
INT16 xSrc, INT16 ySrc, int nlists, GlyphListPtr lists,
|
||||
GlyphPtr *glyphs);
|
||||
|
||||
#endif
|
@ -1,89 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpImageGlyphBlt.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpImageGlyphBltOrg(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, unsigned int nglyph,
|
||||
CharInfoPtr *ppci, pointer pglyphBase)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->ImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, unsigned int nglyph,
|
||||
CharInfoPtr *ppci, pointer pglyphBase)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(0, ("rdpImageGlyphBlt:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpImageGlyphBltCallCount++;
|
||||
GetTextBoundingBox(pDrawable, pGC->font, x, y, nglyph, &box);
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpImageGlyphBlt: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpImageGlyphBltOrg(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPIMAGEGLYPHBLT_H
|
||||
#define __RDPIMAGEGLYPHBLT_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, unsigned int nglyph,
|
||||
CharInfoPtr* ppci, pointer pglyphBase);
|
||||
|
||||
#endif
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpImageText16.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpImageText16Org(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, unsigned short *chars)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->ImageText16(pDrawable, pGC, x, y, count, chars);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, unsigned short *chars)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpImageText16:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpImageText16CallCount++;
|
||||
GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpImageText16: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpImageText16Org(pDrawable, pGC, x, y, count, chars);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPIMAGETEXT16_H
|
||||
#define __RDPIMAGETEXT16_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, unsigned short* chars);
|
||||
|
||||
#endif
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpImageText8.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpImageText8Org(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, char *chars)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->ImageText8(pDrawable, pGC, x, y, count, chars);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, char *chars)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpImageText8:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpImageText8CallCount++;
|
||||
GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpImageText8: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpImageText8Org(pDrawable, pGC, x, y, count, chars);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPIMAGETEXT8_H
|
||||
#define __RDPIMAGETEXT8_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, char* chars);
|
||||
|
||||
#endif
|
@ -1,133 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpInput.h"
|
||||
#include "rdpMisc.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
#define MAX_INPUT_PROC 4
|
||||
|
||||
struct input_proc_list
|
||||
{
|
||||
int type;
|
||||
rdpInputEventProcPtr proc;
|
||||
};
|
||||
|
||||
static struct input_proc_list g_input_proc[MAX_INPUT_PROC];
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpRegisterInputCallback(int type, rdpInputEventProcPtr proc)
|
||||
{
|
||||
LLOGLN(0, ("rdpRegisterInputCallback: type %d proc %p", type, proc));
|
||||
if (type == 0)
|
||||
{
|
||||
g_input_proc[0].proc = proc;
|
||||
}
|
||||
else if (type == 1)
|
||||
{
|
||||
g_input_proc[1].proc = proc;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpUnregisterInputCallback(rdpInputEventProcPtr proc)
|
||||
{
|
||||
int index;
|
||||
char text[256];
|
||||
|
||||
LLOGLN(0, ("rdpUnregisterInputCallback: proc %p", proc));
|
||||
for (index = 0; index < MAX_INPUT_PROC; index++)
|
||||
{
|
||||
if (g_input_proc[index].proc == proc)
|
||||
{
|
||||
if (index == 0)
|
||||
{
|
||||
/* hack to cleanup
|
||||
remove when xrdpdevTearDown is working */
|
||||
g_sprintf(text, "/tmp/.xrdp/xrdp_display_%s", display);
|
||||
LLOGLN(0, ("rdpUnregisterInputCallback: deleting file %s", text));
|
||||
unlink(text);
|
||||
}
|
||||
g_input_proc[index].proc = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpInputKeyboardEvent(rdpPtr dev, int msg,
|
||||
long param1, long param2,
|
||||
long param3, long param4)
|
||||
{
|
||||
if (g_input_proc[0].proc != 0)
|
||||
{
|
||||
return g_input_proc[0].proc(dev, msg, param1, param2, param3, param4);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpInputMouseEvent(rdpPtr dev, int msg,
|
||||
long param1, long param2,
|
||||
long param3, long param4)
|
||||
{
|
||||
if (g_input_proc[1].proc != 0)
|
||||
{
|
||||
return g_input_proc[1].proc(dev, msg, param1, param2, param3, param4);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* called when module loads */
|
||||
int
|
||||
rdpInputInit(void)
|
||||
{
|
||||
g_memset(g_input_proc, 0, sizeof(g_input_proc));
|
||||
return 0;
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
input
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDPINPUT_H
|
||||
#define _RDPINPUT_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
typedef int (*rdpInputEventProcPtr)(rdpPtr dev, int msg,
|
||||
long param1, long param2,
|
||||
long param3, long param4);
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpRegisterInputCallback(int type, rdpInputEventProcPtr proc);
|
||||
extern _X_EXPORT int
|
||||
rdpUnregisterInputCallback(rdpInputEventProcPtr proc);
|
||||
extern _X_EXPORT int
|
||||
rdpInputKeyboardEvent(rdpPtr dev, int msg,
|
||||
long param1, long param2,
|
||||
long param3, long param4);
|
||||
extern _X_EXPORT int
|
||||
rdpInputMouseEvent(rdpPtr dev, int msg,
|
||||
long param1, long param2,
|
||||
long param3, long param4);
|
||||
extern _X_EXPORT int
|
||||
rdpInputInit(void);
|
||||
|
||||
#endif
|
@ -1,111 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
rdp module main
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpInput.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpMain.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
static Bool g_initialised = FALSE;
|
||||
|
||||
/*****************************************************************************/
|
||||
static pointer
|
||||
xorgxrdpSetup(pointer Module, pointer Options,
|
||||
int *ErrorMajor, int *ErrorMinor)
|
||||
{
|
||||
LLOGLN(0, ("xorgxrdpSetup:"));
|
||||
if (!g_initialised)
|
||||
{
|
||||
g_initialised = TRUE;
|
||||
}
|
||||
rdpInputInit();
|
||||
rdpPrivateInit();
|
||||
return (pointer) 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
xorgxrdpTearDown(pointer Module)
|
||||
{
|
||||
LLOGLN(0, ("xorgxrdpTearDown:"));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
xorgxrdpDownDown(ScreenPtr pScreen)
|
||||
{
|
||||
LLOGLN(0, ("xorgxrdpDownDown:"));
|
||||
if (g_initialised)
|
||||
{
|
||||
g_initialised = FALSE;
|
||||
LLOGLN(0, ("xorgxrdpDownDown: 1"));
|
||||
rdpClientConDeinit(rdpGetDevFromScreen(pScreen));
|
||||
}
|
||||
}
|
||||
|
||||
static MODULESETUPPROTO(xorgxrdpSetup);
|
||||
static XF86ModuleVersionInfo RDPVersRec =
|
||||
{
|
||||
XRDP_MODULE_NAME,
|
||||
MODULEVENDORSTRING,
|
||||
MODINFOSTRING1,
|
||||
MODINFOSTRING2,
|
||||
XORG_VERSION_CURRENT,
|
||||
PACKAGE_VERSION_MAJOR,
|
||||
PACKAGE_VERSION_MINOR,
|
||||
PACKAGE_VERSION_PATCHLEVEL,
|
||||
ABI_CLASS_VIDEODRV,
|
||||
ABI_VIDEODRV_VERSION,
|
||||
0,
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
_X_EXPORT XF86ModuleData xorgxrdpModuleData =
|
||||
{
|
||||
&RDPVersRec,
|
||||
xorgxrdpSetup,
|
||||
xorgxrdpTearDown
|
||||
};
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
rdp module main
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPMAIN_H
|
||||
#define __RDPMAIN_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
xorgxrdpDownDown(ScreenPtr pScreen);
|
||||
|
||||
#endif
|
@ -1,446 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
the rest
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdpMisc.h"
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpBitsPerPixel(int depth)
|
||||
{
|
||||
if (depth == 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else if (depth <= 8)
|
||||
{
|
||||
return 8;
|
||||
}
|
||||
else if (depth <= 16)
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 32;
|
||||
}
|
||||
}
|
||||
|
||||
/* the g_ functions from os_calls.c */
|
||||
|
||||
/*****************************************************************************/
|
||||
/* wait 'millis' milliseconds for the socket to be able to receive */
|
||||
/* returns boolean */
|
||||
int
|
||||
g_sck_can_recv(int sck, int millis)
|
||||
{
|
||||
fd_set rfds;
|
||||
struct timeval time;
|
||||
int rv;
|
||||
|
||||
time.tv_sec = millis / 1000;
|
||||
time.tv_usec = (millis * 1000) % 1000000;
|
||||
FD_ZERO(&rfds);
|
||||
|
||||
if (sck > 0)
|
||||
{
|
||||
FD_SET(((unsigned int)sck), &rfds);
|
||||
rv = select(sck + 1, &rfds, 0, 0, &time);
|
||||
|
||||
if (rv > 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_recv(int sck, void *ptr, int len, int flags)
|
||||
{
|
||||
return recv(sck, ptr, len, flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
g_sck_close(int sck)
|
||||
{
|
||||
if (sck == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
shutdown(sck, 2);
|
||||
close(sck);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_last_error_would_block(int sck)
|
||||
{
|
||||
return (errno == EWOULDBLOCK) || (errno == EINPROGRESS);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
g_sleep(int msecs)
|
||||
{
|
||||
usleep(msecs * 1000);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_send(int sck, void *ptr, int len, int flags)
|
||||
{
|
||||
return send(sck, ptr, len, flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void *
|
||||
g_malloc(int size, int zero)
|
||||
{
|
||||
char *rv;
|
||||
|
||||
rv = (char *)malloc(size);
|
||||
if (zero)
|
||||
{
|
||||
if (rv != 0)
|
||||
{
|
||||
memset(rv, 0, size);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
g_free(void *ptr)
|
||||
{
|
||||
if (ptr != 0)
|
||||
{
|
||||
free(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
g_sprintf(char *dest, char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
vsprintf(dest, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_tcp_socket(void)
|
||||
{
|
||||
int rv;
|
||||
int i;
|
||||
|
||||
i = 1;
|
||||
rv = socket(PF_INET, SOCK_STREAM, 0);
|
||||
setsockopt(rv, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));
|
||||
setsockopt(rv, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof(i));
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_local_socket_dgram(void)
|
||||
{
|
||||
return socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_local_socket_stream(void)
|
||||
{
|
||||
return socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
g_memcpy(void *d_ptr, const void *s_ptr, int size)
|
||||
{
|
||||
memcpy(d_ptr, s_ptr, size);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
g_memset(void *d_ptr, const unsigned char chr, int size)
|
||||
{
|
||||
memset(d_ptr, chr, size);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_tcp_set_no_delay(int sck)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = 1;
|
||||
setsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_set_non_blocking(int sck)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
i = fcntl(sck, F_GETFL);
|
||||
i = i | O_NONBLOCK;
|
||||
fcntl(sck, F_SETFL, i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_accept(int sck)
|
||||
{
|
||||
struct sockaddr_in s;
|
||||
unsigned int i;
|
||||
|
||||
i = sizeof(struct sockaddr_in);
|
||||
memset(&s, 0, i);
|
||||
return accept(sck, (struct sockaddr *)&s, &i);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_select(int sck1, int sck2, int sck3)
|
||||
{
|
||||
fd_set rfds;
|
||||
struct timeval time;
|
||||
int max;
|
||||
int rv;
|
||||
|
||||
time.tv_sec = 0;
|
||||
time.tv_usec = 0;
|
||||
FD_ZERO(&rfds);
|
||||
|
||||
if (sck1 > 0)
|
||||
{
|
||||
FD_SET(((unsigned int)sck1), &rfds);
|
||||
}
|
||||
|
||||
if (sck2 > 0)
|
||||
{
|
||||
FD_SET(((unsigned int)sck2), &rfds);
|
||||
}
|
||||
|
||||
if (sck3 > 0)
|
||||
{
|
||||
FD_SET(((unsigned int)sck3), &rfds);
|
||||
}
|
||||
|
||||
max = sck1;
|
||||
|
||||
if (sck2 > max)
|
||||
{
|
||||
max = sck2;
|
||||
}
|
||||
|
||||
if (sck3 > max)
|
||||
{
|
||||
max = sck3;
|
||||
}
|
||||
|
||||
rv = select(max + 1, &rfds, 0, 0, &time);
|
||||
|
||||
if (rv > 0)
|
||||
{
|
||||
rv = 0;
|
||||
|
||||
if (FD_ISSET(((unsigned int)sck1), &rfds))
|
||||
{
|
||||
rv = rv | 1;
|
||||
}
|
||||
|
||||
if (FD_ISSET(((unsigned int)sck2), &rfds))
|
||||
{
|
||||
rv = rv | 2;
|
||||
}
|
||||
|
||||
if (FD_ISSET(((unsigned int)sck3), &rfds))
|
||||
{
|
||||
rv = rv | 4;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = 0;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_tcp_bind(int sck, char *port)
|
||||
{
|
||||
struct sockaddr_in s;
|
||||
|
||||
memset(&s, 0, sizeof(struct sockaddr_in));
|
||||
s.sin_family = AF_INET;
|
||||
s.sin_port = htons(atoi(port));
|
||||
s.sin_addr.s_addr = INADDR_ANY;
|
||||
return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_in));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_local_bind(int sck, char *port)
|
||||
{
|
||||
struct sockaddr_un s;
|
||||
|
||||
memset(&s, 0, sizeof(struct sockaddr_un));
|
||||
s.sun_family = AF_UNIX;
|
||||
strcpy(s.sun_path, port);
|
||||
return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_un));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
g_sck_listen(int sck)
|
||||
{
|
||||
return listen(sck, 2);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns boolean */
|
||||
int
|
||||
g_create_dir(const char *dirname)
|
||||
{
|
||||
return mkdir(dirname, (mode_t) - 1) == 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns boolean, non zero if the directory exists */
|
||||
int
|
||||
g_directory_exist(const char *dirname)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (stat(dirname, &st) == 0)
|
||||
{
|
||||
return S_ISDIR(st.st_mode);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int
|
||||
g_chmod_hex(const char *filename, int flags)
|
||||
{
|
||||
int fl;
|
||||
|
||||
fl = 0;
|
||||
fl |= (flags & 0x4000) ? S_ISUID : 0;
|
||||
fl |= (flags & 0x2000) ? S_ISGID : 0;
|
||||
fl |= (flags & 0x1000) ? S_ISVTX : 0;
|
||||
fl |= (flags & 0x0400) ? S_IRUSR : 0;
|
||||
fl |= (flags & 0x0200) ? S_IWUSR : 0;
|
||||
fl |= (flags & 0x0100) ? S_IXUSR : 0;
|
||||
fl |= (flags & 0x0040) ? S_IRGRP : 0;
|
||||
fl |= (flags & 0x0020) ? S_IWGRP : 0;
|
||||
fl |= (flags & 0x0010) ? S_IXGRP : 0;
|
||||
fl |= (flags & 0x0004) ? S_IROTH : 0;
|
||||
fl |= (flags & 0x0002) ? S_IWOTH : 0;
|
||||
fl |= (flags & 0x0001) ? S_IXOTH : 0;
|
||||
return chmod(filename, fl);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* produce a hex dump */
|
||||
void
|
||||
g_hexdump(void *p, long len)
|
||||
{
|
||||
unsigned char *line;
|
||||
int i;
|
||||
int thisline;
|
||||
int offset;
|
||||
|
||||
offset = 0;
|
||||
line = (unsigned char *) p;
|
||||
|
||||
while (offset < (int) len)
|
||||
{
|
||||
ErrorF("%04x ", offset);
|
||||
thisline = len - offset;
|
||||
|
||||
if (thisline > 16)
|
||||
{
|
||||
thisline = 16;
|
||||
}
|
||||
|
||||
for (i = 0; i < thisline; i++)
|
||||
{
|
||||
ErrorF("%02x ", line[i]);
|
||||
}
|
||||
|
||||
for (; i < 16; i++)
|
||||
{
|
||||
ErrorF(" ");
|
||||
}
|
||||
|
||||
for (i = 0; i < thisline; i++)
|
||||
{
|
||||
ErrorF("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
|
||||
}
|
||||
|
||||
ErrorF("\n");
|
||||
offset += thisline;
|
||||
line += thisline;
|
||||
}
|
||||
}
|
@ -1,265 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
the rest
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPMISC_H
|
||||
#define __RDPMISC_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
#include <X11/Xos.h>
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpBitsPerPixel(int depth);
|
||||
extern _X_EXPORT int
|
||||
g_sck_can_recv(int sck, int millis);
|
||||
extern _X_EXPORT int
|
||||
g_sck_recv(int sck, void *ptr, int len, int flags);
|
||||
extern _X_EXPORT void
|
||||
g_sck_close(int sck);
|
||||
extern _X_EXPORT int
|
||||
g_sck_last_error_would_block(int sck);
|
||||
extern _X_EXPORT void
|
||||
g_sleep(int msecs);
|
||||
extern _X_EXPORT int
|
||||
g_sck_send(int sck, void *ptr, int len, int flags);
|
||||
extern _X_EXPORT void *
|
||||
g_malloc(int size, int zero);
|
||||
extern _X_EXPORT void
|
||||
g_free(void *ptr);
|
||||
extern _X_EXPORT void
|
||||
g_sprintf(char *dest, char *format, ...);
|
||||
extern _X_EXPORT int
|
||||
g_sck_tcp_socket(void);
|
||||
extern _X_EXPORT int
|
||||
g_sck_local_socket_dgram(void);
|
||||
extern _X_EXPORT int
|
||||
g_sck_local_socket_stream(void);
|
||||
extern _X_EXPORT void
|
||||
g_memcpy(void *d_ptr, const void *s_ptr, int size);
|
||||
extern _X_EXPORT void
|
||||
g_memset(void *d_ptr, const unsigned char chr, int size);
|
||||
extern _X_EXPORT int
|
||||
g_sck_tcp_set_no_delay(int sck);
|
||||
extern _X_EXPORT int
|
||||
g_sck_set_non_blocking(int sck);
|
||||
extern _X_EXPORT int
|
||||
g_sck_accept(int sck);
|
||||
extern _X_EXPORT int
|
||||
g_sck_select(int sck1, int sck2, int sck3);
|
||||
extern _X_EXPORT int
|
||||
g_sck_tcp_bind(int sck, char *port);
|
||||
extern _X_EXPORT int
|
||||
g_sck_local_bind(int sck, char *port);
|
||||
extern _X_EXPORT int
|
||||
g_sck_listen(int sck);
|
||||
extern _X_EXPORT int
|
||||
g_create_dir(const char *dirname);
|
||||
extern _X_EXPORT int
|
||||
g_directory_exist(const char *dirname);
|
||||
extern _X_EXPORT int
|
||||
g_chmod_hex(const char *filename, int flags);
|
||||
extern _X_EXPORT void
|
||||
g_hexdump(void *p, long len);
|
||||
|
||||
#if defined(X_BYTE_ORDER)
|
||||
# if X_BYTE_ORDER == X_LITTLE_ENDIAN
|
||||
# define L_ENDIAN
|
||||
# else
|
||||
# define B_ENDIAN
|
||||
# endif
|
||||
#else
|
||||
# error Unknown endianness in rdp.h
|
||||
#endif
|
||||
/* check if we need to align data */
|
||||
#if defined(__sparc__) || defined(__alpha__) || defined(__hppa__) || \
|
||||
defined(__AIX__) || defined(__PPC__) || defined(__mips__) || \
|
||||
defined(__ia64__) || defined(__ppc__) || defined(__arm__)
|
||||
#define NEED_ALIGN
|
||||
#endif
|
||||
|
||||
/* parser state */
|
||||
struct stream
|
||||
{
|
||||
char *p;
|
||||
char *end;
|
||||
char *data;
|
||||
int size;
|
||||
/* offsets of various headers */
|
||||
char *iso_hdr;
|
||||
char *mcs_hdr;
|
||||
char *sec_hdr;
|
||||
char *rdp_hdr;
|
||||
char *channel_hdr;
|
||||
char *next_packet;
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
#define s_push_layer(s, h, n) \
|
||||
do { \
|
||||
(s)->h = (s)->p; \
|
||||
(s)->p += (n); \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define s_pop_layer(s, h) \
|
||||
do { \
|
||||
(s)->p = (s)->h; \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
|
||||
#define out_uint16_le(s, v) \
|
||||
do { \
|
||||
*((s)->p) = (unsigned char)((v) >> 0); \
|
||||
(s)->p++; \
|
||||
*((s)->p) = (unsigned char)((v) >> 8); \
|
||||
(s)->p++; \
|
||||
} while (0)
|
||||
#else
|
||||
#define out_uint16_le(s, v) \
|
||||
do { \
|
||||
*((unsigned short*)((s)->p)) = (unsigned short)(v); \
|
||||
(s)->p += 2; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
#define init_stream(s, v) \
|
||||
do { \
|
||||
if ((v) > (s)->size) \
|
||||
{ \
|
||||
g_free((s)->data); \
|
||||
(s)->data = (char*)g_malloc((v), 0); \
|
||||
(s)->size = (v); \
|
||||
} \
|
||||
(s)->p = (s)->data; \
|
||||
(s)->end = (s)->data; \
|
||||
(s)->next_packet = 0; \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define out_uint8p(s, v, n) \
|
||||
do { \
|
||||
g_memcpy((s)->p, (v), (n)); \
|
||||
(s)->p += (n); \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define out_uint8a(s, v, n) \
|
||||
do { \
|
||||
out_uint8p((s), (v), (n)); \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define out_uint8(s, v) \
|
||||
do { \
|
||||
*((s)->p) = (unsigned char)((v) >> 0); \
|
||||
(s)->p++; \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
|
||||
#define out_uint32_le(s, v) \
|
||||
do { \
|
||||
*((s)->p) = (unsigned char)((v) >> 0); \
|
||||
(s)->p++; \
|
||||
*((s)->p) = (unsigned char)((v) >> 8); \
|
||||
(s)->p++; \
|
||||
*((s)->p) = (unsigned char)((v) >> 16); \
|
||||
(s)->p++; \
|
||||
*((s)->p) = (unsigned char)((v) >> 24); \
|
||||
(s)->p++; \
|
||||
} while (0)
|
||||
#else
|
||||
#define out_uint32_le(s, v) \
|
||||
do { \
|
||||
*((unsigned int*)((s)->p)) = (v); \
|
||||
(s)->p += 4; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
|
||||
#define in_uint32_le(s, v) \
|
||||
do { \
|
||||
(v) = (unsigned int) \
|
||||
( \
|
||||
(*((unsigned char*)((s)->p + 0)) << 0) | \
|
||||
(*((unsigned char*)((s)->p + 1)) << 8) | \
|
||||
(*((unsigned char*)((s)->p + 2)) << 16) | \
|
||||
(*((unsigned char*)((s)->p + 3)) << 24) \
|
||||
); \
|
||||
(s)->p += 4; \
|
||||
} while (0)
|
||||
#else
|
||||
#define in_uint32_le(s, v) \
|
||||
do { \
|
||||
(v) = *((unsigned int*)((s)->p)); \
|
||||
(s)->p += 4; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
|
||||
#define in_uint16_le(s, v) \
|
||||
do { \
|
||||
(v) = (unsigned short) \
|
||||
( \
|
||||
(*((unsigned char*)((s)->p + 0)) << 0) | \
|
||||
(*((unsigned char*)((s)->p + 1)) << 8) \
|
||||
); \
|
||||
(s)->p += 2; \
|
||||
} while (0)
|
||||
#else
|
||||
#define in_uint16_le(s, v) \
|
||||
do { \
|
||||
(v) = *((unsigned short*)((s)->p)); \
|
||||
(s)->p += 2; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
#define s_mark_end(s) \
|
||||
do { \
|
||||
(s)->end = (s)->p; \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define make_stream(s) \
|
||||
do { \
|
||||
(s) = (struct stream*)g_malloc(sizeof(struct stream), 1); \
|
||||
} while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
#define free_stream(s) \
|
||||
do { \
|
||||
if ((s) != 0) \
|
||||
{ \
|
||||
g_free((s)->data); \
|
||||
} \
|
||||
g_free((s)); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
@ -1,122 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
pixmap calls
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpPixmap.h"
|
||||
|
||||
#ifndef XRDP_PIX
|
||||
#warning XRDP_PIX not defined
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
#if XRDP_PIX == 2
|
||||
|
||||
/*****************************************************************************/
|
||||
PixmapPtr
|
||||
rdpCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
|
||||
unsigned usage_hint)
|
||||
{
|
||||
rdpPtr dev;
|
||||
PixmapPtr rv;
|
||||
|
||||
LLOGLN(10, ("rdpCreatePixmap: width %d height %d depth %d",
|
||||
width, height, depth));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
pScreen->CreatePixmap = dev->CreatePixmap;
|
||||
rv = pScreen->CreatePixmap(pScreen, width, height, depth, usage_hint);
|
||||
pScreen->CreatePixmap = rdpCreatePixmap;
|
||||
return rv;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*****************************************************************************/
|
||||
PixmapPtr
|
||||
rdpCreatePixmap(ScreenPtr pScreen, int width, int height, int depth)
|
||||
{
|
||||
rdpPtr dev;
|
||||
PixmapPtr rv;
|
||||
|
||||
LLOGLN(10, ("rdpCreatePixmap: width %d height %d depth %d",
|
||||
width, height, depth));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
pScreen->CreatePixmap = dev->CreatePixmap;
|
||||
rv = pScreen->CreatePixmap(pScreen, width, height, depth);
|
||||
pScreen->CreatePixmap = rdpCreatePixmap;
|
||||
return rv;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpDestroyPixmap(PixmapPtr pPixmap)
|
||||
{
|
||||
Bool rv;
|
||||
ScreenPtr pScreen;
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(10, ("rdpDestroyPixmap: refcnt %d", pPixmap->refcnt));
|
||||
pScreen = pPixmap->drawable.pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
pScreen->DestroyPixmap = dev->DestroyPixmap;
|
||||
rv = pScreen->DestroyPixmap(pPixmap);
|
||||
pScreen->DestroyPixmap = rdpDestroyPixmap;
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, int depth,
|
||||
int bitsPerPixel, int devKind, pointer pPixData)
|
||||
{
|
||||
Bool rv;
|
||||
ScreenPtr pScreen;
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(10, ("rdpModifyPixmapHeader:"));
|
||||
pScreen = pPixmap->drawable.pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
pScreen->ModifyPixmapHeader = dev->ModifyPixmapHeader;
|
||||
rv = pScreen->ModifyPixmapHeader(pPixmap, width, height, depth, bitsPerPixel,
|
||||
devKind, pPixData);
|
||||
pScreen->ModifyPixmapHeader = rdpModifyPixmapHeader;
|
||||
return rv;
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
pixmap calls
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPIXMAP_H
|
||||
#define __RDPPIXAMP_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 5, 0, 0, 0)
|
||||
/* 1.1, 1.2, 1.3, 1.4 */
|
||||
#define XRDP_PIX 1
|
||||
#else
|
||||
/* 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11, 1.12 */
|
||||
#define XRDP_PIX 2
|
||||
#endif
|
||||
|
||||
#if XRDP_PIX == 2
|
||||
extern _X_EXPORT PixmapPtr
|
||||
rdpCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
|
||||
unsigned usage_hint);
|
||||
#else
|
||||
extern _X_EXPORT PixmapPtr
|
||||
rdpCreatePixmap(ScreenPtr pScreen, int width, int height, int depth);
|
||||
#endif
|
||||
extern _X_EXPORT Bool
|
||||
rdpDestroyPixmap(PixmapPtr pPixmap);
|
||||
extern _X_EXPORT Bool
|
||||
rdpModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, int depth,
|
||||
int bitsPerPixel, int devKind, pointer pPixData);
|
||||
|
||||
#endif
|
@ -1,104 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyArc.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPolyArcOrg(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc *parcs)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolyArc(pDrawable, pGC, narcs, parcs);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc *parcs)
|
||||
{
|
||||
rdpPtr dev;
|
||||
BoxRec box;
|
||||
int index;
|
||||
int cd;
|
||||
int lw;
|
||||
int extra;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
|
||||
LLOGLN(0, ("rdpPolyArc:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyArcCallCount++;
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
if (narcs > 0)
|
||||
{
|
||||
lw = pGC->lineWidth;
|
||||
if (lw == 0)
|
||||
{
|
||||
lw = 1;
|
||||
}
|
||||
extra = lw / 2;
|
||||
for (index = 0; index < narcs; index++)
|
||||
{
|
||||
box.x1 = (parcs[index].x - extra) + pDrawable->x;
|
||||
box.y1 = (parcs[index].y - extra) + pDrawable->y;
|
||||
box.x2 = box.x1 + parcs[index].width + lw;
|
||||
box.y2 = box.y1 + parcs[index].height + lw;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
}
|
||||
}
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyArc: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolyArcOrg(pDrawable, pGC, narcs, parcs);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2013 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYARC_H
|
||||
#define __RDPPOLYARC_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs);
|
||||
|
||||
#endif
|
@ -1,104 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyFillArc.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPolyFillArcOrg(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc *parcs)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolyFillArc(pDrawable, pGC, narcs, parcs);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc *parcs)
|
||||
{
|
||||
rdpPtr dev;
|
||||
BoxRec box;
|
||||
int index;
|
||||
int cd;
|
||||
int lw;
|
||||
int extra;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
|
||||
LLOGLN(10, ("rdpPolyFillArc:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyFillArcCallCount++;
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
if (narcs > 0)
|
||||
{
|
||||
lw = pGC->lineWidth;
|
||||
if (lw == 0)
|
||||
{
|
||||
lw = 1;
|
||||
}
|
||||
extra = lw / 2;
|
||||
for (index = 0; index < narcs; index++)
|
||||
{
|
||||
box.x1 = (parcs[index].x - extra) + pDrawable->x;
|
||||
box.y1 = (parcs[index].y - extra) + pDrawable->y;
|
||||
box.x2 = box.x1 + parcs[index].width + lw;
|
||||
box.y2 = box.y1 + parcs[index].height + lw;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
}
|
||||
}
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyFillArc: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolyFillArcOrg(pDrawable, pGC, narcs, parcs);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2013 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYFILLARC_H
|
||||
#define __RDPPOLYFILLARC_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs);
|
||||
|
||||
#endif
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyFillRect.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPolyFillRectOrg(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
|
||||
xRectangle *prectInit)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolyFillRect(pDrawable, pGC, nrectFill, prectInit);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
|
||||
xRectangle *prectInit)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionPtr reg;
|
||||
int cd;
|
||||
|
||||
LLOGLN(10, ("rdpPolyFillRect:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyFillRectCallCount++;
|
||||
/* make a copy of rects */
|
||||
reg = rdpRegionFromRects(nrectFill, prectInit, CT_NONE);
|
||||
rdpRegionTranslate(reg, pDrawable->x, pDrawable->y);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyFillRect: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(reg, &clip_reg, reg);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolyFillRectOrg(pDrawable, pGC, nrectFill, prectInit);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, reg, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionDestroy(reg);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2013 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYFILLRECT_H
|
||||
#define __RDPPOLYFILLRECT_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
|
||||
xRectangle* prectInit);
|
||||
|
||||
#endif
|
@ -1,89 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyGlyphBlt.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyGlyphBltOrg(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, unsigned int nglyph,
|
||||
CharInfoPtr *ppci, pointer pglyphBase)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, unsigned int nglyph,
|
||||
CharInfoPtr *ppci, pointer pglyphBase)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(0, ("rdpPolyGlyphBlt:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyGlyphBltCallCount++;
|
||||
GetTextBoundingBox(pDrawable, pGC->font, x, y, nglyph, &box);
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyGlyphBlt: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolyGlyphBltOrg(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYGLYPHBLT_H
|
||||
#define __RDPPOLYGLYPHBLT_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, unsigned int nglyph,
|
||||
CharInfoPtr* ppci, pointer pglyphBase);
|
||||
|
||||
#endif
|
@ -1,95 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyPoint.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPolyPointOrg(DrawablePtr pDrawable, GCPtr pGC, int mode,
|
||||
int npt, DDXPointPtr in_pts)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolyPoint(pDrawable, pGC, mode, npt, in_pts);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
|
||||
int npt, DDXPointPtr in_pts)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
int index;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpPolyPoint:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyPointCallCount++;
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
for (index = 0; index < npt; index++)
|
||||
{
|
||||
box.x1 = in_pts[index].x + pDrawable->x;
|
||||
box.y1 = in_pts[index].y + pDrawable->y;
|
||||
box.x2 = box.x1 + 1;
|
||||
box.y2 = box.y1 + 1;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
}
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyPoint: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolyPointOrg(pDrawable, pGC, mode, npt, in_pts);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYPOINT_H
|
||||
#define __RDPPOLYPOINT_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
|
||||
int npt, DDXPointPtr in_pts);
|
||||
|
||||
#endif
|
@ -1,134 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyRectangle.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPolyRectangleOrg(DrawablePtr pDrawable, GCPtr pGC, int nrects,
|
||||
xRectangle *rects)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolyRectangle(pDrawable, pGC, nrects, rects);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolyRectangle(DrawablePtr pDrawable, GCPtr pGC, int nrects,
|
||||
xRectangle *rects)
|
||||
{
|
||||
rdpPtr dev;
|
||||
BoxRec box;
|
||||
int index;
|
||||
int up;
|
||||
int down;
|
||||
int lw;
|
||||
int cd;
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
|
||||
LLOGLN(10, ("rdpPolyRectangle:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyRectangleCallCount++;
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
lw = pGC->lineWidth;
|
||||
if (lw < 1)
|
||||
{
|
||||
lw = 1;
|
||||
}
|
||||
up = lw / 2;
|
||||
down = 1 + (lw - 1) / 2;
|
||||
index = 0;
|
||||
while (index < nrects)
|
||||
{
|
||||
x1 = rects[index].x + pDrawable->x;
|
||||
y1 = rects[index].y + pDrawable->y;
|
||||
x2 = x1 + rects[index].width;
|
||||
y2 = y1 + rects[index].height;
|
||||
/* top */
|
||||
box.x1 = x1 - up;
|
||||
box.y1 = y1 - up;
|
||||
box.x2 = x2 + down;
|
||||
box.y2 = y1 + down;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
/* left */
|
||||
box.x1 = x1 - up;
|
||||
box.y1 = y1 - up;
|
||||
box.x2 = x1 + down;
|
||||
box.y2 = y2 + down;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
/* right */
|
||||
box.x1 = x2 - up;
|
||||
box.y1 = y1 - up;
|
||||
box.x2 = x2 + down;
|
||||
box.y2 = y2 + down;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
/* bottom */
|
||||
box.x1 = x1 - up;
|
||||
box.y1 = y2 - up;
|
||||
box.x2 = x2 + down;
|
||||
box.y2 = y2 + down;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
index++;
|
||||
}
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyRectangle: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolyRectangleOrg(pDrawable, pGC, nrects, rects);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2013 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYRECTANGLE_H
|
||||
#define __RDPPOLYRECTANGLE_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolyRectangle(DrawablePtr pDrawable, GCPtr pGC, int nrects,
|
||||
xRectangle* rects);
|
||||
|
||||
#endif
|
@ -1,101 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolySegment.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolySegmentOrg(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSegs)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PolySegment(pDrawable, pGC, nseg, pSegs);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSegs)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
int index;
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpPolySegment:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolySegmentCallCount++;
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
for (index = 0; index < nseg; index++)
|
||||
{
|
||||
x1 = pSegs[index].x1 + pDrawable->x;
|
||||
y1 = pSegs[index].y1 + pDrawable->y;
|
||||
x2 = pSegs[index].x2 + pDrawable->x;
|
||||
y2 = pSegs[index].y2 + pDrawable->y;
|
||||
box.x1 = RDPMIN(x1, x2);
|
||||
box.y1 = RDPMIN(y1, y2);
|
||||
box.x2 = RDPMAX(x1, x2) + 1;
|
||||
box.y2 = RDPMAX(y1, y2) + 1;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
}
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolySegment: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolySegmentOrg(pDrawable, pGC, nseg, pSegs);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYSEGMENT_H
|
||||
#define __RDPPOLYSEGMENT_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment* pSegs);
|
||||
|
||||
#endif
|
@ -1,91 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyText16.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpPolyText16Org(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, unsigned short *chars)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
int rv;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
rv = pGC->ops->PolyText16(pDrawable, pGC, x, y, count, chars);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, unsigned short *chars)
|
||||
{
|
||||
int rv;
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpPolyText16:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyText16CallCount++;
|
||||
GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyText16: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rv = rdpPolyText16Org(pDrawable, pGC, x, y, count, chars);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
return rv;
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYTEXT16_H
|
||||
#define __RDPPOLYTEXT16_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT int
|
||||
rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, unsigned short* chars);
|
||||
|
||||
#endif
|
@ -1,91 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolyText8.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpPolyText8Org(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, char *chars)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
int rv;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
rv = pGC->ops->PolyText8(pDrawable, pGC, x, y, count, chars);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, char *chars)
|
||||
{
|
||||
int rv;
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpPolyText8:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolyText8CallCount++;
|
||||
GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolyText8: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rv = rdpPolyText8Org(pDrawable, pGC, x, y, count, chars);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
return rv;
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYTEXT8_H
|
||||
#define __RDPPOLYTEXT8_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
int
|
||||
rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
|
||||
int x, int y, int count, char* chars);
|
||||
|
||||
#endif
|
@ -1,103 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPolylines.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPolylinesOrg(DrawablePtr pDrawable, GCPtr pGC, int mode,
|
||||
int npt, DDXPointPtr pptInit)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->Polylines(pDrawable, pGC, mode, npt, pptInit);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
|
||||
int npt, DDXPointPtr pptInit)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
int index;
|
||||
int x1;
|
||||
int y1;
|
||||
int x2;
|
||||
int y2;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpPolylines:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPolylinesCallCount++;
|
||||
rdpRegionInit(®, NullBox, 0);
|
||||
for (index = 1; index < npt; index++)
|
||||
{
|
||||
x1 = pptInit[index - 1].x + pDrawable->x;
|
||||
y1 = pptInit[index - 1].y + pDrawable->y;
|
||||
x2 = pptInit[index].x + pDrawable->x;
|
||||
y2 = pptInit[index].y + pDrawable->y;
|
||||
box.x1 = RDPMIN(x1, x2);
|
||||
box.y1 = RDPMIN(y1, y2);
|
||||
box.x2 = RDPMAX(x1, x2) + 1;
|
||||
box.y2 = RDPMAX(y1, y2) + 1;
|
||||
rdpRegionUnionRect(®, &box);
|
||||
}
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDrawable, pGC);
|
||||
LLOGLN(10, ("rdpPolylines: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPolylinesOrg(pDrawable, pGC, mode, npt, pptInit);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDrawable);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPOLYLINES_H
|
||||
#define __RDPPOLYLINES_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
void
|
||||
rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
|
||||
int npt, DDXPointPtr pptInit);
|
||||
|
||||
#endif
|
@ -1,177 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
to deal with privates changing in xorg versions
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
|
||||
#include "rdpPri.h"
|
||||
#include "rdpMisc.h"
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 5, 0, 0, 0)
|
||||
/* 1.1, 1.2, 1.3, 1.4 */
|
||||
#define XRDP_PRI 1
|
||||
#elif XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 9, 0, 0, 0)
|
||||
/* 1.5, 1.6, 1.7, 1.8 */
|
||||
#define XRDP_PRI 2
|
||||
#else
|
||||
/* 1.9, 1.10, 1.11, 1.12 */
|
||||
#define XRDP_PRI 3
|
||||
#endif
|
||||
|
||||
#define PTR2INT(_ptr) ((int) ((long) ((void*) (_ptr))))
|
||||
#define INT2PTR(_int) ((void *) ((long) ((int) (_int))))
|
||||
|
||||
#if XRDP_PRI == 3
|
||||
static DevPrivateKeyRec g_privateKeyRecGC;
|
||||
static DevPrivateKeyRec g_privateKeyRecPixmap;
|
||||
static DevPrivateKeyRec g_privateKeyRecWindow;
|
||||
#elif XRDP_PRI == 2
|
||||
static int g_privateKeyRecGC = 0;
|
||||
static int g_privateKeyRecPixmap = 0;
|
||||
static int g_privateKeyRecWindow = 0;
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
rdpDevPrivateKey
|
||||
rdpAllocateGCPrivate(ScreenPtr pScreen, int bytes)
|
||||
{
|
||||
rdpDevPrivateKey rv;
|
||||
|
||||
#if XRDP_PRI == 1
|
||||
rv = INT2PTR(AllocateGCPrivateIndex());
|
||||
AllocateGCPrivate(pScreen, PTR2INT(rv), bytes);
|
||||
#elif XRDP_PRI == 2
|
||||
dixRequestPrivate(&g_privateKeyRecGC, bytes);
|
||||
rv = &g_privateKeyRecGC;
|
||||
#else
|
||||
dixRegisterPrivateKey(&g_privateKeyRecGC, PRIVATE_GC, bytes);
|
||||
rv = &g_privateKeyRecGC;
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
rdpDevPrivateKey
|
||||
rdpAllocatePixmapPrivate(ScreenPtr pScreen, int bytes)
|
||||
{
|
||||
rdpDevPrivateKey rv;
|
||||
|
||||
#if XRDP_PRI == 1
|
||||
rv = INT2PTR(AllocatePixmapPrivateIndex());
|
||||
AllocatePixmapPrivate(pScreen, PTR2INT(rv), bytes);
|
||||
#elif XRDP_PRI == 2
|
||||
dixRequestPrivate(&g_privateKeyRecPixmap, bytes);
|
||||
rv = &g_privateKeyRecPixmap;
|
||||
#else
|
||||
dixRegisterPrivateKey(&g_privateKeyRecPixmap, PRIVATE_PIXMAP, bytes);
|
||||
rv = &g_privateKeyRecPixmap;
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
rdpDevPrivateKey
|
||||
rdpAllocateWindowPrivate(ScreenPtr pScreen, int bytes)
|
||||
{
|
||||
rdpDevPrivateKey rv;
|
||||
|
||||
#if XRDP_PRI == 1
|
||||
rv = INT2PTR(AllocateWindowPrivateIndex());
|
||||
AllocateWindowPrivate(pScreen, PTR2INT(rv), bytes);
|
||||
#elif XRDP_PRI == 2
|
||||
dixRequestPrivate(&g_privateKeyRecWindow, bytes);
|
||||
rv = &g_privateKeyRecWindow;
|
||||
#else
|
||||
dixRegisterPrivateKey(&g_privateKeyRecWindow, PRIVATE_WINDOW, bytes);
|
||||
rv = &g_privateKeyRecWindow;
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void *
|
||||
rdpGetGCPrivate(GCPtr pGC, rdpDevPrivateKey key)
|
||||
{
|
||||
void *rv;
|
||||
|
||||
#if XRDP_PRI == 1
|
||||
rv = pGC->devPrivates[PTR2INT(key)].ptr;
|
||||
#else
|
||||
rv = dixLookupPrivate(&(pGC->devPrivates), key);
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void *
|
||||
rdpGetPixmapPrivate(PixmapPtr pPixmap, rdpDevPrivateKey key)
|
||||
{
|
||||
void *rv;
|
||||
|
||||
#if XRDP_PRI == 1
|
||||
rv = pPixmap->devPrivates[PTR2INT(key)].ptr;
|
||||
#else
|
||||
rv = dixLookupPrivate(&(pPixmap->devPrivates), key);
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void *
|
||||
rdpGetWindowPrivate(WindowPtr pWindow, rdpDevPrivateKey key)
|
||||
{
|
||||
void *rv;
|
||||
|
||||
#if XRDP_PRI == 1
|
||||
rv = pWindow->devPrivates[PTR2INT(key)].ptr;
|
||||
#else
|
||||
rv = dixLookupPrivate(&(pWindow->devPrivates), key);
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
rdpPrivateInit(void)
|
||||
{
|
||||
#if XRDP_PRI == 3
|
||||
g_memset(&g_privateKeyRecGC, 0, sizeof(g_privateKeyRecGC));
|
||||
g_memset(&g_privateKeyRecWindow, 0, sizeof(g_privateKeyRecWindow));
|
||||
g_memset(&g_privateKeyRecPixmap, 0, sizeof(g_privateKeyRecPixmap));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
to deal with privates changing in xorg versions
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _XRDPPRI_H
|
||||
#define _XRDPPRI_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
#include <screenint.h>
|
||||
#include <gc.h>
|
||||
|
||||
typedef void* rdpDevPrivateKey;
|
||||
|
||||
extern _X_EXPORT rdpDevPrivateKey
|
||||
rdpAllocateGCPrivate(ScreenPtr pScreen, int bytes);
|
||||
extern _X_EXPORT rdpDevPrivateKey
|
||||
rdpAllocatePixmapPrivate(ScreenPtr pScreen, int bytes);
|
||||
extern _X_EXPORT rdpDevPrivateKey
|
||||
rdpAllocateWindowPrivate(ScreenPtr pScreen, int bytes);
|
||||
extern _X_EXPORT void*
|
||||
rdpGetGCPrivate(GCPtr pGC, rdpDevPrivateKey key);
|
||||
extern _X_EXPORT void*
|
||||
rdpGetPixmapPrivate(PixmapPtr pPixmap, rdpDevPrivateKey key);
|
||||
extern _X_EXPORT void*
|
||||
rdpGetWindowPrivate(WindowPtr pWindow, rdpDevPrivateKey key);
|
||||
extern _X_EXPORT int
|
||||
rdpPrivateInit(void);
|
||||
|
||||
#endif
|
@ -1,62 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpPushPixels.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPushPixelsOrg(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
|
||||
int w, int h, int x, int y)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PushPixels(pGC, pBitMap, pDst, w, h, x, y);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
|
||||
int w, int h, int x, int y)
|
||||
{
|
||||
LLOGLN(0, ("rdpPushPixels:"));
|
||||
/* do original call */
|
||||
rdpPushPixelsOrg(pGC, pBitMap, pDst, w, h, x, y);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPUSHPIXELS_H
|
||||
#define __RDPPUSHPIXELS_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
|
||||
int w, int h, int x, int y);
|
||||
|
||||
#endif
|
@ -1,91 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpPutImage.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpPutImageOrg(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y,
|
||||
int w, int h, int leftPad, int format, char *pBits)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->PutImage(pDst, pGC, depth, x, y, w, h, leftPad,
|
||||
format, pBits);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y,
|
||||
int w, int h, int leftPad, int format, char *pBits)
|
||||
{
|
||||
rdpPtr dev;
|
||||
RegionRec clip_reg;
|
||||
RegionRec reg;
|
||||
int cd;
|
||||
BoxRec box;
|
||||
|
||||
LLOGLN(10, ("rdpPutImage:"));
|
||||
dev = rdpGetDevFromScreen(pGC->pScreen);
|
||||
dev->counts.rdpPutImageCallCount++;
|
||||
box.x1 = x + pDst->x;
|
||||
box.y1 = y + pDst->y;
|
||||
box.x2 = box.x1 + w;
|
||||
box.y2 = box.y1 + h;
|
||||
rdpRegionInit(®, &box, 0);
|
||||
rdpRegionInit(&clip_reg, NullBox, 0);
|
||||
cd = rdpDrawGetClip(dev, &clip_reg, pDst, pGC);
|
||||
LLOGLN(10, ("rdpPutImage: cd %d", cd));
|
||||
if (cd == XRDP_CD_CLIP)
|
||||
{
|
||||
rdpRegionIntersect(®, &clip_reg, ®);
|
||||
}
|
||||
/* do original call */
|
||||
rdpPutImageOrg(pDst, pGC, depth, x, y, w, h, leftPad, format, pBits);
|
||||
if (cd != XRDP_CD_NODRAW)
|
||||
{
|
||||
rdpClientConAddAllReg(dev, ®, pDst);
|
||||
}
|
||||
rdpRegionUninit(&clip_reg);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPPUTIMAGE_H
|
||||
#define __RDPPUTIMAGE_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y,
|
||||
int w, int h, int leftPad, int format, char* pBits);
|
||||
|
||||
#endif
|
@ -1,273 +0,0 @@
|
||||
/*
|
||||
Copyright 2011-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
RandR draw calls
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpRandR.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRRegisterSize(ScreenPtr pScreen, int width, int height)
|
||||
{
|
||||
int mmwidth;
|
||||
int mmheight;
|
||||
RRScreenSizePtr pSize;
|
||||
|
||||
LLOGLN(0, ("rdpRRRegisterSize: width %d height %d", width, height));
|
||||
mmwidth = PixelToMM(width);
|
||||
mmheight = PixelToMM(height);
|
||||
pSize = RRRegisterSize(pScreen, width, height, mmwidth, mmheight);
|
||||
/* Tell RandR what the current config is */
|
||||
RRSetCurrentConfig(pScreen, RR_Rotate_0, 0, pSize);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRSetConfig(ScreenPtr pScreen, Rotation rotateKind, int rate,
|
||||
RRScreenSizePtr pSize)
|
||||
{
|
||||
LLOGLN(0, ("rdpRRSetConfig:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRGetInfo(ScreenPtr pScreen, Rotation *pRotations)
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpRRGetInfo:"));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
*pRotations = RR_Rotate_0;
|
||||
width = dev->width;
|
||||
height = dev->height;
|
||||
rdpRRRegisterSize(pScreen, width, height);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRScreenSetSize(ScreenPtr pScreen, CARD16 width, CARD16 height,
|
||||
CARD32 mmWidth, CARD32 mmHeight)
|
||||
{
|
||||
WindowPtr root;
|
||||
PixmapPtr screenPixmap;
|
||||
BoxRec box;
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpRRScreenSetSize: width %d height %d mmWidth %d mmHeight %d",
|
||||
width, height, (int)mmWidth, (int)mmHeight));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
root = rdpGetRootWindowPtr(pScreen);
|
||||
if ((width < 1) || (height < 1))
|
||||
{
|
||||
LLOGLN(10, (" error width %d height %d", width, height));
|
||||
return FALSE;
|
||||
}
|
||||
dev->width = width;
|
||||
dev->height = height;
|
||||
dev->paddedWidthInBytes = PixmapBytePad(dev->width, dev->depth);
|
||||
dev->sizeInBytes = dev->paddedWidthInBytes * dev->height;
|
||||
pScreen->width = width;
|
||||
pScreen->height = height;
|
||||
pScreen->mmWidth = mmWidth;
|
||||
pScreen->mmHeight = mmHeight;
|
||||
screenPixmap = pScreen->GetScreenPixmap(pScreen);
|
||||
g_free(dev->pfbMemory_alloc);
|
||||
dev->pfbMemory_alloc = (char *) g_malloc(dev->sizeInBytes + 16, 1);
|
||||
dev->pfbMemory = (char *) RDPALIGN(dev->pfbMemory_alloc, 16);
|
||||
if (screenPixmap != 0)
|
||||
{
|
||||
pScreen->ModifyPixmapHeader(screenPixmap, width, height,
|
||||
-1, -1,
|
||||
dev->paddedWidthInBytes,
|
||||
dev->pfbMemory);
|
||||
}
|
||||
box.x1 = 0;
|
||||
box.y1 = 0;
|
||||
box.x2 = width;
|
||||
box.y2 = height;
|
||||
rdpRegionInit(&root->winSize, &box, 1);
|
||||
rdpRegionInit(&root->borderSize, &box, 1);
|
||||
rdpRegionReset(&root->borderClip, &box);
|
||||
rdpRegionBreak(&root->clipList);
|
||||
root->drawable.width = width;
|
||||
root->drawable.height = height;
|
||||
ResizeChildrenWinSize(root, 0, 0, 0, 0);
|
||||
RRGetInfo(pScreen, 1);
|
||||
LLOGLN(0, (" screen resized to %dx%d", pScreen->width, pScreen->height));
|
||||
RRScreenSizeNotify(pScreen);
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
xf86EnableDisableFBAccess(pScreen->myNum, FALSE);
|
||||
xf86EnableDisableFBAccess(pScreen->myNum, TRUE);
|
||||
#else
|
||||
xf86EnableDisableFBAccess(xf86Screens[pScreen->myNum], FALSE);
|
||||
xf86EnableDisableFBAccess(xf86Screens[pScreen->myNum], TRUE);
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRCrtcSet(ScreenPtr pScreen, RRCrtcPtr crtc, RRModePtr mode,
|
||||
int x, int y, Rotation rotation, int numOutputs,
|
||||
RROutputPtr *outputs)
|
||||
{
|
||||
LLOGLN(0, ("rdpRRCrtcSet:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRCrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr crtc)
|
||||
{
|
||||
LLOGLN(0, ("rdpRRCrtcSetGamma:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRCrtcGetGamma(ScreenPtr pScreen, RRCrtcPtr crtc)
|
||||
{
|
||||
LLOGLN(0, ("rdpRRCrtcGetGamma: %p %p %p %p", crtc, crtc->gammaRed,
|
||||
crtc->gammaBlue, crtc->gammaGreen));
|
||||
crtc->gammaSize = 1;
|
||||
if (crtc->gammaRed == NULL)
|
||||
{
|
||||
crtc->gammaRed = g_malloc(32, 1);
|
||||
}
|
||||
if (crtc->gammaBlue == NULL)
|
||||
{
|
||||
crtc->gammaBlue = g_malloc(32, 1);
|
||||
}
|
||||
if (crtc->gammaGreen == NULL)
|
||||
{
|
||||
crtc->gammaGreen = g_malloc(32, 1);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRROutputSetProperty(ScreenPtr pScreen, RROutputPtr output, Atom property,
|
||||
RRPropertyValuePtr value)
|
||||
{
|
||||
LLOGLN(0, ("rdpRROutputSetProperty:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRROutputValidateMode(ScreenPtr pScreen, RROutputPtr output,
|
||||
RRModePtr mode)
|
||||
{
|
||||
LLOGLN(0, ("rdpRROutputValidateMode:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpRRModeDestroy(ScreenPtr pScreen, RRModePtr mode)
|
||||
{
|
||||
LLOGLN(0, ("rdpRRModeDestroy:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRROutputGetProperty(ScreenPtr pScreen, RROutputPtr output, Atom property)
|
||||
{
|
||||
LLOGLN(0, ("rdpRROutputGetProperty:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRGetPanning(ScreenPtr pScreen, RRCrtcPtr crtc, BoxPtr totalArea,
|
||||
BoxPtr trackingArea, INT16 *border)
|
||||
{
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpRRGetPanning: %p", crtc));
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
|
||||
if (totalArea != 0)
|
||||
{
|
||||
totalArea->x1 = 0;
|
||||
totalArea->y1 = 0;
|
||||
totalArea->x2 = dev->width;
|
||||
totalArea->y2 = dev->height;
|
||||
}
|
||||
|
||||
if (trackingArea != 0)
|
||||
{
|
||||
trackingArea->x1 = 0;
|
||||
trackingArea->y1 = 0;
|
||||
trackingArea->x2 = dev->width;
|
||||
trackingArea->y2 = dev->height;
|
||||
}
|
||||
|
||||
if (border != 0)
|
||||
{
|
||||
border[0] = 0;
|
||||
border[1] = 0;
|
||||
border[2] = 0;
|
||||
border[3] = 0;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
Bool
|
||||
rdpRRSetPanning(ScreenPtr pScreen, RRCrtcPtr crtc, BoxPtr totalArea,
|
||||
BoxPtr trackingArea, INT16 *border)
|
||||
{
|
||||
LLOGLN(0, ("rdpRRSetPanning:"));
|
||||
return TRUE;
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
Copyright 2011-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDPRANDR_H
|
||||
#define _RDPRANDR_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRRegisterSize(ScreenPtr pScreen, int width, int height);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRGetInfo(ScreenPtr pScreen, Rotation* pRotations);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRSetConfig(ScreenPtr pScreen, Rotation rotateKind, int rate,
|
||||
RRScreenSizePtr pSize);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRScreenSetSize(ScreenPtr pScreen, CARD16 width, CARD16 height,
|
||||
CARD32 mmWidth, CARD32 mmHeight);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRCrtcSet(ScreenPtr pScreen, RRCrtcPtr crtc, RRModePtr mode,
|
||||
int x, int y, Rotation rotation, int numOutputs,
|
||||
RROutputPtr* outputs);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRCrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr crtc);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRCrtcGetGamma(ScreenPtr pScreen, RRCrtcPtr crtc);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRROutputSetProperty(ScreenPtr pScreen, RROutputPtr output, Atom property,
|
||||
RRPropertyValuePtr value);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRROutputValidateMode(ScreenPtr pScreen, RROutputPtr output,
|
||||
RRModePtr mode);
|
||||
extern _X_EXPORT void
|
||||
rdpRRModeDestroy(ScreenPtr pScreen, RRModePtr mode);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRROutputGetProperty(ScreenPtr pScreen, RROutputPtr output, Atom property);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRGetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
|
||||
BoxPtr trackingArea, INT16* border);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRRSetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
|
||||
BoxPtr trackingArea, INT16* border);
|
||||
|
||||
#endif
|
@ -1,267 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
to deal with regions changing in xorg versions
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdpReg.h"
|
||||
|
||||
/*
|
||||
miRegionCopy -> RegionCopy
|
||||
miTranslateRegion -> RegionTranslate
|
||||
miRegionNotEmpty -> RegionNotEmpty
|
||||
miIntersect -> RegionIntersect
|
||||
miRectIn -> RegionContainsRect
|
||||
miRegionInit -> RegionInit
|
||||
miRegionUninit -> RegionUninit
|
||||
miRectsToRegion -> RegionFromRects
|
||||
miRegionDestroy -> RegionDestroy
|
||||
miRegionCreate -> RegionCreate
|
||||
miUnion -> RegionUnion
|
||||
miRegionExtents -> RegionExtents
|
||||
miRegionReset -> RegionReset
|
||||
miRegionBreak -> RegionBreak
|
||||
*/
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 9, 0, 0, 0)
|
||||
/* 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8 */
|
||||
#define XRDP_REG 1
|
||||
#else
|
||||
/* 1.9, 1.10, 1.11, 1.12 */
|
||||
#define XRDP_REG 2
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionCopy(RegionPtr dst, RegionPtr src)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRegionCopy(dst, src);
|
||||
#else
|
||||
return RegionCopy(dst, src);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpRegionTranslate(RegionPtr pReg, int x, int y)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
miTranslateRegion(pReg, x, y);
|
||||
#else
|
||||
RegionTranslate(pReg, x, y);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionNotEmpty(RegionPtr pReg)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRegionNotEmpty(pReg);
|
||||
#else
|
||||
return RegionNotEmpty(pReg);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionIntersect(RegionPtr newReg, RegionPtr reg1, RegionPtr reg2)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miIntersect(newReg, reg1, reg2);
|
||||
#else
|
||||
return RegionIntersect(newReg, reg1, reg2);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
rdpRegionContainsRect(RegionPtr region, BoxPtr prect)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRectIn(region, prect);
|
||||
#else
|
||||
return RegionContainsRect(region, prect);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpRegionInit(RegionPtr pReg, BoxPtr rect, int size)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
miRegionInit(pReg, rect, size);
|
||||
#else
|
||||
RegionInit(pReg, rect, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpRegionUninit(RegionPtr pReg)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
miRegionUninit(pReg);
|
||||
#else
|
||||
RegionUninit(pReg);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
RegionPtr
|
||||
rdpRegionFromRects(int nrects, xRectanglePtr prect, int ctype)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRectsToRegion(nrects, prect, ctype);
|
||||
#else
|
||||
return RegionFromRects(nrects, prect, ctype);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpRegionDestroy(RegionPtr pReg)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
miRegionDestroy(pReg);
|
||||
#else
|
||||
RegionDestroy(pReg);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
RegionPtr
|
||||
rdpRegionCreate(BoxPtr rect, int size)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRegionCreate(rect, size);
|
||||
#else
|
||||
return RegionCreate(rect, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionUnion(RegionPtr newReg, RegionPtr reg1, RegionPtr reg2)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miUnion(newReg, reg1, reg2);
|
||||
#else
|
||||
return RegionUnion(newReg, reg1, reg2);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionSubtract(RegionPtr newReg, RegionPtr reg1, RegionPtr reg2)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miSubtract(newReg, reg1, reg2);
|
||||
#else
|
||||
return RegionSubtract(newReg, reg1, reg2);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionInverse(RegionPtr newReg, RegionPtr reg1, BoxPtr invRect)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miInverse(newReg, reg1, invRect);
|
||||
#else
|
||||
return RegionInverse(newReg, reg1, invRect);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
BoxPtr
|
||||
rdpRegionExtents(RegionPtr pReg)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRegionExtents(pReg);
|
||||
#else
|
||||
return RegionExtents(pReg);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpRegionReset(RegionPtr pReg, BoxPtr pBox)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
miRegionReset(pReg, pBox);
|
||||
#else
|
||||
RegionReset(pReg, pBox);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpRegionBreak(RegionPtr pReg)
|
||||
{
|
||||
#if XRDP_REG == 1
|
||||
return miRegionBreak(pReg);
|
||||
#else
|
||||
return RegionBreak(pReg);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void
|
||||
rdpRegionUnionRect(RegionPtr pReg, BoxPtr prect)
|
||||
{
|
||||
RegionRec reg;
|
||||
|
||||
rdpRegionInit(®, prect, 0);
|
||||
rdpRegionUnion(pReg, pReg, ®);
|
||||
rdpRegionUninit(®);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
rdpRegionPixelCount(RegionPtr pReg)
|
||||
{
|
||||
int index;
|
||||
int count;
|
||||
int rv;
|
||||
BoxRec box;
|
||||
|
||||
rv = 0;
|
||||
count = REGION_NUM_RECTS(pReg);
|
||||
for (index = 0; index < count; index++)
|
||||
{
|
||||
box = REGION_RECTS(pReg)[index];
|
||||
rv += (box.x2 - box.x1) * (box.y2 - box.y1);
|
||||
}
|
||||
return rv;
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
to deal with regions changing in xorg versions
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPREG_H
|
||||
#define __RDPREG_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionCopy(RegionPtr dst, RegionPtr src);
|
||||
extern _X_EXPORT void
|
||||
rdpRegionTranslate(RegionPtr pReg, int x, int y);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionNotEmpty(RegionPtr pReg);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionIntersect(RegionPtr newReg, RegionPtr reg1, RegionPtr reg2);
|
||||
extern _X_EXPORT int
|
||||
rdpRegionContainsRect(RegionPtr region, BoxPtr prect);
|
||||
extern _X_EXPORT void
|
||||
rdpRegionInit(RegionPtr pReg, BoxPtr rect, int size);
|
||||
extern _X_EXPORT void
|
||||
rdpRegionUninit(RegionPtr pReg);
|
||||
extern _X_EXPORT RegionPtr
|
||||
rdpRegionFromRects(int nrects, xRectanglePtr prect, int ctype);
|
||||
extern _X_EXPORT void
|
||||
rdpRegionDestroy(RegionPtr pReg);
|
||||
extern _X_EXPORT RegionPtr
|
||||
rdpRegionCreate(BoxPtr rect, int size);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionUnion(RegionPtr newReg, RegionPtr reg1, RegionPtr reg2);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionSubtract(RegionPtr newReg, RegionPtr reg1, RegionPtr reg2);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionInverse(RegionPtr newReg, RegionPtr reg1, BoxPtr invRect);
|
||||
extern _X_EXPORT BoxPtr
|
||||
rdpRegionExtents(RegionPtr pReg);
|
||||
extern _X_EXPORT void
|
||||
rdpRegionReset(RegionPtr pReg, BoxPtr pBox);
|
||||
extern _X_EXPORT Bool
|
||||
rdpRegionBreak(RegionPtr pReg);
|
||||
extern _X_EXPORT void
|
||||
rdpRegionUnionRect(RegionPtr pReg, BoxPtr prect);
|
||||
extern _X_EXPORT int
|
||||
rdpRegionPixelCount(RegionPtr pReg);
|
||||
|
||||
#endif
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpSetSpans.h"
|
||||
|
||||
#define LDEBUG 0
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpSetSpansOrg(DrawablePtr pDrawable, GCPtr pGC, char *psrc,
|
||||
DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
|
||||
{
|
||||
GC_OP_VARS;
|
||||
|
||||
GC_OP_PROLOGUE(pGC);
|
||||
pGC->ops->SetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
|
||||
GC_OP_EPILOGUE(pGC);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpSetSpans(DrawablePtr pDrawable, GCPtr pGC, char *psrc,
|
||||
DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
|
||||
{
|
||||
LLOGLN(0, ("rdpSetSpans:"));
|
||||
/* do original call */
|
||||
rdpSetSpansOrg(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
Copyright 2005-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPSETSPANS_H
|
||||
#define __RDPSETSPANS_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpSetSpans(DrawablePtr pDrawable, GCPtr pGC, char* psrc,
|
||||
DDXPointPtr ppt, int* pwidth, int nspans, int fSorted);
|
||||
|
||||
#endif
|
@ -1,110 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
SIMD function asign
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpXv.h"
|
||||
#include "rdpCapture.h"
|
||||
#include "rdpSimd.h"
|
||||
|
||||
/* use simd, run time */
|
||||
int g_simd_use_accel = 1;
|
||||
|
||||
/* use simd, compile time, if zero, g_simd_use_accel does not matter */
|
||||
#if !defined(SIMD_USE_ACCEL)
|
||||
#define SIMD_USE_ACCEL 0
|
||||
#endif
|
||||
|
||||
#if SIMD_USE_ACCEL
|
||||
#if defined(__x86_64__) || defined(__AMD64__) || defined (_M_AMD64)
|
||||
#include "amd64/funcs_amd64.h"
|
||||
#elif defined(__x86__) || defined(_M_IX86) || defined(__i386__)
|
||||
#include "x86/funcs_x86.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpSimdInit(ScreenPtr pScreen, ScrnInfoPtr pScrn)
|
||||
{
|
||||
rdpPtr dev;
|
||||
|
||||
dev = XRDPPTR(pScrn);
|
||||
/* assign functions */
|
||||
LLOGLN(0, ("rdpSimdInit: assigning yuv functions"));
|
||||
dev->yv12_to_rgb32 = YV12_to_RGB32;
|
||||
dev->i420_to_rgb32 = I420_to_RGB32;
|
||||
dev->yuy2_to_rgb32 = YUY2_to_RGB32;
|
||||
dev->uyvy_to_rgb32 = UYVY_to_RGB32;
|
||||
dev->a8r8g8b8_to_a8b8g8r8_box = a8r8g8b8_to_a8b8g8r8_box;
|
||||
#if SIMD_USE_ACCEL
|
||||
if (g_simd_use_accel)
|
||||
{
|
||||
#if defined(__x86_64__) || defined(__AMD64__) || defined (_M_AMD64)
|
||||
int ax, bx, cx, dx;
|
||||
cpuid_amd64(1, 0, &ax, &bx, &cx, &dx);
|
||||
LLOGLN(0, ("rdpSimdInit: cpuid ax 1 cx 0 return ax 0x%8.8x bx "
|
||||
"0x%8.8x cx 0x%8.8x dx 0x%8.8x", ax, bx, cx, dx));
|
||||
if (dx & (1 << 26)) /* SSE 2 */
|
||||
{
|
||||
dev->yv12_to_rgb32 = yv12_to_rgb32_amd64_sse2;
|
||||
dev->i420_to_rgb32 = i420_to_rgb32_amd64_sse2;
|
||||
dev->yuy2_to_rgb32 = yuy2_to_rgb32_amd64_sse2;
|
||||
dev->uyvy_to_rgb32 = uyvy_to_rgb32_amd64_sse2;
|
||||
LLOGLN(0, ("rdpSimdInit: sse2 amd64 yuv functions assigned"));
|
||||
}
|
||||
#elif defined(__x86__) || defined(_M_IX86) || defined(__i386__)
|
||||
int ax, bx, cx, dx;
|
||||
cpuid_x86(1, 0, &ax, &bx, &cx, &dx);
|
||||
LLOGLN(0, ("rdpSimdInit: cpuid ax 1 cx 0 return ax 0x%8.8x bx "
|
||||
"0x%8.8x cx 0x%8.8x dx 0x%8.8x", ax, bx, cx, dx));
|
||||
if (dx & (1 << 26)) /* SSE 2 */
|
||||
{
|
||||
dev->yv12_to_rgb32 = yv12_to_rgb32_x86_sse2;
|
||||
dev->i420_to_rgb32 = i420_to_rgb32_x86_sse2;
|
||||
dev->yuy2_to_rgb32 = yuy2_to_rgb32_x86_sse2;
|
||||
dev->uyvy_to_rgb32 = uyvy_to_rgb32_x86_sse2;
|
||||
dev->a8r8g8b8_to_a8b8g8r8_box = a8r8g8b8_to_a8b8g8r8_box_x86_sse2;
|
||||
LLOGLN(0, ("rdpSimdInit: sse2 x86 yuv functions assigned"));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
SIMD function asign
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPSIMD_H
|
||||
#define __RDPSIMD_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpSimdInit(ScreenPtr pScreen, ScrnInfoPtr pScrn);
|
||||
|
||||
#endif
|
@ -1,88 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipict.h>
|
||||
#include <picture.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpTrapezoids.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpTrapezoidsOrg(PictureScreenPtr ps, rdpPtr dev,
|
||||
CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
|
||||
int ntrap, xTrapezoid *traps)
|
||||
{
|
||||
ps->Trapezoids = dev->Trapezoids;
|
||||
ps->Trapezoids(op, pSrc, pDst, maskFormat, xSrc, ySrc, ntrap, traps);
|
||||
ps->Trapezoids = rdpTrapezoids;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
|
||||
int ntrap, xTrapezoid *traps)
|
||||
{
|
||||
ScreenPtr pScreen;
|
||||
rdpPtr dev;
|
||||
PictureScreenPtr ps;
|
||||
BoxRec box;
|
||||
RegionRec reg;
|
||||
|
||||
LLOGLN(10, ("rdpTrapezoids:"));
|
||||
pScreen = pDst->pDrawable->pScreen;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
dev->counts.rdpTrapezoidsCallCount++;
|
||||
miTrapezoidBounds(ntrap, traps, &box);
|
||||
box.x1 += pDst->pDrawable->x;
|
||||
box.y1 += pDst->pDrawable->y;
|
||||
box.x2 += pDst->pDrawable->x;
|
||||
box.y2 += pDst->pDrawable->y;
|
||||
rdpRegionInit(®, &box, 0);
|
||||
ps = GetPictureScreen(pScreen);
|
||||
/* do original call */
|
||||
rdpTrapezoidsOrg(ps, dev, op, pSrc, pDst, maskFormat, xSrc, ySrc,
|
||||
ntrap, traps);
|
||||
rdpClientConAddAllReg(dev, ®, pDst->pDrawable);
|
||||
rdpRegionUninit(®);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _RDPTRAPEZOIDS_H
|
||||
#define _RDPTRAPEZOIDS_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT void
|
||||
rdpTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
|
||||
int ntrap, xTrapezoid *traps);
|
||||
|
||||
#endif
|
@ -1,690 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
XVideo
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <xf86xv.h>
|
||||
#include <X11/extensions/Xv.h>
|
||||
#include <fourcc.h>
|
||||
|
||||
#include <fb.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpReg.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpXv.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
#define T_NUM_ENCODINGS 1
|
||||
static XF86VideoEncodingRec g_xrdpVidEncodings[T_NUM_ENCODINGS] =
|
||||
{ { 0, "XV_IMAGE", 2046, 2046, { 1, 1 } } };
|
||||
|
||||
#define T_NUM_FORMATS 1
|
||||
static XF86VideoFormatRec g_xrdpVidFormats[T_NUM_FORMATS] =
|
||||
{ { 0, TrueColor } };
|
||||
|
||||
/* YV12
|
||||
I420
|
||||
12 bpp planar
|
||||
YUV 4:2:0 8 bit Y plane followed by 8 bit 2x2 subsampled
|
||||
U and V planes. */
|
||||
|
||||
/* YUY2
|
||||
UYVY
|
||||
16 bpp packed
|
||||
YUV 4:2:2 Y sample at every pixel, U and V sampled at
|
||||
every second pixel */
|
||||
|
||||
/* XVIMAGE_YV12 FOURCC_YV12 0x32315659 */
|
||||
/* XVIMAGE_I420 FOURCC_I420 0x30323449 */
|
||||
/* XVIMAGE_YUY2 FOURCC_YUY2 0x32595559 */
|
||||
/* XVIMAGE_UYVY FOURCC_UYVY 0x59565955 */
|
||||
|
||||
static XF86ImageRec g_xrdpVidImages[] =
|
||||
{ XVIMAGE_YV12, XVIMAGE_I420, XVIMAGE_YUY2, XVIMAGE_UYVY };
|
||||
|
||||
#define T_MAX_PORTS 1
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidPutVideo(ScrnInfoPtr pScrn, short vid_x, short vid_y,
|
||||
short drw_x, short drw_y, short vid_w, short vid_h,
|
||||
short drw_w, short drw_h, RegionPtr clipBoxes,
|
||||
pointer data, DrawablePtr pDraw)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidPutVideo:"));
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidPutStill(ScrnInfoPtr pScrn, short vid_x, short vid_y,
|
||||
short drw_x, short drw_y, short vid_w, short vid_h,
|
||||
short drw_w, short drw_h, RegionPtr clipBoxes,
|
||||
pointer data, DrawablePtr pDraw)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidPutStill:"));
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidGetVideo(ScrnInfoPtr pScrn, short vid_x, short vid_y,
|
||||
short drw_x, short drw_y, short vid_w, short vid_h,
|
||||
short drw_w, short drw_h, RegionPtr clipBoxes,
|
||||
pointer data, DrawablePtr pDraw)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidGetVideo:"));
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidGetStill(ScrnInfoPtr pScrn, short vid_x, short vid_y,
|
||||
short drw_x, short drw_y, short vid_w, short vid_h,
|
||||
short drw_w, short drw_h, RegionPtr clipBoxes,
|
||||
pointer data, DrawablePtr pDraw)
|
||||
{
|
||||
LLOGLN(0, ("FBDevTIVidGetStill:"));
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
xrdpVidStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidStopVideo:"));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
|
||||
INT32 value, pointer data)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidSetPortAttribute:"));
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
|
||||
INT32 *value, pointer data)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidGetPortAttribute:"));
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
xrdpVidQueryBestSize(ScrnInfoPtr pScrn, Bool motion,
|
||||
short vid_w, short vid_h, short drw_w, short drw_h,
|
||||
unsigned int *p_w, unsigned int *p_h, pointer data)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidQueryBestSize:"));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
YV12_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
{
|
||||
int size_total;
|
||||
int y;
|
||||
int u;
|
||||
int v;
|
||||
int c;
|
||||
int d;
|
||||
int e;
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int t;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
size_total = width * height;
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
y = yuvs[j * width + i];
|
||||
u = yuvs[(j / 2) * (width / 2) + (i / 2) + size_total];
|
||||
v = yuvs[(j / 2) * (width / 2) + (i / 2) + size_total + (size_total / 4)];
|
||||
c = y - 16;
|
||||
d = u - 128;
|
||||
e = v - 128;
|
||||
t = (298 * c + 409 * e + 128) >> 8;
|
||||
b = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c - 100 * d - 208 * e + 128) >> 8;
|
||||
g = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c + 516 * d + 128) >> 8;
|
||||
r = RDPCLAMP(t, 0, 255);
|
||||
rgbs[j * width + i] = (r << 16) | (g << 8) | b;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
I420_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
{
|
||||
int size_total;
|
||||
int y;
|
||||
int u;
|
||||
int v;
|
||||
int c;
|
||||
int d;
|
||||
int e;
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int t;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
size_total = width * height;
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
y = yuvs[j * width + i];
|
||||
v = yuvs[(j / 2) * (width / 2) + (i / 2) + size_total];
|
||||
u = yuvs[(j / 2) * (width / 2) + (i / 2) + size_total + (size_total / 4)];
|
||||
c = y - 16;
|
||||
d = u - 128;
|
||||
e = v - 128;
|
||||
t = (298 * c + 409 * e + 128) >> 8;
|
||||
b = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c - 100 * d - 208 * e + 128) >> 8;
|
||||
g = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c + 516 * d + 128) >> 8;
|
||||
r = RDPCLAMP(t, 0, 255);
|
||||
rgbs[j * width + i] = (r << 16) | (g << 8) | b;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
YUY2_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
{
|
||||
int y1;
|
||||
int y2;
|
||||
int u;
|
||||
int v;
|
||||
int c;
|
||||
int d;
|
||||
int e;
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int t;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
y1 = *(yuvs++);
|
||||
v = *(yuvs++);
|
||||
y2 = *(yuvs++);
|
||||
u = *(yuvs++);
|
||||
|
||||
c = y1 - 16;
|
||||
d = u - 128;
|
||||
e = v - 128;
|
||||
t = (298 * c + 409 * e + 128) >> 8;
|
||||
b = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c - 100 * d - 208 * e + 128) >> 8;
|
||||
g = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c + 516 * d + 128) >> 8;
|
||||
r = RDPCLAMP(t, 0, 255);
|
||||
rgbs[j * width + i] = (r << 16) | (g << 8) | b;
|
||||
|
||||
i++;
|
||||
c = y2 - 16;
|
||||
d = u - 128;
|
||||
e = v - 128;
|
||||
t = (298 * c + 409 * e + 128) >> 8;
|
||||
b = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c - 100 * d - 208 * e + 128) >> 8;
|
||||
g = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c + 516 * d + 128) >> 8;
|
||||
r = RDPCLAMP(t, 0, 255);
|
||||
rgbs[j * width + i] = (r << 16) | (g << 8) | b;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
UYVY_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
{
|
||||
int y1;
|
||||
int y2;
|
||||
int u;
|
||||
int v;
|
||||
int c;
|
||||
int d;
|
||||
int e;
|
||||
int r;
|
||||
int g;
|
||||
int b;
|
||||
int t;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
v = *(yuvs++);
|
||||
y1 = *(yuvs++);
|
||||
u = *(yuvs++);
|
||||
y2 = *(yuvs++);
|
||||
|
||||
c = y1 - 16;
|
||||
d = u - 128;
|
||||
e = v - 128;
|
||||
t = (298 * c + 409 * e + 128) >> 8;
|
||||
b = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c - 100 * d - 208 * e + 128) >> 8;
|
||||
g = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c + 516 * d + 128) >> 8;
|
||||
r = RDPCLAMP(t, 0, 255);
|
||||
rgbs[j * width + i] = (r << 16) | (g << 8) | b;
|
||||
|
||||
i++;
|
||||
c = y2 - 16;
|
||||
d = u - 128;
|
||||
e = v - 128;
|
||||
t = (298 * c + 409 * e + 128) >> 8;
|
||||
b = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c - 100 * d - 208 * e + 128) >> 8;
|
||||
g = RDPCLAMP(t, 0, 255);
|
||||
t = (298 * c + 516 * d + 128) >> 8;
|
||||
r = RDPCLAMP(t, 0, 255);
|
||||
rgbs[j * width + i] = (r << 16) | (g << 8) | b;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
stretch_RGB32_RGB32(int *src, int src_width, int src_height,
|
||||
int src_x, int src_y, int src_w, int src_h,
|
||||
int *dst, int dst_w, int dst_h)
|
||||
{
|
||||
int mwidth;
|
||||
int mheight;
|
||||
int index;
|
||||
|
||||
mwidth = RDPMIN(src_width, dst_w);
|
||||
mheight = RDPMIN(src_height, dst_h);
|
||||
for (index = 0; index < mheight; index++)
|
||||
{
|
||||
g_memcpy(dst, src, mwidth * 4);
|
||||
src += src_width;
|
||||
dst += dst_w;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
stretch_RGB32_RGB32(int *src, int src_width, int src_height,
|
||||
int src_x, int src_y, int src_w, int src_h,
|
||||
int *dst, int dst_w, int dst_h)
|
||||
{
|
||||
int index;
|
||||
int jndex;
|
||||
int lndex;
|
||||
int last_lndex;
|
||||
int oh;
|
||||
int ih;
|
||||
int ov;
|
||||
int iv;
|
||||
int pix;
|
||||
int *src32;
|
||||
int *dst32;
|
||||
|
||||
LLOGLN(10, ("stretch_RGB32_RGB32: oh 0x%8.8x ov 0x%8.8x", oh, ov));
|
||||
oh = (src_w << 16) / dst_w;
|
||||
ov = (src_h << 16) / dst_h;
|
||||
iv = ov;
|
||||
lndex = src_y;
|
||||
last_lndex = -1;
|
||||
for (index = 0; index < dst_h; index++)
|
||||
{
|
||||
if (lndex == last_lndex)
|
||||
{
|
||||
/* repeat line */
|
||||
dst32 = dst + index * dst_w;
|
||||
src32 = dst32 - dst_w;
|
||||
g_memcpy(dst32, src32, dst_w * 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
ih = oh;
|
||||
src32 = src + lndex * src_width + src_x;
|
||||
pix = *src32;
|
||||
dst32 = dst + index * dst_w;
|
||||
for (jndex = 0; jndex < dst_w; jndex++)
|
||||
{
|
||||
*dst32 = pix;
|
||||
while (ih > (1 << 16) - 1)
|
||||
{
|
||||
ih -= 1 << 16;
|
||||
src32++;
|
||||
}
|
||||
pix = *src32;
|
||||
ih += oh;
|
||||
dst32++;
|
||||
}
|
||||
}
|
||||
last_lndex = lndex;
|
||||
while (iv > (1 << 16) - 1)
|
||||
{
|
||||
iv -= 1 << 16;
|
||||
lndex++;
|
||||
}
|
||||
iv += ov;
|
||||
|
||||
}
|
||||
LLOGLN(10, ("stretch_RGB32_RGB32: out"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* returns error */
|
||||
static CARD32
|
||||
rdpDeferredXvCleanup(OsTimerPtr timer, CARD32 now, pointer arg)
|
||||
{
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpDeferredXvCleanup:"));
|
||||
dev = (rdpPtr) arg;
|
||||
dev->xv_timer_schedualed = 0;
|
||||
dev->xv_data_bytes = 0;
|
||||
g_free(dev->xv_data);
|
||||
dev->xv_data = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* see hw/xfree86/common/xf86xv.c for info */
|
||||
static int
|
||||
xrdpVidPutImage(ScrnInfoPtr pScrn,
|
||||
short src_x, short src_y, short drw_x, short drw_y,
|
||||
short src_w, short src_h, short drw_w, short drw_h,
|
||||
int format, unsigned char* buf,
|
||||
short width, short height,
|
||||
Bool sync, RegionPtr clipBoxes,
|
||||
pointer data, DrawablePtr dst)
|
||||
{
|
||||
rdpPtr dev;
|
||||
int *rgborg32;
|
||||
int *rgbend32;
|
||||
int index;
|
||||
int error;
|
||||
GCPtr tempGC;
|
||||
|
||||
LLOGLN(10, ("xrdpVidPutImage: format 0x%8.8x", format));
|
||||
LLOGLN(10, ("xrdpVidPutImage: src_x %d srcy_y %d", src_x, src_y));
|
||||
dev = XRDPPTR(pScrn);
|
||||
|
||||
if (dev->xv_timer_schedualed)
|
||||
{
|
||||
TimerCancel(dev->xv_timer);
|
||||
dev->xv_timer = TimerSet(dev->xv_timer, 0, 2000,
|
||||
rdpDeferredXvCleanup, dev);
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->xv_timer_schedualed = 1;
|
||||
dev->xv_timer = TimerSet(dev->xv_timer, 0, 2000,
|
||||
rdpDeferredXvCleanup, dev);
|
||||
}
|
||||
|
||||
index = width * height * 4 + drw_w * drw_h * 4 + 64;
|
||||
if (index > dev->xv_data_bytes)
|
||||
{
|
||||
g_free(dev->xv_data);
|
||||
dev->xv_data = g_malloc(index, 0);
|
||||
if (dev->xv_data == NULL)
|
||||
{
|
||||
LLOGLN(0, ("xrdpVidPutImage: memory alloc error"));
|
||||
dev->xv_data_bytes = 0;
|
||||
return Success;
|
||||
}
|
||||
dev->xv_data_bytes = index;
|
||||
}
|
||||
rgborg32 = (int *) RDPALIGN(dev->xv_data, 16);
|
||||
rgbend32 = rgborg32 + width * height;
|
||||
rgbend32 = (int *) RDPALIGN(rgbend32, 16);
|
||||
error = 0;
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case FOURCC_YV12:
|
||||
LLOGLN(10, ("xrdpVidPutImage: FOURCC_YV12"));
|
||||
error = dev->yv12_to_rgb32(buf, width, height, rgborg32);
|
||||
break;
|
||||
case FOURCC_I420:
|
||||
LLOGLN(10, ("xrdpVidPutImage: FOURCC_I420"));
|
||||
error = dev->i420_to_rgb32(buf, width, height, rgborg32);
|
||||
break;
|
||||
case FOURCC_YUY2:
|
||||
LLOGLN(10, ("xrdpVidPutImage: FOURCC_YUY2"));
|
||||
error = dev->yuy2_to_rgb32(buf, width, height, rgborg32);
|
||||
break;
|
||||
case FOURCC_UYVY:
|
||||
LLOGLN(10, ("xrdpVidPutImage: FOURCC_UYVY"));
|
||||
error = dev->uyvy_to_rgb32(buf, width, height, rgborg32);
|
||||
break;
|
||||
default:
|
||||
LLOGLN(0, ("xrdpVidPutImage: unknown format 0x%8.8x", format));
|
||||
return Success;
|
||||
}
|
||||
if (error != 0)
|
||||
{
|
||||
return Success;
|
||||
}
|
||||
if ((width == drw_w) && (height == drw_h))
|
||||
{
|
||||
LLOGLN(10, ("xrdpVidPutImage: strech skip"));
|
||||
rgbend32 = rgborg32;
|
||||
}
|
||||
else
|
||||
{
|
||||
error = stretch_RGB32_RGB32(rgborg32, width, height,
|
||||
src_x, src_y, src_w, src_h,
|
||||
rgbend32, drw_w, drw_h);
|
||||
if (error != 0)
|
||||
{
|
||||
return Success;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
tempGC = GetScratchGC(dst->depth, pScrn->pScreen);
|
||||
if (tempGC != NULL)
|
||||
{
|
||||
ValidateGC(dst, tempGC);
|
||||
(*tempGC->ops->PutImage)(dst, tempGC, 24,
|
||||
drw_x - dst->x, drw_y - dst->y,
|
||||
drw_w, drw_h, 0, ZPixmap,
|
||||
(char *) rgbend32);
|
||||
FreeScratchGC(tempGC);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdpVidQueryImageAttributes(ScrnInfoPtr pScrn, int id,
|
||||
unsigned short *w, unsigned short *h,
|
||||
int *pitches, int *offsets)
|
||||
{
|
||||
int size, tmp;
|
||||
|
||||
LLOGLN(10, ("xrdpVidQueryImageAttributes:"));
|
||||
/* this is same code as all drivers currently have */
|
||||
if (*w > 2046)
|
||||
{
|
||||
*w = 2046;
|
||||
}
|
||||
if (*h > 2046)
|
||||
{
|
||||
*h = 2046;
|
||||
}
|
||||
/* make w multiple of 4 so that resizing works properly */
|
||||
*w = (*w + 3) & ~3;
|
||||
if (offsets != NULL)
|
||||
{
|
||||
offsets[0] = 0;
|
||||
}
|
||||
switch (id)
|
||||
{
|
||||
case FOURCC_YV12:
|
||||
case FOURCC_I420:
|
||||
/* make h be even */
|
||||
*h = (*h + 1) & ~1;
|
||||
/* make w be multiple of 4 (ie. pad it) */
|
||||
size = (*w + 3) & ~3;
|
||||
/* width of a Y row => width of image */
|
||||
if (pitches != NULL)
|
||||
{
|
||||
pitches[0] = size;
|
||||
}
|
||||
/* offset of U plane => w * h */
|
||||
size *= *h;
|
||||
if (offsets != NULL)
|
||||
{
|
||||
offsets[1] = size;
|
||||
}
|
||||
/* width of U, V row => width / 2 */
|
||||
tmp = ((*w >> 1) + 3) & ~3;
|
||||
if (pitches != NULL)
|
||||
{
|
||||
pitches[1] = pitches[2] = tmp;
|
||||
}
|
||||
/* offset of V => Y plane + U plane (w * h + w / 2 * h / 2) */
|
||||
tmp *= (*h >> 1);
|
||||
size += tmp;
|
||||
if (offsets != NULL)
|
||||
{
|
||||
offsets[2] = size;
|
||||
}
|
||||
size += tmp;
|
||||
break;
|
||||
case FOURCC_YUY2:
|
||||
case FOURCC_UYVY:
|
||||
size = (*w) * 2;
|
||||
if (pitches != NULL)
|
||||
{
|
||||
pitches[0] = size;
|
||||
}
|
||||
size *= *h;
|
||||
break;
|
||||
default:
|
||||
LLOGLN(0, ("xrdpVidQueryImageAttributes: Unsupported image"));
|
||||
return 0;
|
||||
}
|
||||
LLOGLN(10, ("xrdpVidQueryImageAttributes: finished size %d id 0x%x", size, id));
|
||||
return size;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
Bool
|
||||
rdpXvInit(ScreenPtr pScreen, ScrnInfoPtr pScrn)
|
||||
{
|
||||
XF86VideoAdaptorPtr adaptor;
|
||||
DevUnion* pDevUnion;
|
||||
int bytes;
|
||||
|
||||
adaptor = xf86XVAllocateVideoAdaptorRec(pScrn);
|
||||
if (adaptor == 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpXvInit: xf86XVAllocateVideoAdaptorRec failed"));
|
||||
return 0;
|
||||
}
|
||||
adaptor->type = XvInputMask | XvImageMask | XvVideoMask | XvStillMask | XvWindowMask | XvPixmapMask;
|
||||
//adaptor->flags = VIDEO_NO_CLIPPING;
|
||||
//adaptor->flags = VIDEO_CLIP_TO_VIEWPORT;
|
||||
adaptor->flags = 0;
|
||||
adaptor->name = XRDP_MODULE_NAME " XVideo Adaptor";
|
||||
adaptor->nEncodings = T_NUM_ENCODINGS;
|
||||
adaptor->pEncodings = &(g_xrdpVidEncodings[0]);
|
||||
adaptor->nFormats = T_NUM_FORMATS;
|
||||
adaptor->pFormats = &(g_xrdpVidFormats[0]);
|
||||
adaptor->pFormats[0].depth = pScrn->depth;
|
||||
LLOGLN(0, ("rdpXvInit: depth %d", pScrn->depth));
|
||||
adaptor->nImages = sizeof(g_xrdpVidImages) / sizeof(XF86ImageRec);
|
||||
adaptor->pImages = g_xrdpVidImages;
|
||||
adaptor->nAttributes = 0;
|
||||
adaptor->pAttributes = 0;
|
||||
adaptor->nPorts = T_MAX_PORTS;
|
||||
bytes = sizeof(DevUnion) * T_MAX_PORTS;
|
||||
pDevUnion = (DevUnion*) g_malloc(bytes, 1);
|
||||
adaptor->pPortPrivates = pDevUnion;
|
||||
adaptor->PutVideo = xrdpVidPutVideo;
|
||||
adaptor->PutStill = xrdpVidPutStill;
|
||||
adaptor->GetVideo = xrdpVidGetVideo;
|
||||
adaptor->GetStill = xrdpVidGetStill;
|
||||
adaptor->StopVideo = xrdpVidStopVideo;
|
||||
adaptor->SetPortAttribute = xrdpVidSetPortAttribute;
|
||||
adaptor->GetPortAttribute = xrdpVidGetPortAttribute;
|
||||
adaptor->QueryBestSize = xrdpVidQueryBestSize;
|
||||
adaptor->PutImage = xrdpVidPutImage;
|
||||
adaptor->QueryImageAttributes = xrdpVidQueryImageAttributes;
|
||||
if (!xf86XVScreenInit(pScreen, &adaptor, 1))
|
||||
{
|
||||
LLOGLN(0, ("rdpXvInit: xf86XVScreenInit failed"));
|
||||
return 0;
|
||||
}
|
||||
xf86XVFreeVideoAdaptorRec(adaptor);
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,42 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
XVideo
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RDPXV_H
|
||||
#define __RDPXV_H
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
#include <xf86.h>
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
rdpXvInit(ScreenPtr pScreen, ScrnInfoPtr pScrn);
|
||||
extern _X_EXPORT int
|
||||
YV12_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
extern _X_EXPORT int
|
||||
I420_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
extern _X_EXPORT int
|
||||
YUY2_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
extern _X_EXPORT int
|
||||
UYVY_to_RGB32(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
|
||||
#endif
|
@ -1,174 +0,0 @@
|
||||
;
|
||||
;Copyright 2014 Jay Sorg
|
||||
;
|
||||
;Permission to use, copy, modify, distribute, and sell this software and its
|
||||
;documentation for any purpose is hereby granted without fee, provided that
|
||||
;the above copyright notice appear in all copies and that both that
|
||||
;copyright notice and this permission notice appear in supporting
|
||||
;documentation.
|
||||
;
|
||||
;The above copyright notice and this permission notice shall be included in
|
||||
;all copies or substantial portions of the Software.
|
||||
;
|
||||
;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
;OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
;AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
;CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
;
|
||||
;ARGB to ABGR
|
||||
;x86 SSE2 32 bit
|
||||
;
|
||||
|
||||
SECTION .data
|
||||
align 16
|
||||
c1 times 4 dd 0xFF00FF00
|
||||
c2 times 4 dd 0x00FF0000
|
||||
c3 times 4 dd 0x000000FF
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;int
|
||||
;a8r8g8b8_to_a8b8g8r8_box_x86_sse2(char *s8, int src_stride,
|
||||
; char *d8, int dst_stride,
|
||||
; int width, int height);
|
||||
PROC a8r8g8b8_to_a8b8g8r8_box_x86_sse2
|
||||
push ebx
|
||||
push esi
|
||||
push edi
|
||||
push ebp
|
||||
|
||||
movdqa xmm4, [c1]
|
||||
movdqa xmm5, [c2]
|
||||
movdqa xmm6, [c3]
|
||||
|
||||
mov esi, [esp + 20] ; src
|
||||
mov edi, [esp + 28] ; dst
|
||||
|
||||
loop_y:
|
||||
mov ecx, [esp + 36] ; width
|
||||
|
||||
loop_xpre:
|
||||
mov eax, esi ; look for aligned
|
||||
and eax, 0x0F ; we can jump to next
|
||||
mov ebx, eax
|
||||
mov eax, edi
|
||||
and eax, 0x0F
|
||||
or eax, ebx
|
||||
cmp eax, 0
|
||||
je done_loop_xpre
|
||||
cmp ecx, 1
|
||||
jl done_loop_x ; all done with this row
|
||||
mov eax, [esi]
|
||||
lea esi, [esi + 4]
|
||||
mov edx, eax ; a and g
|
||||
and edx, 0xFF00FF00
|
||||
mov ebx, eax ; r
|
||||
and ebx, 0x00FF0000
|
||||
shr ebx, 16
|
||||
or edx, ebx
|
||||
mov ebx, eax ; b
|
||||
and ebx, 0x000000FF
|
||||
shl ebx, 16
|
||||
or edx, ebx
|
||||
mov [edi], edx
|
||||
lea edi, [edi + 4]
|
||||
dec ecx
|
||||
jmp loop_xpre;
|
||||
done_loop_xpre:
|
||||
|
||||
prefetchnta [esi]
|
||||
|
||||
; A R G B A R G B A R G B A R G B to
|
||||
; A B G R A B G R A B G R A B G R
|
||||
|
||||
loop_x8:
|
||||
cmp ecx, 8
|
||||
jl done_loop_x8
|
||||
|
||||
prefetchnta [esi + 32]
|
||||
|
||||
movdqa xmm0, [esi]
|
||||
lea esi, [esi + 16]
|
||||
movdqa xmm3, xmm0 ; a and g
|
||||
pand xmm3, xmm4
|
||||
movdqa xmm1, xmm0 ; r
|
||||
pand xmm1, xmm5
|
||||
psrld xmm1, 16
|
||||
por xmm3, xmm1
|
||||
movdqa xmm1, xmm0 ; b
|
||||
pand xmm1, xmm6
|
||||
pslld xmm1, 16
|
||||
por xmm3, xmm1
|
||||
movdqa [edi], xmm3
|
||||
lea edi, [edi + 16]
|
||||
sub ecx, 4
|
||||
|
||||
movdqa xmm0, [esi]
|
||||
lea esi, [esi + 16]
|
||||
movdqa xmm3, xmm0 ; a and g
|
||||
pand xmm3, xmm4
|
||||
movdqa xmm1, xmm0 ; r
|
||||
pand xmm1, xmm5
|
||||
psrld xmm1, 16
|
||||
por xmm3, xmm1
|
||||
movdqa xmm1, xmm0 ; b
|
||||
pand xmm1, xmm6
|
||||
pslld xmm1, 16
|
||||
por xmm3, xmm1
|
||||
movdqa [edi], xmm3
|
||||
lea edi, [edi + 16]
|
||||
sub ecx, 4
|
||||
|
||||
jmp loop_x8;
|
||||
done_loop_x8:
|
||||
|
||||
loop_x:
|
||||
cmp ecx, 1
|
||||
jl done_loop_x
|
||||
mov eax, [esi]
|
||||
lea esi, [esi + 4]
|
||||
mov edx, eax ; a and g
|
||||
and edx, 0xFF00FF00
|
||||
mov ebx, eax ; r
|
||||
and ebx, 0x00FF0000
|
||||
shr ebx, 16
|
||||
or edx, ebx
|
||||
mov ebx, eax ; b
|
||||
and ebx, 0x000000FF
|
||||
shl ebx, 16
|
||||
or edx, ebx
|
||||
mov [edi], edx
|
||||
lea edi, [edi + 4]
|
||||
dec ecx
|
||||
jmp loop_x;
|
||||
done_loop_x:
|
||||
|
||||
mov esi, [esp + 20]
|
||||
add esi, [esp + 24]
|
||||
mov [esp + 20], esi
|
||||
|
||||
mov edi, [esp + 28]
|
||||
add edi, [esp + 32]
|
||||
mov [esp + 28], edi
|
||||
|
||||
mov ecx, [esp + 40] ; height
|
||||
dec ecx
|
||||
mov [esp + 40], ecx
|
||||
jnz loop_y
|
||||
|
||||
mov eax, 0 ; return value
|
||||
pop ebp
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
ret
|
||||
align 16
|
||||
|
@ -1,39 +0,0 @@
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;int
|
||||
;cpuid_x86(int eax_in, int ecx_in, int *eax, int *ebx, int *ecx, int *edx)
|
||||
|
||||
PROC cpuid_x86
|
||||
; save registers
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push edi
|
||||
; cpuid
|
||||
mov eax, [esp + 20]
|
||||
mov ecx, [esp + 24]
|
||||
cpuid
|
||||
mov edi, [esp + 28]
|
||||
mov [edi], eax
|
||||
mov edi, [esp + 32]
|
||||
mov [edi], ebx
|
||||
mov edi, [esp + 36]
|
||||
mov [edi], ecx
|
||||
mov edi, [esp + 40]
|
||||
mov [edi], edx
|
||||
mov eax, 0
|
||||
; restore registers
|
||||
pop edi
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret;
|
||||
align 16
|
||||
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
Copyright 2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
x86 asm files
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __FUNCS_X86_H
|
||||
#define __FUNCS_X86_H
|
||||
|
||||
int
|
||||
cpuid_x86(int eax_in, int ecx_in, int *eax, int *ebx, int *ecx, int *edx);
|
||||
int
|
||||
yv12_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
i420_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
yuy2_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
uyvy_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs);
|
||||
int
|
||||
a8r8g8b8_to_a8b8g8r8_box_x86_sse2(char *s8, int src_stride,
|
||||
char *d8, int dst_stride,
|
||||
int width, int height);
|
||||
|
||||
#endif
|
||||
|
@ -1,243 +0,0 @@
|
||||
;
|
||||
;Copyright 2014 Jay Sorg
|
||||
;
|
||||
;Permission to use, copy, modify, distribute, and sell this software and its
|
||||
;documentation for any purpose is hereby granted without fee, provided that
|
||||
;the above copyright notice appear in all copies and that both that
|
||||
;copyright notice and this permission notice appear in supporting
|
||||
;documentation.
|
||||
;
|
||||
;The above copyright notice and this permission notice shall be included in
|
||||
;all copies or substantial portions of the Software.
|
||||
;
|
||||
;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
;OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
;AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
;CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
;
|
||||
;I420 to RGB32
|
||||
;x86 SSE2 32 bit
|
||||
;
|
||||
; RGB to YUV
|
||||
; 0.299 0.587 0.114
|
||||
; -0.14713 -0.28886 0.436
|
||||
; 0.615 -0.51499 -0.10001
|
||||
; YUV to RGB
|
||||
; 1 0 1.13983
|
||||
; 1 -0.39465 -0.58060
|
||||
; 1 2.03211 0
|
||||
; shift left 12
|
||||
; 4096 0 4669
|
||||
; 4096 -1616 -2378
|
||||
; 4096 9324 0
|
||||
|
||||
SECTION .data
|
||||
align 16
|
||||
c128 times 8 dw 128
|
||||
c4669 times 8 dw 4669
|
||||
c1616 times 8 dw 1616
|
||||
c2378 times 8 dw 2378
|
||||
c9324 times 8 dw 9324
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
do8_uv:
|
||||
|
||||
; v
|
||||
movd xmm1, [ebx] ; 4 at a time
|
||||
lea ebx, [ebx + 4]
|
||||
punpcklbw xmm1, xmm1
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm1, xmm6
|
||||
movdqa xmm7, [c128]
|
||||
psubw xmm1, xmm7
|
||||
psllw xmm1, 4
|
||||
|
||||
; u
|
||||
movd xmm2, [edx] ; 4 at a time
|
||||
lea edx, [edx + 4]
|
||||
punpcklbw xmm2, xmm2
|
||||
punpcklbw xmm2, xmm6
|
||||
psubw xmm2, xmm7
|
||||
psllw xmm2, 4
|
||||
|
||||
do8:
|
||||
|
||||
; y
|
||||
movq xmm0, [esi] ; 8 at a time
|
||||
lea esi, [esi + 8]
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm0, xmm6
|
||||
|
||||
; r = y + hiword(4669 * (v << 4))
|
||||
movdqa xmm4, [c4669]
|
||||
pmulhw xmm4, xmm1
|
||||
movdqa xmm3, xmm0
|
||||
paddw xmm3, xmm4
|
||||
|
||||
; g = y - hiword(1616 * (u << 4)) - hiword(2378 * (v << 4))
|
||||
movdqa xmm5, [c1616]
|
||||
pmulhw xmm5, xmm2
|
||||
movdqa xmm6, [c2378]
|
||||
pmulhw xmm6, xmm1
|
||||
movdqa xmm4, xmm0
|
||||
psubw xmm4, xmm5
|
||||
psubw xmm4, xmm6
|
||||
|
||||
; b = y + hiword(9324 * (u << 4))
|
||||
movdqa xmm6, [c9324]
|
||||
pmulhw xmm6, xmm2
|
||||
movdqa xmm5, xmm0
|
||||
paddw xmm5, xmm6
|
||||
|
||||
packuswb xmm3, xmm3 ; b
|
||||
packuswb xmm4, xmm4 ; g
|
||||
punpcklbw xmm3, xmm4 ; gb
|
||||
|
||||
pxor xmm4, xmm4 ; a
|
||||
packuswb xmm5, xmm5 ; r
|
||||
punpcklbw xmm5, xmm4 ; ar
|
||||
|
||||
movdqa xmm4, xmm3
|
||||
punpcklwd xmm3, xmm5 ; argb
|
||||
movdqa [edi], xmm3
|
||||
lea edi, [edi + 16]
|
||||
punpckhwd xmm4, xmm5 ; argb
|
||||
movdqa [edi], xmm4
|
||||
lea edi, [edi + 16]
|
||||
|
||||
ret;
|
||||
|
||||
;int
|
||||
;i420_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC i420_to_rgb32_x86_sse2
|
||||
push ebx
|
||||
push esi
|
||||
push edi
|
||||
push ebp
|
||||
|
||||
mov edi, [esp + 32] ; rgbs
|
||||
|
||||
mov ecx, [esp + 24] ; width
|
||||
mov edx, ecx
|
||||
mov ebp, [esp + 28] ; height
|
||||
mov eax, ebp
|
||||
shr ebp, 1
|
||||
imul eax, ecx ; eax = width * height
|
||||
|
||||
mov esi, [esp + 20] ; y
|
||||
|
||||
mov ebx, esi ; u = y + width * height
|
||||
add ebx, eax
|
||||
|
||||
; local vars
|
||||
; char* yptr1
|
||||
; char* yptr2
|
||||
; char* uptr
|
||||
; char* vptr
|
||||
; int* rgbs1
|
||||
; int* rgbs2
|
||||
; int width
|
||||
sub esp, 28 ; local vars, 28 bytes
|
||||
mov [esp + 0], esi ; save y1
|
||||
add esi, edx
|
||||
mov [esp + 4], esi ; save y2
|
||||
mov [esp + 8], ebx ; save u
|
||||
shr eax, 2
|
||||
add ebx, eax ; v = u + (width * height / 4)
|
||||
mov [esp + 12], ebx ; save v
|
||||
|
||||
mov [esp + 16], edi ; save rgbs1
|
||||
mov eax, edx
|
||||
shl eax, 2
|
||||
add edi, eax
|
||||
mov [esp + 20], edi ; save rgbs2
|
||||
|
||||
loop_y:
|
||||
|
||||
mov ecx, edx ; width
|
||||
shr ecx, 3
|
||||
|
||||
; save edx
|
||||
mov [esp + 24], edx
|
||||
|
||||
;prefetchnta 4096[esp + 0] ; y
|
||||
;prefetchnta 1024[esp + 8] ; u
|
||||
;prefetchnta 1024[esp + 12] ; v
|
||||
|
||||
loop_x:
|
||||
|
||||
mov esi, [esp + 0] ; y1
|
||||
mov ebx, [esp + 8] ; u
|
||||
mov edx, [esp + 12] ; v
|
||||
mov edi, [esp + 16] ; rgbs1
|
||||
|
||||
; y1
|
||||
call do8_uv
|
||||
|
||||
mov [esp + 0], esi ; y1
|
||||
mov [esp + 16], edi ; rgbs1
|
||||
|
||||
mov esi, [esp + 4] ; y2
|
||||
mov edi, [esp + 20] ; rgbs2
|
||||
|
||||
; y2
|
||||
call do8
|
||||
|
||||
mov [esp + 4], esi ; y2
|
||||
mov [esp + 8], ebx ; u
|
||||
mov [esp + 12], edx ; v
|
||||
mov [esp + 20], edi ; rgbs2
|
||||
|
||||
dec ecx ; width
|
||||
jnz loop_x
|
||||
|
||||
; restore edx
|
||||
mov edx, [esp + 24]
|
||||
|
||||
; update y1 and 2
|
||||
mov eax, [esp + 0]
|
||||
mov ebx, edx
|
||||
add eax, ebx
|
||||
mov [esp + 0], eax
|
||||
|
||||
mov eax, [esp + 4]
|
||||
add eax, ebx
|
||||
mov [esp + 4], eax
|
||||
|
||||
; update rgb1 and 2
|
||||
mov eax, [esp + 16]
|
||||
mov ebx, edx
|
||||
shl ebx, 2
|
||||
add eax, ebx
|
||||
mov [esp + 16], eax
|
||||
|
||||
mov eax, [esp + 20]
|
||||
add eax, ebx
|
||||
mov [esp + 20], eax
|
||||
|
||||
mov ecx, ebp
|
||||
dec ecx ; height
|
||||
mov ebp, ecx
|
||||
jnz loop_y
|
||||
|
||||
add esp, 28
|
||||
|
||||
mov eax, 0
|
||||
pop ebp
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
ret
|
||||
align 16
|
||||
|
||||
|
@ -1,22 +0,0 @@
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;int
|
||||
;uyvy_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC uyvy_to_rgb32_x86_sse2
|
||||
push ebx
|
||||
push esi
|
||||
push edi
|
||||
|
||||
mov eax, 0
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
ret
|
||||
align 16
|
||||
|
@ -1,22 +0,0 @@
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
;int
|
||||
;yuy2_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC yuy2_to_rgb32_x86_sse2
|
||||
push ebx
|
||||
push esi
|
||||
push edi
|
||||
|
||||
mov eax, 0
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
ret
|
||||
align 16
|
||||
|
@ -1,243 +0,0 @@
|
||||
;
|
||||
;Copyright 2014 Jay Sorg
|
||||
;
|
||||
;Permission to use, copy, modify, distribute, and sell this software and its
|
||||
;documentation for any purpose is hereby granted without fee, provided that
|
||||
;the above copyright notice appear in all copies and that both that
|
||||
;copyright notice and this permission notice appear in supporting
|
||||
;documentation.
|
||||
;
|
||||
;The above copyright notice and this permission notice shall be included in
|
||||
;all copies or substantial portions of the Software.
|
||||
;
|
||||
;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
;OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
;AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
;CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
;
|
||||
;YV12 to RGB32
|
||||
;x86 SSE2 32 bit
|
||||
;
|
||||
; RGB to YUV
|
||||
; 0.299 0.587 0.114
|
||||
; -0.14713 -0.28886 0.436
|
||||
; 0.615 -0.51499 -0.10001
|
||||
; YUV to RGB
|
||||
; 1 0 1.13983
|
||||
; 1 -0.39465 -0.58060
|
||||
; 1 2.03211 0
|
||||
; shift left 12
|
||||
; 4096 0 4669
|
||||
; 4096 -1616 -2378
|
||||
; 4096 9324 0
|
||||
|
||||
SECTION .data
|
||||
align 16
|
||||
c128 times 8 dw 128
|
||||
c4669 times 8 dw 4669
|
||||
c1616 times 8 dw 1616
|
||||
c2378 times 8 dw 2378
|
||||
c9324 times 8 dw 9324
|
||||
|
||||
SECTION .text
|
||||
|
||||
%macro PROC 1
|
||||
align 16
|
||||
global %1
|
||||
%1:
|
||||
%endmacro
|
||||
|
||||
do8_uv:
|
||||
|
||||
; u
|
||||
movd xmm1, [ebx] ; 4 at a time
|
||||
lea ebx, [ebx + 4]
|
||||
punpcklbw xmm1, xmm1
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm1, xmm6
|
||||
movdqa xmm7, [c128]
|
||||
psubw xmm1, xmm7
|
||||
psllw xmm1, 4
|
||||
|
||||
; v
|
||||
movd xmm2, [edx] ; 4 at a time
|
||||
lea edx, [edx + 4]
|
||||
punpcklbw xmm2, xmm2
|
||||
punpcklbw xmm2, xmm6
|
||||
psubw xmm2, xmm7
|
||||
psllw xmm2, 4
|
||||
|
||||
do8:
|
||||
|
||||
; y
|
||||
movq xmm0, [esi] ; 8 at a time
|
||||
lea esi, [esi + 8]
|
||||
pxor xmm6, xmm6
|
||||
punpcklbw xmm0, xmm6
|
||||
|
||||
; r = y + hiword(4669 * (v << 4))
|
||||
movdqa xmm4, [c4669]
|
||||
pmulhw xmm4, xmm2
|
||||
movdqa xmm3, xmm0
|
||||
paddw xmm3, xmm4
|
||||
|
||||
; g = y - hiword(1616 * (u << 4)) - hiword(2378 * (v << 4))
|
||||
movdqa xmm5, [c1616]
|
||||
pmulhw xmm5, xmm1
|
||||
movdqa xmm6, [c2378]
|
||||
pmulhw xmm6, xmm2
|
||||
movdqa xmm4, xmm0
|
||||
psubw xmm4, xmm5
|
||||
psubw xmm4, xmm6
|
||||
|
||||
; b = y + hiword(9324 * (u << 4))
|
||||
movdqa xmm6, [c9324]
|
||||
pmulhw xmm6, xmm1
|
||||
movdqa xmm5, xmm0
|
||||
paddw xmm5, xmm6
|
||||
|
||||
packuswb xmm3, xmm3 ; b
|
||||
packuswb xmm4, xmm4 ; g
|
||||
punpcklbw xmm3, xmm4 ; gb
|
||||
|
||||
pxor xmm4, xmm4 ; a
|
||||
packuswb xmm5, xmm5 ; r
|
||||
punpcklbw xmm5, xmm4 ; ar
|
||||
|
||||
movdqa xmm4, xmm3
|
||||
punpcklwd xmm3, xmm5 ; argb
|
||||
movdqa [edi], xmm3
|
||||
lea edi, [edi + 16]
|
||||
punpckhwd xmm4, xmm5 ; argb
|
||||
movdqa [edi], xmm4
|
||||
lea edi, [edi + 16]
|
||||
|
||||
ret;
|
||||
|
||||
;int
|
||||
;yv12_to_rgb32_x86_sse2(unsigned char *yuvs, int width, int height, int *rgbs)
|
||||
|
||||
PROC yv12_to_rgb32_x86_sse2
|
||||
push ebx
|
||||
push esi
|
||||
push edi
|
||||
push ebp
|
||||
|
||||
mov edi, [esp + 32] ; rgbs
|
||||
|
||||
mov ecx, [esp + 24] ; width
|
||||
mov edx, ecx
|
||||
mov ebp, [esp + 28] ; height
|
||||
mov eax, ebp
|
||||
shr ebp, 1
|
||||
imul eax, ecx ; eax = width * height
|
||||
|
||||
mov esi, [esp + 20] ; y
|
||||
|
||||
mov ebx, esi ; u = y + width * height
|
||||
add ebx, eax
|
||||
|
||||
; local vars
|
||||
; char* yptr1
|
||||
; char* yptr2
|
||||
; char* uptr
|
||||
; char* vptr
|
||||
; int* rgbs1
|
||||
; int* rgbs2
|
||||
; int width
|
||||
sub esp, 28 ; local vars, 28 bytes
|
||||
mov [esp + 0], esi ; save y1
|
||||
add esi, edx
|
||||
mov [esp + 4], esi ; save y2
|
||||
mov [esp + 8], ebx ; save u
|
||||
shr eax, 2
|
||||
add ebx, eax ; v = u + (width * height / 4)
|
||||
mov [esp + 12], ebx ; save v
|
||||
|
||||
mov [esp + 16], edi ; save rgbs1
|
||||
mov eax, edx
|
||||
shl eax, 2
|
||||
add edi, eax
|
||||
mov [esp + 20], edi ; save rgbs2
|
||||
|
||||
loop_y:
|
||||
|
||||
mov ecx, edx ; width
|
||||
shr ecx, 3
|
||||
|
||||
; save edx
|
||||
mov [esp + 24], edx
|
||||
|
||||
;prefetchnta 4096[esp + 0] ; y
|
||||
;prefetchnta 1024[esp + 8] ; u
|
||||
;prefetchnta 1024[esp + 12] ; v
|
||||
|
||||
loop_x:
|
||||
|
||||
mov esi, [esp + 0] ; y1
|
||||
mov ebx, [esp + 8] ; u
|
||||
mov edx, [esp + 12] ; v
|
||||
mov edi, [esp + 16] ; rgbs1
|
||||
|
||||
; y1
|
||||
call do8_uv
|
||||
|
||||
mov [esp + 0], esi ; y1
|
||||
mov [esp + 16], edi ; rgbs1
|
||||
|
||||
mov esi, [esp + 4] ; y2
|
||||
mov edi, [esp + 20] ; rgbs2
|
||||
|
||||
; y2
|
||||
call do8
|
||||
|
||||
mov [esp + 4], esi ; y2
|
||||
mov [esp + 8], ebx ; u
|
||||
mov [esp + 12], edx ; v
|
||||
mov [esp + 20], edi ; rgbs2
|
||||
|
||||
dec ecx ; width
|
||||
jnz loop_x
|
||||
|
||||
; restore edx
|
||||
mov edx, [esp + 24]
|
||||
|
||||
; update y1 and 2
|
||||
mov eax, [esp + 0]
|
||||
mov ebx, edx
|
||||
add eax, ebx
|
||||
mov [esp + 0], eax
|
||||
|
||||
mov eax, [esp + 4]
|
||||
add eax, ebx
|
||||
mov [esp + 4], eax
|
||||
|
||||
; update rgb1 and 2
|
||||
mov eax, [esp + 16]
|
||||
mov ebx, edx
|
||||
shl ebx, 2
|
||||
add eax, ebx
|
||||
mov [esp + 16], eax
|
||||
|
||||
mov eax, [esp + 20]
|
||||
add eax, ebx
|
||||
mov [esp + 20], eax
|
||||
|
||||
mov ecx, ebp
|
||||
dec ecx ; height
|
||||
mov ebp, ecx
|
||||
jnz loop_y
|
||||
|
||||
add esp, 28
|
||||
|
||||
mov eax, 0
|
||||
pop ebp
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
ret
|
||||
align 16
|
||||
|
||||
|
@ -1,100 +0,0 @@
|
||||
|
||||
------------------------------------------------------
|
||||
11/01/2014
|
||||
------------------------------------------------------
|
||||
|
||||
There are four modules built for the Xorg driver model and one configuration file
|
||||
This works best with newer Xorg installs, xserver 1.10 +, example Debian 7 +, Ubuntu 12.04 +
|
||||
|
||||
To see what version you have, run
|
||||
xdpyinfo | grep version:
|
||||
or
|
||||
dpkg -l | grep xserver-xorg-core
|
||||
or
|
||||
yum list | grep xorg-x11-server-Xorg
|
||||
|
||||
It should compile with older version and may run but may be problems.
|
||||
Usually, the problems are related to startup / login.
|
||||
|
||||
autotools should build and install them
|
||||
|
||||
./bootstrap
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
|
||||
This should install the following...
|
||||
|
||||
libxorgxrdp.so goes in /usr/lib/xorg/modules/
|
||||
xrdpdev_drv.so goes in /usr/lib/xorg/modules/drivers/
|
||||
xrdpkeyb_drv.so goes in /usr/lib/xorg/modules/input/
|
||||
xrdpmouse_drv.so goes in /usr/lib/xorg/modules/input/
|
||||
xorg.conf goes in /etc/X11/xrdp/
|
||||
|
||||
with all these components in place, you can start Xorg with the xrdp modules with
|
||||
Xorg -config xrdp/xorg.conf -logfile /tmp/Xtmp.log -noreset -ac :10
|
||||
or
|
||||
Xorg -config xrdp/xorg.conf -logfile /dev/null -noreset -ac :10
|
||||
|
||||
|
||||
|
||||
|
||||
older notes
|
||||
|
||||
------------------------------------------------------
|
||||
Notes for building xrdpdev_drv.so and libxorgxrdp.so
|
||||
------------------------------------------------------
|
||||
|
||||
Pre-requisites:
|
||||
o sudo apt-get install xserver-xorg-dev
|
||||
|
||||
quick and easy way to build and run the driver
|
||||
o cd xorg/server
|
||||
o ./test-in-home.sh
|
||||
|
||||
o see /etc/X11/xrdp/xorg.conf to see how things are configured
|
||||
|
||||
to run it
|
||||
create /etc/X11/xrdp
|
||||
copy xorg.conf into it
|
||||
|
||||
copy xrdpdev_drv.so to /usr/lib/xorg/modules/drivers
|
||||
copy libxorgxrdp.so to /usr/lib/xorg/modules
|
||||
|
||||
copy xrdpmouse_drv.so to /usr/lib/xorg/modules/input
|
||||
copy xrdpkeyb_drv.so to /usr/lib/xorg/modules/input
|
||||
|
||||
start xserver like this
|
||||
Xorg -modulepath /usr/lib/xorg/modules -config xrdp/xorg.conf -logfile /tmp/Xjay.log -novtswitch -sharevts -noreset -nohwaccess -ac :10
|
||||
or this on older Xorg but need /dev/vc/ thing below
|
||||
Xorg -modulepath /home/jay/xorg-modules -config xrdp/xorg.conf -logfile /tmp/Xjay.log -novtswitch -sharevts -noreset -ac vt7 :10
|
||||
|
||||
older Xorg don't have -nohwaccess so you need to run Xorg as root
|
||||
or do something like this.
|
||||
|
||||
sudo rm /dev/tty0
|
||||
sudo mknod -m 666 /dev/tty0 c 4 0
|
||||
|
||||
sudo mkdir /dev/vc/
|
||||
sudo mknod -m 666 /dev/vc/7 c 7 7
|
||||
|
||||
--modules
|
||||
libfb.so
|
||||
libint10.so
|
||||
libvbe.so
|
||||
libxorgxrdp.so
|
||||
----drivers
|
||||
xrdpdev_drv.so
|
||||
----extensions
|
||||
libdbe.so
|
||||
libdri.so
|
||||
libdri2.so
|
||||
libextmod.so
|
||||
libglx.so
|
||||
librecord.so
|
||||
----input
|
||||
xrdpkeyb_drv.so
|
||||
xrdpmouse_drv.so
|
||||
|
||||
dpkg -S /usr/lib/xorg/modules/extensions/libglx.so
|
||||
xserver-xorg-core
|
@ -1,41 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -e /etc/X11/xrdp/xorg.conf ]; then
|
||||
echo "/etc/X11/xrdp/xorg.conf ok"
|
||||
else
|
||||
echo "/etc/X11/xrdp/xorg.conf missing, run"
|
||||
echo "sudo mkdir /etc/X11/xrdp"
|
||||
echo "sudo cp xrdpdev/xorg.conf /etc/X11/xrdp/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -d $HOME/xorg-modules ]; then
|
||||
echo "found directory ok"
|
||||
else
|
||||
echo "creating directory"
|
||||
mkdir $HOME/xorg-modules
|
||||
mkdir $HOME/xorg-modules/drivers
|
||||
mkdir $HOME/xorg-modules/extensions
|
||||
mkdir $HOME/xorg-modules/input
|
||||
|
||||
cp /usr/lib/xorg/modules/libfb.so $HOME/xorg-modules/
|
||||
cp /usr/lib/xorg/modules/libint10.so $HOME/xorg-modules/
|
||||
cp /usr/lib/xorg/modules/libvbe.so $HOME/xorg-modules/
|
||||
|
||||
cp /usr/lib/xorg/modules/extensions/libdbe.so $HOME/xorg-modules/extensions/
|
||||
cp /usr/lib/xorg/modules/extensions/libdri.so $HOME/xorg-modules/extensions/
|
||||
cp /usr/lib/xorg/modules/extensions/libdri2.so $HOME/xorg-modules/extensions/
|
||||
cp /usr/lib/xorg/modules/extensions/libextmod.so $HOME/xorg-modules/extensions/
|
||||
cp /usr/lib/xorg/modules/extensions/libglx.so $HOME/xorg-modules/extensions/
|
||||
cp /usr/lib/xorg/modules/extensions/librecord.so $HOME/xorg-modules/extensions/
|
||||
|
||||
fi
|
||||
|
||||
make
|
||||
if test $? -ne 0
|
||||
then
|
||||
echo "make failed"
|
||||
exit 1
|
||||
fi
|
||||
make xinstall
|
||||
exec Xorg -modulepath $HOME/xorg-modules -config xrdp/xorg.conf -logfile /tmp/Xtmp.log -novtswitch -sharevts -noreset -ac vt7 :20
|
@ -1,17 +0,0 @@
|
||||
EXTRA_DIST = \
|
||||
xorg.conf
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(XORG_SERVER_CFLAGS) \
|
||||
-I../module \
|
||||
-I../../../common
|
||||
|
||||
xrdpdev_drv_la_LTLIBRARIES = xrdpdev_drv.la
|
||||
|
||||
xrdpdev_drv_la_LDFLAGS = -module -avoid-version
|
||||
|
||||
xrdpdev_drv_ladir = $(moduledir)/drivers
|
||||
|
||||
xrdpdev_drv_la_SOURCES = xrdpdev.c
|
||||
|
||||
xrdpdev_drv_la_LIBADD =
|
@ -1,68 +0,0 @@
|
||||
|
||||
Section "ServerLayout"
|
||||
Identifier "X11 Server"
|
||||
Screen "Screen (xrdpdev)"
|
||||
InputDevice "xrdpMouse" "CorePointer"
|
||||
InputDevice "xrdpKeyboard" "CoreKeyboard"
|
||||
EndSection
|
||||
|
||||
Section "ServerFlags"
|
||||
Option "DontVTSwitch" "on"
|
||||
Option "AutoAddDevices" "off"
|
||||
EndSection
|
||||
|
||||
Section "Files"
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/misc/:unscaled"
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
|
||||
FontPath "/usr/X11R6/lib/X11/fonts/viewtouch"
|
||||
EndSection
|
||||
|
||||
Section "Module"
|
||||
Load "dbe"
|
||||
Load "ddc"
|
||||
Load "extmod"
|
||||
Load "glx"
|
||||
Load "int10"
|
||||
Load "record"
|
||||
Load "vbe"
|
||||
Load "xorgxrdp"
|
||||
Load "fb"
|
||||
EndSection
|
||||
|
||||
Section "InputDevice"
|
||||
Identifier "xrdpKeyboard"
|
||||
Driver "xrdpkeyb"
|
||||
EndSection
|
||||
|
||||
Section "InputDevice"
|
||||
Identifier "xrdpMouse"
|
||||
Driver "xrdpmouse"
|
||||
EndSection
|
||||
|
||||
Section "Monitor"
|
||||
Identifier "Monitor"
|
||||
Option "DPMS"
|
||||
HorizSync 30-80
|
||||
VertRefresh 60-75
|
||||
ModeLine "1920x1080" 138.500 1920 1968 2000 2080 1080 1083 1088 1111 +hsync -vsync
|
||||
ModeLine "1280x720" 74.25 1280 1720 1760 1980 720 725 730 750 +HSync +VSync
|
||||
Modeline "1368x768" 72.25 1368 1416 1448 1528 768 771 781 790 +hsync -vsync
|
||||
Modeline "1600x900" 119.00 1600 1696 1864 2128 900 901 904 932 -hsync +vsync
|
||||
EndSection
|
||||
|
||||
Section "Device"
|
||||
Identifier "Video Card (xrdpdev)"
|
||||
Driver "xrdpdev"
|
||||
EndSection
|
||||
|
||||
Section "Screen"
|
||||
Identifier "Screen (xrdpdev)"
|
||||
Device "Video Card (xrdpdev)"
|
||||
Monitor "Monitor"
|
||||
DefaultDepth 24
|
||||
SubSectionSub "Display"
|
||||
Depth 24
|
||||
Modes "640x480" "800x600" "1024x768" "1280x720" "1280x1024" "1600x900" "1920x1080"
|
||||
EndSubSection
|
||||
EndSection
|
@ -1,779 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
This is the main driver file
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
#include <randrstr.h>
|
||||
|
||||
#include <xf86Modes.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpPri.h"
|
||||
#include "rdpDraw.h"
|
||||
#include "rdpGC.h"
|
||||
#include "rdpCursor.h"
|
||||
#include "rdpRandR.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpComposite.h"
|
||||
#include "rdpTrapezoids.h"
|
||||
#include "rdpGlyphs.h"
|
||||
#include "rdpPixmap.h"
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpXv.h"
|
||||
#include "rdpSimd.h"
|
||||
|
||||
#define LLOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do \
|
||||
{ \
|
||||
if (_level < LLOG_LEVEL) \
|
||||
{ \
|
||||
ErrorF _args ; \
|
||||
ErrorF("\n"); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
int g_bpp = 32;
|
||||
int g_depth = 24;
|
||||
int g_rgb_bits = 8;
|
||||
int g_redOffset = 16;
|
||||
int g_redBits = 8;
|
||||
int g_greenOffset = 8;
|
||||
int g_greenBits = 8;
|
||||
int g_blueOffset = 0;
|
||||
int g_blueBits = 8;
|
||||
|
||||
static int g_setup_done = 0;
|
||||
static OsTimerPtr g_timer = 0;
|
||||
|
||||
/* Supported "chipsets" */
|
||||
static SymTabRec g_Chipsets[] =
|
||||
{
|
||||
{ 0, XRDP_DRIVER_NAME },
|
||||
{ -1, 0 }
|
||||
};
|
||||
|
||||
static XF86ModuleVersionInfo g_VersRec =
|
||||
{
|
||||
XRDP_DRIVER_NAME,
|
||||
MODULEVENDORSTRING,
|
||||
MODINFOSTRING1,
|
||||
MODINFOSTRING2,
|
||||
XORG_VERSION_CURRENT,
|
||||
PACKAGE_VERSION_MAJOR,
|
||||
PACKAGE_VERSION_MINOR,
|
||||
PACKAGE_VERSION_PATCHLEVEL,
|
||||
ABI_CLASS_VIDEODRV,
|
||||
ABI_VIDEODRV_VERSION,
|
||||
0,
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
rdpAllocRec(ScrnInfoPtr pScrn)
|
||||
{
|
||||
LLOGLN(10, ("rdpAllocRec:"));
|
||||
if (pScrn->driverPrivate != 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
/* xnfcalloc exits if alloc failed */
|
||||
pScrn->driverPrivate = xnfcalloc(sizeof(rdpRec), 1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
rdpFreeRec(ScrnInfoPtr pScrn)
|
||||
{
|
||||
LLOGLN(10, ("rdpFreeRec:"));
|
||||
if (pScrn->driverPrivate == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
free(pScrn->driverPrivate);
|
||||
pScrn->driverPrivate = 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
rdpPreInit(ScrnInfoPtr pScrn, int flags)
|
||||
{
|
||||
rgb zeros1;
|
||||
Gamma zeros2;
|
||||
int got_res_match;
|
||||
char **modename;
|
||||
DisplayModePtr mode;
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpPreInit:"));
|
||||
if (flags & PROBE_DETECT)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (pScrn->numEntities != 1)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
rdpAllocRec(pScrn);
|
||||
dev = XRDPPTR(pScrn);
|
||||
|
||||
dev->width = 1024;
|
||||
dev->height = 768;
|
||||
|
||||
pScrn->monitor = pScrn->confScreen->monitor;
|
||||
pScrn->bitsPerPixel = g_bpp;
|
||||
pScrn->virtualX = dev->width;
|
||||
pScrn->displayWidth = dev->width;
|
||||
pScrn->virtualY = dev->height;
|
||||
pScrn->progClock = 1;
|
||||
pScrn->rgbBits = g_rgb_bits;
|
||||
pScrn->depth = g_depth;
|
||||
pScrn->chipset = XRDP_DRIVER_NAME;
|
||||
pScrn->currentMode = pScrn->modes;
|
||||
pScrn->offset.blue = g_blueOffset;
|
||||
pScrn->offset.green = g_greenOffset;
|
||||
pScrn->offset.red = g_redOffset;
|
||||
pScrn->mask.blue = ((1 << g_blueBits) - 1) << pScrn->offset.blue;
|
||||
pScrn->mask.green = ((1 << g_greenBits) - 1) << pScrn->offset.green;
|
||||
pScrn->mask.red = ((1 << g_redBits) - 1) << pScrn->offset.red;
|
||||
|
||||
if (!xf86SetDepthBpp(pScrn, g_depth, g_bpp, g_bpp,
|
||||
Support24bppFb | Support32bppFb |
|
||||
SupportConvert32to24 | SupportConvert24to32))
|
||||
{
|
||||
LLOGLN(0, ("rdpPreInit: xf86SetDepthBpp failed"));
|
||||
rdpFreeRec(pScrn);
|
||||
return FALSE;
|
||||
}
|
||||
xf86PrintDepthBpp(pScrn);
|
||||
g_memset(&zeros1, 0, sizeof(zeros1));
|
||||
if (!xf86SetWeight(pScrn, zeros1, zeros1))
|
||||
{
|
||||
LLOGLN(0, ("rdpPreInit: xf86SetWeight failed"));
|
||||
rdpFreeRec(pScrn);
|
||||
return FALSE;
|
||||
}
|
||||
g_memset(&zeros2, 0, sizeof(zeros2));
|
||||
if (!xf86SetGamma(pScrn, zeros2))
|
||||
{
|
||||
LLOGLN(0, ("rdpPreInit: xf86SetGamma failed"));
|
||||
rdpFreeRec(pScrn);
|
||||
return FALSE;
|
||||
}
|
||||
if (!xf86SetDefaultVisual(pScrn, -1))
|
||||
{
|
||||
LLOGLN(0, ("rdpPreInit: xf86SetDefaultVisual failed"));
|
||||
rdpFreeRec(pScrn);
|
||||
return FALSE;
|
||||
}
|
||||
xf86SetDpi(pScrn, 0, 0);
|
||||
if (0 == pScrn->display->modes)
|
||||
{
|
||||
LLOGLN(0, ("rdpPreInit: modes error"));
|
||||
rdpFreeRec(pScrn);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pScrn->virtualX = pScrn->display->virtualX;
|
||||
pScrn->virtualY = pScrn->display->virtualY;
|
||||
|
||||
got_res_match = 0;
|
||||
for (modename = pScrn->display->modes; *modename != 0; modename++)
|
||||
{
|
||||
for (mode = pScrn->monitor->Modes; mode != 0; mode = mode->next)
|
||||
{
|
||||
LLOGLN(10, ("%s %s", mode->name, *modename));
|
||||
if (0 == strcmp(mode->name, *modename))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (0 == mode)
|
||||
{
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "\tmode \"%s\" not found\n",
|
||||
*modename);
|
||||
continue;
|
||||
}
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "\tmode \"%s\" ok\n", *modename);
|
||||
LLOGLN(10, ("%d %d %d %d", mode->HDisplay, dev->width,
|
||||
mode->VDisplay, dev->height));
|
||||
if ((mode->HDisplay == dev->width) && (mode->VDisplay == dev->height))
|
||||
{
|
||||
pScrn->virtualX = mode->HDisplay;
|
||||
pScrn->virtualY = mode->VDisplay;
|
||||
got_res_match = 1;
|
||||
}
|
||||
if (got_res_match)
|
||||
{
|
||||
pScrn->modes = xf86DuplicateMode(mode);
|
||||
pScrn->modes->next = pScrn->modes;
|
||||
pScrn->modes->prev = pScrn->modes;
|
||||
dev->num_modes = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
pScrn->currentMode = pScrn->modes;
|
||||
xf86PrintModes(pScrn);
|
||||
LLOGLN(10, ("rdpPreInit: out fPtr->num_modes %d", dev->num_modes));
|
||||
if (!got_res_match)
|
||||
{
|
||||
LLOGLN(0, ("rdpPreInit: could not find screen resolution %dx%d",
|
||||
dev->width, dev->height));
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static miPointerSpriteFuncRec g_rdpSpritePointerFuncs =
|
||||
{
|
||||
/* these are in rdpCursor.c */
|
||||
rdpSpriteRealizeCursor,
|
||||
rdpSpriteUnrealizeCursor,
|
||||
rdpSpriteSetCursor,
|
||||
rdpSpriteMoveCursor,
|
||||
rdpSpriteDeviceCursorInitialize,
|
||||
rdpSpriteDeviceCursorCleanup
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
static Bool
|
||||
rdpSaveScreen(ScreenPtr pScreen, int on)
|
||||
{
|
||||
LLOGLN(0, ("rdpSaveScreen:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static Bool
|
||||
rdpResizeSession(rdpPtr dev, int width, int height)
|
||||
{
|
||||
int mmwidth;
|
||||
int mmheight;
|
||||
RRScreenSizePtr pSize;
|
||||
Bool ok;
|
||||
|
||||
LLOGLN(0, ("rdpResizeSession: width %d height %d", width, height));
|
||||
mmwidth = PixelToMM(width);
|
||||
mmheight = PixelToMM(height);
|
||||
|
||||
pSize = RRRegisterSize(dev->pScreen, width, height, mmwidth, mmheight);
|
||||
RRSetCurrentConfig(dev->pScreen, RR_Rotate_0, 0, pSize);
|
||||
|
||||
ok = TRUE;
|
||||
if ((dev->width != width) || (dev->height != height))
|
||||
{
|
||||
LLOGLN(0, (" calling RRScreenSizeSet"));
|
||||
ok = RRScreenSizeSet(dev->pScreen, width, height, mmwidth, mmheight);
|
||||
LLOGLN(0, (" RRScreenSizeSet ok %d", ok));
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* returns error */
|
||||
static CARD32
|
||||
rdpDeferredRandR(OsTimerPtr timer, CARD32 now, pointer arg)
|
||||
{
|
||||
ScreenPtr pScreen;
|
||||
rrScrPrivPtr pRRScrPriv;
|
||||
rdpPtr dev;
|
||||
char *envvar;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
pScreen = (ScreenPtr) arg;
|
||||
dev = rdpGetDevFromScreen(pScreen);
|
||||
LLOGLN(0, ("rdpDeferredRandR:"));
|
||||
pRRScrPriv = rrGetScrPriv(pScreen);
|
||||
if (pRRScrPriv == 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpDeferredRandR: rrGetScrPriv failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
dev->rrSetConfig = pRRScrPriv->rrSetConfig;
|
||||
dev->rrGetInfo = pRRScrPriv->rrGetInfo;
|
||||
dev->rrScreenSetSize = pRRScrPriv->rrScreenSetSize;
|
||||
dev->rrCrtcSet = pRRScrPriv->rrCrtcSet;
|
||||
dev->rrCrtcSetGamma = pRRScrPriv->rrCrtcSetGamma;
|
||||
dev->rrCrtcGetGamma = pRRScrPriv->rrCrtcGetGamma;
|
||||
dev->rrOutputSetProperty = pRRScrPriv->rrOutputSetProperty;
|
||||
dev->rrOutputValidateMode = pRRScrPriv->rrOutputValidateMode;
|
||||
dev->rrModeDestroy = pRRScrPriv->rrModeDestroy;
|
||||
dev->rrOutputGetProperty = pRRScrPriv->rrOutputGetProperty;
|
||||
dev->rrGetPanning = pRRScrPriv->rrGetPanning;
|
||||
dev->rrSetPanning = pRRScrPriv->rrSetPanning;
|
||||
|
||||
LLOGLN(10, (" rrSetConfig = %p", dev->rrSetConfig));
|
||||
LLOGLN(10, (" rrGetInfo = %p", dev->rrGetInfo));
|
||||
LLOGLN(10, (" rrScreenSetSize = %p", dev->rrScreenSetSize));
|
||||
LLOGLN(10, (" rrCrtcSet = %p", dev->rrCrtcSet));
|
||||
LLOGLN(10, (" rrCrtcSetGamma = %p", dev->rrCrtcSetGamma));
|
||||
LLOGLN(10, (" rrCrtcGetGamma = %p", dev->rrCrtcGetGamma));
|
||||
LLOGLN(10, (" rrOutputSetProperty = %p", dev->rrOutputSetProperty));
|
||||
LLOGLN(10, (" rrOutputValidateMode = %p", dev->rrOutputValidateMode));
|
||||
LLOGLN(10, (" rrModeDestroy = %p", dev->rrModeDestroy));
|
||||
LLOGLN(10, (" rrOutputGetProperty = %p", dev->rrOutputGetProperty));
|
||||
LLOGLN(10, (" rrGetPanning = %p", dev->rrGetPanning));
|
||||
LLOGLN(10, (" rrSetPanning = %p", dev->rrSetPanning));
|
||||
|
||||
pRRScrPriv->rrSetConfig = rdpRRSetConfig;
|
||||
pRRScrPriv->rrGetInfo = rdpRRGetInfo;
|
||||
pRRScrPriv->rrScreenSetSize = rdpRRScreenSetSize;
|
||||
pRRScrPriv->rrCrtcSet = rdpRRCrtcSet;
|
||||
pRRScrPriv->rrCrtcSetGamma = rdpRRCrtcSetGamma;
|
||||
pRRScrPriv->rrCrtcGetGamma = rdpRRCrtcGetGamma;
|
||||
pRRScrPriv->rrOutputSetProperty = rdpRROutputSetProperty;
|
||||
pRRScrPriv->rrOutputValidateMode = rdpRROutputValidateMode;
|
||||
pRRScrPriv->rrModeDestroy = rdpRRModeDestroy;
|
||||
pRRScrPriv->rrOutputGetProperty = rdpRROutputGetProperty;
|
||||
pRRScrPriv->rrGetPanning = rdpRRGetPanning;
|
||||
pRRScrPriv->rrSetPanning = rdpRRSetPanning;
|
||||
|
||||
rdpResizeSession(dev, dev->width, dev->height);
|
||||
|
||||
envvar = getenv("XRDP_START_WIDTH");
|
||||
if (envvar != 0)
|
||||
{
|
||||
width = atoi(envvar);
|
||||
if ((width >= 16) && (width < 8192))
|
||||
{
|
||||
envvar = getenv("XRDP_START_HEIGHT");
|
||||
if (envvar != 0)
|
||||
{
|
||||
height = atoi(envvar);
|
||||
if ((height >= 16) && (height < 8192))
|
||||
{
|
||||
rdpResizeSession(dev, width, height);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpBlockHandler1(pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
|
||||
{
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpWakeupHandler1(pointer blockData, int result, pointer pReadmask)
|
||||
{
|
||||
rdpClientConCheck((ScreenPtr)blockData);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||
#else
|
||||
rdpScreenInit(ScreenPtr pScreen, int argc, char **argv)
|
||||
#endif
|
||||
{
|
||||
ScrnInfoPtr pScrn;
|
||||
rdpPtr dev;
|
||||
VisualPtr vis;
|
||||
Bool vis_found;
|
||||
PictureScreenPtr ps;
|
||||
|
||||
pScrn = xf86Screens[pScreen->myNum];
|
||||
dev = XRDPPTR(pScrn);
|
||||
|
||||
dev->pScreen = pScreen;
|
||||
|
||||
miClearVisualTypes();
|
||||
miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth),
|
||||
pScrn->rgbBits, TrueColor);
|
||||
miSetPixmapDepths();
|
||||
LLOGLN(0, ("rdpScreenInit: virtualX %d virtualY %d rgbBits %d depth %d",
|
||||
pScrn->virtualX, pScrn->virtualY, pScrn->rgbBits, pScrn->depth));
|
||||
|
||||
dev->depth = pScrn->depth;
|
||||
dev->paddedWidthInBytes = PixmapBytePad(dev->width, dev->depth);
|
||||
dev->bitsPerPixel = rdpBitsPerPixel(dev->depth);
|
||||
dev->sizeInBytes = dev->paddedWidthInBytes * dev->height;
|
||||
LLOGLN(0, ("rdpScreenInit: pfbMemory bytes %d", dev->sizeInBytes));
|
||||
dev->pfbMemory_alloc = (char *) g_malloc(dev->sizeInBytes + 16, 1);
|
||||
dev->pfbMemory = (char*) RDPALIGN(dev->pfbMemory_alloc, 16);
|
||||
LLOGLN(0, ("rdpScreenInit: pfbMemory %p", dev->pfbMemory));
|
||||
if (!fbScreenInit(pScreen, dev->pfbMemory,
|
||||
pScrn->virtualX, pScrn->virtualY,
|
||||
pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth,
|
||||
pScrn->bitsPerPixel))
|
||||
{
|
||||
LLOGLN(0, ("rdpScreenInit: fbScreenInit failed"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 14, 0, 0, 0)
|
||||
/* 1.13 has this function, 1.14 and up does not */
|
||||
miInitializeBackingStore(pScreen);
|
||||
#endif
|
||||
|
||||
/* try in init simd functions */
|
||||
rdpSimdInit(pScreen, pScrn);
|
||||
|
||||
#if defined(XvExtension) && XvExtension
|
||||
/* XVideo */
|
||||
if (!rdpXvInit(pScreen, pScrn))
|
||||
{
|
||||
LLOGLN(0, ("rdpScreenInit: rdpXvInit failed"));
|
||||
}
|
||||
#endif
|
||||
|
||||
vis = pScreen->visuals + (pScreen->numVisuals - 1);
|
||||
while (vis >= pScreen->visuals)
|
||||
{
|
||||
if ((vis->class | DynamicClass) == DirectColor)
|
||||
{
|
||||
vis->offsetBlue = pScrn->offset.blue;
|
||||
vis->blueMask = pScrn->mask.blue;
|
||||
vis->offsetGreen = pScrn->offset.green;
|
||||
vis->greenMask = pScrn->mask.green;
|
||||
vis->offsetRed = pScrn->offset.red;
|
||||
vis->redMask = pScrn->mask.red;
|
||||
}
|
||||
vis--;
|
||||
}
|
||||
fbPictureInit(pScreen, 0, 0);
|
||||
xf86SetBlackWhitePixels(pScreen);
|
||||
xf86SetBackingStore(pScreen);
|
||||
|
||||
#if 1
|
||||
/* hardware cursor */
|
||||
dev->pCursorFuncs = xf86GetPointerScreenFuncs();
|
||||
miPointerInitialize(pScreen, &g_rdpSpritePointerFuncs,
|
||||
dev->pCursorFuncs, 0);
|
||||
#else
|
||||
/* software cursor */
|
||||
dev->pCursorFuncs = xf86GetPointerScreenFuncs();
|
||||
miDCInitialize(pScreen, dev->pCursorFuncs);
|
||||
#endif
|
||||
|
||||
fbCreateDefColormap(pScreen);
|
||||
|
||||
/* must assign this one */
|
||||
pScreen->SaveScreen = rdpSaveScreen;
|
||||
|
||||
vis_found = FALSE;
|
||||
vis = pScreen->visuals + (pScreen->numVisuals - 1);
|
||||
while (vis >= pScreen->visuals)
|
||||
{
|
||||
if (vis->vid == pScreen->rootVisual)
|
||||
{
|
||||
vis_found = TRUE;
|
||||
}
|
||||
vis--;
|
||||
}
|
||||
if (!vis_found)
|
||||
{
|
||||
LLOGLN(0, ("rdpScreenInit: no root visual"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
dev->privateKeyRecGC = rdpAllocateGCPrivate(pScreen, sizeof(rdpGCRec));
|
||||
dev->privateKeyRecPixmap = rdpAllocatePixmapPrivate(pScreen, sizeof(rdpPixmapRec));
|
||||
|
||||
dev->CopyWindow = pScreen->CopyWindow;
|
||||
pScreen->CopyWindow = rdpCopyWindow;
|
||||
|
||||
dev->CreateGC = pScreen->CreateGC;
|
||||
pScreen->CreateGC = rdpCreateGC;
|
||||
|
||||
dev->CreatePixmap = pScreen->CreatePixmap;
|
||||
pScreen->CreatePixmap = rdpCreatePixmap;
|
||||
|
||||
dev->DestroyPixmap = pScreen->DestroyPixmap;
|
||||
pScreen->DestroyPixmap = rdpDestroyPixmap;
|
||||
|
||||
dev->ModifyPixmapHeader = pScreen->ModifyPixmapHeader;
|
||||
pScreen->ModifyPixmapHeader = rdpModifyPixmapHeader;
|
||||
|
||||
ps = GetPictureScreenIfSet(pScreen);
|
||||
if (ps != 0)
|
||||
{
|
||||
/* composite */
|
||||
dev->Composite = ps->Composite;
|
||||
ps->Composite = rdpComposite;
|
||||
/* glyphs */
|
||||
dev->Glyphs = ps->Glyphs;
|
||||
ps->Glyphs = rdpGlyphs;
|
||||
/* trapezoids */
|
||||
dev->Trapezoids = ps->Trapezoids;
|
||||
ps->Trapezoids = rdpTrapezoids;
|
||||
}
|
||||
|
||||
RegisterBlockAndWakeupHandlers(rdpBlockHandler1, rdpWakeupHandler1, pScreen);
|
||||
|
||||
g_timer = TimerSet(g_timer, 0, 10, rdpDeferredRandR, pScreen);
|
||||
|
||||
if (rdpClientConInit(dev) != 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpScreenInit: rdpClientConInit failed"));
|
||||
}
|
||||
|
||||
dev->Bpp_mask = 0x00FFFFFF;
|
||||
dev->Bpp = 4;
|
||||
dev->bitsPerPixel = 32;
|
||||
|
||||
LLOGLN(0, ("rdpScreenInit: out"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpSwitchMode(int a, DisplayModePtr b, int c)
|
||||
#else
|
||||
rdpSwitchMode(ScrnInfoPtr a, DisplayModePtr b)
|
||||
#endif
|
||||
{
|
||||
LLOGLN(0, ("rdpSwitchMode:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpAdjustFrame(int a, int b, int c, int d)
|
||||
#else
|
||||
rdpAdjustFrame(ScrnInfoPtr a, int b, int c)
|
||||
#endif
|
||||
{
|
||||
LLOGLN(10, ("rdpAdjustFrame:"));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpEnterVT(int a, int b)
|
||||
#else
|
||||
rdpEnterVT(ScrnInfoPtr a)
|
||||
#endif
|
||||
{
|
||||
LLOGLN(0, ("rdpEnterVT:"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpLeaveVT(int a, int b)
|
||||
#else
|
||||
rdpLeaveVT(ScrnInfoPtr a)
|
||||
#endif
|
||||
{
|
||||
LLOGLN(0, ("rdpLeaveVT:"));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static ModeStatus
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpValidMode(int a, DisplayModePtr b, Bool c, int d)
|
||||
#else
|
||||
rdpValidMode(ScrnInfoPtr a, DisplayModePtr b, Bool c, int d)
|
||||
#endif
|
||||
{
|
||||
LLOGLN(0, ("rdpValidMode:"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 13, 0, 0, 0)
|
||||
rdpFreeScreen(int a, int b)
|
||||
#else
|
||||
rdpFreeScreen(ScrnInfoPtr a)
|
||||
#endif
|
||||
{
|
||||
LLOGLN(0, ("rdpFreeScreen:"));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
rdpProbe(DriverPtr drv, int flags)
|
||||
{
|
||||
int num_dev_sections;
|
||||
int i;
|
||||
int entity;
|
||||
GDevPtr *dev_sections;
|
||||
Bool found_screen;
|
||||
ScrnInfoPtr pscrn;
|
||||
|
||||
LLOGLN(0, ("rdpProbe:"));
|
||||
if (flags & PROBE_DETECT)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
/* fbScreenInit, fbPictureInit, ... */
|
||||
if (!xf86LoadDrvSubModule(drv, "fb"))
|
||||
{
|
||||
LLOGLN(0, ("rdpProbe: xf86LoadDrvSubModule for fb failed"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
num_dev_sections = xf86MatchDevice(XRDP_DRIVER_NAME, &dev_sections);
|
||||
if (num_dev_sections <= 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpProbe: xf86MatchDevice failed"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pscrn = 0;
|
||||
found_screen = FALSE;
|
||||
for (i = 0; i < num_dev_sections; i++)
|
||||
{
|
||||
entity = xf86ClaimFbSlot(drv, 0, dev_sections[i], 1);
|
||||
pscrn = xf86ConfigFbEntity(pscrn, 0, entity, 0, 0, 0, 0);
|
||||
if (pscrn)
|
||||
{
|
||||
LLOGLN(10, ("rdpProbe: found screen"));
|
||||
found_screen = 1;
|
||||
pscrn->driverVersion = XRDP_VERSION;
|
||||
pscrn->driverName = XRDP_DRIVER_NAME;
|
||||
pscrn->name = XRDP_DRIVER_NAME;
|
||||
pscrn->Probe = rdpProbe;
|
||||
pscrn->PreInit = rdpPreInit;
|
||||
pscrn->ScreenInit = rdpScreenInit;
|
||||
pscrn->SwitchMode = rdpSwitchMode;
|
||||
pscrn->AdjustFrame = rdpAdjustFrame;
|
||||
pscrn->EnterVT = rdpEnterVT;
|
||||
pscrn->LeaveVT = rdpLeaveVT;
|
||||
pscrn->ValidMode = rdpValidMode;
|
||||
pscrn->FreeScreen = rdpFreeScreen;
|
||||
xf86DrvMsg(pscrn->scrnIndex, X_INFO, "%s", "using default device\n");
|
||||
}
|
||||
}
|
||||
free(dev_sections);
|
||||
return found_screen;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static const OptionInfoRec *
|
||||
rdpAvailableOptions(int chipid, int busid)
|
||||
{
|
||||
LLOGLN(0, ("rdpAvailableOptions:"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef HW_SKIP_CONSOLE
|
||||
#define HW_SKIP_CONSOLE 4
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
static Bool
|
||||
rdpDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr)
|
||||
{
|
||||
xorgHWFlags *flags;
|
||||
int rv;
|
||||
|
||||
rv = FALSE;
|
||||
LLOGLN(0, ("rdpDriverFunc: op %d", (int)op));
|
||||
if (op == GET_REQUIRED_HW_INTERFACES)
|
||||
{
|
||||
flags = (xorgHWFlags *) ptr;
|
||||
*flags = HW_SKIP_CONSOLE;
|
||||
rv = TRUE;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
rdpIdentify(int flags)
|
||||
{
|
||||
LLOGLN(0, ("rdpIdentify:"));
|
||||
xf86PrintChipsets(XRDP_DRIVER_NAME, "driver for xrdp", g_Chipsets);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
_X_EXPORT DriverRec g_DriverRec =
|
||||
{
|
||||
XRDP_VERSION,
|
||||
XRDP_DRIVER_NAME,
|
||||
rdpIdentify,
|
||||
rdpProbe,
|
||||
rdpAvailableOptions,
|
||||
0,
|
||||
0,
|
||||
rdpDriverFunc
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
static pointer
|
||||
xrdpdevSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
||||
{
|
||||
LLOGLN(0, ("xrdpdevSetup:"));
|
||||
if (!g_setup_done)
|
||||
{
|
||||
g_setup_done = 1;
|
||||
xf86AddDriver(&g_DriverRec, module, HaveDriverFuncs);
|
||||
return (pointer)1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (errmaj != 0)
|
||||
{
|
||||
*errmaj = LDR_ONCEONLY;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void
|
||||
xrdpdevTearDown(pointer Module)
|
||||
{
|
||||
LLOGLN(0, ("xrdpdevTearDown:"));
|
||||
}
|
||||
|
||||
/* <drivername>ModuleData */
|
||||
_X_EXPORT XF86ModuleData xrdpdevModuleData =
|
||||
{
|
||||
&g_VersRec,
|
||||
xrdpdevSetup,
|
||||
xrdpdevTearDown
|
||||
};
|
@ -1,16 +0,0 @@
|
||||
EXTRA_DIST =
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(XORG_SERVER_CFLAGS) \
|
||||
-I../module \
|
||||
-I../../../common
|
||||
|
||||
xrdpkeyb_drv_la_LTLIBRARIES = xrdpkeyb_drv.la
|
||||
|
||||
xrdpkeyb_drv_la_LDFLAGS = -module -avoid-version
|
||||
|
||||
xrdpkeyb_drv_ladir = $(moduledir)/input
|
||||
|
||||
xrdpkeyb_drv_la_SOURCES = rdpKeyboard.c
|
||||
|
||||
xrdpkeyb_drv_la_LIBADD =
|
@ -1,732 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
xrdp keyboard module
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "xf86Xinput.h"
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
|
||||
#include <xkbsrv.h>
|
||||
|
||||
#include "X11/keysym.h"
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpInput.h"
|
||||
#include "rdpDraw.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
#define MIN_KEY_CODE 8
|
||||
#define MAX_KEY_CODE 255
|
||||
#define NO_OF_KEYS ((MAX_KEY_CODE - MIN_KEY_CODE) + 1)
|
||||
#define GLYPHS_PER_KEY 2
|
||||
/* control */
|
||||
#define CONTROL_L_KEY_CODE 37
|
||||
#define CONTROL_R_KEY_CODE 109
|
||||
/* shift */
|
||||
#define SHIFT_L_KEY_CODE 50
|
||||
#define SHIFT_R_KEY_CODE 62
|
||||
/* win keys */
|
||||
#define SUPER_L_KEY_CODE 115
|
||||
#define SUPER_R_KEY_CODE 116
|
||||
/* alt */
|
||||
#define ALT_L_KEY_CODE 64
|
||||
#define ALT_R_KEY_CODE 113
|
||||
/* caps lock */
|
||||
#define CAPS_LOCK_KEY_CODE 66
|
||||
/* num lock */
|
||||
#define NUM_LOCK_KEY_CODE 77
|
||||
|
||||
#define N_PREDEFINED_KEYS \
|
||||
(sizeof(g_kbdMap) / (sizeof(KeySym) * GLYPHS_PER_KEY))
|
||||
|
||||
static KeySym g_kbdMap[] =
|
||||
{
|
||||
NoSymbol, NoSymbol, /* 8 */
|
||||
XK_Escape, NoSymbol, /* 9 */
|
||||
XK_1, XK_exclam, /* 10 */
|
||||
XK_2, XK_at,
|
||||
XK_3, XK_numbersign,
|
||||
XK_4, XK_dollar,
|
||||
XK_5, XK_percent,
|
||||
XK_6, XK_asciicircum,
|
||||
XK_7, XK_ampersand,
|
||||
XK_8, XK_asterisk,
|
||||
XK_9, XK_parenleft,
|
||||
XK_0, XK_parenright,
|
||||
XK_minus, XK_underscore, /* 20 */
|
||||
XK_equal, XK_plus,
|
||||
XK_BackSpace, NoSymbol,
|
||||
XK_Tab, XK_ISO_Left_Tab,
|
||||
XK_Q, NoSymbol,
|
||||
XK_W, NoSymbol,
|
||||
XK_E, NoSymbol,
|
||||
XK_R, NoSymbol,
|
||||
XK_T, NoSymbol,
|
||||
XK_Y, NoSymbol,
|
||||
XK_U, NoSymbol, /* 30 */
|
||||
XK_I, NoSymbol,
|
||||
XK_O, NoSymbol,
|
||||
XK_P, NoSymbol,
|
||||
XK_bracketleft, XK_braceleft,
|
||||
XK_bracketright, XK_braceright,
|
||||
XK_Return, NoSymbol,
|
||||
XK_Control_L, NoSymbol,
|
||||
XK_A, NoSymbol,
|
||||
XK_S, NoSymbol,
|
||||
XK_D, NoSymbol, /* 40 */
|
||||
XK_F, NoSymbol,
|
||||
XK_G, NoSymbol,
|
||||
XK_H, NoSymbol,
|
||||
XK_J, NoSymbol,
|
||||
XK_K, NoSymbol,
|
||||
XK_L, NoSymbol,
|
||||
XK_semicolon, XK_colon,
|
||||
XK_apostrophe, XK_quotedbl,
|
||||
XK_grave, XK_asciitilde,
|
||||
XK_Shift_L, NoSymbol, /* 50 */
|
||||
XK_backslash, XK_bar,
|
||||
XK_Z, NoSymbol,
|
||||
XK_X, NoSymbol,
|
||||
XK_C, NoSymbol,
|
||||
XK_V, NoSymbol,
|
||||
XK_B, NoSymbol,
|
||||
XK_N, NoSymbol,
|
||||
XK_M, NoSymbol,
|
||||
XK_comma, XK_less,
|
||||
XK_period, XK_greater, /* 60 */
|
||||
XK_slash, XK_question,
|
||||
XK_Shift_R, NoSymbol,
|
||||
XK_KP_Multiply, NoSymbol,
|
||||
XK_Alt_L, NoSymbol,
|
||||
XK_space, NoSymbol,
|
||||
XK_Caps_Lock, NoSymbol,
|
||||
XK_F1, NoSymbol,
|
||||
XK_F2, NoSymbol,
|
||||
XK_F3, NoSymbol,
|
||||
XK_F4, NoSymbol, /* 70 */
|
||||
XK_F5, NoSymbol,
|
||||
XK_F6, NoSymbol,
|
||||
XK_F7, NoSymbol,
|
||||
XK_F8, NoSymbol,
|
||||
XK_F9, NoSymbol,
|
||||
XK_F10, NoSymbol,
|
||||
XK_Num_Lock, NoSymbol,
|
||||
XK_Scroll_Lock, NoSymbol,
|
||||
XK_KP_Home, XK_KP_7,
|
||||
XK_KP_Up, XK_KP_8, /* 80 */
|
||||
XK_KP_Prior, XK_KP_9,
|
||||
XK_KP_Subtract, NoSymbol,
|
||||
XK_KP_Left, XK_KP_4,
|
||||
XK_KP_Begin, XK_KP_5,
|
||||
XK_KP_Right, XK_KP_6,
|
||||
XK_KP_Add, NoSymbol,
|
||||
XK_KP_End, XK_KP_1,
|
||||
XK_KP_Down, XK_KP_2,
|
||||
XK_KP_Next, XK_KP_3,
|
||||
XK_KP_Insert, XK_KP_0, /* 90 */
|
||||
XK_KP_Delete, XK_KP_Decimal,
|
||||
NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol,
|
||||
XK_F11, NoSymbol,
|
||||
XK_F12, NoSymbol,
|
||||
XK_Home, NoSymbol,
|
||||
XK_Up, NoSymbol,
|
||||
XK_Prior, NoSymbol,
|
||||
XK_Left, NoSymbol, /* 100 */
|
||||
XK_Print, NoSymbol,
|
||||
XK_Right, NoSymbol,
|
||||
XK_End, NoSymbol,
|
||||
XK_Down, NoSymbol,
|
||||
XK_Next, NoSymbol,
|
||||
XK_Insert, NoSymbol,
|
||||
XK_Delete, NoSymbol,
|
||||
XK_KP_Enter, NoSymbol,
|
||||
XK_Control_R, NoSymbol,
|
||||
XK_Pause, NoSymbol, /* 110 */
|
||||
XK_Print, NoSymbol,
|
||||
XK_KP_Divide, NoSymbol,
|
||||
XK_Alt_R, NoSymbol,
|
||||
NoSymbol, NoSymbol,
|
||||
XK_Super_L, NoSymbol,
|
||||
XK_Super_R, NoSymbol,
|
||||
XK_Menu, NoSymbol,
|
||||
NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol,
|
||||
NoSymbol, NoSymbol, /* 120 */
|
||||
NoSymbol, NoSymbol
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpEnqueueKey(DeviceIntPtr device, int type, int scancode)
|
||||
{
|
||||
if (type == KeyPress)
|
||||
{
|
||||
xf86PostKeyboardEvent(device, scancode, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
xf86PostKeyboardEvent(device, scancode, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
sendDownUpKeyEvent(DeviceIntPtr device, int type, int x_scancode)
|
||||
{
|
||||
/* need this cause rdp and X11 repeats are different */
|
||||
/* if type is keydown, send keyup + keydown */
|
||||
if (type == KeyPress)
|
||||
{
|
||||
rdpEnqueueKey(device, KeyRelease, x_scancode);
|
||||
rdpEnqueueKey(device, KeyPress, x_scancode);
|
||||
}
|
||||
else
|
||||
{
|
||||
rdpEnqueueKey(device, KeyRelease, x_scancode);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
check_keysa(rdpKeyboard *keyboard)
|
||||
{
|
||||
if (keyboard->ctrl_down != 0)
|
||||
{
|
||||
rdpEnqueueKey(keyboard->device, KeyRelease, keyboard->ctrl_down);
|
||||
keyboard->ctrl_down = 0;
|
||||
}
|
||||
|
||||
if (keyboard->alt_down != 0)
|
||||
{
|
||||
rdpEnqueueKey(keyboard->device, KeyRelease, keyboard->alt_down);
|
||||
keyboard->alt_down = 0;
|
||||
}
|
||||
|
||||
if (keyboard->shift_down != 0)
|
||||
{
|
||||
rdpEnqueueKey(keyboard->device, KeyRelease, keyboard->shift_down);
|
||||
keyboard->shift_down = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param down - true for KeyDown events, false otherwise
|
||||
* @param param1 - ASCII code of pressed key
|
||||
* @param param2 -
|
||||
* @param param3 - scancode of pressed key
|
||||
* @param param4 -
|
||||
******************************************************************************/
|
||||
static void
|
||||
KbdAddEvent(rdpKeyboard *keyboard, int down, int param1, int param2,
|
||||
int param3, int param4)
|
||||
{
|
||||
int rdp_scancode;
|
||||
int x_scancode;
|
||||
int is_ext;
|
||||
int is_spe;
|
||||
int type;
|
||||
|
||||
type = down ? KeyPress : KeyRelease;
|
||||
rdp_scancode = param3;
|
||||
is_ext = param4 & 256; /* 0x100 */
|
||||
is_spe = param4 & 512; /* 0x200 */
|
||||
x_scancode = 0;
|
||||
|
||||
switch (rdp_scancode)
|
||||
{
|
||||
case 58: /* caps lock */
|
||||
case 42: /* left shift */
|
||||
case 54: /* right shift */
|
||||
case 70: /* scroll lock */
|
||||
x_scancode = rdp_scancode + MIN_KEY_CODE;
|
||||
|
||||
if (x_scancode > 0)
|
||||
{
|
||||
rdpEnqueueKey(keyboard->device, type, x_scancode);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 56: /* left - right alt button */
|
||||
|
||||
if (is_ext)
|
||||
{
|
||||
x_scancode = 113; /* right alt button */
|
||||
}
|
||||
else
|
||||
{
|
||||
x_scancode = 64; /* left alt button */
|
||||
}
|
||||
|
||||
rdpEnqueueKey(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 15: /* tab */
|
||||
|
||||
if (!down && !keyboard->tab_down)
|
||||
{
|
||||
/* leave x_scancode 0 here, we don't want the tab key up */
|
||||
check_keysa(keyboard);
|
||||
}
|
||||
else
|
||||
{
|
||||
sendDownUpKeyEvent(keyboard->device, type, 23);
|
||||
}
|
||||
|
||||
keyboard->tab_down = down;
|
||||
break;
|
||||
|
||||
case 29: /* left or right ctrl */
|
||||
|
||||
/* this is to handle special case with pause key sending control first */
|
||||
if (is_spe)
|
||||
{
|
||||
if (down)
|
||||
{
|
||||
keyboard->pause_spe = 1;
|
||||
/* leave x_scancode 0 here, we don't want the control key down */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
x_scancode = is_ext ? 109 : 37;
|
||||
keyboard->ctrl_down = down ? x_scancode : 0;
|
||||
rdpEnqueueKey(keyboard->device, type, x_scancode);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 69: /* Pause or Num Lock */
|
||||
|
||||
if (keyboard->pause_spe)
|
||||
{
|
||||
x_scancode = 110;
|
||||
|
||||
if (!down)
|
||||
{
|
||||
keyboard->pause_spe = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
x_scancode = keyboard->ctrl_down ? 110 : 77;
|
||||
}
|
||||
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 28: /* Enter or Return */
|
||||
x_scancode = is_ext ? 108 : 36;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 53: /* / */
|
||||
x_scancode = is_ext ? 112 : 61;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 55: /* * on KP or Print Screen */
|
||||
x_scancode = is_ext ? 111 : 63;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 71: /* 7 or Home */
|
||||
x_scancode = is_ext ? 97 : 79;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 72: /* 8 or Up */
|
||||
x_scancode = is_ext ? 98 : 80;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 73: /* 9 or PgUp */
|
||||
x_scancode = is_ext ? 99 : 81;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 75: /* 4 or Left */
|
||||
x_scancode = is_ext ? 100 : 83;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 77: /* 6 or Right */
|
||||
x_scancode = is_ext ? 102 : 85;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 79: /* 1 or End */
|
||||
x_scancode = is_ext ? 103 : 87;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 80: /* 2 or Down */
|
||||
x_scancode = is_ext ? 104 : 88;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 81: /* 3 or PgDn */
|
||||
x_scancode = is_ext ? 105 : 89;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 82: /* 0 or Insert */
|
||||
x_scancode = is_ext ? 106 : 90;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 83: /* . or Delete */
|
||||
x_scancode = is_ext ? 107 : 91;
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
break;
|
||||
|
||||
case 91: /* left win key */
|
||||
rdpEnqueueKey(keyboard->device, type, 115);
|
||||
break;
|
||||
|
||||
case 92: /* right win key */
|
||||
rdpEnqueueKey(keyboard->device, type, 116);
|
||||
break;
|
||||
|
||||
case 93: /* menu key */
|
||||
rdpEnqueueKey(keyboard->device, type, 117);
|
||||
break;
|
||||
|
||||
default:
|
||||
x_scancode = rdp_scancode + MIN_KEY_CODE;
|
||||
|
||||
if (x_scancode > 0)
|
||||
{
|
||||
sendDownUpKeyEvent(keyboard->device, type, x_scancode);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* notes -
|
||||
scroll lock doesn't seem to be a modifier in X
|
||||
*/
|
||||
static void
|
||||
KbdSync(rdpKeyboard *keyboard, int param1)
|
||||
{
|
||||
int xkb_state;
|
||||
|
||||
xkb_state = XkbStateFieldFromRec(&(keyboard->device->key->xkbInfo->state));
|
||||
|
||||
if ((!(xkb_state & 0x02)) != (!(param1 & 4))) /* caps lock */
|
||||
{
|
||||
LLOGLN(0, ("KbdSync: toggling caps lock"));
|
||||
KbdAddEvent(keyboard, 1, 58, 0, 58, 0);
|
||||
KbdAddEvent(keyboard, 0, 58, 49152, 58, 49152);
|
||||
}
|
||||
|
||||
if ((!(xkb_state & 0x10)) != (!(param1 & 2))) /* num lock */
|
||||
{
|
||||
LLOGLN(0, ("KbdSync: toggling num lock"));
|
||||
KbdAddEvent(keyboard, 1, 69, 0, 69, 0);
|
||||
KbdAddEvent(keyboard, 0, 69, 49152, 69, 49152);
|
||||
}
|
||||
|
||||
if ((!(keyboard->scroll_lock_down)) != (!(param1 & 1))) /* scroll lock */
|
||||
{
|
||||
LLOGLN(0, ("KbdSync: toggling scroll lock"));
|
||||
KbdAddEvent(keyboard, 1, 70, 0, 70, 0);
|
||||
KbdAddEvent(keyboard, 0, 70, 49152, 70, 49152);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpInputKeyboard(rdpPtr dev, int msg, long param1, long param2,
|
||||
long param3, long param4)
|
||||
{
|
||||
rdpKeyboard *keyboard;
|
||||
|
||||
keyboard = &(dev->keyboard);
|
||||
LLOGLN(10, ("rdpInputKeyboard:"));
|
||||
switch (msg)
|
||||
{
|
||||
case 15: /* key down */
|
||||
case 16: /* key up */
|
||||
KbdAddEvent(keyboard, msg == 15, param1, param2, param3, param4);
|
||||
break;
|
||||
case 17: /* from RDP_INPUT_SYNCHRONIZE */
|
||||
KbdSync(keyboard, param1);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void
|
||||
rdpkeybDeviceInit(DeviceIntPtr pDevice, KeySymsPtr pKeySyms, CARD8 *pModMap)
|
||||
{
|
||||
int i;
|
||||
|
||||
LLOGLN(0, ("rdpkeybDeviceInit:"));
|
||||
LLOGLN(10, (" MAP_LENGTH %d GLYPHS_PER_KEY %d N_PREDEFINED_KEYS %d",
|
||||
MAP_LENGTH, GLYPHS_PER_KEY, (int) N_PREDEFINED_KEYS));
|
||||
|
||||
for (i = 0; i < MAP_LENGTH; i++)
|
||||
{
|
||||
pModMap[i] = NoSymbol;
|
||||
}
|
||||
|
||||
pModMap[SHIFT_L_KEY_CODE] = ShiftMask;
|
||||
pModMap[SHIFT_R_KEY_CODE] = ShiftMask;
|
||||
pModMap[CAPS_LOCK_KEY_CODE] = LockMask;
|
||||
pModMap[CONTROL_L_KEY_CODE] = ControlMask;
|
||||
pModMap[CONTROL_R_KEY_CODE] = ControlMask;
|
||||
pModMap[ALT_L_KEY_CODE] = Mod1Mask;
|
||||
pModMap[ALT_R_KEY_CODE] = Mod1Mask;
|
||||
pModMap[NUM_LOCK_KEY_CODE] = Mod2Mask;
|
||||
pModMap[SUPER_L_KEY_CODE] = Mod4Mask;
|
||||
pModMap[SUPER_R_KEY_CODE] = Mod4Mask;
|
||||
pKeySyms->minKeyCode = MIN_KEY_CODE;
|
||||
pKeySyms->maxKeyCode = MAX_KEY_CODE;
|
||||
pKeySyms->mapWidth = GLYPHS_PER_KEY;
|
||||
i = sizeof(KeySym) * MAP_LENGTH * GLYPHS_PER_KEY;
|
||||
pKeySyms->map = (KeySym *)malloc(i);
|
||||
if (pKeySyms->map == 0)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybDeviceInit: malloc failed"));
|
||||
exit(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(pKeySyms->map, 0, i);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAP_LENGTH * GLYPHS_PER_KEY; i++)
|
||||
{
|
||||
pKeySyms->map[i] = NoSymbol;
|
||||
}
|
||||
|
||||
for (i = 0; i < N_PREDEFINED_KEYS * GLYPHS_PER_KEY; i++)
|
||||
{
|
||||
pKeySyms->map[i] = g_kbdMap[i];
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpkeybDeviceOn(void)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybDeviceOn:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpkeybDeviceOff(void)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybDeviceOff:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpkeybBell(int volume, DeviceIntPtr pDev, pointer ctrl, int cls)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybBell:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpkeybChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybChangeKeyboardControl:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpkeybControl(DeviceIntPtr device, int what)
|
||||
{
|
||||
KeySymsRec keySyms;
|
||||
CARD8 modMap[MAP_LENGTH];
|
||||
DevicePtr pDev;
|
||||
XkbRMLVOSet set;
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpkeybControl: what %d", what));
|
||||
pDev = (DevicePtr)device;
|
||||
|
||||
switch (what)
|
||||
{
|
||||
case DEVICE_INIT:
|
||||
rdpkeybDeviceInit(device, &keySyms, modMap);
|
||||
memset(&set, 0, sizeof(set));
|
||||
set.rules = "base";
|
||||
set.model = "pc104";
|
||||
set.layout = "us";
|
||||
set.variant = "";
|
||||
set.options = "";
|
||||
InitKeyboardDeviceStruct(device, &set, rdpkeybBell,
|
||||
rdpkeybChangeKeyboardControl);
|
||||
dev = rdpGetDevFromScreen(NULL);
|
||||
dev->keyboard.device = device;
|
||||
rdpRegisterInputCallback(0, rdpInputKeyboard);
|
||||
break;
|
||||
case DEVICE_ON:
|
||||
pDev->on = 1;
|
||||
rdpkeybDeviceOn();
|
||||
break;
|
||||
case DEVICE_OFF:
|
||||
pDev->on = 0;
|
||||
rdpkeybDeviceOff();
|
||||
break;
|
||||
case DEVICE_CLOSE:
|
||||
if (pDev->on)
|
||||
{
|
||||
rdpkeybDeviceOff();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
#if XORG_VERSION_CURRENT < (((1) * 10000000) + ((9) * 100000) + ((0) * 1000) + 1)
|
||||
|
||||
/* debian 6
|
||||
ubuntu 10.04 */
|
||||
|
||||
/******************************************************************************/
|
||||
static InputInfoPtr
|
||||
rdpkeybPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
|
||||
{
|
||||
InputInfoPtr info;
|
||||
|
||||
LLOGLN(0, ("rdpkeybPreInit: drv %p dev %p, flags 0x%x",
|
||||
drv, dev, flags));
|
||||
info = xf86AllocateInput(drv, 0);
|
||||
info->name = dev->identifier;
|
||||
info->device_control = rdpkeybControl;
|
||||
info->flags = XI86_CONFIGURED | XI86_ALWAYS_CORE | XI86_SEND_DRAG_EVENTS |
|
||||
XI86_CORE_KEYBOARD | XI86_KEYBOARD_CAPABLE;
|
||||
info->type_name = "Keyboard";
|
||||
info->fd = -1;
|
||||
info->conf_idev = dev;
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* debian 7
|
||||
ubuntu 12.04 */
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpkeybPreInit(InputDriverPtr drv, InputInfoPtr info, int flags)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybPreInit: drv %p info %p, flags 0x%x",
|
||||
drv, info, flags));
|
||||
info->device_control = rdpkeybControl;
|
||||
info->type_name = "Keyboard";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpkeybUnInit(InputDriverPtr drv, InputInfoPtr info, int flags)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybUnInit: drv %p info %p, flags 0x%x",
|
||||
drv, info, flags));
|
||||
rdpUnregisterInputCallback(rdpInputKeyboard);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static InputDriverRec rdpkeyb =
|
||||
{
|
||||
PACKAGE_VERSION_MAJOR, /* version */
|
||||
XRDP_KEYB_NAME, /* name */
|
||||
NULL, /* identify */
|
||||
rdpkeybPreInit, /* preinit */
|
||||
rdpkeybUnInit, /* uninit */
|
||||
NULL, /* module */
|
||||
0 /* ref count */
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
static pointer
|
||||
rdpkeybPlug(pointer module, pointer options, int *errmaj, int *errmin)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybPlug:"));
|
||||
xf86AddInputDriver(&rdpkeyb, module, 0);
|
||||
return module;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpkeybUnplug(pointer p)
|
||||
{
|
||||
LLOGLN(0, ("rdpkeybUnplug:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static XF86ModuleVersionInfo rdpkeybVersionRec =
|
||||
{
|
||||
XRDP_KEYB_NAME,
|
||||
MODULEVENDORSTRING,
|
||||
MODINFOSTRING1,
|
||||
MODINFOSTRING2,
|
||||
XORG_VERSION_CURRENT,
|
||||
PACKAGE_VERSION_MAJOR,
|
||||
PACKAGE_VERSION_MINOR,
|
||||
PACKAGE_VERSION_PATCHLEVEL,
|
||||
ABI_CLASS_XINPUT,
|
||||
ABI_XINPUT_VERSION,
|
||||
MOD_CLASS_XINPUT,
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
_X_EXPORT XF86ModuleData xrdpkeybModuleData =
|
||||
{
|
||||
&rdpkeybVersionRec,
|
||||
rdpkeybPlug,
|
||||
rdpkeybUnplug
|
||||
};
|
@ -1,16 +0,0 @@
|
||||
EXTRA_DIST =
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(XORG_SERVER_CFLAGS) \
|
||||
-I../module \
|
||||
-I../../../common
|
||||
|
||||
xrdpmouse_drv_la_LTLIBRARIES = xrdpmouse_drv.la
|
||||
|
||||
xrdpmouse_drv_la_LDFLAGS = -module -avoid-version
|
||||
|
||||
xrdpmouse_drv_ladir = $(moduledir)/input
|
||||
|
||||
xrdpmouse_drv_la_SOURCES = rdpMouse.c
|
||||
|
||||
xrdpmouse_drv_la_LIBADD =
|
@ -1,367 +0,0 @@
|
||||
/*
|
||||
Copyright 2013-2014 Jay Sorg
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
xrdp mouse module
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* this should be before all X11 .h files */
|
||||
#include <xorg-server.h>
|
||||
#include <xorgVersion.h>
|
||||
|
||||
/* all driver need this */
|
||||
#include <xf86.h>
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#include "xf86Xinput.h"
|
||||
|
||||
#include <mipointer.h>
|
||||
#include <fb.h>
|
||||
#include <micmap.h>
|
||||
#include <mi.h>
|
||||
#include <exevents.h>
|
||||
#include <xserver-properties.h>
|
||||
|
||||
#include "rdp.h"
|
||||
#include "rdpInput.h"
|
||||
#include "rdpDraw.h"
|
||||
|
||||
/******************************************************************************/
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpmouseDeviceInit(void)
|
||||
{
|
||||
LLOGLN(0, ("rdpmouseDeviceInit:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpmouseDeviceOn(DeviceIntPtr pDev)
|
||||
{
|
||||
LLOGLN(0, ("rdpmouseDeviceOn:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpmouseDeviceOff(void)
|
||||
{
|
||||
LLOGLN(0, ("rdpmouseDeviceOff:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpmouseCtrl(DeviceIntPtr pDevice, PtrCtrl *pCtrl)
|
||||
{
|
||||
LLOGLN(0, ("rdpmouseCtrl:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
l_bound_by(int val, int low, int high)
|
||||
{
|
||||
val = RDPCLAMP(val, low, high);
|
||||
return val;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpEnqueueMotion(DeviceIntPtr device, int x, int y)
|
||||
{
|
||||
LLOGLN(10, ("rdpEnqueueMotion:"));
|
||||
xf86PostMotionEvent(device, TRUE, 0, 2, x, y);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpEnqueueButton(DeviceIntPtr device, int type, int buttons)
|
||||
{
|
||||
LLOGLN(10, ("rdpEnqueueButton:"));
|
||||
xf86PostButtonEvent(device, FALSE, buttons, type == ButtonPress, 0, 0);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
PtrAddEvent(rdpPointer *pointer)
|
||||
{
|
||||
int i;
|
||||
int type;
|
||||
int buttons;
|
||||
|
||||
rdpEnqueueMotion(pointer->device, pointer->cursor_x, pointer->cursor_y);
|
||||
|
||||
LLOGLN(10, ("PtrAddEvent: x %d y %d", pointer->cursor_x, pointer->cursor_y));
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
if ((pointer->button_mask ^ pointer->old_button_mask) & (1 << i))
|
||||
{
|
||||
if (pointer->button_mask & (1 << i))
|
||||
{
|
||||
type = ButtonPress;
|
||||
buttons = i + 1;
|
||||
rdpEnqueueButton(pointer->device, type, buttons);
|
||||
}
|
||||
else
|
||||
{
|
||||
type = ButtonRelease;
|
||||
buttons = i + 1;
|
||||
rdpEnqueueButton(pointer->device, type, buttons);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pointer->old_button_mask = pointer->button_mask;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpInputMouse(rdpPtr dev, int msg,
|
||||
long param1, long param2,
|
||||
long param3, long param4)
|
||||
{
|
||||
rdpPointer *pointer;
|
||||
|
||||
LLOGLN(10, ("rdpInputMouse: msg %d param1 %ld param2 %ld param3 %ld param4 %ld",
|
||||
msg, param1, param2, param3, param4));
|
||||
pointer = &(dev->pointer);
|
||||
switch (msg)
|
||||
{
|
||||
case 100:
|
||||
/* without the minus 2, strange things happen when dragging
|
||||
past the width or height */
|
||||
pointer->cursor_x = l_bound_by(param1, 0, dev->width - 2);
|
||||
pointer->cursor_y = l_bound_by(param2, 0, dev->height - 2);
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 101:
|
||||
pointer->button_mask = pointer->button_mask & (~1);
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 102:
|
||||
pointer->button_mask = pointer->button_mask | 1;
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 103:
|
||||
pointer->button_mask = pointer->button_mask & (~4);
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 104:
|
||||
pointer->button_mask = pointer->button_mask | 4;
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 105:
|
||||
pointer->button_mask = pointer->button_mask & (~2);
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 106:
|
||||
pointer->button_mask = pointer->button_mask | 2;
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 107:
|
||||
pointer->button_mask = pointer->button_mask & (~8);
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 108:
|
||||
pointer->button_mask = pointer->button_mask | 8;
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 109:
|
||||
pointer->button_mask = pointer->button_mask & (~16);
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
case 110:
|
||||
pointer->button_mask = pointer->button_mask | 16;
|
||||
PtrAddEvent(pointer);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpmouseControl(DeviceIntPtr device, int what)
|
||||
{
|
||||
BYTE map[6];
|
||||
DevicePtr pDev;
|
||||
Atom btn_labels[6];
|
||||
Atom axes_labels[2];
|
||||
rdpPtr dev;
|
||||
|
||||
LLOGLN(0, ("rdpmouseControl: what %d", what));
|
||||
pDev = (DevicePtr)device;
|
||||
|
||||
switch (what)
|
||||
{
|
||||
case DEVICE_INIT:
|
||||
rdpmouseDeviceInit();
|
||||
map[0] = 0;
|
||||
map[1] = 1;
|
||||
map[2] = 2;
|
||||
map[3] = 3;
|
||||
map[4] = 4;
|
||||
map[5] = 5;
|
||||
|
||||
btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
|
||||
btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
|
||||
btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
|
||||
btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
|
||||
btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
|
||||
|
||||
axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
|
||||
axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
|
||||
|
||||
InitPointerDeviceStruct(pDev, map, 5, btn_labels, rdpmouseCtrl,
|
||||
GetMotionHistorySize(), 2, axes_labels);
|
||||
dev = rdpGetDevFromScreen(NULL);
|
||||
dev->pointer.device = device;
|
||||
rdpRegisterInputCallback(1, rdpInputMouse);
|
||||
break;
|
||||
case DEVICE_ON:
|
||||
pDev->on = 1;
|
||||
rdpmouseDeviceOn(device);
|
||||
break;
|
||||
case DEVICE_OFF:
|
||||
pDev->on = 0;
|
||||
rdpmouseDeviceOff();
|
||||
break;
|
||||
case DEVICE_CLOSE:
|
||||
|
||||
if (pDev->on)
|
||||
{
|
||||
rdpmouseDeviceOff();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
#if XORG_VERSION_CURRENT < (((1) * 10000000) + ((9) * 100000) + ((0) * 1000) + 1)
|
||||
|
||||
/* debian 6
|
||||
ubuntu 10.04 */
|
||||
|
||||
/******************************************************************************/
|
||||
static InputInfoPtr
|
||||
rdpmousePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
|
||||
{
|
||||
InputInfoPtr info;
|
||||
|
||||
LLOGLN(0, ("rdpmousePreInit: drv %p dev %p, flags 0x%x",
|
||||
drv, dev, flags));
|
||||
info = xf86AllocateInput(drv, 0);
|
||||
info->name = dev->identifier;
|
||||
info->device_control = rdpmouseControl;
|
||||
info->flags = XI86_CONFIGURED | XI86_ALWAYS_CORE | XI86_SEND_DRAG_EVENTS |
|
||||
XI86_CORE_POINTER | XI86_POINTER_CAPABLE;
|
||||
info->type_name = "Mouse";
|
||||
info->fd = -1;
|
||||
info->conf_idev = dev;
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* debian 7
|
||||
ubuntu 12.04 */
|
||||
|
||||
/******************************************************************************/
|
||||
static int
|
||||
rdpmousePreInit(InputDriverPtr drv, InputInfoPtr info, int flags)
|
||||
{
|
||||
LLOGLN(0, ("rdpmousePreInit: drv %p info %p, flags 0x%x",
|
||||
drv, info, flags));
|
||||
info->device_control = rdpmouseControl;
|
||||
info->type_name = "Mouse";
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpmouseUnInit(InputDriverPtr drv, InputInfoPtr info, int flags)
|
||||
{
|
||||
LLOGLN(0, ("rdpmouseUnInit: drv %p info %p, flags 0x%x",
|
||||
drv, info, flags));
|
||||
rdpUnregisterInputCallback(rdpInputMouse);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static InputDriverRec rdpmouse =
|
||||
{
|
||||
PACKAGE_VERSION_MAJOR, /* version */
|
||||
XRDP_MOUSE_NAME, /* name */
|
||||
NULL, /* identify */
|
||||
rdpmousePreInit, /* preinit */
|
||||
rdpmouseUnInit, /* uninit */
|
||||
NULL, /* module */
|
||||
0 /* ref count */
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
static pointer
|
||||
rdpmousePlug(pointer module, pointer options, int *errmaj, int *errmin)
|
||||
{
|
||||
LLOGLN(0, ("rdpmousePlug:"));
|
||||
xf86AddInputDriver(&rdpmouse, module, 0);
|
||||
return module;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static void
|
||||
rdpmouseUnplug(pointer p)
|
||||
{
|
||||
LLOGLN(0, ("rdpmouseUnplug:"));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static XF86ModuleVersionInfo rdpmouseVersionRec =
|
||||
{
|
||||
XRDP_MOUSE_NAME,
|
||||
MODULEVENDORSTRING,
|
||||
MODINFOSTRING1,
|
||||
MODINFOSTRING2,
|
||||
XORG_VERSION_CURRENT,
|
||||
PACKAGE_VERSION_MAJOR,
|
||||
PACKAGE_VERSION_MINOR,
|
||||
PACKAGE_VERSION_PATCHLEVEL,
|
||||
ABI_CLASS_XINPUT,
|
||||
ABI_XINPUT_VERSION,
|
||||
MOD_CLASS_XINPUT,
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
_X_EXPORT XF86ModuleData xrdpmouseModuleData =
|
||||
{
|
||||
&rdpmouseVersionRec,
|
||||
rdpmousePlug,
|
||||
rdpmouseUnplug
|
||||
};
|
@ -1 +1 @@
|
||||
Subproject commit 7c4d67356db815a9b4b003fca06394f43aaf7f82
|
||||
Subproject commit 6edf9e519765e0257221c24b01f0a7eeb2aee1dc
|
Loading…
Reference in new issue