20
21
** ensure the GNU Lesser General Public License version 2.1 requirements
21
22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23
** In addition, as a special exception, Nokia gives you certain
24
** additional rights. These rights are described in the Nokia Qt LGPL
25
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
28
** GNU General Public License Usage
29
** Alternatively, this file may be used under the terms of the GNU
30
** General Public License version 3.0 as published by the Free Software
31
** Foundation and appearing in the file LICENSE.GPL included in the
32
** packaging of this file. Please review the following information to
33
** ensure the GNU General Public License version 3.0 requirements will be
34
** met: http://www.gnu.org/copyleft/gpl.html.
36
** If you are unsure which license is appropriate for your use, please
37
** contact the sales department at http://www.qtsoftware.com/contact.
24
** In addition, as a special exception, Nokia gives you certain additional
25
** rights. These rights are described in the Nokia Qt LGPL Exception
26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28
** If you have questions regarding the use of this file, please contact
29
** Nokia at qt-info@nokia.com.
38
38
** $QT_END_LICENSE$
40
40
****************************************************************************/
214
217
QByteArray idx = face_id.filename;
215
218
idx.remove(0, 14); // remove ':qmemoryfonts/'
217
freetype->fontData = qt_fontdata_from_index(idx.toInt(&ok));
220
newFreetype->fontData = qt_fontdata_from_index(idx.toInt(&ok));
219
freetype->fontData = QByteArray();
222
newFreetype->fontData = QByteArray();
220
223
} else if (!(file.fileEngine()->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::LocalDiskFlag)) {
221
224
if (!file.open(QIODevice::ReadOnly)) {
225
freetype->fontData = file.readAll();
227
newFreetype->fontData = file.readAll();
227
if (!freetype->fontData.isEmpty()) {
228
if (FT_New_Memory_Face(freetypeData->library, (const FT_Byte *)freetype->fontData.constData(), freetype->fontData.size(), face_id.index, &face)) {
229
if (!newFreetype->fontData.isEmpty()) {
230
if (FT_New_Memory_Face(freetypeData->library, (const FT_Byte *)newFreetype->fontData.constData(), newFreetype->fontData.size(), face_id.index, &face)) {
232
233
} else if (FT_New_Face(freetypeData->library, face_id.filename, face_id.index, &face)) {
236
freetype->face = face;
236
newFreetype->face = face;
238
freetype->hbFace = qHBNewFace(face, hb_getSFntTable);
242
freetype->matrix.xx = 0x10000;
243
freetype->matrix.yy = 0x10000;
244
freetype->matrix.xy = 0;
245
freetype->matrix.yx = 0;
246
freetype->unicode_map = 0;
247
freetype->symbol_map = 0;
238
newFreetype->hbFace = qHBNewFace(face, hb_getSFntTable);
239
Q_CHECK_PTR(newFreetype->hbFace);
240
newFreetype->ref = 1;
241
newFreetype->xsize = 0;
242
newFreetype->ysize = 0;
243
newFreetype->matrix.xx = 0x10000;
244
newFreetype->matrix.yy = 0x10000;
245
newFreetype->matrix.xy = 0;
246
newFreetype->matrix.yx = 0;
247
newFreetype->unicode_map = 0;
248
newFreetype->symbol_map = 0;
248
249
#ifndef QT_NO_FONTCONFIG
249
freetype->charset = 0;
250
newFreetype->charset = 0;
252
memset(freetype->cmapCache, 0, sizeof(freetype->cmapCache));
253
memset(newFreetype->cmapCache, 0, sizeof(newFreetype->cmapCache));
254
for (int i = 0; i < freetype->face->num_charmaps; ++i) {
255
FT_CharMap cm = freetype->face->charmaps[i];
255
for (int i = 0; i < newFreetype->face->num_charmaps; ++i) {
256
FT_CharMap cm = newFreetype->face->charmaps[i];
256
257
switch(cm->encoding) {
257
258
case FT_ENCODING_UNICODE:
258
freetype->unicode_map = cm;
259
newFreetype->unicode_map = cm;
260
261
case FT_ENCODING_APPLE_ROMAN:
261
262
case FT_ENCODING_ADOBE_LATIN_1:
262
if (!freetype->unicode_map || freetype->unicode_map->encoding != FT_ENCODING_UNICODE)
263
freetype->unicode_map = cm;
263
if (!newFreetype->unicode_map || newFreetype->unicode_map->encoding != FT_ENCODING_UNICODE)
264
newFreetype->unicode_map = cm;
265
266
case FT_ENCODING_ADOBE_CUSTOM:
266
267
case FT_ENCODING_MS_SYMBOL:
267
if (!freetype->symbol_map)
268
freetype->symbol_map = cm;
268
if (!newFreetype->symbol_map)
269
newFreetype->symbol_map = cm;
275
if (!FT_IS_SCALABLE(freetype->face) && freetype->face->num_fixed_sizes == 1)
276
FT_Set_Char_Size (face, X_SIZE(freetype->face, 0), Y_SIZE(freetype->face, 0), 0, 0);
276
if (!FT_IS_SCALABLE(newFreetype->face) && newFreetype->face->num_fixed_sizes == 1)
277
FT_Set_Char_Size (face, X_SIZE(newFreetype->face, 0), Y_SIZE(newFreetype->face, 0), 0, 0);
279
280
FcPatternGetString(pattern, FC_FAMILY, 0, &name);
280
281
qDebug("%s: using maps: default: %x unicode: %x, symbol: %x", name,
281
freetype->face->charmap ? freetype->face->charmap->encoding : 0,
282
freetype->unicode_map ? freetype->unicode_map->encoding : 0,
283
freetype->symbol_map ? freetype->symbol_map->encoding : 0);
282
newFreetype->face->charmap ? newFreetype->face->charmap->encoding : 0,
283
newFreetype->unicode_map ? newFreetype->unicode_map->encoding : 0,
284
newFreetype->symbol_map ? newFreetype->symbol_map->encoding : 0);
285
286
for (int i = 0; i < 256; i += 8)
286
287
qDebug(" %x: %d %d %d %d %d %d %d %d", i,
287
FcCharSetHasChar(freetype->charset, i), FcCharSetHasChar(freetype->charset, i),
288
FcCharSetHasChar(freetype->charset, i), FcCharSetHasChar(freetype->charset, i),
289
FcCharSetHasChar(freetype->charset, i), FcCharSetHasChar(freetype->charset, i),
290
FcCharSetHasChar(freetype->charset, i), FcCharSetHasChar(freetype->charset, i));
288
FcCharSetHasChar(newFreetype->charset, i), FcCharSetHasChar(newFreetype->charset, i),
289
FcCharSetHasChar(newFreetype->charset, i), FcCharSetHasChar(newFreetype->charset, i),
290
FcCharSetHasChar(newFreetype->charset, i), FcCharSetHasChar(newFreetype->charset, i),
291
FcCharSetHasChar(newFreetype->charset, i), FcCharSetHasChar(newFreetype->charset, i));
293
FT_Set_Charmap(freetype->face, freetype->unicode_map);
294
freetypeData->faces.insert(face_id, freetype);
294
FT_Set_Charmap(newFreetype->face, newFreetype->unicode_map);
296
freetypeData->faces.insert(face_id, newFreetype.data());
298
newFreetype.take()->release(face_id);
299
// we could return null in principle instead of throwing
302
freetype = newFreetype.take();