parent
3989dfcecc
commit
762209e0dd
@ -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
|
|
||||||
};
|
|
Loading…
Reference in new issue