/** * Called from db_scan() when initially scanning database. */ void rt_color_addrec(int low, int hi, int r, int g, int b, off_t addr) { register struct mater *mp; BU_ALLOC(mp, struct mater); mp->mt_low = low; mp->mt_high = hi; mp->mt_r = r; mp->mt_g = g; mp->mt_b = b; mp->mt_daddr = addr; rt_insert_color(mp); }
int ged_color(struct ged *gedp, int argc, const char *argv[]) { struct mater *newp; struct mater *mp; struct mater *next_mater; static const char *usage = "[-e] [low high r g b]"; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_READ_ONLY(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); /* must be wanting help */ if (argc == 1) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_HELP; } if (argc != 6 && argc != 2) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } /* edcolor */ if (argc == 2) { if (argv[1][0] == '-' && argv[1][1] == 'e' && argv[1][2] == '\0') { return edcolor(gedp, argc, argv); } else { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } } if (db_version(gedp->ged_wdbp->dbip) < 5) { /* Delete all color records from the database */ mp = rt_material_head(); while (mp != MATER_NULL) { next_mater = mp->mt_forw; color_zaprec(gedp, mp); mp = next_mater; } /* construct the new color record */ BU_ALLOC(newp, struct mater); newp->mt_low = atoi(argv[1]); newp->mt_high = atoi(argv[2]); newp->mt_r = atoi(argv[3]); newp->mt_g = atoi(argv[4]); newp->mt_b = atoi(argv[5]); newp->mt_daddr = MATER_NO_ADDR; /* not in database yet */ /* Insert new color record in the in-memory list */ rt_insert_color(newp); /* Write new color records for all colors in the list */ mp = rt_material_head(); while (mp != MATER_NULL) { next_mater = mp->mt_forw; color_putrec(gedp, mp); mp = next_mater; } } else { struct bu_vls colors = BU_VLS_INIT_ZERO; /* construct the new color record */ BU_ALLOC(newp, struct mater); newp->mt_low = atoi(argv[1]); newp->mt_high = atoi(argv[2]); newp->mt_r = atoi(argv[3]); newp->mt_g = atoi(argv[4]); newp->mt_b = atoi(argv[5]); newp->mt_daddr = MATER_NO_ADDR; /* not in database yet */ /* Insert new color record in the in-memory list */ rt_insert_color(newp); /* * Gather color records from the in-memory list to build * the _GLOBAL objects regionid_colortable attribute. */ rt_vls_color_map(&colors); db5_update_attribute("_GLOBAL", "regionid_colortable", bu_vls_addr(&colors), gedp->ged_wdbp->dbip); bu_vls_free(&colors); } return GED_OK; }
/* * used by the 'color' command when provided the -e option */ static int edcolor(struct ged *gedp, int argc, const char *argv[]) { struct mater *mp; struct mater *zot; FILE *fp; int c; char line[128]; static char hdr[] = "LOW\tHIGH\tRed\tGreen\tBlue\n"; char tmpfil[MAXPATHLEN]; char *editstring = NULL; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_READ_ONLY(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); bu_optind = 1; /* First, grab the editstring off of the argv list */ while ((c = bu_getopt(argc, (char * const *)argv, "E:")) != -1) { switch (c) { case 'E' : editstring = bu_optarg; break; default : break; } } argc -= bu_optind - 1; argv += bu_optind - 1; /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); fp = bu_temp_file(tmpfil, MAXPATHLEN); if (fp == NULL) { bu_vls_printf(gedp->ged_result_str, "%s: could not create tmp file", argv[0]); return GED_ERROR; } fprintf(fp, "%s", hdr); for (mp = rt_material_head(); mp != MATER_NULL; mp = mp->mt_forw) { fprintf(fp, "%d\t%d\t%3d\t%3d\t%3d", mp->mt_low, mp->mt_high, mp->mt_r, mp->mt_g, mp->mt_b); fprintf(fp, "\n"); } (void)fclose(fp); if (!_ged_editit(editstring, (const char *)tmpfil)) { bu_vls_printf(gedp->ged_result_str, "%s: editor returned bad status. Aborted\n", argv[0]); return GED_ERROR; } /* Read file and process it */ if ((fp = fopen(tmpfil, "r")) == NULL) { perror(tmpfil); return GED_ERROR; } if (bu_fgets(line, sizeof (line), fp) == NULL || line[0] != hdr[0]) { bu_vls_printf(gedp->ged_result_str, "%s: Header line damaged, aborting\n", argv[0]); (void)fclose(fp); return GED_ERROR; } if (db_version(gedp->ged_wdbp->dbip) < 5) { /* Zap all the current records, both in core and on disk */ while (rt_material_head() != MATER_NULL) { zot = rt_material_head(); rt_new_material_head(zot->mt_forw); color_zaprec(gedp, zot); bu_free((void *)zot, "mater rec"); } while (bu_fgets(line, sizeof (line), fp) != NULL) { int cnt; int low, hi, r, g, b; /* character-separated numbers (ideally a space) */ cnt = sscanf(line, "%d%*c%d%*c%d%*c%d%*c%d", &low, &hi, &r, &g, &b); if (cnt != 9) { bu_vls_printf(gedp->ged_result_str, "%s: Discarding %s\n", argv[0], line); continue; } BU_ALLOC(mp, struct mater); mp->mt_low = low; mp->mt_high = hi; mp->mt_r = r; mp->mt_g = g; mp->mt_b = b; mp->mt_daddr = MATER_NO_ADDR; rt_insert_color(mp); color_putrec(gedp, mp); } } else { struct bu_vls vls = BU_VLS_INIT_ZERO; /* free colors in rt_material_head */ rt_color_free(); while (bu_fgets(line, sizeof (line), fp) != NULL) { int cnt; int low, hi, r, g, b; /* character-separated numbers (ideally a space) */ cnt = sscanf(line, "%d%*c%d%*c%d%*c%d%*c%d", &low, &hi, &r, &g, &b); /* check to see if line is reasonable */ if (cnt != 5) { bu_vls_printf(gedp->ged_result_str, "%s: Discarding %s\n", argv[0], line); continue; } bu_vls_printf(&vls, "{%d %d %d %d %d} ", low, hi, r, g, b); } db5_update_attribute("_GLOBAL", "regionid_colortable", bu_vls_addr(&vls), gedp->ged_wdbp->dbip); db5_import_color_table(bu_vls_addr(&vls)); bu_vls_free(&vls); } (void)fclose(fp); bu_file_delete(tmpfil); /* if there are drawables, update their colors */ if (gedp->ged_gdp) ged_color_soltab(gedp->ged_gdp->gd_headDisplay); return GED_OK; }