jdk/src/solaris/native/sun/awt/multiVis.c
author trims
Thu, 11 Nov 2010 23:30:49 -0800
changeset 7128 a683e80b9ca8
parent 5506 202f599c92aa
child 21278 ef8a3a2a72f2
permissions -rw-r--r--
6997698: Bump the HS20 build number to 03 Summary: Update the HS20 build number to 03 Reviewed-by: jcoomes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     2
 * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
/* $XConsortium: multiVis.c /main/4 1996/10/14 15:04:08 swick $ */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
        This file contains functions to create a list of regions which
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
        tile a specified window.  Each region contains all visible
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
        portions of the window which are drawn with the same visual.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
        If the window consists of subwindows of two different visual types,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
        there will be two regions in the list.  The list can be traversed
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
        to correctly pull an image of the window using XGetImage or the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
        Image Library.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
 This file is available under and governed by the GNU General Public
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
 License version 2 only, as published by the Free Software Foundation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
 However, the following notice accompanied the original version of this
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
 file:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
Copyright (c) 1994 Hewlett-Packard Co.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
Copyright (c) 1996  X Consortium
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
Permission is hereby granted, free of charge, to any person obtaining
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
a copy of this software and associated documentation files (the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
"Software"), to deal in the Software without restriction, including
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
without limitation the rights to use, copy, modify, merge, publish,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
distribute, sublicense, and sell copies of the Software, and to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
permit persons to whom the Software is furnished to do so, subject to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
the following conditions:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
The above copyright notice and this permission notice shall be included
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
in all copies or substantial portions of the Software.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
OTHER DEALINGS IN THE SOFTWARE.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
Except as contained in this notice, the name of the X Consortium shall
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
not be used in advertising or otherwise to promote the sale, use or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
other dealings in this Software without prior written authorization
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
from the X Consortium.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
#include <stdlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
#include <X11/Xlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
#include <X11/Xutil.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
#include <X11/X.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
#include <stdio.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
#include "list.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
#include "wsutils.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
#include "multiVis.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
#include "robot_common.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
static char *vis_class_str[] = { "StaticGray" , "GrayScale" , "StaticColor",
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
                                 "PseudoColor","TrueColor","DirectColor" } ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
/* These structures are copied from X11/region.h.  For some reason
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
 * they're invisible from the outside.*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
typedef struct {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
    short x1, x2, y1, y2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
} myBox, myBOX, myBoxRec, *myBoxPtr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
typedef struct my_XRegion {    /* 64-bit: Region is supposed to be opaque    */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
    long size;                 /* but it is defined here anyway.  I'm going  */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
    long numRects;             /* to leave those longs alone.                */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
    myBOX *rects;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
    myBOX extents;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
} myREGION;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
/* Items in long list of windows that have some part in the grabbed area */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
typedef struct {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
    Window win;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
    Visual *vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
    Colormap cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
    int32_t x_rootrel, y_rootrel;       /* root relative location of window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
    int32_t x_vis, y_vis;               /* rt rel x,y of vis part, not parent clipped */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
    int32_t width, height;              /* width and height of visible part */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
    int32_t border_width;               /* border width of the window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
    Window parent;              /* id of parent (for debugging) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
} image_win_type;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
/*  Items in short list of regions that tile the grabbed area.  May have
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
    multiple windows in the region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
typedef struct {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
    Window win;                 /* lowest window of this visual */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    Visual *vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
    Colormap cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
    int32_t x_rootrel, y_rootrel;       /* root relative location of bottom window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
    int32_t x_vis, y_vis;               /* rt rel x,y of vis part, not parent clipped */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
    int32_t width, height;              /* w & h of visible rect of bottom window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
    int32_t border;                     /* border width of the window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
    Region visible_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
} image_region_type;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
        Returns TRUE if the two structs pointed to have the same "vis" &
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
        "cmap" fields and s2 lies completely within s1.  s1 and s2 can
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
        point to structs of image_win_type or image_region_type.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
#define SAME_REGIONS( s1, s2)   \
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
        ((s1)->vis == (s2)->vis && (s1)->cmap == (s2)->cmap &&          \
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
         (s1)->x_vis <= (s2)->x_vis &&                              \
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
         (s1)->y_vis <= (s2)->y_vis &&                              \
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
         (s1)->x_vis + (s1)->width  >= (s2)->x_vis + (s2)->width && \
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
         (s1)->y_vis + (s1)->height >= (s2)->y_vis + (s2)->height)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
#ifndef MIN
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
#define MIN( a, b)      ((a) < (b) ? a : b)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
#define MAX( a, b)      ((a) > (b) ? a : b)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
#define RED_SHIFT        16
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
#define GREEN_SHIFT       8
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
#define BLUE_SHIFT        0
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
extern list_ptr new_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
extern list_ptr dup_list_head();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
extern void *   first_in_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
extern void *   next_in_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
extern int32_t  add_to_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
extern void     zero_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
extern void     delete_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
extern void     delete_list_destroying();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
extern uint32_t list_length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
/* Prototype Declarations for Static Functions */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
static void TransferImage(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
           Display *, XImage *,int32_t, int32_t , image_region_type*,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
           XImage *,int32_t ,int32_t
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
           );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
static XImage * ReadRegionsInList(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
           Display *, Visual *, int32_t ,int32_t ,int32_t ,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
           int32_t , XRectangle, list_ptr
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
           );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
static list_ptr make_region_list(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
                  Display*, Window, XRectangle*,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
                  int32_t*, int32_t, XVisualInfo**, int32_t     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
         );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
static void destroy_region_list(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
            list_ptr
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
            ) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
static void subtr_rect_from_image_region(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
           image_region_type *, int32_t , int32_t , int32_t , int32_t
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
     );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
static void add_rect_to_image_region(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
           image_region_type *,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
           int32_t , int32_t , int32_t , int32_t
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
     );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
static int32_t src_in_region_list(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
    image_win_type *, list_ptr
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
    );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
static void add_window_to_list(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
    list_ptr, Window, int32_t, int32_t ,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
    int32_t     , int32_t , int32_t , int32_t, int32_t,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
    Visual*, Colormap, Window
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
    );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
static int32_t src_in_image(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
    image_win_type      *, int32_t      , XVisualInfo**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
    );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
static int32_t src_in_overlay(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
#if NeedFunctionPrototypes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
    image_region_type *, int32_t, OverlayInfo *, int32_t*, int32_t*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
    );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
/* End of Prototype Declarations */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
void initFakeVisual(Vis)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
Visual *Vis ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
    Vis->ext_data=NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
    Vis->class = DirectColor ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
    Vis->red_mask =   0x00FF0000;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
    Vis->green_mask = 0x0000FF00 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
    Vis->blue_mask  = 0x000000FF ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
    Vis->map_entries = 256 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
    Vis->bits_per_rgb = 8 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
/* QueryColorMap has been moved into robot_common.c so it can be used by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
 * awt_DataTransferer.c as well.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
int32_t
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
GetMultiVisualRegions(disp,srcRootWinid, x, y, width, height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
    transparentOverlays,numVisuals, pVisuals,numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
    numImageVisuals, pImageVisuals,vis_regions,vis_image_regions,allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
    Window              srcRootWinid;   /* root win on which grab was done */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
    int32_t             x;      /* root rel UL corner of bounding box of grab */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
    int32_t             y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
    uint32_t            width;  /* size of bounding box of grab */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
    uint32_t            height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
    int32_t             *transparentOverlays ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
    int32_t             *numVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
    XVisualInfo         **pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
    int32_t             *numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
    OverlayInfo         **pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
    int32_t             *numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
    XVisualInfo         ***pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
    list_ptr            *vis_regions;    /* list of regions to read from */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
    list_ptr            *vis_image_regions ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
    int32_t             *allImage ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
    int32_t             hasNonDefault;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
    XRectangle          bbox;           /* bounding box of grabbed area */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
    /* Java uses 32-bit ints for coordinates, but XRectangles use 16-bit shorts.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
     * Hope nobody passes in too big a coordinate */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    bbox.x = (short) x;                 /* init X rect for bounding box */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    bbox.y = (short) y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
    bbox.width = (unsigned short) width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
    bbox.height = (unsigned short) height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
    GetXVisualInfo(disp,DefaultScreen(disp),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
                    transparentOverlays,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
                    numVisuals, pVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
                    numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
                    numImageVisuals, pImageVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
    *vis_regions = *vis_image_regions = NULL ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
    if ((*vis_regions = make_region_list( disp, srcRootWinid, &bbox,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
                                         &hasNonDefault, *numImageVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
                                         *pImageVisuals, allImage)) == NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
        return 0 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
    if (*transparentOverlays)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
        *allImage = 1; /* until proven otherwise,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
                         this flags that it to be an image only list */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
        *vis_image_regions =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
                make_region_list( disp, srcRootWinid, &bbox, &hasNonDefault,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
                                        *numImageVisuals, *pImageVisuals, allImage);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    /* if there is a second region in any of the two lists return 1 **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    if ( ( *vis_regions && (*vis_regions)->next && (*vis_regions)->next->next ) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
         ( *vis_image_regions && (*vis_image_regions)->next &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
           (*vis_image_regions)->next->next ) ) return 1 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
    else return 0 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
static void TransferImage(disp,reg_image,srcw,srch,reg,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
                          target_image,dst_x,dst_y)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
Display *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
XImage *reg_image,*target_image ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
image_region_type       *reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
int32_t srcw,srch,dst_x , dst_y ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    int32_t ncolors;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
    int32_t i,j,old_pixel,new_pixel,red_ind,green_ind,blue_ind ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
    XColor *colors;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
    int32_t rShift,gShift,bShift;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
    int32_t targetBytesPerLine ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
    ncolors = QueryColorMap(disp,reg->cmap,reg->vis,&colors,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
         &rShift,&gShift,&bShift) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
    targetBytesPerLine = target_image->bytes_per_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
    switch (reg->vis->class) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
    case TrueColor :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
       for(i=0 ; i < srch ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
       {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
         for(j=0 ; j < srcw ;  j++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
         {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
           old_pixel = (int32_t) XGetPixel(reg_image,j,i) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
/* commented out since not using server RGB masks in all true color modes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
 * causes the R and B values to be swapped around on some X servers
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
 *    - robi.khan@eng 9/7/1999
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
 *           if( reg->vis->map_entries == 16) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
             red_ind   = (old_pixel & reg->vis->red_mask) >> rShift ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
                 green_ind = (old_pixel & reg->vis->green_mask) >> gShift ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
                 blue_ind  = (old_pixel & reg->vis->blue_mask) >> bShift ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
                 new_pixel = (
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
                              ((colors[red_ind].red >> 8) << RED_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
                              |((colors[green_ind].green >> 8) << GREEN_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
                              |((colors[blue_ind].blue >> 8) << BLUE_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
                             );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
/*         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
 *  else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
 *    new_pixel = old_pixel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
           XPutPixel(target_image,dst_x+j, dst_y+i,new_pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
       }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
       break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
    case DirectColor :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
       for(i=0 ; i < srch ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
       {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
         for(j=0 ; j < srcw ;  j++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
         {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
           old_pixel = (int32_t) XGetPixel(reg_image,j,i) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
           red_ind   = (old_pixel & reg->vis->red_mask) >> rShift ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
               green_ind = (old_pixel & reg->vis->green_mask) >> gShift ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
               blue_ind  = (old_pixel & reg->vis->blue_mask) >> bShift ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
               new_pixel = (
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
                         ((colors[red_ind].red >> 8) << RED_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
                        |((colors[green_ind].green >> 8) << GREEN_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
                        |((colors[blue_ind].blue >> 8) << BLUE_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
                       );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
           XPutPixel(target_image,dst_x+j, dst_y+i,new_pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
       }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
       break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
    default :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
       for(i=0 ; i < srch ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
       {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
         for(j=0 ; j < srcw ;  j++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
         {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
               old_pixel = (int32_t) XGetPixel(reg_image,j,i) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
               new_pixel = (
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
                         ((colors[old_pixel].red >> 8) << RED_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
                        |((colors[old_pixel].green >> 8) << GREEN_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
                        |((colors[old_pixel].blue >> 8) << BLUE_SHIFT)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
                       );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
           XPutPixel(target_image,dst_x+j, dst_y+i,new_pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
       }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
       break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
    /* Fix memory leak by freeing colors
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
     *  - robi.khan@eng 9/22/1999
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
    free(colors);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
static XImage *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
ReadRegionsInList(disp,fakeVis,depth,format,width,height,bbox,regions)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
Display *disp ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
Visual *fakeVis ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
int32_t depth , width , height ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
int32_t format ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
XRectangle      bbox;           /* bounding box of grabbed area */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
list_ptr regions;/* list of regions to read from */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
    image_region_type   *reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
    int32_t                     dst_x, dst_y;   /* where in pixmap to write (UL) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
    int32_t                     diff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
    XImage              *reg_image,*ximage ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
    int32_t             srcRect_x,srcRect_y,srcRect_width,srcRect_height ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
    int32_t     rem ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
    int32_t     bytes_per_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
    int32_t     bitmap_unit;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
    bitmap_unit = sizeof (long);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
    if (format == ZPixmap)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
       bytes_per_line = width*depth/8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
       bytes_per_line = width/8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
    /* Find out how many more bytes are required for padding so that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
    ** bytes per scan line will be multiples of bitmap_unit bits */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
    if (format == ZPixmap) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
       rem = (bytes_per_line*8)%bitmap_unit;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
    if (rem)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
       bytes_per_line += (rem/8 + 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
    ximage = XCreateImage(disp,fakeVis,(uint32_t) depth,format,0,NULL,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
                          (uint32_t)width,(uint32_t)height,8,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
    bytes_per_line = ximage->bytes_per_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
    if (format == ZPixmap)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
          ximage->data = malloc(height*bytes_per_line);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
        ximage->data = malloc(height*bytes_per_line*depth);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
    ximage->bits_per_pixel = depth; /** Valid only if format is ZPixmap ***/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
    for (reg = (image_region_type *) first_in_list( regions); reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
         reg = (image_region_type *) next_in_list( regions))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
                int32_t rect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
                struct my_XRegion *vis_reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
                vis_reg = (struct my_XRegion *)(reg->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
                for (rect = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
                     rect < vis_reg->numRects;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
                     rect++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
                {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
                /** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
                        Intersect bbox with visible part of region giving src rect & output
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
                        location.  Width is the min right side minus the max left side.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
                        Similar for height.  Offset src rect so x,y are relative to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
                        origin of win, not the root-relative visible rect of win.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
                    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
                    srcRect_width  = MIN( vis_reg->rects[rect].x2, bbox.width + bbox.x)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
             - MAX( vis_reg->rects[rect].x1, bbox.x);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
                    srcRect_height = MIN( vis_reg->rects[rect].y2, bbox.height + bbox.y)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
             - MAX( vis_reg->rects[rect].y1, bbox.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
                    diff = bbox.x - vis_reg->rects[rect].x1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
                    srcRect_x = MAX( 0, diff)  + (vis_reg->rects[rect].x1 - reg->x_rootrel - reg->border);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
                    dst_x     = MAX( 0, -diff) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
                    diff = bbox.y - vis_reg->rects[rect].y1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
                    srcRect_y = MAX( 0, diff)  + (vis_reg->rects[rect].y1 - reg->y_rootrel - reg->border);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
                    dst_y     = MAX( 0, -diff) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
            reg_image = XGetImage(disp,reg->win,srcRect_x,srcRect_y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
             (uint32_t) srcRect_width, (uint32_t) srcRect_height,AllPlanes,format) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
                    TransferImage(disp,reg_image,srcRect_width,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
                                 srcRect_height,reg,ximage,dst_x,dst_y) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
            XDestroyImage(reg_image);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
    return ximage ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
XImage *ReadAreaToImage(disp, srcRootWinid, x, y, width, height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
    numVisuals,pVisuals,numOverlayVisuals,pOverlayVisuals,numImageVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
    pImageVisuals,vis_regions,vis_image_regions,format,allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
    Window              srcRootWinid;   /* root win on which grab was done */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
    int32_t                     x;   /* root rel UL corner of bounding box of grab */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
    int32_t                     y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
    uint32_t            width;  /* size of bounding box of grab */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
    uint32_t            height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
    /** int32_t                 transparentOverlays; ***/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
    int32_t                     numVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
    XVisualInfo         *pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
    int32_t                     numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
    OverlayInfo         *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
    int32_t                     numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
    XVisualInfo         **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
    list_ptr            vis_regions;    /* list of regions to read from */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
    list_ptr            vis_image_regions ;/* list of regions to read from */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
    int32_t                     format;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
    int32_t             allImage ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
    image_region_type   *reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
    XRectangle          bbox;           /* bounding box of grabbed area */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
    int32_t             depth ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
    XImage              *ximage, *ximage_ipm ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
    Visual              fakeVis ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
    int32_t     x1, y1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
    XImage      *image;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
    unsigned char       *pmData ,  *ipmData ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
    int32_t                 transparentColor, transparentType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
    int32_t                     srcRect_x,srcRect_y,srcRect_width,srcRect_height ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
    int32_t                     diff ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
    int32_t                     dst_x, dst_y;   /* where in pixmap to write (UL) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
    int32_t                     pixel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
    bbox.x = (short) x;                 /* init X rect for bounding box */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
    bbox.y = (short) y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
    bbox.width = (unsigned short) width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
    bbox.height = (unsigned short) height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
    ximage_ipm = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
    initFakeVisual(&fakeVis) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
    depth = 24 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
    ximage = ReadRegionsInList(disp,&fakeVis,depth,format,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
             (int32_t) width, (int32_t) height, bbox,vis_regions) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
    pmData = (unsigned char *)ximage -> data ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
/* if transparency possible do it again, but this time for image planes only */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
    if (vis_image_regions && (vis_image_regions->next) && !allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
            ximage_ipm = ReadRegionsInList(disp,&fakeVis,depth,format,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
                         (int32_t) width, (int32_t) height,bbox,vis_image_regions) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
        ipmData = (unsigned char *)ximage_ipm -> data ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
/* Now tranverse the overlay visual windows and test for transparency index.  */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
/* If you find one, subsitute the value from the matching image plane pixmap. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
    for (reg = (image_region_type *) first_in_list( vis_regions); reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
         reg = (image_region_type *) next_in_list( vis_regions))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
        if (src_in_overlay( reg, numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
                                 &transparentColor, &transparentType))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
         int32_t test = 0 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
             srcRect_width  = MIN( reg->width + reg->x_vis, bbox.width + bbox.x)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
                                 - MAX( reg->x_vis, bbox.x);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
             srcRect_height = MIN( reg->height + reg->y_vis, bbox.height
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
                                 + bbox.y) - MAX( reg->y_vis, bbox.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
         diff = bbox.x - reg->x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
         srcRect_x = MAX( 0, diff) + (reg->x_vis - reg->x_rootrel - reg->border);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
         dst_x     = MAX( 0, -diff) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
             diff = bbox.y - reg->y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
             srcRect_y = MAX( 0, diff)  + (reg->y_vis - reg->y_rootrel - reg->border);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
             dst_y     = MAX( 0, -diff) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
        /* let's test some pixels for transparency */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
         image = XGetImage(disp, reg->win, srcRect_x, srcRect_y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
                           (uint32_t) srcRect_width, (uint32_t) srcRect_height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
                           0xffffffff, ZPixmap);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
        /* let's assume byte per pixel for overlay image for now */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
             if ((image->depth == 8) && (transparentType == TransparentPixel))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
             {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
                 unsigned char *pixel_ptr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
                 unsigned char *start_of_line = (unsigned char *) image->data;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
                 for (y1 = 0; y1 < srcRect_height; y1++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
                    pixel_ptr = start_of_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
                    for (x1 = 0; x1 < srcRect_width; x1++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
                    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
                        if (*pixel_ptr++ == transparentColor)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
                        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
                        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
                            *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
                            *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
                            *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
                        */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
                        pixel = (int32_t) XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
                    XPutPixel(ximage,dst_x+x1, dst_y+y1,(unsigned long)pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
                        if(!test){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
                           test = 1 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
                        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
                        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
                            pmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
                            ipmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
                        */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
                    start_of_line += image->bytes_per_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
                if (transparentType == TransparentPixel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
                for (y1 = 0; y1 < srcRect_height; y1++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
                      for (x1 = 0; x1 < srcRect_width; x1++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
                      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
                            int32_t pixel_value = (int32_t) XGetPixel(image, x1, y1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
                            if (pixel_value == transparentColor)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
                            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
                        pixel = (int32_t) XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
                    XPutPixel(ximage,dst_x+x1, dst_y+y1,(unsigned long)pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
                        if(!test){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
                           test = 1 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
                            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
                                pmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
                                ipmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
                    for (y1 = 0; y1 < srcRect_height; y1++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
                        for (x1 = 0; x1 < srcRect_width; x1++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
                        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
                            int32_t pixel_value = (int32_t) XGetPixel(image, x1, y1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
                            if (pixel_value & transparentColor)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
                            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
                     pixel = (int32_t) XGetPixel(ximage_ipm,dst_x+x1,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
                                    dst_y+y1) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
                     XPutPixel(ximage,dst_x+x1, dst_y+y1,(unsigned long)pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
                        if(!test){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
                           test = 1 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
                            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
                                pmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
                                ipmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
        XDestroyImage (image);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
      } /* end of src_in_overlay */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
    } /** end transparency **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
    if (ximage_ipm != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
        XDestroyImage(ximage_ipm);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
    destroy_region_list( vis_regions);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
    if (vis_image_regions) destroy_region_list( vis_image_regions );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
    FreeXVisualInfo(pVisuals, pOverlayVisuals, pImageVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
    XSync(disp, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
    return ximage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
        Creates a list of the subwindows of a given window which have a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
        different visual than their parents.  The function is recursive.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
        This list is used in make_region_list(), which coalesces the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
        windows with the same visual into a region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
        image_wins must point to an existing list struct that's already
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
        been zeroed (zero_list()).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
static void make_src_list( disp, image_wins, bbox, curr, x_rootrel, y_rootrel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
                    curr_attrs, pclip)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
    list_ptr            image_wins;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
    XRectangle          *bbox;                  /* bnding box of area we want */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
    Window              curr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
    int32_t                     x_rootrel;              /* pos of curr WRT root */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
    int32_t                     y_rootrel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
    XWindowAttributes   *curr_attrs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
    XRectangle          *pclip;                 /* visible part of curr, not */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
                                                /* obscurred by ancestors */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
    XWindowAttributes child_attrs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
    Window root, parent, *child;        /* variables for XQueryTree() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
    Window *save_child_list;            /* variables for XQueryTree() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
    uint32_t nchild;            /* variables for XQueryTree() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
    XRectangle child_clip;              /* vis part of child */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
    int32_t curr_clipX, curr_clipY, curr_clipRt, curr_clipBt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
    /* check that win is mapped & not outside bounding box */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
    if (curr_attrs->map_state == IsViewable &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
        curr_attrs->class == InputOutput &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
        !( pclip->x >= (bbox->x + bbox->width)  ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
           pclip->y >= (bbox->y + bbox->height) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
           (pclip->x + pclip->width)  <= bbox->x        ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
           (pclip->y + pclip->height) <= bbox->y)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
        XQueryTree( disp, curr, &root, &parent, &child, &nchild );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
        save_child_list = child;      /* so we can free list when we're done */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
        add_window_to_list( image_wins, curr, x_rootrel, y_rootrel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
                            (int32_t) pclip->x, (int32_t) pclip->y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
                            (int32_t) pclip->width, (int32_t) pclip->height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
                            curr_attrs->border_width,curr_attrs->visual,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
                            curr_attrs->colormap, parent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
        set RR coords of right (Rt), left (X), bottom (Bt) and top (Y)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
        of rect we clip all children by.  This is our own clip rect (pclip)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
        inflicted on us by our parent plus our own borders.  Within the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
        child loop, we figure the clip rect for each child by adding in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
        it's rectangle (not taking into account the child's borders).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
        curr_clipX = MAX( pclip->x, x_rootrel + curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
        curr_clipY = MAX( pclip->y, y_rootrel + curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
        curr_clipRt = MIN(pclip->x + pclip->width,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
                                  x_rootrel + curr_attrs->width + 2 * curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
        curr_clipBt = MIN(pclip->y + pclip->height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
                                  y_rootrel + curr_attrs->height + 2 * curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
        while (nchild--) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
            int32_t new_width, new_height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
            int32_t child_xrr, child_yrr;       /* root relative x & y of child */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
            XGetWindowAttributes( disp, *child, &child_attrs);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
            /* intersect parent & child clip rects */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
            child_xrr = x_rootrel + child_attrs.x + curr_attrs->border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
            child_clip.x = (short) MAX( curr_clipX, child_xrr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
            new_width = MIN(curr_clipRt,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
                        child_xrr + child_attrs.width +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
                         2 * child_attrs.border_width) - child_clip.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
            if (new_width >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
                child_clip.width = (unsigned short) new_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
                child_yrr = y_rootrel + child_attrs.y +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
                            curr_attrs->border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
                child_clip.y = (short) MAX( curr_clipY, child_yrr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
                new_height = MIN(curr_clipBt,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
                                         child_yrr + (int32_t) child_attrs.height +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
                                         2 * child_attrs.border_width) - child_clip.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
                if (new_height >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
                    child_clip.height = (unsigned short) new_height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
                    make_src_list( disp, image_wins, bbox, *child,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
                                   child_xrr, child_yrr,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
                                   &child_attrs, &child_clip);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
            child++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
        XFree( save_child_list);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
        This function creates a list of regions which tile a specified
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
        window.  Each region contains all visible portions of the window
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
        which are drawn with the same visual.  For example, if the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
        window consists of subwindows of two different visual types,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
        there will be two regions in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
        Returns a pointer to the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
static list_ptr make_region_list( disp, win, bbox, hasNonDefault,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
                             numImageVisuals, pImageVisuals, allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
    Window              win;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
    XRectangle          *bbox;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
    int32_t             *hasNonDefault;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
    int32_t                     numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
    XVisualInfo         **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
    int32_t                     *allImage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
    XWindowAttributes   win_attrs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
    list                image_wins;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
    list_ptr            image_regions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
    list_ptr            srcs_left;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
    image_region_type   *new_reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
    image_win_type      *base_src, *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
    Region              bbox_region = XCreateRegion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
    XRectangle          clip;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
    int32_t                     image_only;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
    int32_t                 count=0 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
    *hasNonDefault = False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
    XUnionRectWithRegion( bbox, bbox_region, bbox_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
    XGetWindowAttributes( disp, win, &win_attrs);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
    zero_list( &image_wins);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
    clip.x = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
    clip.y = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
    clip.width  = (unsigned short) win_attrs.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
    clip.height = (unsigned short) win_attrs.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
    make_src_list( disp, &image_wins, bbox, win,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
                   0 /* x_rootrel */, 0 /* y_rootrel */, &win_attrs, &clip);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
    image_regions = new_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
    image_only = (*allImage) ? True:False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
    for (base_src = (image_win_type *) first_in_list( &image_wins); base_src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
         base_src = (image_win_type *) next_in_list( &image_wins))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
        /* test for image visual */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
        if (!image_only || src_in_image(base_src, numImageVisuals, pImageVisuals))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
            /* find a window whose visual hasn't been put in list yet */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
            if (!src_in_region_list( base_src, image_regions))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
                if (! (new_reg = (image_region_type *)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
                                        malloc( sizeof( image_region_type)))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
                    return (list_ptr) NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
                count++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
                new_reg->visible_region = XCreateRegion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
                new_reg->win            = base_src->win;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
                new_reg->vis            = base_src->vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
                new_reg->cmap           = base_src->cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   823
                new_reg->x_rootrel      = base_src->x_rootrel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
                new_reg->y_rootrel      = base_src->y_rootrel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
                new_reg->x_vis          = base_src->x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
                new_reg->y_vis          = base_src->y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
                new_reg->width          = base_src->width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
                new_reg->height         = base_src->height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
                new_reg->border         = base_src->border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
                srcs_left = (list_ptr) dup_list_head( &image_wins, START_AT_CURR);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
                for (src = (image_win_type *) first_in_list( srcs_left); src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
                     src = (image_win_type *) next_in_list( srcs_left)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
                    if (SAME_REGIONS( base_src, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
                        add_rect_to_image_region( new_reg, src->x_vis, src->y_vis,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
                                                  src->width, src->height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
                    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
                        if (!image_only || src_in_image(src, numImageVisuals, pImageVisuals))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
                        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
                            subtr_rect_from_image_region( new_reg, src->x_vis,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
                                          src->y_vis, src->width, src->height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
                XIntersectRegion( bbox_region, new_reg->visible_region,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
                                  new_reg->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
                if (! XEmptyRegion( new_reg->visible_region)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
                    add_to_list( image_regions, new_reg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
                    if (new_reg->vis != DefaultVisualOfScreen( win_attrs.screen) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
                        new_reg->cmap != DefaultColormapOfScreen(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
                                                            win_attrs.screen)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
                        *hasNonDefault = True;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
                else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
                    XDestroyRegion( new_reg->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
                    free( (void *) new_reg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
        } else *allImage = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
    delete_list( &image_wins, True);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
    XDestroyRegion( bbox_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
    return image_regions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
        Destructor called from destroy_region_list().
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
void destroy_image_region( image_region)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
    image_region_type *image_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
    XDestroyRegion( image_region->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
    free( (void *) image_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
        Destroys the region list, destroying all the regions contained in it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
static void destroy_region_list( rlist)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
    list_ptr rlist;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
    delete_list_destroying( rlist, (DESTRUCT_FUNC_PTR)destroy_image_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
90ce3da70b43 Initial load
duke
parents:
diff changeset
   887
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   888
        Subtracts the specified rectangle from the region in image_region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
        First converts the rectangle to a region of its own, since X
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
        only provides a way to subtract one region from another, not a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
        rectangle from a region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
static void subtr_rect_from_image_region( image_region, x, y, width, height)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
    image_region_type *image_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
    int32_t x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
    int32_t y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
    int32_t width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
    int32_t height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
    XRectangle rect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
    Region rect_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
    rect_region = XCreateRegion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
    rect.x = (short)x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
    rect.y = (short)y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
    rect.width = (unsigned short)width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
    rect.height = (unsigned short)height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
    XUnionRectWithRegion( &rect, rect_region, rect_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
    XSubtractRegion( image_region->visible_region, rect_region,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
                     image_region->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
    XDestroyRegion( rect_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
        Adds the specified rectangle to the region in image_region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
static void add_rect_to_image_region( image_region, x, y, width, height)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
    image_region_type *image_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
    int32_t x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
    int32_t y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
    int32_t width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
    int32_t height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
    XRectangle rect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
    rect.x = (short) x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
    rect.y = (short) y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
    rect.width = (unsigned short) width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
    rect.height = (unsigned short) height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
    XUnionRectWithRegion( &rect, image_region->visible_region,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
                          image_region->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
        Returns TRUE if the given src's visual is already represented in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
        the image_regions list, FALSE otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
static int32_t src_in_region_list( src, image_regions)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
    image_win_type *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
    list_ptr image_regions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
    image_region_type   *ir;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
    for (ir = (image_region_type *) first_in_list( image_regions); ir;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
         ir = (image_region_type *) next_in_list( image_regions)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
        if (SAME_REGIONS( ir, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
            return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
        Makes a new entry in image_wins with the given fields filled in.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
static void add_window_to_list( image_wins, w, xrr, yrr, x_vis, y_vis,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
                                width, height, border_width,vis, cmap, parent)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
    list_ptr    image_wins;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
    Window      w;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
    int32_t             xrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
    int32_t     yrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
    int32_t             x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
    int32_t     y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
    int32_t     width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
    int32_t     height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
    int32_t     border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
    Visual      *vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
    Colormap    cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
    Window      parent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
    image_win_type      *new_src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
    if ((new_src = (image_win_type *) malloc( sizeof( image_win_type))) == NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
    new_src->win = w;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
    new_src->x_rootrel = xrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
    new_src->y_rootrel = yrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
    new_src->x_vis = x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
    new_src->y_vis = y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
    new_src->width = width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
    new_src->height = height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
    new_src->border_width = border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
    new_src->vis = vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
    new_src->cmap = cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
    new_src->parent = parent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
    add_to_list( image_wins, new_src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
        Returns TRUE if the given src's visual is in the image planes,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
        FALSE otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
static int32_t src_in_image( src, numImageVisuals, pImageVisuals)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
    image_win_type      *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
    int32_t                     numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
    XVisualInfo         **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
    int32_t             i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
    for (i = 0 ; i < numImageVisuals ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
        if (pImageVisuals[i]->visual == src->vis)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
            return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
        Returns TRUE if the given src's visual is in the overlay planes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
        and transparency is possible, FALSE otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
static int32_t src_in_overlay( src, numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
                        transparentColor, transparentType)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
    image_region_type   *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
    int32_t                     numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
    OverlayInfo         *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
    int32_t                     *transparentColor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
    int32_t                     *transparentType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
    int32_t             i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
    for (i = 0 ; i < numOverlayVisuals ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
        if (((pOverlayVisuals[i].pOverlayVisualInfo)->visual == src->vis)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
                && (pOverlayVisuals[i].transparentType != None))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
            *transparentColor = pOverlayVisuals[i].value;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
            *transparentType = pOverlayVisuals[i].transparentType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
            return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
/********************** from wsutils.c ******************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
/******************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
 * This file contains a set of example utility procedures; procedures that can
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
 * help a "window-smart" Starbase or PHIGS program determine information about
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
 * a device, and create image and overlay plane windows.  To use these
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1055
 * utilities, #include "wsutils.h" and compile this file and link the results
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
 * with your program.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
 ******************************************************************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
#define STATIC_GRAY     0x01
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
#define GRAY_SCALE      0x02
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
#define PSEUDO_COLOR    0x04
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
#define TRUE_COLOR      0x10
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
#define DIRECT_COLOR    0x11
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
static int32_t  weCreateServerOverlayVisualsProperty = False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
/******************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
 * GetXVisualInfo()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
 * This routine takes an X11 Display, screen number, and returns whether the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
 * screen supports transparent overlays and three arrays:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
 *      1) All of the XVisualInfo struct's for the screen.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
 *      2) All of the OverlayInfo struct's for the screen.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
 *      3) An array of pointers to the screen's image plane XVisualInfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
 *         structs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
 * The code below obtains the array of all the screen's visuals, and obtains
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
 * the array of all the screen's overlay visual information.  It then processes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
 * the array of the screen's visuals, determining whether the visual is an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1087
 * overlay or image visual.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
 * If the routine sucessfully obtained the visual information, it returns zero.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
 * If the routine didn't obtain the visual information, it returns non-zero.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1091
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
 ******************************************************************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
int32_t GetXVisualInfo(display, screen, transparentOverlays,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
                   numVisuals, pVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
                   numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
                   numImageVisuals, pImageVisuals)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1099
    Display     *display;                   /* Which X server (aka "display"). */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
    int32_t             screen;                 /* Which screen of the "display". */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1101
    int32_t             *transparentOverlays;   /* Non-zero if there's at least one
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1102
                                         * overlay visual and if at least one
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1103
                                         * of those supports a transparent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1104
                                         * pixel. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
    int32_t             *numVisuals;            /* Number of XVisualInfo struct's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
                                         * pointed to to by pVisuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
    XVisualInfo **pVisuals;             /* All of the device's visuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1108
    int32_t             *numOverlayVisuals;     /* Number of OverlayInfo's pointed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
                                         * to by pOverlayVisuals.  If this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
                                         * number is zero, the device does
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1111
                                         * not have overlay planes. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
    OverlayInfo **pOverlayVisuals;      /* The device's overlay plane visual
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1113
                                         * information. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
    int32_t             *numImageVisuals;       /* Number of XVisualInfo's pointed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1115
                                         * to by pImageVisuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1116
    XVisualInfo ***pImageVisuals;       /* The device's image visuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1117
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1118
    XVisualInfo getVisInfo;             /* Paramters of XGetVisualInfo */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1119
    int32_t             mask;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1120
    XVisualInfo *pVis, **pIVis;         /* Faster, local copies */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1121
    OverlayInfo *pOVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
    OverlayVisualPropertyRec    *pOOldVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
    int32_t             nVisuals, nOVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
    Atom        overlayVisualsAtom;     /* Parameters for XGetWindowProperty */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1125
    Atom        actualType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
    unsigned long numLongs, bytesAfter;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1127
    int32_t             actualFormat;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1128
    int32_t             nImageVisualsAlloced;   /* Values to process the XVisualInfo */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1129
    int32_t             imageVisual;            /* array */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1130
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1131
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1132
    /* First, get the list of visuals for this screen. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
    getVisInfo.screen = screen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
    mask = VisualScreenMask;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
    *pVisuals = XGetVisualInfo(display, mask, &getVisInfo, numVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1137
    if ((nVisuals = *numVisuals) <= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1138
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1139
        /* Return that the information wasn't sucessfully obtained: */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1140
        return(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1141
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
    pVis = *pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
    /* Now, get the overlay visual information for this screen.  To obtain
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
     * this information, get the SERVER_OVERLAY_VISUALS property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1148
    overlayVisualsAtom = XInternAtom(display, "SERVER_OVERLAY_VISUALS", True);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1149
    if (overlayVisualsAtom != None)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1150
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1151
        /* Since the Atom exists, we can request the property's contents.  The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1152
         * do-while loop makes sure we get the entire list from the X server.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1153
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
        bytesAfter = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
        numLongs = sizeof(OverlayVisualPropertyRec) / 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1156
        do
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1157
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1158
            numLongs += bytesAfter * 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1159
            XGetWindowProperty(display, RootWindow(display, screen),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1160
                               overlayVisualsAtom, 0, numLongs, False,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1161
                               overlayVisualsAtom, &actualType, &actualFormat,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1162
                               &numLongs, &bytesAfter, (unsigned char**) pOverlayVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1163
        } while (bytesAfter > 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1164
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1165
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1166
        /* Calculate the number of overlay visuals in the list. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1167
        /* *numOverlayVisuals = numLongs / (sizeof(OverlayVisualPropertyRec) / 4); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1168
        *numOverlayVisuals = numLongs / (sizeof(OverlayVisualPropertyRec) / sizeof(long));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1169
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1170
    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1171
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1172
        /* This screen doesn't have overlay planes. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1173
        *numOverlayVisuals = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1174
        *pOverlayVisuals = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1175
        *transparentOverlays = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1176
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1177
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1178
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1179
    /* Process the pVisuals array. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1180
    *numImageVisuals = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1181
    nImageVisualsAlloced = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1182
    pIVis = *pImageVisuals = (XVisualInfo **) malloc(sizeof(XVisualInfo *));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1183
    while (--nVisuals >= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1184
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1185
        nOVisuals = *numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1186
        pOVis = *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1187
        imageVisual = True;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1188
        while (--nOVisuals >= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1189
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1190
            pOOldVis = (OverlayVisualPropertyRec *) pOVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1191
            if (pVis->visualid == pOOldVis->visualID)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1192
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1193
                imageVisual = False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1194
                pOVis->pOverlayVisualInfo = pVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1195
                if (pOVis->transparentType == TransparentPixel)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1196
                    *transparentOverlays = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1197
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1198
            pOVis++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1199
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1200
        if (imageVisual)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1201
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
            if ((*numImageVisuals += 1) > nImageVisualsAlloced)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1204
                nImageVisualsAlloced++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1205
                *pImageVisuals = (XVisualInfo **)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1206
                    realloc(*pImageVisuals, (nImageVisualsAlloced * sizeof(XVisualInfo *)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1207
                pIVis = *pImageVisuals + (*numImageVisuals - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1208
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1209
            *pIVis++ = pVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1210
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1211
        pVis++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1212
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1213
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1214
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1215
    /* Return that the information was sucessfully obtained: */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1216
    return(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1217
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1218
} /* GetXVisualInfo() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1219
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1220
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1221
/******************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1222
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1223
 * FreeXVisualInfo()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1224
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1225
 * This routine frees the data that was allocated by GetXVisualInfo().
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1226
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1227
 ******************************************************************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1228
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1229
void FreeXVisualInfo(pVisuals, pOverlayVisuals, pImageVisuals)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1230
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1231
    XVisualInfo *pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1232
    OverlayInfo *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1233
    XVisualInfo **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1234
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1235
    XFree(pVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1236
    if (weCreateServerOverlayVisualsProperty)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1237
        free(pOverlayVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1238
    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1239
        XFree(pOverlayVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1240
    free(pImageVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1241
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1242
} /* FreeXVisualInfo() */