Example #1
0
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);
    }
}
Example #2
0
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;
}
Example #3
0
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;
}