const sc_texture_t * sc_arraytex_add_from_surface(sc_arraytex_t *arr, SDL_Surface *img) { size_t i; size_t w = arr->width, h = arr->height; sc_texture_t *rv; SDL_Surface *helper_img, *previous_img; GLenum format; ASSERT_NOT_FINALIZED(arr); img = sc_prepare_surface_for_upload(img, &format); if (!img) return NULL; /* we currently do not support resizing of the images on adding, so let's just make sure we add only images of the same size */ if (img->w != arr->height || img->h != arr->height) { if (!(arr->flags & SC_ARRAYTEX_NEAREST)) { SDL_FreeSurface(img); sc_set_error(SC_EGRAPHIC, __FILE__, __LINE__, "Texture size (%dx%d) does not match array size " "(%dx%d)", (int)img->w, (int)img->h, (int)arr->width, (int)arr->height); return NULL; } helper_img = img; img = sc_resize_surface_nearest(img, arr->width, arr->height); SDL_FreeSurface(helper_img); } /* same goes for the format. All images added to the array have to be of the same format. Currently not a big deal as we are only having RGBA images anyways, but it's important to check. */ if (arr->slices == 0) arr->format = format; else if (arr->format != format) { SDL_FreeSurface(img); sc_set_error(SC_EGRAPHIC, __FILE__, __LINE__, "Texture format mismatch when adding new texture " "to texture array. Array format is %d, added " "format is %d.", arr->format, format); return NULL; } rv = sc_xalloc(sc_texture_t); rv->id = 0; /* set later, we don't know it yet */ rv->stored_width = arr->width; rv->stored_height = arr->height; rv->off_x = 0; rv->off_y = 0; rv->index = arr->slices++; rv->width = arr->width; rv->height = arr->height; rv->target = TARGET; rv->shared = 1; /* first level is not resized */ append_image(arr->buffers[0], img); /* all other levels are scaled down */ helper_img = NULL; previous_img = NULL; for (i = 1; i < arr->mipmap_levels; i++) { if (w > 1) w /= 2; if (h > 1) h /= 2; helper_img = sc_resize_surface_nearest( previous_img ? previous_img : img, w, h); SDL_FreeSurface(previous_img); append_image(arr->buffers[i], helper_img); previous_img = helper_img; } SDL_FreeSurface(img); SDL_FreeSurface(helper_img); sc_list_append(arr->textures, rv); return rv; }
char * op_mangle_filename(struct mangle_values const * values) { char * mangled; size_t len; int anon = values->flags & MANGLE_ANON; int cg_anon = values->flags & MANGLE_CG_ANON; /* if dep_name != image_name we need to invert them (and so revert them * unconditionally because if they are equal it doesn't hurt to invert * them), see P:3, FIXME: this is a bit weirds, we prolly need to * reword pp_interface */ char const * image_name = values->dep_name; char const * anon_name = values->anon_name; char const * dep_name = values->image_name; char const * cg_image_name = values->cg_image_name; len = strlen(op_samples_current_dir) + strlen(dep_name) + 1 + strlen(values->event_name) + 1 + strlen(image_name) + 1; if (values->flags & MANGLE_CALLGRAPH) len += strlen(cg_image_name) + 1; if (anon || cg_anon) len += strlen(anon_name); /* provision for tgid, tid, unit_mask, cpu and some {root}, {dep}, * {kern}, {anon} and {cg} marker */ /* FIXME: too ugly */ len += 256; mangled = xmalloc(len); strcpy(mangled, op_samples_current_dir); append_image(mangled, values->flags, 0, image_name, anon_name); strcat(mangled, "{dep}" "/"); append_image(mangled, values->flags, anon, dep_name, anon_name); if (values->flags & MANGLE_CALLGRAPH) { strcat(mangled, "{cg}" "/"); append_image(mangled, values->flags, cg_anon, cg_image_name, anon_name); } strcat(mangled, values->event_name); sprintf(mangled + strlen(mangled), ".%d.%d.", values->count, values->unit_mask); if (values->flags & MANGLE_TGID) { sprintf(mangled + strlen(mangled), "%d.", values->tgid); } else { sprintf(mangled + strlen(mangled), "%s.", "all"); } if (values->flags & MANGLE_TID) { sprintf(mangled + strlen(mangled), "%d.", values->tid); } else { sprintf(mangled + strlen(mangled), "%s.", "all"); } if (values->flags & MANGLE_CPU) { sprintf(mangled + strlen(mangled), "%d", values->cpu); } else { sprintf(mangled + strlen(mangled), "%s", "all"); } return mangled; }