/** * @brief Uploads image data * @param[in] name The name of the texture to use for this data * @param[in] frame The frame data that is uploaded * @param[in] width The width of the texture * @param[in] height The height of the texture * @return the texture number of the uploaded images */ int R_UploadData (const char *name, unsigned *frame, int width, int height) { image_t *img; unsigned *scaled; int scaledWidth, scaledHeight; int samples = r_config.gl_compressed_solid_format ? r_config.gl_compressed_solid_format : r_config.gl_solid_format; R_GetScaledTextureSize(width, height, &scaledWidth, &scaledHeight); img = R_FindImage(name, it_pic); if (img == r_noTexture) Com_Error(ERR_FATAL, "Could not find the searched image: %s", name); /* scan the texture for any non-255 alpha */ for (unsigned const* i = frame, * const end = i + scaledHeight * scaledWidth; i != end; ++i) { if ((*i & 0xFF000000U) != 0xFF000000U) { samples = r_config.gl_compressed_alpha_format ? r_config.gl_compressed_alpha_format : r_config.gl_alpha_format; break; } } if (scaledWidth != width || scaledHeight != height) { /* whereas others need to be scaled */ scaled = Mem_PoolAllocTypeN(unsigned, scaledWidth * scaledHeight, vid_imagePool); R_ScaleTexture(frame, width, height, scaled, scaledWidth, scaledHeight); } else {
/** * @brief Uploads image data * @param[in] name The name of the texture to use for this data * @param[in] frame The frame data that is uploaded * @param[in] width The width of the texture * @param[in] height The height of the texture * @return the texture number of the uploaded images */ int R_UploadData (const char *name, byte *frame, int width, int height) { image_t *img; unsigned *scaled; int scaledWidth, scaledHeight; int samples = r_config.gl_compressed_solid_format ? r_config.gl_compressed_solid_format : r_config.gl_solid_format; int i, c; byte *scan; R_GetScaledTextureSize(width, height, &scaledWidth, &scaledHeight); img = R_FindImage(name, it_pic); if (img == r_noTexture) Com_Error(ERR_FATAL, "Could not find the searched image: %s", name); /* scan the texture for any non-255 alpha */ c = scaledWidth * scaledHeight; /* set scan to the first alpha byte */ for (i = 0, scan = ((byte *) frame) + 3; i < c; i++, scan += 4) { if (*scan != 255) { samples = r_config.gl_compressed_alpha_format ? r_config.gl_compressed_alpha_format : r_config.gl_alpha_format; break; } } if (scaledWidth != width || scaledHeight != height) { /* whereas others need to be scaled */ scaled = (unsigned *)Mem_PoolAllocExt(scaledWidth * scaledHeight * sizeof(unsigned), qfalse, vid_imagePool, 0); R_ScaleTexture((unsigned *)frame, width, height, scaled, scaledWidth, scaledHeight); } else { scaled = (unsigned *)frame; } R_BindTexture(img->texnum); if (img->upload_width == scaledWidth && img->upload_height == scaledHeight) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, scaledWidth, scaledHeight, GL_RGBA, GL_UNSIGNED_BYTE, scaled); } else { /* Reallocate the texture */ img->width = width; img->height = height; img->upload_width = scaledWidth; img->upload_height = scaledHeight; #ifdef HAVE_GLES glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, scaledWidth, scaledHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, scaled); #else glTexImage2D(GL_TEXTURE_2D, 0, samples, scaledWidth, scaledHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, scaled); #endif } glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); R_CheckError(); if (scaled != (unsigned *)frame) Mem_Free(scaled); return img->texnum; }