void export_to(sd_font *font, const char *filename, int split) { if(split) { char path[256]; sd_rgba_image ch_img; sd_rgba_image_create(&ch_img, font->h, font->h); for(int i = 32; i < 256; i++) { sd_font_decode(font, &ch_img, (char)(i-32), 0, 0, 0); sprintf(path, "%s/uni%04x.png", filename, i); int ret = sd_rgba_image_to_png(&ch_img, path); if(ret != SD_SUCCESS) { printf("Error while exporting to %s: %s.", path, sd_get_error(ret)); } } sd_rgba_image_free(&ch_img); } else { sd_rgba_image ch_img; sd_rgba_image dst_img; sd_rgba_image_create(&dst_img, font->h * 16, font->h * 16); sd_rgba_image_create(&ch_img, font->h, font->h); for(int i = 32; i < 256; i++) { int x = i % 16; int y = i / 16; sd_font_decode(font, &ch_img, (char)(i-32), 0, 0, 0); sd_rgba_image_blit(&dst_img, &ch_img, x * font->h, y * font->h); } sd_rgba_image_free(&ch_img); int ret = sd_rgba_image_to_png(&dst_img, filename); if(ret != SD_SUCCESS) { printf("Error while exporting to %s: %s.", filename, sd_get_error(ret)); } sd_rgba_image_free(&dst_img); } }
SDL_Surface* render_text(sd_font *font, const char *text, int area_w) { // Vars unsigned int rmask,gmask,bmask,amask; int char_w, char_h; int pix_w, pix_h; int slen; SDL_Surface *surface; SDL_Surface *tmp; SDL_Rect dst; sd_rgba_image img; // Required surface size slen = strlen(text); char_h = (slen * font->h) / area_w + 1; pix_h = char_h * font->h; if(char_h == 1) { char_w = slen; pix_w = slen * font->h; } else { char_w = area_w / font->h; pix_w = area_w; } // Create an empty SDL surface rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; if((surface = SDL_CreateRGBSurface(0, pix_w, pix_h, 32, rmask, gmask, bmask, amask)) == 0) { return 0; } if((tmp = SDL_CreateRGBSurface(0, font->h, font->h, 32, rmask, gmask, bmask, amask)) == 0) { SDL_FreeSurface(surface); return 0; } // Render text dst.w = font->h; dst.h = font->h; sd_rgba_image_create(&img, font->h, font->h); for(int i = 0; i < slen; i++) { sd_font_decode(font, &img, text[i] - 32, 64, 128, 64); memcpy(tmp->pixels, img.data, 4*font->h*font->h); dst.y = i / char_w * font->h; dst.x = i % char_w * font->h; SDL_BlitSurface(tmp, 0, surface, &dst); } // All done. SDL_FreeSurface(tmp); sd_rgba_image_free(&img); return surface; }
int font_load(font *font, const char* filename, unsigned int size) { sd_rgba_image *img; sd_font *sdfont; int pixsize; texture *tex; // Find vertical size switch(size) { case FONT_BIG: pixsize = 8; break; case FONT_SMALL: pixsize = 6; break; default: return 1; } // Open font file sdfont = sd_font_create(); if(sd_font_load(sdfont, filename, pixsize)) { sd_font_delete(sdfont); return 2; } // Load into textures img = sd_rgba_image_create(pixsize, pixsize); for(int i = 0; i < 224; i++) { tex = malloc(sizeof(texture)); sd_font_decode(sdfont, img, i, 0xFF, 0xFF, 0xFF); texture_create(tex); texture_init(tex, img->data, img->w, img->h); vector_append(&font->textures, &tex); } // Set font info vars font->w = pixsize; font->h = pixsize; font->size = size; // Free resources sd_rgba_image_delete(img); sd_font_delete(sdfont); return 0; }
// extract part of a sprite as a new sprite // we need this because the HAR portraits are one single sprite, unlike the player portraits // so we need to chunk them up into individual sprites and strip out the black background sd_rgba_image* sub_sprite(sd_sprite *sprite, sd_palette *pal, int x, int y, int w, int h) { sd_rgba_image *img = 0; sd_rgba_image *out = sd_rgba_image_create(w, h); img = sd_sprite_image_decode(sprite->img, pal, -1); for(int i = y; i < y+h; i++) { for(int j = x; j < x+w; j++) { int offset = (i*sprite->img->w*4)+(j*4); int local_offset = ((i-y)*w*4)+((j-x)*4); out->data[local_offset] = (char)img->data[offset]; out->data[local_offset+1] = (char)img->data[offset+1]; out->data[local_offset+2] = (char)img->data[offset+2]; if (!out->data[local_offset] && !out->data[local_offset+1] && !out->data[local_offset+2]) { // all three colors are black, set the pixel to be transparent! out->data[local_offset+3] = 0; } else { out->data[local_offset+3] = (char)img->data[offset+3]; } } } sd_rgba_image_delete(img); return out; }