// Allocate and return a gr_surface sufficient for storing an image of // the indicated size in the framebuffer pixel format. static GGLSurface* init_display_surface(png_uint_32 width, png_uint_32 height) { GGLSurface* surface; surface = (GGLSurface*) malloc_surface(width * height * 4); if (surface == NULL) return NULL; surface->version = sizeof(GGLSurface); surface->width = width; surface->height = height; surface->stride = width; return surface; }
// Allocate and return a gr_surface sufficient for storing an image of // the indicated size in the framebuffer pixel format. static gr_surface init_display_surface(png_uint_32 width, png_uint_32 height) { gr_surface surface; surface = malloc_surface(width * height * 4); if (surface == NULL) return NULL; surface->width = width; surface->height = height; surface->row_bytes = width * 4; surface->pixel_bytes = 4; return surface; }
int res_create_alpha_surface(const char *name, gr_surface *pSurface) { int result = 0; unsigned int y; unsigned char *p_row; gr_surface surface = NULL; png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_uint_32 width, height; png_byte channels; FILE *fp = NULL; *pSurface = NULL; result = open_png(name, &png_ptr, &info_ptr, &fp, &width, &height, &channels); if (result < 0) return result; if (channels != 1) { result = -7; goto exit; } if (!(surface = malloc_surface(width * height))) { result = -8; goto exit; } surface->width = width; surface->height = height; surface->row_bytes = width; surface->pixel_bytes = 1; for (y = 0; y < height; y++) { p_row = surface->data + y * surface->row_bytes; png_read_row(png_ptr, p_row, NULL); } *pSurface = surface; exit: close_png(&png_ptr, &info_ptr, fp); if (result < 0 && surface != NULL) free(surface); return result; }
int res_create_alpha_surface(const char* name, gr_surface* pSurface) { gr_surface surface = NULL; int result = 0; png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_uint_32 width, height; png_byte channels; *pSurface = NULL; result = open_png(name, &png_ptr, &info_ptr, &width, &height, &channels); if (result < 0) return result; if (channels != 1) { result = -7; goto exit; } surface = malloc_surface(width * height); if (surface == NULL) { result = -8; goto exit; } surface->width = width; surface->height = height; surface->row_bytes = width; surface->pixel_bytes = 1; #if defined(RECOVERY_ABGR) || defined(RECOVERY_BGRA) png_set_bgr(png_ptr); #endif unsigned char* p_row; unsigned int y; for (y = 0; y < height; ++y) { p_row = surface->data + y * surface->row_bytes; png_read_row(png_ptr, p_row, NULL); } *pSurface = surface; exit: png_destroy_read_struct(&png_ptr, &info_ptr, NULL); if (result < 0 && surface != NULL) free(surface); return result; }
int res_create_theme_localized_alpha_surface(const char* name, const char* themename, const char* locale, gr_surface* pSurface) { gr_surface surface = NULL; int result = 0; png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_uint_32 width, height; png_byte channels; *pSurface = NULL; if (locale == NULL) { surface = malloc_surface(0); surface->width = 0; surface->height = 0; surface->row_bytes = 0; surface->pixel_bytes = 1; goto exit; } result = open_theme_png(name, themename, &png_ptr, &info_ptr, &width, &height, &channels); if (result < 0) return result; if (channels != 1) { result = -7; goto exit; } unsigned char* row = malloc(width); png_uint_32 y; for (y = 0; y < height; ++y) { png_read_row(png_ptr, row, NULL); int w = (row[1] << 8) | row[0]; int h = (row[3] << 8) | row[2]; int len = row[4]; char* loc = (char*)row+5; if (y+1+h >= height || matches_locale(loc, locale)) { printf(" %20s: %s (%d x %d @ %d)\n", name, loc, w, h, y); surface = malloc_surface(w*h); if (surface == NULL) { result = -8; goto exit; } surface->width = w; surface->height = h; surface->row_bytes = w; surface->pixel_bytes = 1; int i; for (i = 0; i < h; ++i, ++y) { png_read_row(png_ptr, row, NULL); memcpy(surface->data + i*w, row, w); } *pSurface = (gr_surface) surface; break; } else { int i; for (i = 0; i < h; ++i, ++y) { png_read_row(png_ptr, row, NULL); } } } exit: png_destroy_read_struct(&png_ptr, &info_ptr, NULL); if (result < 0 && surface != NULL) free(surface); return result; }
int res_create_localized_alpha_surface(const char *name, const char *locale, gr_surface *pSurface) { int result = 0; unsigned char *row; gr_surface surface = NULL; png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_uint_32 width, height, y; png_byte channels; FILE *fp = NULL; *pSurface = NULL; if (!locale) { surface = malloc_surface(0); surface->width = 0; surface->height = 0; surface->row_bytes = 0; surface->pixel_bytes = 1; goto exit; } result = open_png(name, &png_ptr, &info_ptr, &fp, &width, &height, &channels); if (result < 0) return result; if (channels != 1) { result = -7; goto exit; } /* TODO: check for error */ row = malloc(width); for (y = 0; y < height; y++) { int h, w; char *loc; png_read_row(png_ptr, row, NULL); w = (row[1] << 8) | row[0]; h = (row[3] << 8) | row[2]; loc = (char *)row + 5; if (y + 1 + h >= height || matches_locale(loc, locale)) { int i; printf(" %20s: %s (%d x %d @ %ld)\n", name, loc, w, h, (long)y); if (!(surface = malloc_surface(w * h))) { result = -8; goto exit; } surface->width = w; surface->height = h; surface->row_bytes = w; surface->pixel_bytes = 1; for (i = 0; i < h; i++, y++) { png_read_row(png_ptr, row, NULL); memcpy(surface->data + i * w, row, w); } *pSurface = (gr_surface)surface; break; } else { int i; for (i = 0; i < h; i++, y++) png_read_row(png_ptr, row, NULL); } } exit: close_png(&png_ptr, &info_ptr, fp); if (result < 0 && surface) free(surface); return result; }