Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}