Get rid of a few more references to the DC structure.

diff --git a/dlls/x11drv/bitblt.c b/dlls/x11drv/bitblt.c
index ab58290..9579dff 100644
--- a/dlls/x11drv/bitblt.c
+++ b/dlls/x11drv/bitblt.c
@@ -1133,8 +1133,6 @@
                                      RECT *visRectSrc, RECT *visRectDst )
 {
     RECT rect, clipRect;
-    DC *dcSrc = physDevSrc ? physDevSrc->dc : NULL;
-    DC *dcDst = physDevDst->dc;
 
       /* Get the destination visible rectangle */
 
@@ -1144,7 +1142,7 @@
     rect.bottom = yDst + heightDst;
     if (widthDst < 0) SWAP_INT32( &rect.left, &rect.right );
     if (heightDst < 0) SWAP_INT32( &rect.top, &rect.bottom );
-    GetRgnBox( dcDst->hGCClipRgn, &clipRect );
+    GetRgnBox( physDevDst->dc->hGCClipRgn, &clipRect );
     if (!IntersectRect( visRectDst, &rect, &clipRect )) return FALSE;
 
       /* Get the source visible rectangle */
@@ -1157,8 +1155,15 @@
     if (widthSrc < 0) SWAP_INT32( &rect.left, &rect.right );
     if (heightSrc < 0) SWAP_INT32( &rect.top, &rect.bottom );
     /* Apparently the clipping and visible regions are only for output,
-       so just check against totalExtent here to avoid BadMatch errors */
-    if (!IntersectRect( visRectSrc, &rect, &dcSrc->totalExtent ))
+       so just check against dc extent here to avoid BadMatch errors */
+    if (GetObjectType( physDevSrc->hdc ) == OBJ_MEMDC)
+    {
+        BITMAP bm;
+        GetObjectW( GetCurrentObject(physDevSrc->hdc,OBJ_BITMAP), sizeof(bm), &bm );
+        SetRect( &clipRect, 0, 0, bm.bmWidth, bm.bmHeight );
+    }
+    else SetRect( &clipRect, 0, 0, screen_width, screen_height );
+    if (!IntersectRect( visRectSrc, &rect, &clipRect ))
         return FALSE;
 
       /* Intersect the rectangles */
diff --git a/dlls/x11drv/text.c b/dlls/x11drv/text.c
index c8d0d14..85dde73 100644
--- a/dlls/x11drv/text.c
+++ b/dlls/x11drv/text.c
@@ -59,6 +59,7 @@
     POINT               pt;
     DC *dc = physDev->dc;
     UINT align = GetTextAlign( physDev->hdc );
+    INT charExtra = GetTextCharacterExtra( physDev->hdc );
 
     if(dc->gdiFont)
         return X11DRV_XRender_ExtTextOut(physDev, x, y, flags, lprect, wstr, count,
@@ -261,7 +262,7 @@
     wine_tsx11_unlock();
     if(!rotated)
     {
-      if (!dc->charExtra && !dc->breakExtra && !lpDx)
+      if (!charExtra && !dc->breakExtra && !lpDx)
       {
         X11DRV_cptable[pfo->fi->cptable].pDrawString(
 		pfo, gdi_display, physDev->drawable, physDev->gc,
@@ -326,7 +327,7 @@
 
 		do
                 {
-                    delta += dc->charExtra;
+                    delta += charExtra;
                     if (str2b[i].byte2 == (char)dfBreakChar)
 		      delta += dc->breakExtra;
 		    pitem->nchars++;
@@ -369,7 +370,7 @@
 			      font->per_char[char_metric_offset].attributes:
 			      font->min_bounds.attributes)
 	                  * pfo->lpX11Trans->pixelsize / 1000.0;
-	  offset += dc->charExtra;
+	  offset += charExtra;
 	  if (str2b[i].byte2 == (char)dfBreakChar)
 	    offset += dc->breakExtra;
 	}
@@ -434,6 +435,7 @@
 
     TRACE("%s %d\n", debugstr_wn(str,count), count);
     if( pfo ) {
+        INT charExtra = GetTextCharacterExtra( physDev->hdc );
 	XChar2b *p = X11DRV_cptable[pfo->fi->cptable].punicode_to_char2b( pfo, str, count );
 	if (!p) return FALSE;
         if( !pfo->lpX11Trans ) {
@@ -443,7 +445,7 @@
 				count, &dir, &ascent, &descent, &info_width );
 
           size->cx = fabs((FLOAT)(info_width + dc->breakRem + count *
-                                  dc->charExtra) * dc->xformVport2World.eM11);
+                                  charExtra) * dc->xformVport2World.eM11);
           size->cy = fabs((FLOAT)(pfo->fs->ascent + pfo->fs->descent) *
                           dc->xformVport2World.eM22);
 	} else {
@@ -459,7 +461,7 @@
 	    TRACE("x = %f y = %f\n", x, y);
 	    x *= pfo->lpX11Trans->pixelsize / 1000.0;
 	    y *= pfo->lpX11Trans->pixelsize / 1000.0;
-	    size->cx = fabs((x + dc->breakRem + count * dc->charExtra) *
+	    size->cx = fabs((x + dc->breakRem + count * charExtra) *
 			    dc->xformVport2World.eM11);
 	    size->cy = fabs(y * dc->xformVport2World.eM22);
 	}
diff --git a/dlls/x11drv/xrender.c b/dlls/x11drv/xrender.c
index 38fdacd..4df7c76 100644
--- a/dlls/x11drv/xrender.c
+++ b/dlls/x11drv/xrender.c
@@ -949,11 +949,11 @@
     gsCacheEntry *entry;
     BOOL retv = FALSE;
     HDC hdc = physDev->hdc;
-    DC *dc = physDev->dc;
     int textPixel, backgroundPixel;
     INT *deltas = NULL;
     INT char_extra;
     UINT align = GetTextAlign( hdc );
+    COLORREF textColor = GetTextColor( hdc );
 
     TRACE("%p, %d, %d, %08x, %p, %s, %d, %p)\n", hdc, x, y, flags,
 	  lprect, debugstr_wn(wstr, count), count, lpDx);
@@ -968,7 +968,7 @@
     if(lprect)
       TRACE("rect: %ld,%ld - %ld,%ld\n", lprect->left, lprect->top, lprect->right,
 	    lprect->bottom);
-    TRACE("align = %x bkmode = %x mapmode = %x\n", align, GetBkMode(hdc), dc->MapMode);
+    TRACE("align = %x bkmode = %x mapmode = %x\n", align, GetBkMode(hdc), GetMapMode(hdc));
 
     if(align & TA_UPDATECP)
     {
@@ -1015,7 +1015,7 @@
     X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod, FALSE );
 
     if(physDev->depth == 1) {
-        if((dc->textColor & 0xffffff) == 0) {
+        if((textColor & 0xffffff) == 0) {
 	    textPixel = 0;
 	    backgroundPixel = 1;
 	} else {
@@ -1083,7 +1083,7 @@
 
     tm.tmAscent = X11DRV_YWStoDS(physDev, tm.tmAscent);
     tm.tmDescent = X11DRV_YWStoDS(physDev, tm.tmDescent);
-    switch( dc->textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) ) {
+    switch( align & (TA_LEFT | TA_RIGHT | TA_CENTER) ) {
     case TA_LEFT:
         if (align & TA_UPDATECP) {
 	    pt.x = x + xwidth;
@@ -1144,12 +1144,14 @@
 							   CPSubwindowMode, &pa);
 	    wine_tsx11_unlock();
 
-	    TRACE("allocing pict = %lx dc = %p drawable = %08lx\n", physDev->xrender->pict, dc, physDev->drawable);
+	    TRACE("allocing pict = %lx dc = %p drawable = %08lx\n",
+                  physDev->xrender->pict, hdc, physDev->drawable);
 	} else {
-	    TRACE("using existing pict = %lx dc = %p drawable = %08lx\n", physDev->xrender->pict, dc, physDev->drawable);
+	    TRACE("using existing pict = %lx dc = %p drawable = %08lx\n",
+                  physDev->xrender->pict, hdc, physDev->drawable);
 	}
 
-	if ((data = X11DRV_GetRegionData( dc->hGCClipRgn, 0 )))
+	if ((data = X11DRV_GetRegionData( physDev->dc->hGCClipRgn, 0 )))
 	{
 	    wine_tsx11_lock();
 	    pXRenderSetPictureClipRectangles( gdi_display, physDev->xrender->pict,
@@ -1192,19 +1194,19 @@
 								CPRepeat, &pa);
 	    wine_tsx11_unlock();
 	    TRACE("Created pixmap of depth %d\n", format->depth);
-	    /* init lastTextColor to something different from dc->textColor */
-	    physDev->xrender->lastTextColor = ~dc->textColor;
+	    /* init lastTextColor to something different from textColor */
+	    physDev->xrender->lastTextColor = ~textColor;
 
 	}
 
-	if(dc->textColor != physDev->xrender->lastTextColor) {
+	if(textColor != physDev->xrender->lastTextColor) {
 	    if(physDev->depth != 1) {
 	      /* Map 0 -- 0xff onto 0 -- 0xffff */
-	        col.red = GetRValue(dc->textColor);
+	        col.red = GetRValue(textColor);
 		col.red |= col.red << 8;
-		col.green = GetGValue(dc->textColor);
+		col.green = GetGValue(textColor);
 		col.green |= col.green << 8;
-		col.blue = GetBValue(dc->textColor);
+		col.blue = GetBValue(textColor);
 		col.blue |= col.blue << 8;
 		col.alpha = 0x0;
 	    } else { /* for a 1bpp bitmap we always need a 1 in the tile */
@@ -1216,7 +1218,7 @@
 				  physDev->xrender->tile_pict,
 				  &col, 0, 0, 1, 1);
 	    wine_tsx11_unlock();
-	    physDev->xrender->lastTextColor = dc->textColor;
+	    physDev->xrender->lastTextColor = textColor;
 	}
 
 	/* FIXME the mapping of Text/BkColor onto 1 or 0 needs investigation.
@@ -1439,7 +1441,7 @@
 				yoff + image_off_y - extents.top,
 				entry->bitmaps[glyphs[idx]],
 				&entry->gis[glyphs[idx]],
-				dc->textColor);
+				textColor);
 		if(deltas) {
 		    offset += X11DRV_XWStoDS(physDev, deltas[idx]);
 		    xoff = offset * cosEsc;