summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Wright <kevin.wright@nokia.com>2010-08-02 15:47:29 (GMT)
committerKevin Wright <kevin.wright@nokia.com>2010-08-02 15:47:29 (GMT)
commit4381ec737668c8b61efa46ab3b1cdc1f96cb00b8 (patch)
treedf569d1290dca7f467dd09b1da152b6eb8b6520a
parente55fd8c9790863f2d6001bda617a9d87be61f29b (diff)
parent00fb79714162ea3e434cf66a87a70a4fc26b2b86 (diff)
downloadQt-4381ec737668c8b61efa46ab3b1cdc1f96cb00b8.zip
Qt-4381ec737668c8b61efa46ab3b1cdc1f96cb00b8.tar.gz
Qt-4381ec737668c8b61efa46ab3b1cdc1f96cb00b8.tar.bz2
Merge branch '4.7' of http://git.scm.dev.nokia.troll.no/qt/oslo-staging-1 into 4.7
-rwxr-xr-xconfigure8
-rw-r--r--src/gui/text/qfontengine_mac.mm32
2 files changed, 37 insertions, 3 deletions
diff --git a/configure b/configure
index c61250b..52a4063 100755
--- a/configure
+++ b/configure
@@ -2397,6 +2397,14 @@ if [ "$OPT_SHADOW" = "yes" ]; then
ln -s "$relpath"/mkspecs/* "$outpath/mkspecs"
rm -f "$outpath/mkspecs/default"
+ # Special case for mkspecs/features directory.
+ # To be able to place .prf files into a shadow build directory,
+ # we're creating links for files only. The directory structure is reproduced.
+ # A simple "cp -rs" doesn't work on Mac. :(
+ rm -rf "$outpath/mkspecs/features"
+ find "$relpath/mkspecs/features" -type d | sed "s,^$relpath,$outpath," | xargs mkdir -p
+ find "$relpath/mkspecs/features" -type f | sed "s,^$relpath/,," | xargs -n 1 -I % ln -s "$relpath/%" "$outpath/%"
+
# symlink the doc directory
rm -rf "$outpath/doc"
ln -s "$relpath/doc" "$outpath/doc"
diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm
index deaad57..91b6082 100644
--- a/src/gui/text/qfontengine_mac.mm
+++ b/src/gui/text/qfontengine_mac.mm
@@ -349,11 +349,32 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay
int *nglyphs, QTextEngine::ShaperFlags flags) const
{
*nglyphs = len;
+ QCFType<CFStringRef> cfstring;
+
QVarLengthArray<CGGlyph> cgGlyphs(len);
CTFontGetGlyphsForCharacters(ctfont, (const UniChar*)str, cgGlyphs.data(), len);
- for (int i = 0; i < len; ++i)
- glyphs->glyphs[i] = cgGlyphs[i];
+ for (int i = 0; i < len; ++i) {
+ if (cgGlyphs[i]) {
+ glyphs->glyphs[i] = cgGlyphs[i];
+ } else {
+ if (!cfstring)
+ cfstring = CFStringCreateWithCharactersNoCopy(0, reinterpret_cast<const UniChar *>(str), len, kCFAllocatorNull);
+ QCFType<CTFontRef> substituteFont = CTFontCreateForString(ctfont, cfstring, CFRangeMake(i, 1));
+ CGGlyph substituteGlyph = 0;
+ CTFontGetGlyphsForCharacters(substituteFont, (const UniChar*)str + i, &substituteGlyph, 1);
+ if (substituteGlyph) {
+ const uint fontIndex = (fontIndexForFont(substituteFont) << 24);
+ glyphs->glyphs[i] = substituteGlyph | fontIndex;
+ if (!(flags & QTextEngine::GlyphIndicesOnly)) {
+ CGSize advance;
+ CTFontGetAdvancesForGlyphs(substituteFont, kCTFontHorizontalOrientation, &substituteGlyph, &advance, 1);
+ glyphs->advances_x[i] = QFixed::fromReal(advance.width);
+ glyphs->advances_y[i] = QFixed::fromReal(advance.height);
+ }
+ }
+ }
+ }
if (flags & QTextEngine::GlyphIndicesOnly)
return true;
@@ -362,9 +383,14 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay
CTFontGetAdvancesForGlyphs(ctfont, kCTFontHorizontalOrientation, cgGlyphs.data(), advances.data(), len);
for (int i = 0; i < len; ++i) {
+ if (glyphs->glyphs[i] & 0xff000000)
+ continue;
glyphs->advances_x[i] = QFixed::fromReal(advances[i].width);
glyphs->advances_y[i] = QFixed::fromReal(advances[i].height);
- if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) {
+ }
+
+ if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) {
+ for (int i = 0; i < len; ++i) {
glyphs->advances_x[i] = glyphs->advances_x[i].round();
glyphs->advances_y[i] = glyphs->advances_y[i].round();
}