src/java.desktop/unix/native/libawt_xawt/awt/multiVis.c
author prr
Mon, 12 Feb 2018 08:56:44 -0800
changeset 49083 673be6f60323
parent 49079 05077701f689
child 52542 8c7638601045
child 56230 489867818774
permissions -rw-r--r--
8197546: Fix for 8171000 breaks Solaris + Linux builds Reviewed-by: serb, jdv
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
23010
6dadb192ad81 8029235: Update copyright year to match last edit in jdk8 jdk repository for 2013
lana
parents: 21278
diff changeset
     2
 * Copyright (c) 1999, 2013, 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
{
49079
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   397
    XImage              *ximage ;
49083
673be6f60323 8197546: Fix for 8171000 breaks Solaris + Linux builds
prr
parents: 49079
diff changeset
   398
    image_region_type* reg;
673be6f60323 8197546: Fix for 8171000 breaks Solaris + Linux builds
prr
parents: 49079
diff changeset
   399
    int32_t rect;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
    ximage = XCreateImage(disp,fakeVis,(uint32_t) depth,format,0,NULL,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
                          (uint32_t)width,(uint32_t)height,8,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
49079
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   404
    ximage->data = calloc(ximage->bytes_per_line*height*((format==ZPixmap)? 1 : depth), sizeof(char));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
    ximage->bits_per_pixel = depth; /** Valid only if format is ZPixmap ***/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
49083
673be6f60323 8197546: Fix for 8171000 breaks Solaris + Linux builds
prr
parents: 49079
diff changeset
   407
    for (reg = (image_region_type *) first_in_list( regions); reg;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
         reg = (image_region_type *) next_in_list( regions))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
    {
49079
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   410
                struct my_XRegion *vis_reg = (struct my_XRegion *)(reg->visible_region);
49083
673be6f60323 8197546: Fix for 8171000 breaks Solaris + Linux builds
prr
parents: 49079
diff changeset
   411
                for (rect = 0; rect < vis_reg->numRects; rect++)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
                {
49079
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   413
                    /** ------------------------------------------------------------------------
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   414
                            Intersect bbox with visible part of region giving src rect & output
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   415
                            location.  Width is the min right side minus the max left side.
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   416
                            Similar for height.  Offset src rect so x,y are relative to
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   417
                            origin of win, not the root-relative visible rect of win.
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   418
                        ------------------------------------------------------------------------ **/
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   419
                        int32_t srcRect_width  = MIN( vis_reg->rects[rect].x2, bbox.width + bbox.x)
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   420
                                         - MAX( vis_reg->rects[rect].x1, bbox.x);
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   421
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   422
                        int32_t srcRect_height = MIN( vis_reg->rects[rect].y2, bbox.height + bbox.y)
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   423
                                         - MAX( vis_reg->rects[rect].y1, bbox.y);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
49079
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   425
                        int32_t diff = bbox.x - vis_reg->rects[rect].x1;
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   426
                        int32_t srcRect_x = MAX( 0, diff)  + (vis_reg->rects[rect].x1 - reg->x_rootrel - reg->border);
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   427
                        int32_t dst_x     = MAX( 0, -diff) ;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
49079
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   429
                        diff = bbox.y - vis_reg->rects[rect].y1;
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   430
                        int32_t srcRect_y = MAX( 0, diff)  + (vis_reg->rects[rect].y1 - reg->y_rootrel - reg->border);
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   431
                        int32_t dst_y     = MAX( 0, -diff) ;
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   432
                        XImage* reg_image = XGetImage(disp,reg->win,srcRect_x,srcRect_y,
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   433
                                            (uint32_t) srcRect_width, (uint32_t) srcRect_height,AllPlanes,format) ;
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   434
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   435
                        if (reg_image) {
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   436
                            TransferImage(disp,reg_image,srcRect_width,
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   437
                                            srcRect_height,reg,ximage,dst_x,dst_y) ;
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   438
                            XDestroyImage(reg_image);
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   439
                        }
05077701f689 8171000: Robot.createScreenCapture() crashes in wayland mode
kaddepalli
parents: 47216
diff changeset
   440
                }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
    return ximage ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
XImage *ReadAreaToImage(disp, srcRootWinid, x, y, width, height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
    numVisuals,pVisuals,numOverlayVisuals,pOverlayVisuals,numImageVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
    pImageVisuals,vis_regions,vis_image_regions,format,allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
    Window              srcRootWinid;   /* root win on which grab was done */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
    int32_t                     x;   /* root rel UL corner of bounding box of grab */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
    int32_t                     y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
    uint32_t            width;  /* size of bounding box of grab */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
    uint32_t            height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
    /** int32_t                 transparentOverlays; ***/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
    int32_t                     numVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
    XVisualInfo         *pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
    int32_t                     numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
    OverlayInfo         *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
    int32_t                     numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
    XVisualInfo         **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
    list_ptr            vis_regions;    /* list of regions to read from */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
    list_ptr            vis_image_regions ;/* list of regions to read from */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
    int32_t                     format;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
    int32_t             allImage ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
    image_region_type   *reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
    XRectangle          bbox;           /* bounding box of grabbed area */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
    int32_t             depth ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
    XImage              *ximage, *ximage_ipm ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
    Visual              fakeVis ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
    int32_t     x1, y1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
    XImage      *image;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
    unsigned char       *pmData ,  *ipmData ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
    int32_t                 transparentColor, transparentType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
    int32_t                     srcRect_x,srcRect_y,srcRect_width,srcRect_height ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
    int32_t                     diff ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
    int32_t                     dst_x, dst_y;   /* where in pixmap to write (UL) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
    int32_t                     pixel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
    bbox.x = (short) x;                 /* init X rect for bounding box */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
    bbox.y = (short) y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
    bbox.width = (unsigned short) width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
    bbox.height = (unsigned short) height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
    ximage_ipm = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
    initFakeVisual(&fakeVis) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
    depth = 24 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
    ximage = ReadRegionsInList(disp,&fakeVis,depth,format,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
             (int32_t) width, (int32_t) height, bbox,vis_regions) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
    pmData = (unsigned char *)ximage -> data ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
/* if transparency possible do it again, but this time for image planes only */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
    if (vis_image_regions && (vis_image_regions->next) && !allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
            ximage_ipm = ReadRegionsInList(disp,&fakeVis,depth,format,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
                         (int32_t) width, (int32_t) height,bbox,vis_image_regions) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
        ipmData = (unsigned char *)ximage_ipm -> data ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
/* Now tranverse the overlay visual windows and test for transparency index.  */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
/* If you find one, subsitute the value from the matching image plane pixmap. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
    for (reg = (image_region_type *) first_in_list( vis_regions); reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
         reg = (image_region_type *) next_in_list( vis_regions))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
        if (src_in_overlay( reg, numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
                                 &transparentColor, &transparentType))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
         int32_t test = 0 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
             srcRect_width  = MIN( reg->width + reg->x_vis, bbox.width + bbox.x)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
                                 - MAX( reg->x_vis, bbox.x);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
             srcRect_height = MIN( reg->height + reg->y_vis, bbox.height
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
                                 + bbox.y) - MAX( reg->y_vis, bbox.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
         diff = bbox.x - reg->x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
         srcRect_x = MAX( 0, diff) + (reg->x_vis - reg->x_rootrel - reg->border);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
         dst_x     = MAX( 0, -diff) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
             diff = bbox.y - reg->y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
             srcRect_y = MAX( 0, diff)  + (reg->y_vis - reg->y_rootrel - reg->border);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
             dst_y     = MAX( 0, -diff) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
        /* let's test some pixels for transparency */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
         image = XGetImage(disp, reg->win, srcRect_x, srcRect_y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
                           (uint32_t) srcRect_width, (uint32_t) srcRect_height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
                           0xffffffff, ZPixmap);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
        /* let's assume byte per pixel for overlay image for now */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
             if ((image->depth == 8) && (transparentType == TransparentPixel))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
             {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
                 unsigned char *pixel_ptr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
                 unsigned char *start_of_line = (unsigned char *) image->data;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
                 for (y1 = 0; y1 < srcRect_height; y1++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
                    pixel_ptr = start_of_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
                    for (x1 = 0; x1 < srcRect_width; x1++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
                    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
                        if (*pixel_ptr++ == transparentColor)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
                        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
                        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
                            *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
                            *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
                            *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
                        */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
                        pixel = (int32_t) XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
                    XPutPixel(ximage,dst_x+x1, dst_y+y1,(unsigned long)pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
                        if(!test){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
                           test = 1 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
                        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
                        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
                            pmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
                            ipmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
                        */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
                    start_of_line += image->bytes_per_line;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
                if (transparentType == TransparentPixel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
                for (y1 = 0; y1 < srcRect_height; y1++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
                      for (x1 = 0; x1 < srcRect_width; x1++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
                      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
                            int32_t pixel_value = (int32_t) XGetPixel(image, x1, y1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
                            if (pixel_value == transparentColor)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
                            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
                                *pmData++ = *ipmData++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
                        pixel = (int32_t) XGetPixel(ximage_ipm,dst_x+x1,dst_y+y1) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
                    XPutPixel(ximage,dst_x+x1, dst_y+y1,(unsigned long)pixel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
                        if(!test){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
                           test = 1 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
                            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
                                pmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
                                ipmData +=3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
                        }
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
                    for (y1 = 0; y1 < srcRect_height; y1++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
                        for (x1 = 0; x1 < srcRect_width; x1++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
                        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
                            int32_t pixel_value = (int32_t) XGetPixel(image, x1, y1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
                            if (pixel_value & transparentColor)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
                            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
                            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
                                *pmData++ = *ipmData++;
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
                            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
                     pixel = (int32_t) XGetPixel(ximage_ipm,dst_x+x1,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
                                    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
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
        XDestroyImage (image);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
      } /* end of src_in_overlay */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
    } /** end transparency **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
    if (ximage_ipm != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
        XDestroyImage(ximage_ipm);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
    destroy_region_list( vis_regions);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
    if (vis_image_regions) destroy_region_list( vis_image_regions );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
    FreeXVisualInfo(pVisuals, pOverlayVisuals, pImageVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
    XSync(disp, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
    return ximage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
        Creates a list of the subwindows of a given window which have a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
        different visual than their parents.  The function is recursive.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
        This list is used in make_region_list(), which coalesces the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
        windows with the same visual into a region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
        image_wins must point to an existing list struct that's already
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
        been zeroed (zero_list()).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
static void make_src_list( disp, image_wins, bbox, curr, x_rootrel, y_rootrel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
                    curr_attrs, pclip)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
    list_ptr            image_wins;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
    XRectangle          *bbox;                  /* bnding box of area we want */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
    Window              curr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
    int32_t                     x_rootrel;              /* pos of curr WRT root */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
    int32_t                     y_rootrel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
    XWindowAttributes   *curr_attrs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
    XRectangle          *pclip;                 /* visible part of curr, not */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
                                                /* obscurred by ancestors */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
    XWindowAttributes child_attrs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
    Window root, parent, *child;        /* variables for XQueryTree() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
    Window *save_child_list;            /* variables for XQueryTree() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
    uint32_t nchild;            /* variables for XQueryTree() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
    XRectangle child_clip;              /* vis part of child */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
    int32_t curr_clipX, curr_clipY, curr_clipRt, curr_clipBt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
    /* check that win is mapped & not outside bounding box */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
    if (curr_attrs->map_state == IsViewable &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
        curr_attrs->class == InputOutput &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
        !( pclip->x >= (bbox->x + bbox->width)  ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
           pclip->y >= (bbox->y + bbox->height) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
           (pclip->x + pclip->width)  <= bbox->x        ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
           (pclip->y + pclip->height) <= bbox->y)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
        XQueryTree( disp, curr, &root, &parent, &child, &nchild );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
        save_child_list = child;      /* so we can free list when we're done */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
        add_window_to_list( image_wins, curr, x_rootrel, y_rootrel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
                            (int32_t) pclip->x, (int32_t) pclip->y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
                            (int32_t) pclip->width, (int32_t) pclip->height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
                            curr_attrs->border_width,curr_attrs->visual,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
                            curr_attrs->colormap, parent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
        set RR coords of right (Rt), left (X), bottom (Bt) and top (Y)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
        of rect we clip all children by.  This is our own clip rect (pclip)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
        inflicted on us by our parent plus our own borders.  Within the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
        child loop, we figure the clip rect for each child by adding in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
        it's rectangle (not taking into account the child's borders).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
        curr_clipX = MAX( pclip->x, x_rootrel + curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
        curr_clipY = MAX( pclip->y, y_rootrel + curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
        curr_clipRt = MIN(pclip->x + pclip->width,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
                                  x_rootrel + curr_attrs->width + 2 * curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
        curr_clipBt = MIN(pclip->y + pclip->height,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
                                  y_rootrel + curr_attrs->height + 2 * curr_attrs->border_width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
        while (nchild--) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
            int32_t new_width, new_height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
            int32_t child_xrr, child_yrr;       /* root relative x & y of child */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
            XGetWindowAttributes( disp, *child, &child_attrs);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
            /* intersect parent & child clip rects */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
            child_xrr = x_rootrel + child_attrs.x + curr_attrs->border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
            child_clip.x = (short) MAX( curr_clipX, child_xrr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
            new_width = MIN(curr_clipRt,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
                        child_xrr + child_attrs.width +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
                         2 * child_attrs.border_width) - child_clip.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
            if (new_width >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
                child_clip.width = (unsigned short) new_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
                child_yrr = y_rootrel + child_attrs.y +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
                            curr_attrs->border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
                child_clip.y = (short) MAX( curr_clipY, child_yrr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
                new_height = MIN(curr_clipBt,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
                                         child_yrr + (int32_t) child_attrs.height +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
                                         2 * child_attrs.border_width) - child_clip.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
                if (new_height >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
                    child_clip.height = (unsigned short) new_height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
                    make_src_list( disp, image_wins, bbox, *child,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
                                   child_xrr, child_yrr,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
                                   &child_attrs, &child_clip);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
            child++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
        XFree( save_child_list);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
        This function creates a list of regions which tile a specified
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
        window.  Each region contains all visible portions of the window
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
        which are drawn with the same visual.  For example, if the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
        window consists of subwindows of two different visual types,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
        there will be two regions in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
        Returns a pointer to the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
static list_ptr make_region_list( disp, win, bbox, hasNonDefault,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
                             numImageVisuals, pImageVisuals, allImage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
    Display             *disp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
    Window              win;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
    XRectangle          *bbox;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
    int32_t             *hasNonDefault;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
    int32_t                     numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
    XVisualInfo         **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
    int32_t                     *allImage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
    XWindowAttributes   win_attrs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
    list                image_wins;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
    list_ptr            image_regions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
    list_ptr            srcs_left;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
    image_region_type   *new_reg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
    image_win_type      *base_src, *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
    Region              bbox_region = XCreateRegion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
    XRectangle          clip;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
    int32_t                     image_only;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
    int32_t                 count=0 ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
    *hasNonDefault = False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
    XUnionRectWithRegion( bbox, bbox_region, bbox_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
    XGetWindowAttributes( disp, win, &win_attrs);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
    zero_list( &image_wins);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
    clip.x = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
    clip.y = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
    clip.width  = (unsigned short) win_attrs.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
    clip.height = (unsigned short) win_attrs.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
    make_src_list( disp, &image_wins, bbox, win,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
                   0 /* x_rootrel */, 0 /* y_rootrel */, &win_attrs, &clip);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
    image_regions = new_list();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
    image_only = (*allImage) ? True:False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
    for (base_src = (image_win_type *) first_in_list( &image_wins); base_src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
         base_src = (image_win_type *) next_in_list( &image_wins))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
        /* test for image visual */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
        if (!image_only || src_in_image(base_src, numImageVisuals, pImageVisuals))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
            /* find a window whose visual hasn't been put in list yet */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
            if (!src_in_region_list( base_src, image_regions))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
                if (! (new_reg = (image_region_type *)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
                                        malloc( sizeof( image_region_type)))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
                    return (list_ptr) NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
                count++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
                new_reg->visible_region = XCreateRegion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
                new_reg->win            = base_src->win;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
                new_reg->vis            = base_src->vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
                new_reg->cmap           = base_src->cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
                new_reg->x_rootrel      = base_src->x_rootrel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
                new_reg->y_rootrel      = base_src->y_rootrel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
                new_reg->x_vis          = base_src->x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
                new_reg->y_vis          = base_src->y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
                new_reg->width          = base_src->width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
                new_reg->height         = base_src->height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
                new_reg->border         = base_src->border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
                srcs_left = (list_ptr) dup_list_head( &image_wins, START_AT_CURR);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
                for (src = (image_win_type *) first_in_list( srcs_left); src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
                     src = (image_win_type *) next_in_list( srcs_left)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
                    if (SAME_REGIONS( base_src, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
                        add_rect_to_image_region( new_reg, src->x_vis, src->y_vis,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
                                                  src->width, src->height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
                    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
                        if (!image_only || src_in_image(src, numImageVisuals, pImageVisuals))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
                        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
                            subtr_rect_from_image_region( new_reg, src->x_vis,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
                                          src->y_vis, src->width, src->height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
                XIntersectRegion( bbox_region, new_reg->visible_region,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
                                  new_reg->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
                if (! XEmptyRegion( new_reg->visible_region)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
                    add_to_list( image_regions, new_reg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   823
                    if (new_reg->vis != DefaultVisualOfScreen( win_attrs.screen) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
                        new_reg->cmap != DefaultColormapOfScreen(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
                                                            win_attrs.screen)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
                        *hasNonDefault = True;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
                else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
                    XDestroyRegion( new_reg->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
                    free( (void *) new_reg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
        } else *allImage = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
    delete_list( &image_wins, True);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
    XDestroyRegion( bbox_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
    return image_regions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
        Destructor called from destroy_region_list().
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
void destroy_image_region( image_region)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
    image_region_type *image_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
    XDestroyRegion( image_region->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
    free( (void *) image_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
        Destroys the region list, destroying all the regions contained in it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
static void destroy_region_list( rlist)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
    list_ptr rlist;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
    delete_list_destroying( rlist, (DESTRUCT_FUNC_PTR)destroy_image_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
        Subtracts the specified rectangle from the region in image_region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
        First converts the rectangle to a region of its own, since X
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
        only provides a way to subtract one region from another, not a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
        rectangle from a region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
static void subtr_rect_from_image_region( image_region, x, y, width, height)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
    image_region_type *image_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
    int32_t x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
    int32_t y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
    int32_t width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
    int32_t height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
    XRectangle rect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
    Region rect_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
    rect_region = XCreateRegion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
    rect.x = (short)x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
    rect.y = (short)y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
    rect.width = (unsigned short)width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
    rect.height = (unsigned short)height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
    XUnionRectWithRegion( &rect, rect_region, rect_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
    XSubtractRegion( image_region->visible_region, rect_region,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
                     image_region->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
    XDestroyRegion( rect_region);
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
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
        Adds the specified rectangle to the region in image_region.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
static void add_rect_to_image_region( image_region, x, y, width, height)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
    image_region_type *image_region;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
    int32_t x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
    int32_t y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
    int32_t width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
    int32_t height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
    XRectangle rect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
    rect.x = (short) x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
    rect.y = (short) y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
    rect.width = (unsigned short) width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
    rect.height = (unsigned short) height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
    XUnionRectWithRegion( &rect, image_region->visible_region,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
                          image_region->visible_region);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
        Returns TRUE if the given src's visual is already represented in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
        the image_regions list, FALSE otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
static int32_t src_in_region_list( src, image_regions)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
    image_win_type *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
    list_ptr image_regions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
    image_region_type   *ir;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
    for (ir = (image_region_type *) first_in_list( image_regions); ir;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
         ir = (image_region_type *) next_in_list( image_regions)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
        if (SAME_REGIONS( ir, src)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
            return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
        Makes a new entry in image_wins with the given fields filled in.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
static void add_window_to_list( image_wins, w, xrr, yrr, x_vis, y_vis,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
                                width, height, border_width,vis, cmap, parent)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
    list_ptr    image_wins;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
    Window      w;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
    int32_t             xrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
    int32_t     yrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
    int32_t             x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
    int32_t     y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
    int32_t     width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
    int32_t     height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
    int32_t     border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
    Visual      *vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
    Colormap    cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
    Window      parent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
    image_win_type      *new_src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
    if ((new_src = (image_win_type *) malloc( sizeof( image_win_type))) == NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
    new_src->win = w;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
    new_src->x_rootrel = xrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
    new_src->y_rootrel = yrr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
    new_src->x_vis = x_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
    new_src->y_vis = y_vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
    new_src->width = width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
    new_src->height = height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
    new_src->border_width = border_width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
    new_src->vis = vis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
    new_src->cmap = cmap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
    new_src->parent = parent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
    add_to_list( image_wins, new_src);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
        Returns TRUE if the given src's visual is in the image planes,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
        FALSE otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
static int32_t src_in_image( src, numImageVisuals, pImageVisuals)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
    image_win_type      *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
    int32_t                     numImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
    XVisualInfo         **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
    int32_t             i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
    for (i = 0 ; i < numImageVisuals ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
        if (pImageVisuals[i]->visual == src->vis)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
            return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
/** ------------------------------------------------------------------------
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
        Returns TRUE if the given src's visual is in the overlay planes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
        and transparency is possible, FALSE otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
    ------------------------------------------------------------------------ **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
static int32_t src_in_overlay( src, numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
                        transparentColor, transparentType)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
    image_region_type   *src;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
    int32_t                     numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
    OverlayInfo         *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
    int32_t                     *transparentColor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
    int32_t                     *transparentType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
    int32_t             i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
    for (i = 0 ; i < numOverlayVisuals ; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
        if (((pOverlayVisuals[i].pOverlayVisualInfo)->visual == src->vis)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
                && (pOverlayVisuals[i].transparentType != None))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
            *transparentColor = pOverlayVisuals[i].value;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
            *transparentType = pOverlayVisuals[i].transparentType;
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
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
        else {
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
    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
/********************** from wsutils.c ******************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
/******************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
 * This file contains a set of example utility procedures; procedures that can
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
 * help a "window-smart" Starbase or PHIGS program determine information about
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
 * a device, and create image and overlay plane windows.  To use these
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
 * utilities, #include "wsutils.h" and compile this file and link the results
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
 * with your program.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
 ******************************************************************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
#define STATIC_GRAY     0x01
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
#define GRAY_SCALE      0x02
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
#define PSEUDO_COLOR    0x04
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
#define TRUE_COLOR      0x10
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
#define DIRECT_COLOR    0x11
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
static int32_t  weCreateServerOverlayVisualsProperty = False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
/******************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
 * GetXVisualInfo()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
 * This routine takes an X11 Display, screen number, and returns whether the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
 * screen supports transparent overlays and three arrays:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
 *      1) All of the XVisualInfo struct's for the screen.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
 *      2) All of the OverlayInfo struct's for the screen.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
 *      3) An array of pointers to the screen's image plane XVisualInfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1055
 *         structs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
 * The code below obtains the array of all the screen's visuals, and obtains
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
 * the array of all the screen's overlay visual information.  It then processes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
 * the array of the screen's visuals, determining whether the visual is an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
 * overlay or image visual.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
 * If the routine sucessfully obtained the visual information, it returns zero.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
 * If the routine didn't obtain the visual information, it returns non-zero.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
 ******************************************************************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
int32_t GetXVisualInfo(display, screen, transparentOverlays,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
                   numVisuals, pVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
                   numOverlayVisuals, pOverlayVisuals,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
                   numImageVisuals, pImageVisuals)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
    Display     *display;                   /* Which X server (aka "display"). */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
    int32_t             screen;                 /* Which screen of the "display". */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
    int32_t             *transparentOverlays;   /* Non-zero if there's at least one
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
                                         * overlay visual and if at least one
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
                                         * of those supports a transparent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
                                         * pixel. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
    int32_t             *numVisuals;            /* Number of XVisualInfo struct's
28059
e576535359cc 8067377: My hobby: caning, then then canning, the the can-can
martin
parents: 26751
diff changeset
  1079
                                         * pointed to by pVisuals. */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
    XVisualInfo **pVisuals;             /* All of the device's visuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
    int32_t             *numOverlayVisuals;     /* Number of OverlayInfo's pointed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
                                         * to by pOverlayVisuals.  If this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
                                         * number is zero, the device does
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
                                         * not have overlay planes. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
    OverlayInfo **pOverlayVisuals;      /* The device's overlay plane visual
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
                                         * information. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1087
    int32_t             *numImageVisuals;       /* Number of XVisualInfo's pointed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
                                         * to by pImageVisuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
    XVisualInfo ***pImageVisuals;       /* The device's image visuals. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
{
21278
ef8a3a2a72f2 8022746: List of spelling errors in API doc
malenkov
parents: 5506
diff changeset
  1091
    XVisualInfo getVisInfo;             /* Parameters of XGetVisualInfo */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
    int32_t             mask;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
    XVisualInfo *pVis, **pIVis;         /* Faster, local copies */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
    OverlayInfo *pOVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
    OverlayVisualPropertyRec    *pOOldVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
    int32_t             nVisuals, nOVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
    Atom        overlayVisualsAtom;     /* Parameters for XGetWindowProperty */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
    Atom        actualType;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1099
    unsigned long numLongs, bytesAfter;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
    int32_t             actualFormat;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1101
    int32_t             nImageVisualsAlloced;   /* Values to process the XVisualInfo */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1102
    int32_t             imageVisual;            /* array */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1103
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1104
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
    /* First, get the list of visuals for this screen. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
    getVisInfo.screen = screen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
    mask = VisualScreenMask;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1108
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
    *pVisuals = XGetVisualInfo(display, mask, &getVisInfo, numVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
    if ((nVisuals = *numVisuals) <= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1111
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
        /* Return that the information wasn't sucessfully obtained: */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1113
        return(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1115
    pVis = *pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1116
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1117
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1118
    /* Now, get the overlay visual information for this screen.  To obtain
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1119
     * this information, get the SERVER_OVERLAY_VISUALS property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1120
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1121
    overlayVisualsAtom = XInternAtom(display, "SERVER_OVERLAY_VISUALS", True);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
    if (overlayVisualsAtom != None)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
        /* Since the Atom exists, we can request the property's contents.  The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1125
         * do-while loop makes sure we get the entire list from the X server.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1127
        bytesAfter = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1128
        numLongs = sizeof(OverlayVisualPropertyRec) / 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1129
        do
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1130
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1131
            numLongs += bytesAfter * 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1132
            XGetWindowProperty(display, RootWindow(display, screen),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
                               overlayVisualsAtom, 0, numLongs, False,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
                               overlayVisualsAtom, &actualType, &actualFormat,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
                               &numLongs, &bytesAfter, (unsigned char**) pOverlayVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
        } while (bytesAfter > 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1137
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1138
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1139
        /* Calculate the number of overlay visuals in the list. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1140
        /* *numOverlayVisuals = numLongs / (sizeof(OverlayVisualPropertyRec) / 4); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1141
        *numOverlayVisuals = numLongs / (sizeof(OverlayVisualPropertyRec) / sizeof(long));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
        /* This screen doesn't have overlay planes. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
        *numOverlayVisuals = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
        *pOverlayVisuals = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1148
        *transparentOverlays = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1149
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1150
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1151
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1152
    /* Process the pVisuals array. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1153
    *numImageVisuals = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
    nImageVisualsAlloced = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
    pIVis = *pImageVisuals = (XVisualInfo **) malloc(sizeof(XVisualInfo *));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1156
    while (--nVisuals >= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1157
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1158
        nOVisuals = *numOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1159
        pOVis = *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1160
        imageVisual = True;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1161
        while (--nOVisuals >= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1162
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1163
            pOOldVis = (OverlayVisualPropertyRec *) pOVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1164
            if (pVis->visualid == pOOldVis->visualID)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1165
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1166
                imageVisual = False;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1167
                pOVis->pOverlayVisualInfo = pVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1168
                if (pOVis->transparentType == TransparentPixel)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1169
                    *transparentOverlays = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1170
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1171
            pOVis++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1172
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1173
        if (imageVisual)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1174
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1175
            if ((*numImageVisuals += 1) > nImageVisualsAlloced)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1176
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1177
                nImageVisualsAlloced++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1178
                *pImageVisuals = (XVisualInfo **)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1179
                    realloc(*pImageVisuals, (nImageVisualsAlloced * sizeof(XVisualInfo *)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1180
                pIVis = *pImageVisuals + (*numImageVisuals - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1181
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1182
            *pIVis++ = pVis;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1183
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1184
        pVis++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1185
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1186
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1187
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1188
    /* Return that the information was sucessfully obtained: */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1189
    return(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1190
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1191
} /* GetXVisualInfo() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1192
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1193
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1194
/******************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1195
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1196
 * FreeXVisualInfo()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1197
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1198
 * This routine frees the data that was allocated by GetXVisualInfo().
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1199
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1200
 ******************************************************************************/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1201
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
void FreeXVisualInfo(pVisuals, pOverlayVisuals, pImageVisuals)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1204
    XVisualInfo *pVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1205
    OverlayInfo *pOverlayVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1206
    XVisualInfo **pImageVisuals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1207
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1208
    XFree(pVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1209
    if (weCreateServerOverlayVisualsProperty)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1210
        free(pOverlayVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1211
    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1212
        XFree(pOverlayVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1213
    free(pImageVisuals);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1214
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1215
} /* FreeXVisualInfo() */