~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/winex11.drv/scroll.c

Version: ~ [ wine-1.5.30 ] ~ [ wine-1.5.29 ] ~ [ wine-1.5.28 ] ~ [ wine-1.5.27 ] ~ [ wine-1.5.26 ] ~ [ wine-1.5.25 ] ~ [ wine-1.5.24 ] ~ [ wine-1.5.23 ] ~ [ wine-1.5.22 ] ~ [ wine-1.5.21 ] ~ [ wine-1.5.20 ] ~ [ wine-1.5.19 ] ~ [ wine-1.5.18 ] ~ [ wine-1.5.17 ] ~ [ wine-1.5.16 ] ~ [ wine-1.5.15 ] ~ [ wine-1.5.14 ] ~ [ wine-1.5.13 ] ~ [ wine-1.5.12 ] ~ [ wine-1.5.11 ] ~ [ wine-1.5.10 ] ~ [ wine-1.5.9 ] ~ [ wine-1.5.8 ] ~ [ wine-1.5.7 ] ~ [ wine-1.4.1 ] ~ [ wine-1.5.6 ] ~ [ wine-1.5.5 ] ~ [ wine-1.5.4 ] ~ [ wine-1.5.3 ] ~ [ wine-1.5.2 ] ~ [ wine-1.5.1 ] ~ [ wine-1.5.0 ] ~ [ wine-1.4 ] ~ [ wine-1.4-rc6 ] ~ [ wine-1.4-rc5 ] ~ [ wine-1.4-rc4 ] ~ [ wine-1.4-rc3 ] ~ [ wine-1.4-rc2 ] ~ [ wine-1.4-rc1 ] ~ [ wine-1.3.37 ] ~ [ wine-1.3.36 ] ~ [ wine-1.3.35 ] ~ [ wine-1.3.34 ] ~ [ wine-1.3.33 ] ~ [ wine-1.3.32 ] ~ [ wine-1.3.31 ] ~ [ wine-1.3.30 ] ~ [ wine-1.3.29 ] ~ [ wine-1.3.28 ] ~ [ wine-1.3.27 ] ~ [ wine-1.3.26 ] ~ [ wine-1.3.25 ] ~ [ wine-1.3.24 ] ~ [ wine-1.3.23 ] ~ [ wine-1.3.22 ] ~ [ wine-1.3.21 ] ~ [ wine-1.3.20 ] ~ [ wine-1.3.19 ] ~ [ wine-1.3.18 ] ~ [ wine-1.2.3 ] ~ [ wine-1.3.17 ] ~ [ wine-1.3.16 ] ~ [ wine-1.3.15 ] ~ [ wine-1.3.14 ] ~ [ wine-1.3.13 ] ~ [ wine-1.3.12 ] ~ [ wine-1.3.11 ] ~ [ wine-1.3.10 ] ~ [ wine-1.3.9 ] ~ [ wine-1.2.2 ] ~ [ wine-1.3.8 ] ~ [ wine-1.3.7 ] ~ [ wine-1.3.6 ] ~ [ wine-1.3.5 ] ~ [ wine-1.2.1 ] ~ [ wine-1.3.4 ] ~ [ wine-1.3.3 ] ~ [ wine-1.3.2 ] ~ [ wine-1.3.1 ] ~ [ wine-1.3.0 ] ~ [ wine-1.2 ] ~ [ wine-1.2-rc7 ] ~ [ wine-1.2-rc6 ] ~ [ wine-1.2-rc5 ] ~ [ wine-1.2-rc4 ] ~ [ wine-1.2-rc3 ] ~ [ wine-1.2-rc2 ] ~ [ wine-1.2-rc1 ] ~ [ wine-1.1.44 ] ~ [ wine-1.1.43 ] ~ [ wine-1.1.42 ] ~ [ wine-1.1.41 ] ~ [ wine-1.1.40 ] ~ [ wine-1.1.39 ] ~ [ wine-1.1.38 ] ~ [ wine-1.1.37 ] ~ [ wine-1.1.36 ] ~ [ wine-1.1.35 ] ~ [ wine-1.1.34 ] ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  1 /*
  2  * Scroll windows and DCs
  3  *
  4  * Copyright 1993  David W. Metcalfe
  5  * Copyright 1995, 1996 Alex Korobka
  6  * Copyright 2001 Alexandre Julliard
  7  *
  8  * This library is free software; you can redistribute it and/or
  9  * modify it under the terms of the GNU Lesser General Public
 10  * License as published by the Free Software Foundation; either
 11  * version 2.1 of the License, or (at your option) any later version.
 12  *
 13  * This library is distributed in the hope that it will be useful,
 14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 16  * Lesser General Public License for more details.
 17  *
 18  * You should have received a copy of the GNU Lesser General Public
 19  * License along with this library; if not, write to the Free Software
 20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 21  */
 22 
 23 #include "config.h"
 24 
 25 #include <stdarg.h>
 26 #include <X11/Xlib.h>
 27 
 28 #include "windef.h"
 29 #include "winbase.h"
 30 #include "wingdi.h"
 31 #include "winuser.h"
 32 
 33 #include "x11drv.h"
 34 #include "wine/debug.h"
 35 
 36 WINE_DEFAULT_DEBUG_CHANNEL(scroll);
 37 
 38 static void dump_region( const char *p, HRGN hrgn)
 39 {
 40     DWORD i, size;
 41     RGNDATA *data = NULL;
 42     RECT *rect;
 43 
 44     if (!hrgn) {
 45         TRACE( "%s null region\n", p );
 46         return;
 47     }
 48     if (!(size = GetRegionData( hrgn, 0, NULL ))) {
 49         return;
 50     }
 51     if (!(data = HeapAlloc( GetProcessHeap(), 0, size ))) return;
 52     GetRegionData( hrgn, size, data );
 53     TRACE("%s %d rects:", p, data->rdh.nCount );
 54     for (i = 0, rect = (RECT *)data->Buffer; i<20 && i < data->rdh.nCount; i++, rect++)
 55         TRACE( " %s", wine_dbgstr_rect( rect));
 56     TRACE("\n");
 57     HeapFree( GetProcessHeap(), 0, data );
 58 }
 59 
 60 /*************************************************************************
 61  *              ScrollDC   (X11DRV.@)
 62  */
 63 BOOL CDECL X11DRV_ScrollDC( HDC hdc, INT dx, INT dy, const RECT *lprcScroll,
 64                             const RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate )
 65 {
 66     RECT rcSrc, rcClip, offset;
 67     INT dxdev, dydev, res;
 68     HRGN DstRgn, clipRgn, visrgn;
 69     INT code = X11DRV_START_EXPOSURES;
 70 
 71     TRACE("dx,dy %d,%d rcScroll %s rcClip %s hrgnUpdate %p lprcUpdate %p\n",
 72             dx, dy, wine_dbgstr_rect(lprcScroll), wine_dbgstr_rect(lprcClip),
 73             hrgnUpdate, lprcUpdate);
 74     /* enable X-exposure events */
 75     if (hrgnUpdate || lprcUpdate)
 76         ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
 77     /* get the visible region */
 78     visrgn=CreateRectRgn( 0, 0, 0, 0);
 79     GetRandomRgn( hdc, visrgn, SYSRGN);
 80     if( !(GetVersion() & 0x80000000)) {
 81         /* Window NT/2k/XP */
 82         POINT org;
 83         GetDCOrgEx(hdc, &org);
 84         OffsetRgn( visrgn, -org.x, -org.y);
 85     }
 86     /* intersect with the clipping Region if the DC has one */
 87     clipRgn = CreateRectRgn( 0, 0, 0, 0);
 88     if (GetClipRgn( hdc, clipRgn) != 1) {
 89         DeleteObject(clipRgn);
 90         clipRgn=NULL;
 91     } else
 92         CombineRgn( visrgn, visrgn, clipRgn, RGN_AND);
 93     /* only those pixels in the scroll rectangle that remain in the clipping
 94      * rect are scrolled. */
 95     if( lprcClip) 
 96         rcClip = *lprcClip;
 97     else
 98         GetClipBox( hdc, &rcClip);
 99     rcSrc = rcClip;
100     OffsetRect( &rcClip, -dx, -dy);
101     IntersectRect( &rcSrc, &rcSrc, &rcClip);
102     /* if an scroll rectangle is specified, only the pixels within that
103      * rectangle are scrolled */
104     if( lprcScroll)
105         IntersectRect( &rcSrc, &rcSrc, lprcScroll);
106     /* now convert to device coordinates */
107     LPtoDP(hdc, (LPPOINT)&rcSrc, 2);
108     TRACE("source rect: %s\n", wine_dbgstr_rect(&rcSrc));
109     /* also dx and dy */
110     SetRect(&offset, 0, 0, dx, dy);
111     LPtoDP(hdc, (LPPOINT)&offset, 2);
112     dxdev = offset.right - offset.left;
113     dydev = offset.bottom - offset.top;
114     /* now intersect with the visible region to get the pixels that will
115      * actually scroll */
116     DstRgn = CreateRectRgnIndirect( &rcSrc);
117     res = CombineRgn( DstRgn, DstRgn, visrgn, RGN_AND);
118     /* and translate, giving the destination region */
119     OffsetRgn( DstRgn, dxdev, dydev);
120     if( TRACE_ON( scroll)) dump_region( "Destination scroll region: ", DstRgn);
121     /* if there are any, do it */
122     if( res > NULLREGION) {
123         RECT rect ;
124         /* clip to the destination region, so we can BitBlt with a simple
125          * bounding rectangle */
126         if( clipRgn)
127             ExtSelectClipRgn( hdc, DstRgn, RGN_AND);
128         else
129             SelectClipRgn( hdc, DstRgn);
130         GetRgnBox( DstRgn, &rect);
131         DPtoLP(hdc, (LPPOINT)&rect, 2);
132         TRACE("destination rect: %s\n", wine_dbgstr_rect(&rect));
133 
134         BitBlt( hdc, rect.left, rect.top,
135                     rect.right - rect.left, rect.bottom - rect.top,
136                     hdc, rect.left - dx, rect.top - dy, SRCCOPY);
137     }
138     /* compute the update areas.  This is the combined clip rectangle
139      * minus the scrolled region, and intersected with the visible
140      * region. */
141     if (hrgnUpdate || lprcUpdate)
142     {
143         HRGN hrgn = hrgnUpdate;
144         HRGN ExpRgn = 0;
145 
146         /* collect all the exposures */
147         code = X11DRV_END_EXPOSURES;
148         ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code,
149                 sizeof(ExpRgn), (LPSTR)&ExpRgn );
150         /* Intersect clip and scroll rectangles, allowing NULL values */ 
151         if( lprcScroll)
152             if( lprcClip)
153                 IntersectRect( &rcClip, lprcClip, lprcScroll);
154             else
155                 rcClip = *lprcScroll;
156         else
157             if( lprcClip)
158                 rcClip = *lprcClip;
159             else
160                 GetClipBox( hdc, &rcClip);
161         /* Convert the combined clip rectangle to device coordinates */
162         LPtoDP(hdc, (LPPOINT)&rcClip, 2);
163         if( hrgn )
164             SetRectRgn( hrgn, rcClip.left, rcClip.top, rcClip.right,
165                     rcClip.bottom);
166         else
167             hrgn = CreateRectRgnIndirect( &rcClip);
168         CombineRgn( hrgn, hrgn, visrgn, RGN_AND);
169         CombineRgn( hrgn, hrgn, DstRgn, RGN_DIFF);
170         /* add the exposures to this */
171         if( ExpRgn) {
172             if( TRACE_ON( scroll)) dump_region( "Expose region: ", ExpRgn);
173             CombineRgn( hrgn, hrgn, ExpRgn, RGN_OR);
174             DeleteObject( ExpRgn);
175         }
176         if( TRACE_ON( scroll)) dump_region( "Update region: ", hrgn);
177         if( lprcUpdate) {
178             GetRgnBox( hrgn, lprcUpdate );
179             /* Put the lprcUpdate in logical coordinates */
180             DPtoLP( hdc, (LPPOINT)lprcUpdate, 2 );
181             TRACE("returning lprcUpdate %s\n", wine_dbgstr_rect(lprcUpdate));
182         }
183         if( !hrgnUpdate)
184             DeleteObject( hrgn);
185     }
186     /* restore original clipping region */
187     SelectClipRgn( hdc, clipRgn);
188     DeleteObject( visrgn);
189     DeleteObject( DstRgn);
190     if( clipRgn) DeleteObject( clipRgn);
191     return TRUE;
192 }
193 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.