Exemple #1
0
int video_resources_chip_init(const char *chipname,
                              struct video_canvas_s **canvas,
                              video_chip_cap_t *video_chip_cap)
{
    unsigned int i;

    video_render_initconfig((*canvas)->videoconfig);
    (*canvas)->videoconfig->cap = video_chip_cap;

    (*canvas)->videoconfig->chip_name = lib_stralloc(chipname);

    /* Set single size render as default.  */
    (*canvas)->videoconfig->rendermode = video_chip_cap->single_mode.rmode;
    (*canvas)->videoconfig->doublesizex
        = video_chip_cap->single_mode.sizex > 1 ? 1 : 0;
    (*canvas)->videoconfig->doublesizey
        = video_chip_cap->single_mode.sizey > 1 ? 1 : 0;

    /* CHIPDoubleScan */
    if (video_chip_cap->dscan_allowed != 0) {
        resources_chip_scan[0].name
            = util_concat(chipname, vname_chip_scan[0], NULL);
        resources_chip_scan[0].value_ptr
            = &((*canvas)->videoconfig->doublescan);
        resources_chip_scan[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_scan) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_scan[0].name));
    }

    if (video_chip_cap->hwscale_allowed != 0) {
        resources_chip_hwscale[0].name
            = util_concat(chipname, vname_chip_hwscale[0], NULL);
        resources_chip_hwscale[0].value_ptr
            = &((*canvas)->videoconfig->hwscale);
        resources_chip_hwscale[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_hwscale) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_hwscale[0].name));
    }

    /* CHIPDoubleSize */
    if (video_chip_cap->dsize_allowed != 0) {
        resources_chip_size[0].name
            = util_concat(chipname, vname_chip_size[0], NULL);
        resources_chip_size[0].factory_value
            = video_chip_cap->dsize_default;
        resources_chip_size[0].value_ptr
            = &((*canvas)->videoconfig->double_size_enabled);
        resources_chip_size[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_size) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_size[0].name));
    }

    if (video_chip_cap->fullscreen.device_num > 0) {
        video_resource_chip_mode_t *resource_chip_mode;

        resources_chip_fullscreen_int[0].name
            = util_concat(chipname, vname_chip_fullscreen[0], NULL);
        resources_chip_fullscreen_int[0].value_ptr
            = &((*canvas)->videoconfig->fullscreen_enabled);
        resources_chip_fullscreen_int[0].param = (void *)*canvas;

        resources_chip_fullscreen_int[1].name
            = util_concat(chipname, vname_chip_fullscreen[1], NULL);
        resources_chip_fullscreen_int[1].value_ptr
            = &((*canvas)->videoconfig->fullscreen_statusbar_enabled);
        resources_chip_fullscreen_int[1].param = (void *)*canvas;

        resources_chip_fullscreen_string[0].name
            = util_concat(chipname, vname_chip_fullscreen[2], NULL);
        resources_chip_fullscreen_string[0].factory_value
            = video_chip_cap->fullscreen.device_name[0];
        resources_chip_fullscreen_string[0].value_ptr
            = &((*canvas)->videoconfig->fullscreen_device);
        resources_chip_fullscreen_string[0].param = (void *)*canvas;

        if (resources_register_string(resources_chip_fullscreen_string) < 0) {
            return -1;
        }

        if (resources_register_int(resources_chip_fullscreen_int) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_fullscreen_int[0].name));
        lib_free((char *)(resources_chip_fullscreen_int[1].name));
        lib_free((char *)(resources_chip_fullscreen_string[0].name));

        for (i = 0; i < video_chip_cap->fullscreen.device_num; i++) {
            /* FIXME: memory leak! */
            resource_chip_mode = lib_malloc(sizeof(video_resource_chip_mode_t));
            resource_chip_mode->resource_chip = *canvas;
            resource_chip_mode->device = i;

            resources_chip_fullscreen_mode[0].name
                = util_concat(chipname,
                    video_chip_cap->fullscreen.device_name[i],
                    vname_chip_fullscreen_mode[0], NULL);
            resources_chip_fullscreen_mode[0].value_ptr
                = &((*canvas)->videoconfig->fullscreen_mode[i]);
            resources_chip_fullscreen_mode[0].param
                = (void *)resource_chip_mode;

            if (resources_register_int(resources_chip_fullscreen_mode) < 0) {
                return -1;
            }

            lib_free((char *)(resources_chip_fullscreen_mode[0].name));
        }
    }

    /* Palette related */
    resources_chip_palette_string[0].name
        = util_concat(chipname, vname_chip_palette[0], NULL);
    resources_chip_palette_string[0].factory_value
        = video_chip_cap->external_palette_name;
    resources_chip_palette_string[0].value_ptr
        = &((*canvas)->videoconfig->external_palette_name);
    resources_chip_palette_string[0].param = (void *)*canvas;

    if (video_chip_cap->internal_palette_allowed != 0) {
        resources_chip_palette_int[0].name
            = util_concat(chipname, vname_chip_palette[1], NULL);
        resources_chip_palette_int[0].value_ptr
            = &((*canvas)->videoconfig->external_palette);
        resources_chip_palette_int[0].param = (void *)*canvas;
    } else {
        resources_chip_palette_int[0].name = NULL;
        (*canvas)->videoconfig->external_palette = 1;
    }

    if (resources_register_string(resources_chip_palette_string) < 0) {
        return -1;
    }

    if (resources_register_int(resources_chip_palette_int) < 0) {
        return -1;
    }

    lib_free((char *)(resources_chip_palette_string[0].name));
    if (video_chip_cap->internal_palette_allowed != 0) {
        lib_free((char *)(resources_chip_palette_int[0].name));
    }

    /* double buffering */
    if (video_chip_cap->double_buffering_allowed != 0) {
        resources_chip_double_buffer[0].name
            = util_concat(chipname, vname_chip_double_buffer[0], NULL);
        resources_chip_double_buffer[0].value_ptr
            = &((*canvas)->videoconfig->double_buffer);
        resources_chip_double_buffer[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_double_buffer) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_double_buffer[0].name));
    }

    /* palette generator */
    i = 0; while (vname_chip_colors[i]) {
        resources_chip_colors[i].name = util_concat(chipname, vname_chip_colors[i], NULL);
        resources_chip_colors[i].param = (void *)*canvas;
        ++i;
    }
    resources_chip_colors[0].value_ptr = &((*canvas)->videoconfig->video_resources.color_saturation);
    resources_chip_colors[1].value_ptr = &((*canvas)->videoconfig->video_resources.color_contrast);
    resources_chip_colors[2].value_ptr = &((*canvas)->videoconfig->video_resources.color_brightness);
    resources_chip_colors[3].value_ptr = &((*canvas)->videoconfig->video_resources.color_gamma);
    resources_chip_colors[4].value_ptr = &((*canvas)->videoconfig->video_resources.color_tint);

    if (resources_register_int(resources_chip_colors) < 0) {
        return -1;
    }

    i = 0; while (vname_chip_colors[i]) {
        lib_free((char *)(resources_chip_colors[i].name));
        ++i;
    }

    /* crt emulation */
    i = 0; while (vname_chip_crtemu[i]) {
        resources_chip_crtemu[i].name = util_concat(chipname, vname_chip_crtemu[i], NULL);
        resources_chip_crtemu[i].param = (void *)*canvas;
        ++i;
    }
    resources_chip_crtemu[0].value_ptr = &((*canvas)->videoconfig->video_resources.pal_scanlineshade);
    resources_chip_crtemu[1].value_ptr = &((*canvas)->videoconfig->video_resources.pal_blur);
    resources_chip_crtemu[2].value_ptr = &((*canvas)->videoconfig->video_resources.pal_oddlines_phase);
    resources_chip_crtemu[3].value_ptr = &((*canvas)->videoconfig->video_resources.pal_oddlines_offset);
    resources_chip_crtemu[4].value_ptr = &((*canvas)->videoconfig->video_resources.audioleak);

    if (resources_register_int(resources_chip_crtemu) < 0) {
        return -1;
    }

    i = 0; while (vname_chip_crtemu[i]) {
        lib_free((char *)(resources_chip_crtemu[i].name));
        ++i;
    }

    /* CHIPFilter */
    resources_chip_rendermode[0].name
        = util_concat(chipname, vname_chip_rendermode[0], NULL);
    resources_chip_rendermode[0].value_ptr
        = &((*canvas)->videoconfig->filter);
    resources_chip_rendermode[0].param = (void *)*canvas;
    if (resources_register_int(resources_chip_rendermode) < 0) {
        return -1;
    }

    lib_free((char *)(resources_chip_rendermode[0].name));

    return 0;
}
Exemple #2
0
int video_resources_chip_init(const char *chipname,
                              struct video_canvas_s **canvas,
                              video_chip_cap_t *video_chip_cap)
{
    unsigned int i;
    
    DBG(("video_resources_chip_init (%s) (canvas:%p) (cap:%p)", chipname, *canvas, video_chip_cap));

    video_render_initconfig((*canvas)->videoconfig);
    (*canvas)->videoconfig->cap = video_chip_cap;

    (*canvas)->videoconfig->chip_name = lib_stralloc(chipname);

    /* Set single size render as default.  */
    (*canvas)->videoconfig->rendermode = video_chip_cap->single_mode.rmode;
    (*canvas)->videoconfig->scalex
        = video_chip_cap->single_mode.sizex > 1 ? 2 : 1;
    (*canvas)->videoconfig->scaley
        = video_chip_cap->single_mode.sizey > 1 ? 2 : 1;

    /* CHIPDoubleScan */
    if (video_chip_cap->dscan_allowed != 0) {
        if (machine_class != VICE_MACHINE_VSID) {
            resources_chip_scan[0].name
                = util_concat(chipname, vname_chip_scan[0], NULL);
            resources_chip_scan[0].value_ptr
                = &((*canvas)->videoconfig->doublescan);
            resources_chip_scan[0].param = (void *)*canvas;
            if (resources_register_int(resources_chip_scan) < 0) {
                return -1;
            }

            lib_free((char *)(resources_chip_scan[0].name));
        } else {
            set_double_scan_enabled(0, (void *)*canvas);
        }
    }

    if (video_chip_cap->hwscale_allowed != 0) {
        if (machine_class != VICE_MACHINE_VSID) {
            resources_chip_hwscale[0].name
                = util_concat(chipname, vname_chip_hwscale[0], NULL);
            resources_chip_hwscale[0].value_ptr
                = &((*canvas)->videoconfig->hwscale);
            resources_chip_hwscale[0].param = (void *)*canvas;
            if (resources_register_int(resources_chip_hwscale) < 0) {
                return -1;
            }

            lib_free((char *)(resources_chip_hwscale[0].name));
        } else {
            set_hwscale_enabled(0, (void *)*canvas);
        }
    }

    /* CHIPDoubleSize */
    if (video_chip_cap->dsize_allowed != 0) {
        if (machine_class != VICE_MACHINE_VSID) {
            resources_chip_size[0].name
                = util_concat(chipname, vname_chip_size[0], NULL);
            resources_chip_size[0].factory_value
                = video_chip_cap->dsize_default;
            resources_chip_size[0].value_ptr
                = &((*canvas)->videoconfig->double_size_enabled);
            resources_chip_size[0].param = (void *)*canvas;
            if (resources_register_int(resources_chip_size) < 0) {
                return -1;
            }

            lib_free((char *)(resources_chip_size[0].name));
        } else {
            set_double_size_enabled(0, (void *)*canvas);
        }
    }

    if (video_chip_cap->fullscreen.device_num > 0) {
        video_resource_chip_mode_t *resource_chip_mode;

        if (machine_class != VICE_MACHINE_VSID) {
            resources_chip_fullscreen_int[0].name
                = util_concat(chipname, vname_chip_fullscreen[0], NULL);
            resources_chip_fullscreen_int[0].value_ptr
                = &((*canvas)->videoconfig->fullscreen_enabled);
            resources_chip_fullscreen_int[0].param = (void *)*canvas;

            resources_chip_fullscreen_int[1].name
                = util_concat(chipname, vname_chip_fullscreen[1], NULL);
            resources_chip_fullscreen_int[1].value_ptr
                = &((*canvas)->videoconfig->fullscreen_statusbar_enabled);
            resources_chip_fullscreen_int[1].param = (void *)*canvas;

            resources_chip_fullscreen_string[0].name
                = util_concat(chipname, vname_chip_fullscreen[2], NULL);
            resources_chip_fullscreen_string[0].factory_value
                = video_chip_cap->fullscreen.device_name[0];
            resources_chip_fullscreen_string[0].value_ptr
                = &((*canvas)->videoconfig->fullscreen_device);
            resources_chip_fullscreen_string[0].param = (void *)*canvas;

            if (resources_register_string(resources_chip_fullscreen_string) < 0) {
                return -1;
            }

            if (resources_register_int(resources_chip_fullscreen_int) < 0) {
                return -1;
            }

            lib_free((char *)(resources_chip_fullscreen_int[0].name));
            lib_free((char *)(resources_chip_fullscreen_int[1].name));
            lib_free((char *)(resources_chip_fullscreen_string[0].name));
        } else {
            set_fullscreen_enabled(0, (void *)*canvas);
            set_fullscreen_statusbar(0, (void *)*canvas);
            set_fullscreen_device(video_chip_cap->fullscreen.device_name[0], (void *)*canvas);
        }

        for (i = 0; i < video_chip_cap->fullscreen.device_num; i++) {
            resource_chip_mode = get_resource_chip_mode();
            resource_chip_mode->resource_chip = *canvas;
            resource_chip_mode->device = i;

            if (machine_class != VICE_MACHINE_VSID) {
                resources_chip_fullscreen_mode[0].name
                    = util_concat(chipname,
                                  video_chip_cap->fullscreen.device_name[i],
                                  vname_chip_fullscreen_mode[0], NULL);
                resources_chip_fullscreen_mode[0].value_ptr
                    = &((*canvas)->videoconfig->fullscreen_mode[i]);
                resources_chip_fullscreen_mode[0].param
                    = (void *)resource_chip_mode;

                if (resources_register_int(resources_chip_fullscreen_mode) < 0) {
                    return -1;
                }

                lib_free((char *)(resources_chip_fullscreen_mode[0].name));
            } else {
                set_fullscreen_mode(0, (void *)resource_chip_mode);
            }
        }
    }

    /* Palette related */
    if (machine_class != VICE_MACHINE_VSID) {
        resources_chip_palette_string[0].name
            = util_concat(chipname, vname_chip_palette[0], NULL);
        resources_chip_palette_string[0].factory_value
            = video_chip_cap->external_palette_name;
        resources_chip_palette_string[0].value_ptr
            = &((*canvas)->videoconfig->external_palette_name);
        resources_chip_palette_string[0].param = (void *)*canvas;

        resources_chip_palette_int[0].name
            = util_concat(chipname, vname_chip_palette[1], NULL);
        resources_chip_palette_int[0].value_ptr
            = &((*canvas)->videoconfig->external_palette);
        resources_chip_palette_int[0].param = (void *)*canvas;

        if (resources_register_string(resources_chip_palette_string) < 0) {
            return -1;
        }

        if (resources_register_int(resources_chip_palette_int) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_palette_string[0].name));
        lib_free((char *)(resources_chip_palette_int[0].name));
    } else {
        set_palette_file_name(video_chip_cap->external_palette_name, (void *)*canvas);
        set_ext_palette(0, (void *)*canvas);
    }

    /* double buffering */
    if (video_chip_cap->double_buffering_allowed != 0) {
        if (machine_class != VICE_MACHINE_VSID) {
            resources_chip_double_buffer[0].name
                = util_concat(chipname, vname_chip_double_buffer[0], NULL);
            resources_chip_double_buffer[0].value_ptr
                = &((*canvas)->videoconfig->double_buffer);
            resources_chip_double_buffer[0].param = (void *)*canvas;
            if (resources_register_int(resources_chip_double_buffer) < 0) {
                return -1;
            }

            lib_free((char *)(resources_chip_double_buffer[0].name));
        } else {
            set_double_buffer_enabled(0, (void *)*canvas);
        }
    }

    /* palette generator */
    if (machine_class != VICE_MACHINE_VSID) {
        i = 0;
        while (vname_chip_colors[i]) {
            resources_chip_colors[i].name = util_concat(chipname, vname_chip_colors[i], NULL);
            resources_chip_colors[i].param = (void *)*canvas;
            ++i;
        }
        resources_chip_colors[0].value_ptr = &((*canvas)->videoconfig->video_resources.color_saturation);
        resources_chip_colors[1].value_ptr = &((*canvas)->videoconfig->video_resources.color_contrast);
        resources_chip_colors[2].value_ptr = &((*canvas)->videoconfig->video_resources.color_brightness);
        resources_chip_colors[3].value_ptr = &((*canvas)->videoconfig->video_resources.color_gamma);
        resources_chip_colors[4].value_ptr = &((*canvas)->videoconfig->video_resources.color_tint);

        if (resources_register_int(resources_chip_colors) < 0) {
            return -1;
        }

        i = 0;
        while (vname_chip_colors[i]) {
            lib_free((char *)(resources_chip_colors[i].name));
            ++i;
        }
    } else {
        set_color_saturation(1250, (void *)*canvas);
        set_color_contrast(1250, (void *)*canvas);
        set_color_brightness(1000, (void *)*canvas);
        set_color_gamma(2200, (void *)*canvas);
        set_color_tint(1000, (void *)*canvas);
    }

    /* crt emulation */
    if (machine_class != VICE_MACHINE_VSID) {
        i = 0;
        while (vname_chip_crtemu[i]) {
            resources_chip_crtemu[i].name = util_concat(chipname, vname_chip_crtemu[i], NULL);
            resources_chip_crtemu[i].param = (void *)*canvas;
            ++i;
        }
        resources_chip_crtemu[0].value_ptr = &((*canvas)->videoconfig->video_resources.pal_scanlineshade);
        resources_chip_crtemu[1].value_ptr = &((*canvas)->videoconfig->video_resources.pal_blur);
        resources_chip_crtemu[2].value_ptr = &((*canvas)->videoconfig->video_resources.pal_oddlines_phase);
        resources_chip_crtemu[3].value_ptr = &((*canvas)->videoconfig->video_resources.pal_oddlines_offset);
        resources_chip_crtemu[4].value_ptr = &((*canvas)->videoconfig->video_resources.audioleak);

        if (resources_register_int(resources_chip_crtemu) < 0) {
            return -1;
        }

        i = 0;
        while (vname_chip_crtemu[i]) {
            lib_free((char *)(resources_chip_crtemu[i].name));
            ++i;
        }
    } else {
        set_pal_scanlineshade(750, (void *)*canvas);
        set_pal_blur(500, (void *)*canvas);
        set_pal_oddlinesphase(1125, (void *)*canvas);
        set_pal_oddlinesoffset(875, (void *)*canvas);
        set_audioleak(0, (void *)*canvas);
    }

    /* CHIPFilter */
    if (machine_class != VICE_MACHINE_VSID) {
        resources_chip_rendermode[0].name
            = util_concat(chipname, vname_chip_rendermode[0], NULL);
        resources_chip_rendermode[0].value_ptr
            = &((*canvas)->videoconfig->filter);
        resources_chip_rendermode[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_rendermode) < 0) {
            return -1;
        }

        lib_free((char *)(resources_chip_rendermode[0].name));
    } else {
        set_chip_rendermode(VIDEO_FILTER_NONE, (void *)*canvas);
    }

    return 0;
}
Exemple #3
0
int video_resources_chip_init(const char *chipname,
                              struct video_canvas_s **canvas,
                              video_chip_cap_t *video_chip_cap)
{
    unsigned int i;

    video_render_initconfig((*canvas)->videoconfig);
    (*canvas)->videoconfig->cap = video_chip_cap;

    /* Set single size render as default.  */
    (*canvas)->videoconfig->rendermode = video_chip_cap->single_mode.rmode;
    (*canvas)->videoconfig->doublesizex
        = video_chip_cap->single_mode.sizex > 1 ? 1 : 0;
    (*canvas)->videoconfig->doublesizey
        = video_chip_cap->single_mode.sizey > 1 ? 1 : 0;

    if (video_chip_cap->dscan_allowed != 0) {
        resources_chip_scan[0].name
            = util_concat(chipname, vname_chip_scan[0], NULL);
        resources_chip_scan[0].value_ptr
            = &((*canvas)->videoconfig->doublescan);
        resources_chip_scan[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_scan) < 0)
            return -1;

        lib_free((char *)(resources_chip_scan[0].name));
    }

    if (video_chip_cap->hwscale_allowed != 0) {
        resources_chip_hwscale[0].name
            = util_concat(chipname, vname_chip_hwscale[0], NULL);
        resources_chip_hwscale[0].value_ptr
            = &((*canvas)->videoconfig->hwscale);
        resources_chip_hwscale[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_hwscale) < 0)
            return -1;

        lib_free((char *)(resources_chip_hwscale[0].name));
    }

    if (resources_register_int(resources_chip_hwscale_possible) < 0)
        return -1;

    if (video_chip_cap->scale2x_allowed != 0) {
        resources_chip_scale2x[0].name
            = util_concat(chipname, vname_chip_scale2x[0], NULL);
        resources_chip_scale2x[0].value_ptr
            = &((*canvas)->videoconfig->scale2x);
        resources_chip_scale2x[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_scale2x) < 0)
            return -1;

        lib_free((char *)(resources_chip_scale2x[0].name));
    }

    if (video_chip_cap->dsize_allowed != 0) {
        resources_chip_size[0].name
            = util_concat(chipname, vname_chip_size[0], NULL);
        resources_chip_size[0].factory_value
            = video_chip_cap->dsize_default;
        resources_chip_size[0].value_ptr
            = &((*canvas)->videoconfig->double_size_enabled);
        resources_chip_size[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_size) < 0)
            return -1;

        lib_free((char *)(resources_chip_size[0].name));
    }

    if (video_chip_cap->fullscreen.device_num > 0) {
        video_resource_chip_mode_t *resource_chip_mode;

        resources_chip_fullscreen_int[0].name
            = util_concat(chipname, vname_chip_fullscreen[0], NULL);
        resources_chip_fullscreen_int[0].value_ptr
            = &((*canvas)->videoconfig->fullscreen_enabled);
        resources_chip_fullscreen_int[0].param = (void *)*canvas;

        resources_chip_fullscreen_int[1].name
            = util_concat(chipname, vname_chip_fullscreen[1], NULL);
        resources_chip_fullscreen_int[1].value_ptr
            = &((*canvas)->videoconfig->fullscreen_statusbar_enabled);
        resources_chip_fullscreen_int[1].param = (void *)*canvas;

        resources_chip_fullscreen_int[2].name
            = util_concat(chipname, vname_chip_fullscreen[2], NULL);
        resources_chip_fullscreen_int[2].value_ptr
            = &((*canvas)->videoconfig->fullscreen_double_size_enabled);
        resources_chip_fullscreen_int[2].param = (void *)*canvas;

        resources_chip_fullscreen_int[3].name
            = util_concat(chipname, vname_chip_fullscreen[3], NULL);
        resources_chip_fullscreen_int[3].value_ptr
            = &((*canvas)->videoconfig->fullscreen_double_scan_enabled);
        resources_chip_fullscreen_int[3].param = (void *)*canvas;

        resources_chip_fullscreen_string[0].name
            = util_concat(chipname, vname_chip_fullscreen[4], NULL);
        resources_chip_fullscreen_string[0].factory_value
            = video_chip_cap->fullscreen.device_name[0];
        resources_chip_fullscreen_string[0].value_ptr
            = &((*canvas)->videoconfig->fullscreen_device);
        resources_chip_fullscreen_string[0].param = (void *)*canvas;

        if (resources_register_string(resources_chip_fullscreen_string) < 0)
            return -1;

        if (resources_register_int(resources_chip_fullscreen_int) < 0)
            return -1;

        lib_free((char *)(resources_chip_fullscreen_int[0].name));
        lib_free((char *)(resources_chip_fullscreen_int[1].name));
        lib_free((char *)(resources_chip_fullscreen_int[2].name));
        lib_free((char *)(resources_chip_fullscreen_int[3].name));
        lib_free((char *)(resources_chip_fullscreen_string[0].name));

        for (i = 0; i < video_chip_cap->fullscreen.device_num; i++) {
            resource_chip_mode = (video_resource_chip_mode_t *)lib_malloc(
                                 sizeof(video_resource_chip_mode_t));
            resource_chip_mode->resource_chip = *canvas;
            resource_chip_mode->device = i;

            resources_chip_fullscreen_mode[0].name
                = util_concat(chipname,
                    video_chip_cap->fullscreen.device_name[i],
                    vname_chip_fullscreen_mode[0], NULL);
            resources_chip_fullscreen_mode[0].value_ptr
                = &((*canvas)->videoconfig->fullscreen_mode[i]);
            resources_chip_fullscreen_mode[0].param
                = (void *)resource_chip_mode;

            if (resources_register_int(resources_chip_fullscreen_mode) < 0)
                return -1;

            lib_free((char *)(resources_chip_fullscreen_mode[0].name));
        }
    }

    resources_chip_palette_string[0].name
        = util_concat(chipname, vname_chip_palette[0], NULL);
    resources_chip_palette_string[0].factory_value
        = video_chip_cap->external_palette_name;
    resources_chip_palette_string[0].value_ptr
        = &((*canvas)->videoconfig->external_palette_name);
    resources_chip_palette_string[0].param = (void *)*canvas;

    if (video_chip_cap->internal_palette_allowed != 0) {
        resources_chip_palette_int[0].name
            = util_concat(chipname, vname_chip_palette[1], NULL);
        resources_chip_palette_int[0].value_ptr
            = &((*canvas)->videoconfig->external_palette);
        resources_chip_palette_int[0].param = (void *)*canvas;
    } else {
        resources_chip_palette_int[0].name = NULL;
        (*canvas)->videoconfig->external_palette = 1;
    }

    if (resources_register_string(resources_chip_palette_string) < 0)
        return -1;

    if (resources_register_int(resources_chip_palette_int) < 0)
        return -1;

    lib_free((char *)(resources_chip_palette_string[0].name));
    if (video_chip_cap->internal_palette_allowed != 0)
        lib_free((char *)(resources_chip_palette_int[0].name));

    if (video_chip_cap->double_buffering_allowed != 0) {
        resources_chip_double_buffer[0].name
            = util_concat(chipname, vname_chip_double_buffer[0], NULL);
        resources_chip_double_buffer[0].value_ptr
            = &((*canvas)->videoconfig->double_buffer);
        resources_chip_double_buffer[0].param = (void *)*canvas;
        if (resources_register_int(resources_chip_double_buffer) < 0)
            return -1;

        lib_free((char *)(resources_chip_double_buffer[0].name));
    }

    return 0;
}