Mercurial > mplayer.hg
comparison libass/ass.c @ 21458:7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
in fontconfig initialization. This is required for some fontconfig-related
improvements.
author | eugeni |
---|---|
date | Sun, 03 Dec 2006 17:59:13 +0000 |
parents | dd49d3712e6f |
children | cb409839a110 |
comparison
equal
deleted
inserted
replaced
21457:af4c8fd34494 | 21458:7af6c25a0cfc |
---|---|
1044 track->parser_priv->state = old_state; | 1044 track->parser_priv->state = old_state; |
1045 | 1045 |
1046 return 0; | 1046 return 0; |
1047 } | 1047 } |
1048 | 1048 |
1049 static char* validate_fname(char* name) | |
1050 { | |
1051 char* fname; | |
1052 char* p; | |
1053 char* q; | |
1054 unsigned code; | |
1055 int sz = strlen(name); | |
1056 | |
1057 q = fname = malloc(sz + 1); | |
1058 p = name; | |
1059 while (*p) { | |
1060 code = utf8_get_char(&p); | |
1061 if (code == 0) | |
1062 break; | |
1063 if ( (code > 0x7F) || | |
1064 (code == '\\') || | |
1065 (code == '/') || | |
1066 (code == ':') || | |
1067 (code == '*') || | |
1068 (code == '?') || | |
1069 (code == '<') || | |
1070 (code == '>') || | |
1071 (code == '|') || | |
1072 (code == 0)) | |
1073 { | |
1074 *q++ = '_'; | |
1075 } else { | |
1076 *q++ = code; | |
1077 } | |
1078 if (p - name > sz) | |
1079 break; | |
1080 } | |
1081 *q = 0; | |
1082 return fname; | |
1083 } | |
1084 | |
1085 /** | |
1086 * \brief Add a memory font. | |
1087 * \param name attachment name | |
1088 * \param data binary font data | |
1089 * \param data_size data size | |
1090 */ | |
1091 void ass_add_font(ass_library_t* library, const char* name, char* data, int data_size) | |
1092 { | |
1093 char buf[1000]; | |
1094 FILE* fp = 0; | |
1095 int rc; | |
1096 struct stat st; | |
1097 char* fname; | |
1098 const char* fonts_dir = library->fonts_dir; | |
1099 | |
1100 if (!fonts_dir) | |
1101 return; | |
1102 rc = stat(fonts_dir, &st); | |
1103 if (rc) { | |
1104 int res; | |
1105 #ifndef __MINGW32__ | |
1106 res = mkdir(fonts_dir, 0700); | |
1107 #else | |
1108 res = mkdir(fonts_dir); | |
1109 #endif | |
1110 if (res) { | |
1111 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FailedToCreateDirectory, fonts_dir); | |
1112 } | |
1113 } else if (!S_ISDIR(st.st_mode)) { | |
1114 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_NotADirectory, fonts_dir); | |
1115 } | |
1116 | |
1117 fname = validate_fname((char*)name); | |
1118 | |
1119 snprintf(buf, 1000, "%s/%s", fonts_dir, fname); | |
1120 free(fname); | |
1121 | |
1122 fp = fopen(buf, "wb"); | |
1123 if (!fp) return; | |
1124 | |
1125 fwrite(data, data_size, 1, fp); | |
1126 fclose(fp); | |
1127 } | |
1128 | |
1129 long long ass_step_sub(ass_track_t* track, long long now, int movement) { | 1049 long long ass_step_sub(ass_track_t* track, long long now, int movement) { |
1130 int i; | 1050 int i; |
1131 | 1051 |
1132 if (movement == 0) return 0; | 1052 if (movement == 0) return 0; |
1133 if (track->n_events == 0) return 0; | 1053 if (track->n_events == 0) return 0; |