找回密码
 注册
查看: 505|回复: 0

这段例程为什么在高版本Linux上有错,请大家进来看看!

[复制链接]
发表于 2005-9-25 18:51:40 | 显示全部楼层 |阅读模式
今天看了一段xview中的例子,编译可过,但运行时CMS_TYPE选择为XV_STATIC_CMS时正确,选择为XV_DYNAMIC_CMS,出现如下错误:
Can not allocate a read/write cms from a static visual (Color package)
XView error: NULL pointer passed to xv_set
此外,这段代码在linux6.0上运行是正确的,请各位诊断一下!代码如下:

/*
*         xv_colors.c
*        This simple application demonstates the use of the XView color
*        API. The colormap segment can be created in a combination of the
*        following ways:
*        - static or dynamic
*        - control or non-control
*        - using named colors or RGB values
*/       
#include  <stdio.h>
#include  <xview/xview.h>
#include  <xview/canvas.h>
#include  <xview/cms.h>
#include  <X11/Xlib.h>
#include  <xview/xv_xrect.h>

#define CHIP_WIDTH        50
#define CHIP_HEIGHT        50

/* color definitions */
#define GRAY            0
#define YELLOW          1
#define PINK            2
#define VIOLET          3
#define RED             4
#define GREEN           5
#define BLACK           6
#define BLUE            7
#define NUM_COLORS      8

unsigned long                 *index_table;
unsigned long                cms_size;

main(argc, argv)
int argc;
char **argv;
{
    Frame                  frame;
    Canvas                canvas;
    Cms                        cms;
    short                dynamic_colors = FALSE;
    short                control_cms = FALSE;
    short                named_colors = FALSE;
    short                print_colors = FALSE;
    int                        i;
    Xv_Singlecolor      *cms_colors;
    XColor              *cms_x_colors;
    Xv_Singlecolor      colors[NUM_COLORS];
    void                canvas_repaint_proc();


    while (--argc) {
        switch (**(++argv)) {
            case 'c':
            case 'C':
                control_cms = TRUE;
                printf("Control cms set \n");
                break;
       
            case 'd':
            case 'D':
                dynamic_colors = TRUE;
                printf("Dynamic color set \n");
                break;

            case 'n':
            case 'N':
                named_colors = TRUE;
                printf("Named colors set \n");
                break;

            case 'p':
            case 'P':
                print_colors = TRUE;
                printf("Print colors set \n");
                break;
            
            default:
                break;
        }
    }

    printf("\n");

    xv_init(XV_INIT_ARGS, argc, argv, 0);

    frame = xv_create(0, FRAME,
                XV_LABEL, "XView Colors",
                0);

    /* create the colormap segment based on flags */
    cms  = xv_create(0, CMS,
                CMS_TYPE,
                    (dynamic_colors == TRUE) ? XV_DYNAMIC_CMS : XV_STATIC_CMS,
                CMS_CONTROL_CMS, control_cms,
                CMS_SIZE,
                    control_cms ? NUM_COLORS + CMS_CONTROL_COLORS : NUM_COLORS,
                NULL);

    if (named_colors == TRUE) {
        xv_set(cms,
            CMS_NAMED_COLORS,
                "gray",
                "yellow",
                "pink",
                "violet",
                "red",
                "green",
                "black",
                "blue",
                NULL,
            NULL);
    } else {
        initialize_colors(colors);
        xv_set(cms, CMS_COLORS, colors, NULL);
    }

    /*
     * the frame height is adjusted based on the number of colors
     * to be displayed
     */
    cms_size = (unsigned long)xv_get(cms, CMS_SIZE);
    printf("Cms size = %d\n", (int)cms_size);
    xv_set(frame,
        WIN_WIDTH, CHIP_WIDTH * 3,
        WIN_HEIGHT, (cms_size + 2) * CHIP_HEIGHT,
        0);

    /* conversion table for pixel values from XView to X11 */
    index_table = (unsigned long *)xv_get(cms, CMS_INDEX_TABLE);

    if (print_colors == TRUE) {
        /*
         * Colormap segment RGB values can be set or retreived either as
         * an array of Xv_Singlecolor or XColor.
         */
        cms_colors = (Xv_Singlecolor *)malloc(cms_size * sizeof(Xv_Singlecolor));
        cms_colors = (Xv_Singlecolor *)xv_get(cms, CMS_COLORS, cms_colors);
        printf("Cms colors: \n");
        for(i = 0; i <= cms_size - 1; i++)
            printf("%d  %d  %d \n", (int)(cms_colors + i)->red,
                (int)(cms_colors + i)->green,
                (int)(cms_colors + i)->blue);
        free(cms_colors);
        printf("\n");
   
        cms_x_colors = (XColor *)malloc(cms_size * sizeof(XColor));
        cms_x_colors = (XColor *)xv_get(cms, CMS_X_COLORS, cms_x_colors);
        printf("Cms XColors: \n");
        for(i = 0; i <= cms_size - 1; i++)
            printf("%d  %d  %d \n", (int)(cms_x_colors + i)->red,
                    (int)(cms_x_colors + i)->green,
                        (int)(cms_x_colors + i)->blue);
        free(cms_x_colors);
        printf("\n");
    }
   
    canvas = xv_create(frame, CANVAS,
/*                WIN_DYNAMIC_VISUAL, dynamic_colors,   */
                XV_VISUAL_CLASS, PseudoColor,
                CANVAS_REPAINT_PROC, canvas_repaint_proc,
                CANVAS_X_PAINT_WINDOW, TRUE,
                WIN_CMS, cms,
                0);

    window_fit(frame);
    xv_main_loop(frame);
    return(0);
}

/*
*              canvas_repaint_proc()
*      Draws onto the canvas using Xlib drawing functions.
*/
void
canvas_repaint_proc(canvas, pw, display, xid, xrects)
    Canvas      canvas;
    Xv_Window   pw;
    Display     *display;
    Window      xid;
    Xv_xrectlist *xrects;
{
        static GC        gc = NULL;
        XGCValues       gcvalues;
            int             gcvaluemask;
        register int        i;

        if (gc == NULL) {
                /* setup gc for rendering colors */
                gcvalues.function = GXcopy;
                gcvalues.fill_style = FillSolid;
                gcvaluemask = GCFunction | GCFillStyle;

                gc = XCreateGC(display, xid, gcvaluemask, &gcvalues);
                if(gc == NULL) {
                fprintf(stderr, "XCreateGC failed ... exiting... \n");
                    exit(1);
                }
        }

        for (i = 0; i <= cms_size - 1; i++) {
            XSetForeground(display, gc, index_table);
            XFillRectangle(display, xid, gc, CHIP_WIDTH,
                CHIP_HEIGHT * (i + 1), CHIP_WIDTH, CHIP_HEIGHT);
        }
}


initialize_colors(colors)
    Xv_Singlecolor        *colors;
{
    colors[GRAY].red = 220;   
    colors[GRAY].green = 220;   
    colors[GRAY].blue = 220;

    colors[YELLOW].red = 255;
    colors[YELLOW].green = 255;
    colors[YELLOW].blue = 0;

    colors[PINK].red = 188;   
    colors[PINK].green = 143;   
    colors[PINK].blue = 143;

    colors[VIOLET].red = 159;
    colors[VIOLET].green = 95;  
    colors[VIOLET].blue = 159;

    colors[RED].red = 255;   
    colors[RED].green = 0;      
    colors[RED].blue = 0;

    colors[GREEN].red = 0;   
    colors[GREEN].green = 255;  
    colors[GREEN].blue = 0;

    colors[BLACK].red = 0;   
    colors[BLACK].green = 0;   
    colors[BLACK].blue = 0;

    colors[BLUE].red = 0;     
    colors[BLUE].green = 0;     
    colors[BLUE].blue = 255;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-7 23:51 , Processed in 0.024228 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表