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;