static Errcode get_abs_ctable(Sep_cb *sep) { UBYTE *s; Rgb3 *d; int i; if (vs.sep_rgb == 1) { /* copy the absolute rgb values of cnums somewhere */ get_color_rgb(vs.ccolor,vb.pencel->cmap,&sep->sep_rgb_dest); if ((sep->abs_ctable = pj_malloc(sep->p.ccount*3)) == NULL) return(Err_no_memory); s = sep->p.ctable; d = sep->abs_ctable; i = sep->p.ccount; while (--i >= 0) { get_color_rgb(*s++,vb.pencel->cmap,d); ++d; } } return(Success); }
static int parse_image(xmlTextReaderPtr reader, tmx_image **img_adr, short strict, const char *filename) { tmx_image *res; char *value; if (!(res = alloc_image())) return 0; *img_adr = res; if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"source"))) { /* source */ res->source = value; if (!(load_image(&(res->resource_image), filename, value))) { tmx_err(E_UNKN, "xml parser: an error occured in the delegated image loading function"); return 0; } } else { tmx_err(E_MISSEL, "xml parser: missing 'source' attribute in the 'image' element"); return 0; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"height"))) { /* height */ res->height = atoi(value); tmx_free_func(value); } else if (strict) { tmx_err(E_MISSEL, "xml parser: missing 'height' attribute in the 'image' element"); return 0; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"width"))) { /* width */ res->width = atoi(value); tmx_free_func(value); } else if (strict) { tmx_err(E_MISSEL, "xml parser: missing 'width' attribute in the 'image' element"); return 0; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"trans"))) { /* trans */ res->trans = get_color_rgb(value); res->uses_trans = 1; tmx_free_func(value); } return 1; }
static tmx_map *parse_root_map(xmlTextReaderPtr reader, const char *filename) { tmx_map *res = NULL; int curr_depth; const char *name; char *value; name = (char*) xmlTextReaderConstName(reader); curr_depth = xmlTextReaderDepth(reader); if (strcmp(name, "map")) { tmx_err(E_XDATA, "xml parser: root is not a 'map' element"); return NULL; } if (!(res = alloc_map())) return NULL; /* parses each attribute */ if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"orientation"))) { /* orientation */ if (res->orient = parse_orient(value), res->orient == O_NONE) { tmx_err(E_XDATA, "xml parser: unsupported 'orientation' '%s'", value); goto cleanup; } tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'orientation' attribute in the 'map' element"); goto cleanup; } value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"renderorder"); /* renderorder */ if (res->renderorder = parse_renderorder(value), res->renderorder == R_NONE) { tmx_err(E_XDATA, "xml parser: unsupported 'renderorder' '%s'", value); goto cleanup; } tmx_free_func(value); if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"height"))) { /* height */ res->height = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'height' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"width"))) { /* width */ res->width = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'width' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"tileheight"))) { /* tileheight */ res->tile_height = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'tileheight' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"tilewidth"))) { /* tilewidth */ res->tile_width = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'tilewidth' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"backgroundcolor"))) { /* backgroundcolor */ res->backgroundcolor = get_color_rgb(value); tmx_free_func(value); } /* Parse each child */ do { if (xmlTextReaderRead(reader) != 1) goto cleanup; /* error_handler has been called */ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) { name = (char*)xmlTextReaderConstName(reader); if (!strcmp(name, "tileset")) { if (!parse_tileset(reader, &(res->ts_head), filename)) goto cleanup; } else if (!strcmp(name, "layer")) { if (!parse_layer(reader, &(res->ly_head), res->height, res->width, L_LAYER, filename)) goto cleanup; } else if (!strcmp(name, "objectgroup")) { if (!parse_layer(reader, &(res->ly_head), res->height, res->width, L_OBJGR, filename)) goto cleanup; } else if (!strcmp(name, "imagelayer")) { if (!parse_layer(reader, &(res->ly_head), res->height, res->width, L_IMAGE, filename)) goto cleanup; } else if (!strcmp(name, "properties")) { if (!parse_properties(reader, &(res->properties))) goto cleanup; } else { /* Unknow element, skip its tree */ if (xmlTextReaderNext(reader) != 1) goto cleanup; } } } while (xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT || xmlTextReaderDepth(reader) != curr_depth); return res; cleanup: tmx_map_free(res); return NULL; }
/* parse layers and objectgroups */ static int parse_layer(xmlTextReaderPtr reader, tmx_layer **layer_headadr, int map_h, int map_w, enum tmx_layer_type type, const char *filename) { tmx_layer *res; tmx_object *obj; int curr_depth; const char *name; char *value; curr_depth = xmlTextReaderDepth(reader); if (!(res = alloc_layer())) return 0; res->type = type; while(*layer_headadr) { layer_headadr = &((*layer_headadr)->next); } *layer_headadr = res; /* parses each attribute */ if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"name"))) { /* name */ res->name = value; } else { tmx_err(E_MISSEL, "xml parser: missing 'name' attribute in the 'layer' element"); return 0; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"visible"))) { /* visible */ res->visible = (char)atoi(value); tmx_free_func(value); } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"opacity"))) { /* opacity */ res->opacity = (float)strtod(value, NULL); tmx_free_func(value); } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"color"))) { /* color */ res->color = get_color_rgb(value); tmx_free_func(value); } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"x"))) { /* x_offset */ res->x_offset = (int)atoi(value); tmx_free_func(value); } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"y"))) { /* y_offset */ res->y_offset = (int)atoi(value); tmx_free_func(value); } do { if (xmlTextReaderRead(reader) != 1) return 0; /* error_handler has been called */ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) { name = (char*)xmlTextReaderConstName(reader); if (!strcmp(name, "properties")) { if (!parse_properties(reader, &(res->properties))) return 0; } else if (!strcmp(name, "data")) { if (!parse_data(reader, &(res->content.gids), map_h * map_w)) return 0; } else if (!strcmp(name, "image")) { if (!parse_image(reader, &(res->content.image), 0, filename)) return 0; } else if (!strcmp(name, "object")) { if (!(obj = alloc_object())) return 0; obj->next = res->content.head; res->content.head = obj; if (!parse_object(reader, obj)) return 0; } else { /* Unknow element, skip its tree */ if (xmlTextReaderNext(reader) != 1) return 0; } } } while (xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT || xmlTextReaderDepth(reader) != curr_depth); return 1; }