summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2012-05-15 23:43:38 -0700
committerJay Sorg <jay.sorg@gmail.com>2012-05-15 23:43:38 -0700
commit26b42fa84328f02cbe0ff357b86d574fb918ae3e (patch)
treed8dab3cc33dd7531e6b9985c200063379d16e1f7
parentbdc2c51feed37532436f65e9bacd43c8732f1d14 (diff)
downloadxrdp-proprietary-26b42fa84328f02cbe0ff357b86d574fb918ae3e.tar.gz
xrdp-proprietary-26b42fa84328f02cbe0ff357b86d574fb918ae3e.zip
xorg: work on offscreen bitmaps
-rw-r--r--xorg/X11R7.6/rdp/Makefile5
-rw-r--r--xorg/X11R7.6/rdp/gcops.h37
-rw-r--r--xorg/X11R7.6/rdp/rdpFillPolygon.c180
-rw-r--r--xorg/X11R7.6/rdp/rdpFillPolygon.h30
-rw-r--r--xorg/X11R7.6/rdp/rdpFillSpans.c2
-rw-r--r--xorg/X11R7.6/rdp/rdpImageGlyphBlt.c151
-rw-r--r--xorg/X11R7.6/rdp/rdpImageGlyphBlt.h30
-rw-r--r--xorg/X11R7.6/rdp/rdpImageText16.c149
-rw-r--r--xorg/X11R7.6/rdp/rdpImageText16.h29
-rw-r--r--xorg/X11R7.6/rdp/rdpImageText8.c149
-rw-r--r--xorg/X11R7.6/rdp/rdpImageText8.h29
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyArc.c174
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyArc.h28
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyFillArc.c174
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyFillArc.h28
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyGlyphBlt.c151
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyGlyphBlt.h30
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyPoint.c200
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyPoint.h29
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyText16.c152
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyText16.h29
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyText8.c152
-rw-r--r--xorg/X11R7.6/rdp/rdpPolyText8.h29
-rw-r--r--xorg/X11R7.6/rdp/rdpPushPixels.c137
-rw-r--r--xorg/X11R7.6/rdp/rdpPushPixels.h29
-rw-r--r--xorg/X11R7.6/rdp/rdpdraw.c775
-rw-r--r--xorg/X11R7.6/rdp/rdpdraw.h3
27 files changed, 2108 insertions, 803 deletions
diff --git a/xorg/X11R7.6/rdp/Makefile b/xorg/X11R7.6/rdp/Makefile
index 58685597..a4d405c1 100644
--- a/xorg/X11R7.6/rdp/Makefile
+++ b/xorg/X11R7.6/rdp/Makefile
@@ -9,7 +9,10 @@ XSRCBASE = ../build_dir/xorg-server-1.9.3
OBJS = rdpmain.o rdpdraw.o rdpinput.o rdpmisc.o rdpup.o rdprandr.o \
rdpCopyArea.o rdpPolyFillRect.o rdpPutImage.o rdpPolyRectangle.o \
rdpPolylines.o rdpPolySegment.o rdpFillSpans.o rdpSetSpans.o \
-rdpCopyPlane.o \
+rdpCopyPlane.o rdpPolyPoint.o rdpPolyArc.o rdpFillPolygon.o \
+rdpPolyFillArc.o rdpPolyText8.o rdpPolyText16.o \
+rdpImageText8.o rdpImageText16.o rdpImageGlyphBlt.o rdpPolyGlyphBlt.o \
+rdpPushPixels.o \
miinitext.o \
fbcmap_mi.o
diff --git a/xorg/X11R7.6/rdp/gcops.h b/xorg/X11R7.6/rdp/gcops.h
index f335b22c..24aa8740 100644
--- a/xorg/X11R7.6/rdp/gcops.h
+++ b/xorg/X11R7.6/rdp/gcops.h
@@ -33,43 +33,6 @@ static void
rdpDestroyClip(GCPtr pGC);
static void
rdpCopyClip(GCPtr dst, GCPtr src);
-static RegionPtr
-rdpCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
- GCPtr pGC, int srcx, int srcy, int width, int height,
- int dstx, int dsty, unsigned long bitPlane);
-static void
-rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
- int npt, DDXPointPtr pptInit);
-static void
-rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * parcs);
-static void
-rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
- int shape, int mode, int count,
- DDXPointPtr pPts);
-static void
-rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * parcs);
-static int
-rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, char * chars);
-static int
-rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, unsigned short * chars);
-static void
-rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, char * chars);
-static void
-rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count,
- unsigned short * chars);
-static void
-rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase);
-static void
-rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci,
- pointer pglyphBase);
static void
rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
int w, int h, int x, int y);
diff --git a/xorg/X11R7.6/rdp/rdpFillPolygon.c b/xorg/X11R7.6/rdp/rdpFillPolygon.c
new file mode 100644
index 00000000..459ba73e
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpFillPolygon.c
@@ -0,0 +1,180 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpFillPolygonOrg(DrawablePtr pDrawable, GCPtr pGC,
+ int shape, int mode, int count,
+ DDXPointPtr pPts)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec clip_reg;
+ RegionRec box_reg;
+ int num_clips;
+ int cd;
+ int maxx;
+ int maxy;
+ int minx;
+ int miny;
+ int i;
+ int j;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpFillPolygon:"));
+
+ /* do original call */
+ rdpFillPolygonOrg(pDrawable, pGC, shape, mode, count, pPts);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ RegionInit(&clip_reg, NullBox, 0);
+ cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
+ if (cd != 0)
+ {
+ 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 (i = 1; i < count; i++)
+ {
+ if (pPts[i].x > maxx)
+ {
+ maxx = pPts[i].x;
+ }
+ if (pPts[i].x < minx)
+ {
+ minx = pPts[i].x;
+ }
+ if (pPts[i].y > maxy)
+ {
+ maxy = pPts[i].y;
+ }
+ if (pPts[i].y < miny)
+ {
+ miny = pPts[i].y;
+ }
+ box.x1 = pDrawable->x + minx;
+ box.y1 = pDrawable->y + miny;
+ box.x2 = pDrawable->x + maxx + 1;
+ box.y2 = pDrawable->y + maxy + 1;
+ }
+ }
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&box_reg, &box, 0);
+ RegionIntersect(&clip_reg, &clip_reg, &box_reg);
+ num_clips = REGION_NUM_RECTS(&clip_reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&clip_reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&box_reg);
+ }
+ RegionUninit(&clip_reg);
+ rdpup_switch_os_surface(-1);
+}
diff --git a/xorg/X11R7.6/rdp/rdpFillPolygon.h b/xorg/X11R7.6/rdp/rdpFillPolygon.h
new file mode 100644
index 00000000..bb01c379
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpFillPolygon.h
@@ -0,0 +1,30 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
+ int shape, int mode, int count,
+ DDXPointPtr pPts);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpFillSpans.c b/xorg/X11R7.6/rdp/rdpFillSpans.c
index 73b07bcb..0939b50a 100644
--- a/xorg/X11R7.6/rdp/rdpFillSpans.c
+++ b/xorg/X11R7.6/rdp/rdpFillSpans.c
@@ -62,9 +62,7 @@ rdpFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nInit,
{
RegionRec clip_reg;
int cd;
- int j;
int got_id;
- BoxRec box;
struct image_data id;
WindowPtr pDstWnd;
PixmapPtr pDstPixmap;
diff --git a/xorg/X11R7.6/rdp/rdpImageGlyphBlt.c b/xorg/X11R7.6/rdp/rdpImageGlyphBlt.c
new file mode 100644
index 00000000..22839af9
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpImageGlyphBlt.c
@@ -0,0 +1,151 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpImageGlyphBltOrg(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr* ppci, pointer pglyphBase)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec reg;
+ RegionRec reg1;
+ int num_clips;
+ int cd;
+ int j;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpImageGlyphBlt:"));
+
+ if (nglyph != 0)
+ {
+ GetTextBoundingBox(pDrawable, pGC->font, x, y, nglyph, &box);
+ }
+
+ /* do original call */
+ rdpImageGlyphBltOrg(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ RegionInit(&reg, NullBox, 0);
+ if (nglyph == 0)
+ {
+ cd = 0;
+ }
+ else
+ {
+ cd = rdp_get_clip(&reg, pDrawable, pGC);
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&reg1, &box, 0);
+ RegionIntersect(&reg, &reg, &reg1);
+ num_clips = REGION_NUM_RECTS(&reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&reg1);
+ }
+ RegionUninit(&reg);
+ rdpup_switch_os_surface(-1);
+ return;
+}
diff --git a/xorg/X11R7.6/rdp/rdpImageGlyphBlt.h b/xorg/X11R7.6/rdp/rdpImageGlyphBlt.h
new file mode 100644
index 00000000..47fca1b3
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpImageGlyphBlt.h
@@ -0,0 +1,30 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr* ppci, pointer pglyphBase);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpImageText16.c b/xorg/X11R7.6/rdp/rdpImageText16.c
new file mode 100644
index 00000000..cb6f3cfb
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpImageText16.c
@@ -0,0 +1,149 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpImageText16Org(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, unsigned short* chars)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec reg;
+ RegionRec reg1;
+ int num_clips;
+ int cd;
+ int j;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpImageText16:"));
+
+ if (count != 0)
+ {
+ GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
+ }
+
+ /* do original call */
+ rdpImageText16Org(pDrawable, pGC, x, y, count, chars);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ RegionInit(&reg, NullBox, 0);
+ if (count == 0)
+ {
+ cd = 0;
+ }
+ else
+ {
+ cd = rdp_get_clip(&reg, pDrawable, pGC);
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&reg1, &box, 0);
+ RegionIntersect(&reg, &reg, &reg1);
+ num_clips = REGION_NUM_RECTS(&reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&reg1);
+ }
+ RegionUninit(&reg);
+ rdpup_switch_os_surface(-1);
+ return;
+}
diff --git a/xorg/X11R7.6/rdp/rdpImageText16.h b/xorg/X11R7.6/rdp/rdpImageText16.h
new file mode 100644
index 00000000..3fe4f205
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpImageText16.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, unsigned short* chars);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpImageText8.c b/xorg/X11R7.6/rdp/rdpImageText8.c
new file mode 100644
index 00000000..81b754c0
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpImageText8.c
@@ -0,0 +1,149 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpImageText8Org(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, char* chars)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec reg;
+ RegionRec reg1;
+ int num_clips;
+ int cd;
+ int j;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpImageText8:"));
+
+ if (count != 0)
+ {
+ GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
+ }
+
+ /* do original call */
+ rdpImageText8Org(pDrawable, pGC, x, y, count, chars);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ RegionInit(&reg, NullBox, 0);
+ if (count == 0)
+ {
+ cd = 0;
+ }
+ else
+ {
+ cd = rdp_get_clip(&reg, pDrawable, pGC);
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&reg1, &box, 0);
+ RegionIntersect(&reg, &reg, &reg1);
+ num_clips = REGION_NUM_RECTS(&reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&reg1);
+ }
+ RegionUninit(&reg);
+ rdpup_switch_os_surface(-1);
+ return;
+}
diff --git a/xorg/X11R7.6/rdp/rdpImageText8.h b/xorg/X11R7.6/rdp/rdpImageText8.h
new file mode 100644
index 00000000..1a81b271
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpImageText8.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, char* chars);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPolyArc.c b/xorg/X11R7.6/rdp/rdpPolyArc.c
new file mode 100644
index 00000000..3f7dc4b8
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyArc.c
@@ -0,0 +1,174 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpPolyArcOrg(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec clip_reg;
+ RegionPtr tmpRegion;
+ int cd;
+ int lw;
+ int extra;
+ int i;
+ int num_clips;
+ int got_id;
+ xRectangle* rects;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPolyArc:"));
+
+ rects = 0;
+ if (narcs > 0)
+ {
+ rects = (xRectangle*)g_malloc(narcs * sizeof(xRectangle), 0);
+ lw = pGC->lineWidth;
+ if (lw == 0)
+ {
+ lw = 1;
+ }
+ extra = lw / 2;
+ for (i = 0; i < narcs; i++)
+ {
+ rects[i].x = (parcs[i].x - extra) + pDrawable->x;
+ rects[i].y = (parcs[i].y - extra) + pDrawable->y;
+ rects[i].width = parcs[i].width + lw;
+ rects[i].height = parcs[i].height + lw;
+ }
+ }
+
+ /* do original call */
+ rdpPolyArcOrg(pDrawable, pGC, narcs, parcs);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ g_free(rects);
+ return;
+ }
+
+ RegionInit(&clip_reg, NullBox, 0);
+ cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
+ if (cd == 1)
+ {
+ if (rects != 0)
+ {
+ tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
+ num_clips = REGION_NUM_RECTS(tmpRegion);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (i = num_clips - 1; i >= 0; i--)
+ {
+ box = REGION_RECTS(tmpRegion)[i];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionDestroy(tmpRegion);
+ }
+ }
+ else if (cd == 2)
+ {
+ if (rects != 0)
+ {
+ tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
+ RegionIntersect(tmpRegion, tmpRegion, &clip_reg);
+ num_clips = REGION_NUM_RECTS(tmpRegion);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (i = num_clips - 1; i >= 0; i--)
+ {
+ box = REGION_RECTS(tmpRegion)[i];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionDestroy(tmpRegion);
+ }
+ }
+ RegionUninit(&clip_reg);
+ g_free(rects);
+ rdpup_switch_os_surface(-1);
+}
diff --git a/xorg/X11R7.6/rdp/rdpPolyArc.h b/xorg/X11R7.6/rdp/rdpPolyArc.h
new file mode 100644
index 00000000..8db9a017
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyArc.h
@@ -0,0 +1,28 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPolyFillArc.c b/xorg/X11R7.6/rdp/rdpPolyFillArc.c
new file mode 100644
index 00000000..3603b932
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyFillArc.c
@@ -0,0 +1,174 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpPolyFillArcOrg(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec clip_reg;
+ RegionPtr tmpRegion;
+ int cd;
+ int lw;
+ int extra;
+ int i;
+ int num_clips;
+ int got_id;
+ xRectangle* rects;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPolyFillArc:"));
+
+ rects = 0;
+ if (narcs > 0)
+ {
+ rects = (xRectangle*)g_malloc(narcs * sizeof(xRectangle), 0);
+ lw = pGC->lineWidth;
+ if (lw == 0)
+ {
+ lw = 1;
+ }
+ extra = lw / 2;
+ for (i = 0; i < narcs; i++)
+ {
+ rects[i].x = (parcs[i].x - extra) + pDrawable->x;
+ rects[i].y = (parcs[i].y - extra) + pDrawable->y;
+ rects[i].width = parcs[i].width + lw;
+ rects[i].height = parcs[i].height + lw;
+ }
+ }
+
+ /* do original call */
+ rdpPolyFillArcOrg(pDrawable, pGC, narcs, parcs);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ g_free(rects);
+ return;
+ }
+
+ RegionInit(&clip_reg, NullBox, 0);
+ cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
+ if (cd == 1)
+ {
+ if (rects != 0)
+ {
+ tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
+ num_clips = REGION_NUM_RECTS(tmpRegion);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (i = num_clips - 1; i >= 0; i--)
+ {
+ box = REGION_RECTS(tmpRegion)[i];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionDestroy(tmpRegion);
+ }
+ }
+ else if (cd == 2)
+ {
+ if (rects != 0)
+ {
+ tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
+ RegionIntersect(tmpRegion, tmpRegion, &clip_reg);
+ num_clips = REGION_NUM_RECTS(tmpRegion);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (i = num_clips - 1; i >= 0; i--)
+ {
+ box = REGION_RECTS(tmpRegion)[i];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionDestroy(tmpRegion);
+ }
+ }
+ RegionUninit(&clip_reg);
+ g_free(rects);
+ rdpup_switch_os_surface(-1);
+}
diff --git a/xorg/X11R7.6/rdp/rdpPolyFillArc.h b/xorg/X11R7.6/rdp/rdpPolyFillArc.h
new file mode 100644
index 00000000..6d5a9bda
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyFillArc.h
@@ -0,0 +1,28 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPolyGlyphBlt.c b/xorg/X11R7.6/rdp/rdpPolyGlyphBlt.c
new file mode 100644
index 00000000..3ec438db
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyGlyphBlt.c
@@ -0,0 +1,151 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpPolyGlyphBltOrg(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr* ppci, pointer pglyphBase)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec reg;
+ RegionRec reg1;
+ int num_clips;
+ int cd;
+ int j;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPolyGlyphBlt:"));
+
+ if (nglyph != 0)
+ {
+ GetTextBoundingBox(pDrawable, pGC->font, x, y, nglyph, &box);
+ }
+
+ /* do original call */
+ rdpPolyGlyphBltOrg(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ RegionInit(&reg, NullBox, 0);
+ if (nglyph == 0)
+ {
+ cd = 0;
+ }
+ else
+ {
+ cd = rdp_get_clip(&reg, pDrawable, pGC);
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&reg1, &box, 0);
+ RegionIntersect(&reg, &reg, &reg1);
+ num_clips = REGION_NUM_RECTS(&reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&reg1);
+ }
+ RegionUninit(&reg);
+ rdpup_switch_os_surface(-1);
+ return;
+}
diff --git a/xorg/X11R7.6/rdp/rdpPolyGlyphBlt.h b/xorg/X11R7.6/rdp/rdpPolyGlyphBlt.h
new file mode 100644
index 00000000..4098c1ec
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyGlyphBlt.h
@@ -0,0 +1,30 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr* ppci, pointer pglyphBase);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPolyPoint.c b/xorg/X11R7.6/rdp/rdpPolyPoint.c
new file mode 100644
index 00000000..7b4e9842
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyPoint.c
@@ -0,0 +1,200 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpPolyPointOrg(DrawablePtr pDrawable, GCPtr pGC, int mode,
+ int npt, DDXPointPtr in_pts)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec clip_reg;
+ int num_clips;
+ int cd;
+ int x;
+ int y;
+ int i;
+ int j;
+ int got_id;
+ BoxRec box;
+ BoxRec total_box;
+ DDXPointPtr pts;
+ DDXPointRec stack_pts[32];
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPolyPoint:"));
+
+ if (npt > 32)
+ {
+ pts = (DDXPointPtr)g_malloc(sizeof(DDXPointRec) * npt, 0);
+ }
+ else
+ {
+ pts = stack_pts;
+ }
+ for (i = 0; i < npt; i++)
+ {
+ pts[i].x = pDrawable->x + in_pts[i].x;
+ pts[i].y = pDrawable->y + in_pts[i].y;
+ if (i == 0)
+ {
+ total_box.x1 = pts[0].x;
+ total_box.y1 = pts[0].y;
+ total_box.x2 = pts[0].x;
+ total_box.y2 = pts[0].y;
+ }
+ else
+ {
+ if (pts[i].x < total_box.x1)
+ {
+ total_box.x1 = pts[i].x;
+ }
+ if (pts[i].y < total_box.y1)
+ {
+ total_box.y1 = pts[i].y;
+ }
+ if (pts[i].x > total_box.x2)
+ {
+ total_box.x2 = pts[i].x;
+ }
+ if (pts[i].y > total_box.y2)
+ {
+ total_box.y2 = pts[i].y;
+ }
+ }
+ /* todo, use this total_box */
+ }
+
+ /* do original call */
+ rdpPolyPointOrg(pDrawable, pGC, mode, npt, in_pts);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ RegionInit(&clip_reg, NullBox, 0);
+ cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
+ if (cd == 1)
+ {
+ if (npt > 0)
+ {
+ rdpup_begin_update();
+ rdpup_set_fgcolor(pGC->fgPixel);
+ for (i = 0; i < npt; i++)
+ {
+ x = pts[i].x;
+ y = pts[i].y;
+ rdpup_fill_rect(x, y, 1, 1);
+ }
+ rdpup_end_update();
+ }
+ }
+ else if (cd == 2)
+ {
+ num_clips = REGION_NUM_RECTS(&clip_reg);
+ if (npt > 0 && num_clips > 0)
+ {
+ rdpup_begin_update();
+ rdpup_set_fgcolor(pGC->fgPixel);
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&clip_reg)[j];
+ rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ for (i = 0; i < npt; i++)
+ {
+ x = pts[i].x;
+ y = pts[i].y;
+ rdpup_fill_rect(x, y, 1, 1);
+ }
+ }
+ rdpup_reset_clip();
+ rdpup_end_update();
+ }
+ }
+ RegionUninit(&clip_reg);
+ if (pts != stack_pts)
+ {
+ g_free(pts);
+ }
+ rdpup_switch_os_surface(-1);
+}
diff --git a/xorg/X11R7.6/rdp/rdpPolyPoint.h b/xorg/X11R7.6/rdp/rdpPolyPoint.h
new file mode 100644
index 00000000..6bb7222b
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyPoint.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
+ int npt, DDXPointPtr in_pts);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPolyText16.c b/xorg/X11R7.6/rdp/rdpPolyText16.c
new file mode 100644
index 00000000..4feb2f03
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyText16.c
@@ -0,0 +1,152 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+int
+rdpPolyText16Org(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, unsigned short* chars)
+{
+ int rv;
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec reg;
+ RegionRec reg1;
+ int num_clips;
+ int cd;
+ int j;
+ int rv;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPolyText16:"));
+
+ if (count != 0)
+ {
+ GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
+ }
+
+ /* do original call */
+ rv = rdpPolyText16Org(pDrawable, pGC, x, y, count, chars);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return rv;
+ }
+
+ RegionInit(&reg, NullBox, 0);
+ if (count == 0)
+ {
+ cd = 0;
+ }
+ else
+ {
+ cd = rdp_get_clip(&reg, pDrawable, pGC);
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&reg1, &box, 0);
+ RegionIntersect(&reg, &reg, &reg1);
+ num_clips = REGION_NUM_RECTS(&reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&reg1);
+ }
+ RegionUninit(&reg);
+ rdpup_switch_os_surface(-1);
+ return rv;
+}
diff --git a/xorg/X11R7.6/rdp/rdpPolyText16.h b/xorg/X11R7.6/rdp/rdpPolyText16.h
new file mode 100644
index 00000000..87e58f13
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyText16.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2005-2012 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
+
+int
+rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, unsigned short* chars);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPolyText8.c b/xorg/X11R7.6/rdp/rdpPolyText8.c
new file mode 100644
index 00000000..21f4e18a
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyText8.c
@@ -0,0 +1,152 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+int
+rdpPolyText8Org(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, char* chars)
+{
+ int rv;
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec reg;
+ RegionRec reg1;
+ int num_clips;
+ int cd;
+ int j;
+ int rv;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPolyText8:"));
+
+ if (count != 0)
+ {
+ GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
+ }
+
+ /* do original call */
+ rv = rdpPolyText8Org(pDrawable, pGC, x, y, count, chars);
+
+ got_id = 0;
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDrawable;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDrawable;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return rv;
+ }
+
+ RegionInit(&reg, NullBox, 0);
+ if (count == 0)
+ {
+ cd = 0;
+ }
+ else
+ {
+ cd = rdp_get_clip(&reg, pDrawable, pGC);
+ }
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&reg1, &box, 0);
+ RegionIntersect(&reg, &reg, &reg1);
+ num_clips = REGION_NUM_RECTS(&reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&reg)[j];
+ rdpup_send_area(&id, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&reg1);
+ }
+ RegionUninit(&reg);
+ rdpup_switch_os_surface(-1);
+ return rv;
+}
diff --git a/xorg/X11R7.6/rdp/rdpPolyText8.h b/xorg/X11R7.6/rdp/rdpPolyText8.h
new file mode 100644
index 00000000..fb68649c
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPolyText8.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2005-2012 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
+
+int
+rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, char* chars);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpPushPixels.c b/xorg/X11R7.6/rdp/rdpPushPixels.c
new file mode 100644
index 00000000..8e774c53
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPushPixels.c
@@ -0,0 +1,137 @@
+/*
+Copyright 2005-2012 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 "rdp.h"
+#include "rdpdraw.h"
+
+#define LDEBUG 0
+
+#define LOG_LEVEL 1
+#define LLOG(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
+#define LLOGLN(_level, _args) \
+ do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
+
+extern rdpScreenInfoRec g_rdpScreen; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpGCIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpWindowIndex; /* from rdpmain.c */
+extern DevPrivateKeyRec g_rdpPixmapIndex; /* from rdpmain.c */
+extern int g_Bpp; /* from rdpmain.c */
+extern ScreenPtr g_pScreen; /* from rdpmain.c */
+extern Bool g_wrapPixmap; /* from rdpmain.c */
+
+extern GCOps g_rdpGCOps; /* from rdpdraw.c */
+
+extern int g_con_number; /* in rdpup.c */
+
+/******************************************************************************/
+void
+rdpPushPixelsOrg(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
+ int w, int h, int x, int y)
+{
+ rdpGCPtr priv;
+ GCFuncs* oldFuncs;
+
+ 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)
+{
+ RegionRec clip_reg;
+ RegionRec box_reg;
+ int num_clips;
+ int cd;
+ int j;
+ int got_id;
+ BoxRec box;
+ struct image_data id;
+ WindowPtr pDstWnd;
+ PixmapPtr pDstPixmap;
+ rdpPixmapRec* pDstPriv;
+
+ LLOGLN(10, ("rdpPushPixels:"));
+
+ /* do original call */
+ rdpPushPixelsOrg(pGC, pBitMap, pDst, w, h, x, y);
+
+ got_id = 0;
+ if (pDst->type == DRAWABLE_PIXMAP)
+ {
+ pDstPixmap = (PixmapPtr)pDst;
+ pDstPriv = GETPIXPRIV(pDstPixmap);
+ if (XRDP_IS_OS(pDstPriv))
+ {
+ rdpup_switch_os_surface(pDstPriv->rdpid);
+ rdpup_get_pixmap_image_rect(pDstPixmap, &id);
+ got_id = 1;
+ }
+ }
+ else
+ {
+ if (pDst->type == DRAWABLE_WINDOW)
+ {
+ pDstWnd = (WindowPtr)pDst;
+ if (pDstWnd->viewable)
+ {
+ rdpup_get_screen_image_rect(&id);
+ got_id = 1;
+ }
+ }
+ }
+ if (!got_id)
+ {
+ return;
+ }
+
+ memset(&box, 0, sizeof(box));
+ RegionInit(&clip_reg, NullBox, 0);
+ cd = rdp_get_clip(&clip_reg, pDst, pGC);
+ if (cd == 1)
+ {
+ rdpup_begin_update();
+ rdpup_send_area(0, x, y, w, h);
+ rdpup_end_update();
+ }
+ else if (cd == 2)
+ {
+ RegionInit(&box_reg, &box, 0);
+ RegionIntersect(&clip_reg, &clip_reg, &box_reg);
+ num_clips = REGION_NUM_RECTS(&clip_reg);
+ if (num_clips > 0)
+ {
+ rdpup_begin_update();
+ for (j = num_clips - 1; j >= 0; j--)
+ {
+ box = REGION_RECTS(&clip_reg)[j];
+ rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
+ }
+ rdpup_end_update();
+ }
+ RegionUninit(&box_reg);
+ }
+ RegionUninit(&clip_reg);
+ rdpup_switch_os_surface(-1);
+}
diff --git a/xorg/X11R7.6/rdp/rdpPushPixels.h b/xorg/X11R7.6/rdp/rdpPushPixels.h
new file mode 100644
index 00000000..249da583
--- /dev/null
+++ b/xorg/X11R7.6/rdp/rdpPushPixels.h
@@ -0,0 +1,29 @@
+/*
+Copyright 2005-2012 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
+
+void
+rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
+ int w, int h, int x, int y);
+
+#endif
diff --git a/xorg/X11R7.6/rdp/rdpdraw.c b/xorg/X11R7.6/rdp/rdpdraw.c
index a60c4fb5..6f7e4962 100644
--- a/xorg/X11R7.6/rdp/rdpdraw.c
+++ b/xorg/X11R7.6/rdp/rdpdraw.c
@@ -34,6 +34,17 @@ Xserver drawing ops and funcs
#include "rdpFillSpans.h"
#include "rdpSetSpans.h"
#include "rdpCopyPlane.h"
+#include "rdpPolyPoint.h"
+#include "rdpPolyArc.h"
+#include "rdpFillPolygon.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"
#if 1
#define DEBUG_OUT_FUNCS(arg)
@@ -131,7 +142,7 @@ rdp_get_clip(RegionPtr pRegion, DrawablePtr pDrawable, GCPtr pGC)
}
/******************************************************************************/
-static void
+void
GetTextBoundingBox(DrawablePtr pDrawable, FontPtr font, int x, int y,
int n, BoxPtr pbox)
{
@@ -319,768 +330,6 @@ rdpCopyClip(GCPtr dst, GCPtr src)
}
/******************************************************************************/
-static void
-rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
- int npt, DDXPointPtr in_pts)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- int num_clips;
- int cd;
- int x;
- int y;
- int i;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
- BoxRec total_box;
- DDXPointPtr pts;
- DDXPointRec stack_pts[32];
-
- DEBUG_OUT_OPS(("in rdpPolyPoint\n"));
- GC_OP_PROLOGUE(pGC);
- if (npt > 32)
- {
- pts = (DDXPointPtr)g_malloc(sizeof(DDXPointRec) * npt, 0);
- }
- else
- {
- pts = stack_pts;
- }
- for (i = 0; i < npt; i++)
- {
- pts[i].x = pDrawable->x + in_pts[i].x;
- pts[i].y = pDrawable->y + in_pts[i].y;
- if (i == 0)
- {
- total_box.x1 = pts[0].x;
- total_box.y1 = pts[0].y;
- total_box.x2 = pts[0].x;
- total_box.y2 = pts[0].y;
- }
- else
- {
- if (pts[i].x < total_box.x1)
- {
- total_box.x1 = pts[i].x;
- }
- if (pts[i].y < total_box.y1)
- {
- total_box.y1 = pts[i].y;
- }
- if (pts[i].x > total_box.x2)
- {
- total_box.x2 = pts[i].x;
- }
- if (pts[i].y > total_box.y2)
- {
- total_box.y2 = pts[i].y;
- }
- }
- /* todo, use this total_box */
- }
- pGC->ops->PolyPoint(pDrawable, pGC, mode, npt, in_pts);
- RegionInit(&clip_reg, NullBox, 0);
- cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
- if (cd == 1)
- {
- if (npt > 0)
- {
- rdpup_begin_update();
- rdpup_set_fgcolor(pGC->fgPixel);
- for (i = 0; i < npt; i++)
- {
- x = pts[i].x;
- y = pts[i].y;
- rdpup_fill_rect(x, y, 1, 1);
- }
- rdpup_end_update();
- }
- }
- else if (cd == 2)
- {
- num_clips = REGION_NUM_RECTS(&clip_reg);
- if (npt > 0 && num_clips > 0)
- {
- rdpup_begin_update();
- rdpup_set_fgcolor(pGC->fgPixel);
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&clip_reg)[j];
- rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- for (i = 0; i < npt; i++)
- {
- x = pts[i].x;
- y = pts[i].y;
- rdpup_fill_rect(x, y, 1, 1);
- }
- }
- rdpup_reset_clip();
- rdpup_end_update();
- }
- }
- RegionUninit(&clip_reg);
- if (pts != stack_pts)
- {
- g_free(pts);
- }
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- RegionPtr tmpRegion;
- int cd;
- int lw;
- int extra;
- int i;
- int num_clips;
- GCFuncs* oldFuncs;
- xRectangle* rects;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpPolyArc\n"));
- GC_OP_PROLOGUE(pGC);
- rects = 0;
- if (narcs > 0)
- {
- rects = (xRectangle*)g_malloc(narcs * sizeof(xRectangle), 0);
- lw = pGC->lineWidth;
- if (lw == 0)
- {
- lw = 1;
- }
- extra = lw / 2;
- for (i = 0; i < narcs; i++)
- {
- rects[i].x = (parcs[i].x - extra) + pDrawable->x;
- rects[i].y = (parcs[i].y - extra) + pDrawable->y;
- rects[i].width = parcs[i].width + lw;
- rects[i].height = parcs[i].height + lw;
- }
- }
- pGC->ops->PolyArc(pDrawable, pGC, narcs, parcs);
- RegionInit(&clip_reg, NullBox, 0);
- cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
- if (cd == 1)
- {
- if (rects != 0)
- {
- tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
- num_clips = REGION_NUM_RECTS(tmpRegion);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (i = num_clips - 1; i >= 0; i--)
- {
- box = REGION_RECTS(tmpRegion)[i];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionDestroy(tmpRegion);
- }
- }
- else if (cd == 2)
- {
- if (rects != 0)
- {
- tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
- RegionIntersect(tmpRegion, tmpRegion, &clip_reg);
- num_clips = REGION_NUM_RECTS(tmpRegion);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (i = num_clips - 1; i >= 0; i--)
- {
- box = REGION_RECTS(tmpRegion)[i];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionDestroy(tmpRegion);
- }
- }
- RegionUninit(&clip_reg);
- g_free(rects);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
- int shape, int mode, int count,
- DDXPointPtr pPts)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- RegionRec box_reg;
- int num_clips;
- int cd;
- int maxx;
- int maxy;
- int minx;
- int miny;
- int i;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpFillPolygon\n"));
- GC_OP_PROLOGUE(pGC);
- pGC->ops->FillPolygon(pDrawable, pGC, shape, mode, count, pPts);
- RegionInit(&clip_reg, NullBox, 0);
- cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
- if (cd != 0)
- {
- 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 (i = 1; i < count; i++)
- {
- if (pPts[i].x > maxx)
- {
- maxx = pPts[i].x;
- }
- if (pPts[i].x < minx)
- {
- minx = pPts[i].x;
- }
- if (pPts[i].y > maxy)
- {
- maxy = pPts[i].y;
- }
- if (pPts[i].y < miny)
- {
- miny = pPts[i].y;
- }
- box.x1 = pDrawable->x + minx;
- box.y1 = pDrawable->y + miny;
- box.x2 = pDrawable->x + maxx + 1;
- box.y2 = pDrawable->y + maxy + 1;
- }
- }
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&box_reg, &box, 0);
- RegionIntersect(&clip_reg, &clip_reg, &box_reg);
- num_clips = REGION_NUM_RECTS(&clip_reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&clip_reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&box_reg);
- }
- RegionUninit(&clip_reg);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- RegionPtr tmpRegion;
- int cd;
- int lw;
- int extra;
- int i;
- int num_clips;
- GCFuncs* oldFuncs;
- xRectangle* rects;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpPolyFillArc\n"));
- GC_OP_PROLOGUE(pGC);
- rects = 0;
- if (narcs > 0)
- {
- rects = (xRectangle*)g_malloc(narcs * sizeof(xRectangle), 0);
- lw = pGC->lineWidth;
- if (lw == 0)
- {
- lw = 1;
- }
- extra = lw / 2;
- for (i = 0; i < narcs; i++)
- {
- rects[i].x = (parcs[i].x - extra) + pDrawable->x;
- rects[i].y = (parcs[i].y - extra) + pDrawable->y;
- rects[i].width = parcs[i].width + lw;
- rects[i].height = parcs[i].height + lw;
- }
- }
- pGC->ops->PolyFillArc(pDrawable, pGC, narcs, parcs);
- RegionInit(&clip_reg, NullBox, 0);
- cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
- if (cd == 1)
- {
- if (rects != 0)
- {
- tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
- num_clips = REGION_NUM_RECTS(tmpRegion);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (i = num_clips - 1; i >= 0; i--)
- {
- box = REGION_RECTS(tmpRegion)[i];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionDestroy(tmpRegion);
- }
- }
- else if (cd == 2)
- {
- if (rects != 0)
- {
- tmpRegion = RegionFromRects(narcs, rects, CT_NONE);
- RegionIntersect(tmpRegion, tmpRegion, &clip_reg);
- num_clips = REGION_NUM_RECTS(tmpRegion);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (i = num_clips - 1; i >= 0; i--)
- {
- box = REGION_RECTS(tmpRegion)[i];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionDestroy(tmpRegion);
- }
- }
- RegionUninit(&clip_reg);
- g_free(rects);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static int
-rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, char* chars)
-{
- rdpGCPtr priv;
- RegionRec reg;
- RegionRec reg1;
- int num_clips;
- int cd;
- int j;
- int rv;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpPolyText8\n"));
- GC_OP_PROLOGUE(pGC);
- if (count != 0)
- {
- GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
- }
- rv = pGC->ops->PolyText8(pDrawable, pGC, x, y, count, chars);
- RegionInit(&reg, NullBox, 0);
- if (count == 0)
- {
- cd = 0;
- }
- else
- {
- cd = rdp_get_clip(&reg, pDrawable, pGC);
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&reg1, &box, 0);
- RegionIntersect(&reg, &reg, &reg1);
- num_clips = REGION_NUM_RECTS(&reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&reg1);
- }
- RegionUninit(&reg);
- GC_OP_EPILOGUE(pGC);
- return rv;
-}
-
-/******************************************************************************/
-static int
-rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, unsigned short* chars)
-{
- rdpGCPtr priv;
- RegionRec reg;
- RegionRec reg1;
- int num_clips;
- int cd;
- int j;
- int rv;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpPolyText16\n"));
- GC_OP_PROLOGUE(pGC);
- if (count != 0)
- {
- GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
- }
- rv = pGC->ops->PolyText16(pDrawable, pGC, x, y, count, chars);
- RegionInit(&reg, NullBox, 0);
- if (count == 0)
- {
- cd = 0;
- }
- else
- {
- cd = rdp_get_clip(&reg, pDrawable, pGC);
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&reg1, &box, 0);
- RegionIntersect(&reg, &reg, &reg1);
- num_clips = REGION_NUM_RECTS(&reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&reg1);
- }
- RegionUninit(&reg);
- GC_OP_EPILOGUE(pGC);
- return rv;
-}
-
-/******************************************************************************/
-static void
-rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, char* chars)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- RegionRec box_reg;
- int num_clips;
- int cd;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpImageText8\n"));
- GC_OP_PROLOGUE(pGC);
- if (count != 0)
- {
- GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
- }
- pGC->ops->ImageText8(pDrawable, pGC, x, y, count, chars);
- RegionInit(&clip_reg, NullBox, 0);
- if (count == 0)
- {
- cd = 0;
- }
- else
- {
- cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&box_reg, &box, 0);
- RegionIntersect(&clip_reg, &clip_reg, &box_reg);
- num_clips = REGION_NUM_RECTS(&clip_reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&clip_reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&box_reg);
- }
- RegionUninit(&clip_reg);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count,
- unsigned short* chars)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- RegionRec box_reg;
- int num_clips;
- int cd;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpImageText16\n"));
- GC_OP_PROLOGUE(pGC);
- if (count != 0)
- {
- GetTextBoundingBox(pDrawable, pGC->font, x, y, count, &box);
- }
- pGC->ops->ImageText16(pDrawable, pGC, x, y, count, chars);
- RegionInit(&clip_reg, NullBox, 0);
- if (count == 0)
- {
- cd = 0;
- }
- else
- {
- cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&box_reg, &box, 0);
- RegionIntersect(&clip_reg, &clip_reg, &box_reg);
- num_clips = REGION_NUM_RECTS(&clip_reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&clip_reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&box_reg);
- }
- RegionUninit(&clip_reg);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr* ppci, pointer pglyphBase)
-{
- rdpGCPtr priv;
- RegionRec reg;
- RegionRec box_reg;
- int num_clips;
- int cd;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpImageGlyphBlt\n"));
- GC_OP_PROLOGUE(pGC);
- if (nglyph != 0)
- {
- GetTextBoundingBox(pDrawable, pGC->font, x, y, nglyph, &box);
- }
- pGC->ops->ImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- RegionInit(&reg, NullBox, 0);
- if (nglyph == 0)
- {
- cd = 0;
- }
- else
- {
- cd = rdp_get_clip(&reg, pDrawable, pGC);
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&box_reg, &box, 0);
- RegionIntersect(&reg, &reg, &box_reg);
- num_clips = REGION_NUM_RECTS(&reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&box_reg);
- }
- RegionUninit(&reg);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr* ppci,
- pointer pglyphBase)
-{
- rdpGCPtr priv;
- RegionRec reg;
- RegionRec box_reg;
- int num_clips;
- int cd;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpPolyGlyphBlt\n"));
- GC_OP_PROLOGUE(pGC);
- memset(&box, 0, sizeof(box));
- if (nglyph != 0)
- {
- GetTextBoundingBox(pDrawable, pGC->font, x, y, nglyph, &box);
- }
- pGC->ops->PolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- RegionInit(&reg, NullBox, 0);
- if (nglyph == 0)
- {
- cd = 0;
- }
- else
- {
- cd = rdp_get_clip(&reg, pDrawable, pGC);
- }
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&box_reg, &box, 0);
- RegionIntersect(&reg, &reg, &box_reg);
- num_clips = REGION_NUM_RECTS(&reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&box_reg);
- }
- RegionUninit(&reg);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
-static void
-rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
- int w, int h, int x, int y)
-{
- rdpGCPtr priv;
- RegionRec clip_reg;
- RegionRec box_reg;
- int num_clips;
- int cd;
- int j;
- GCFuncs* oldFuncs;
- BoxRec box;
-
- DEBUG_OUT_OPS(("in rdpPushPixels\n"));
- GC_OP_PROLOGUE(pGC);
- memset(&box, 0, sizeof(box));
- pGC->ops->PushPixels(pGC, pBitMap, pDst, w, h, x, y);
- RegionInit(&clip_reg, NullBox, 0);
- cd = rdp_get_clip(&clip_reg, pDst, pGC);
- if (cd == 1)
- {
- rdpup_begin_update();
- rdpup_send_area(0, x, y, w, h);
- rdpup_end_update();
- }
- else if (cd == 2)
- {
- RegionInit(&box_reg, &box, 0);
- RegionIntersect(&clip_reg, &clip_reg, &box_reg);
- num_clips = REGION_NUM_RECTS(&clip_reg);
- if (num_clips > 0)
- {
- rdpup_begin_update();
- for (j = num_clips - 1; j >= 0; j--)
- {
- box = REGION_RECTS(&clip_reg)[j];
- rdpup_send_area(0, box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- }
- rdpup_end_update();
- }
- RegionUninit(&box_reg);
- }
- RegionUninit(&clip_reg);
- GC_OP_EPILOGUE(pGC);
-}
-
-/******************************************************************************/
Bool
rdpCloseScreen(int i, ScreenPtr pScreen)
{
diff --git a/xorg/X11R7.6/rdp/rdpdraw.h b/xorg/X11R7.6/rdp/rdpdraw.h
index 0a1569e8..38d46ecc 100644
--- a/xorg/X11R7.6/rdp/rdpdraw.h
+++ b/xorg/X11R7.6/rdp/rdpdraw.h
@@ -41,5 +41,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
int
rdp_get_clip(RegionPtr pRegion, DrawablePtr pDrawable, GCPtr pGC);
+void
+GetTextBoundingBox(DrawablePtr pDrawable, FontPtr font, int x, int y,
+ int n, BoxPtr pbox);
#endif