Log Message
[Chromium] Implement font shaping with font-feature-settings on Windows https://bugs.webkit.org/show_bug.cgi?id=65904
Reviewed by Kenneth Russell. Source/WebCore: Use Uniscribe's OpenType APIs to shape complex text to support -webkit-font-feature-settings property. No new tests. css3/font-feature-settings-rendering.html should pass by this patch. * platform/graphics/chromium/UniscribeHelper.cpp: (WebCore::loadOpenTypeFunctions): (WebCore::UniscribeHelper::UniscribeHelper): Calls loadOpenTypeFunctions if needed. (WebCore::UniscribeHelper::fillRuns): Uses ScriptItemizeOpenType() if possible. (WebCore::UniscribeHelper::shape): Uses ScriptShapeOpenType() if possible. (WebCore::UniscribeHelper::fillShapes): Adds OpenType script tag as an argument. (WebCore::convertFeatureTag): Added. (WebCore::UniscribeHelper::setRangeProperties): Added. * platform/graphics/chromium/UniscribeHelper.h: * platform/graphics/chromium/UniscribeHelperTextRun.cpp: (WebCore::UniscribeHelperTextRun::UniscribeHelperTextRun): Calls setRangeProperties(). LayoutTests: Adds expectations of css3/font-feature-settings-rendering.html for Chromium win port. Since Uniscirbe OpenType APIs are not available on WinXP by default, the test could fail on WinXP. * platform/chromium-win/css3/font-feature-settings-rendering-expected.png: Added. * platform/chromium-win/css3/font-feature-settings-rendering-expected.txt: Added. * platform/chromium/test_expectations.txt: VISTA and WIN7 should pass css3/font-feature-settings-rendering.html.
Modified Paths
- trunk/LayoutTests/ChangeLog
- trunk/LayoutTests/platform/chromium/test_expectations.txt
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.cpp
- trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.h
- trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelperTextRun.cpp
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (96581 => 96582)
--- trunk/LayoutTests/ChangeLog 2011-10-04 10:07:39 UTC (rev 96581)
+++ trunk/LayoutTests/ChangeLog 2011-10-04 10:16:05 UTC (rev 96582)
@@ -1,3 +1,16 @@
+2011-10-04 Kenichi Ishibashi <[email protected]>
+
+ [Chromium] Implement font shaping with font-feature-settings on Windows
+ https://bugs.webkit.org/show_bug.cgi?id=65904
+
+ Reviewed by Kenneth Russell.
+
+ Adds expectations of css3/font-feature-settings-rendering.html for Chromium win port. Since Uniscirbe OpenType APIs are not available on WinXP by default, the test could fail on WinXP.
+
+ * platform/chromium-win/css3/font-feature-settings-rendering-expected.png: Added.
+ * platform/chromium-win/css3/font-feature-settings-rendering-expected.txt: Added.
+ * platform/chromium/test_expectations.txt: VISTA and WIN7 should pass css3/font-feature-settings-rendering.html.
+
2011-10-04 Oliver Varga <[email protected]>
[Qt] Unreviewed gardening. Update Qt specific expected files after r96498.
Modified: trunk/LayoutTests/platform/chromium/test_expectations.txt (96581 => 96582)
--- trunk/LayoutTests/platform/chromium/test_expectations.txt 2011-10-04 10:07:39 UTC (rev 96581)
+++ trunk/LayoutTests/platform/chromium/test_expectations.txt 2011-10-04 10:16:05 UTC (rev 96582)
@@ -486,6 +486,10 @@
WONTFIX CPU GPU : platform/chromium/rubberbanding = FAIL
WONTFIX CPU GPU : platform/chromium-gpu/compositing/rubberbanding = IMAGE
+// This requires usp10.dll version 1.600 or greater on Windows and
+// it isn't installed on XP by default.
+WONTFIX XP : css3/font-feature-settings-rendering.html = PASS FAIL
+
// -----------------------------------------------------------------
// LIGHTTPD
// -----------------------------------------------------------------
@@ -3476,7 +3480,7 @@
BUGWK65951 LINUX MAC DEBUG : webaudio/mixing.html = CRASH PASS
BUGWK65951 LINUX MAC DEBUG : webaudio/test-basic.html = CRASH PASS
-BUGWK63796 MAC WIN : css3/font-feature-settings-rendering.html = MISSING FAIL
+BUGWK63796 MAC : css3/font-feature-settings-rendering.html = MISSING FAIL
// New test in r93068
BUGWK66268 MAC CPU-CG : editing/deleting/regional-indicators.html = TEXT
Added: trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.png (0 => 96582)
--- trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.png (rev 0)
+++ trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.png 2011-10-04 10:16:05 UTC (rev 96582)
@@ -0,0 +1,18 @@
+\x89PNG
+
+
+IHDR X ' )tEXtchecksum 8fe50c0062febc6fcfc99e7fbd1e2453\x90\xEF\x9C\xCD LIDATx\x9C\xED\xDD\xDBr\xDAJ@Q3u\xFE\xFF\x97\x99\x87̡]Z\x8D\xB4\xF1-k=\xA4\x8CZRK\x88 \xF6\xED~\xBF \xD0\xF9\xCFWo \xC0o#\xB0 b &\xB0 b &\xB0 b &\xB0 b &\xB0 b \xF6\xCF\xDE7n\xB7\xDB\x92__\xF8\xFF\xDCh\xFF\xE4a?\xDF\xEDv\xFB\xE9\xBBp\xD1\xF8>=?\xCF\xC3~\xCF~u\xD7\xCF\xF9\xEBsu8\xF2\xF5\xD35<\xE1\xDCc\xE7\xCAzӴo\xDE^M\xEC\x95\xD3\xE6Mw\xBC\xBF\xD7\xCF\xF3?>\xFE|ܾ\xFE\xEB\xC7\xDC5jo\x83\x9F\xFF\xBA9\xF8`\xD9+\xD7\xD5\xC3
+\xAB.\x87\xEBj\xED\xD6\xC7΄\x9E\xB7\xE6-\xBC\xF2 yӅ\xF5\xC7]d~\xF4\xC6W\xF6N\xE0\xD3\xE7p\xFE@Ƚ\xBAU\x87\xE7|5W\x83\x91\x93\x99/\xC98\x9F\xE6\xCAzӪ7o\xAF&\xF6ʿp\xDEtp\xF7w\xDD=W,Rc]\x87\xA1\xB3\xB7%\x9BC}\xAC\xBF\xEF{r9ܰOXW\xEB\xBDo\xCE\xEC\xC3ţu\xEE\xEB\xE1\xB0_{E~^\xFB\x8F{n\x98\x94\xEFWr\x81\xF8\x9Egȕ]{^\xB6})ws\x90\xC5E\xFCk\xFDܗ\xAEOo\xF0\xF5=\xDDa|\xB8ߴ\xD2w/\xFB\xEA\xB0\xEB\xBFϩ\xF5\xEA\x93\xE6\xE0e\xB0h\x8B\xFEg\xBCa\xDF᭳W\xED\xD6K\xF8n\x9C\xC0\xC0o\xB5x\xFF\xEEM~\xFA;9_n\xF4\xE1\xD8f >\xDF\xF8\xE7\xEB?\xAEﳸ}\xF3n\x8FA\x92\xC5\xF7\xB6go\xD8\xC3\,\xB5\xBE\xFD\xF9\xF5\xD5Ñ\xD7\xD6w;\\xFBc-\x8B7\xAD\xF7\xA6qs\xB3\xF7\xE6go\x9C\xF5\xED\xF3Gso7\x97\x8F\xC1\x87\xAE<\xFE\xD3rx\x86fx\xFEQ\xB0ޗ\xBD\x83~b\xCE\xF7\xF7\xFA#tr\xAE\xE6\xB7p\xB0\x9Dù:w\xC2\xCFo\xED\xE4\xA3\xF8pN\xC6{\xB1\xB9꽝\x9A|4~w0\xCE\xE6\xBA\xC7\xF1\xC4I8\xB3\xD9{\x9F\x83\x95\xCA\xDE\xE6M\x9E\xD2\xEBL9\xBC\xB6/ܟ\xDE
+ܴ~\x8CW7\xB3\xFD{u\xF5<\xB7\x8F\xB7\xF0\xE3\xC2C`sKN\x9C3\xA7\xAFl\xA7\x9F\xC4O\xD6\xE2\xCC^\xD7\xF5\x93г\xF5\xED{#T\x8B\xFF\xF9bo{6\x87\xEF\xE0ޘ{Ϭ\x87#f\xF81\xE6\xCC\xDA\xEC\xCD\xCF\xE1\xE1[l\xCC\xCC<\xBFt8\xF6vjr\xC6\xC6Gs\xC6\xE4\xB4<,.a\x9B3\xB3\xDE\xEB\x99G\xC1\xDE\xD73\x93\xB9\xB9\xD2\xC9\xFD\xBD\xF8\x9D\x9C\xAB\xBD\xCEm\xE7\xE6\xD7\xE7N\xF8\xF9\xAD\x9D<'\xE7\xD7\xF2\xA6#>>
+l\xC3}\xE7\xF1p\xFC\xC1}^\xBA$\xEE=\xF46\xBF;\xB8\xE0\xACy|\xBDwPf\x8E\xFB\xDE\xFE\xBE\xBBy43063\xE7{_\xAF\xD7\xF8\xB8v
+Vt\xE2
+|\xEE!0>\xD96\xB7o\xCF]\xD9/\xF2\xE7?\x83u\xFB\xD7\xFA[/M\xFA\xF3v?v\xE61\xEF^|<\xF2b\x9F\xE7wr\x90\xCD-L\xDD\xDE/-\xF8<!뵿\xB4\xC6\xCDq\xF3<s8\x8F\x99\xC5N%\xC7n\xC6\xDEc\xB2\x9A\xE1\xEB\xBB0yn/\xEE6?Լ+s\xF5\xD2\xDA\xCFm\xE7\xC5~0\xE0`\xD8\xCD\xDD顽V\xF1\xF1<w\\xF3\x87`\xE6$\xFC\x98\xBE\xCC>\xD8\xF1\xF1g\xB1\xF8\xE4 \xBCؼ\xC9\xFD\xDD\xFC\xEEf\x9C8s6\x9F\xFB'\xB7\xFFc8?\x8F\xDC\xDC\\xE9\xFC\x9E\xB3\xF9\xE8[{\xE9\x9Cٻ\xDB̕\xED\xCAE\xFE\xFC[\x84\x9BO\xC3\xCFW\x84on\xB3\x9C\x9E
+\xFA\xFD\xC4S\xD4x\xE4\xF5\xC6lN\xE6['\xF6\xAB\xDFK\xAB{\xFC\xE4\xF0\x9A\xF2 \xB37\xC2\xE44.\xF6\xE5\xAD\xFB\xF5\x9F\xB9\x9D\xDFp\xAEΕ\xCD[\xF7b|\xEE}\xE7\xEB\xF3\xC5M:\xB7k\xEB\x8B\xF9\xDEA g\xEC\xA5g\xFA\x97Υs\x83\xBF\xE3!>\xDEwO^\xBAg\xEEy>\xB0\xF6V\xFCq\xF6E\xCEOvb߷_\x83G\xC5;V\xBA\xB8\xA6|\xC2\xFF*\xA6\xF1\xBB\xD9;\xE1\x9F\xF1\xB9\xF7\x8B\xCF\xCCWw\xED\xAB&\xE1g\x82/\xFFg̷5y\x83\xD3\xF0\xB8r
+^\xAC,\xFE|\xED;q,O,\xFE\xEA\x8BO\xEB\xFB\xDE\xF2x\xE5\xF6\x{116317}\xDD\\xDD̂\x8F\xFB\xDC\xFF5\xBF\xE0\xCC<\xC7\xE1⓻|\xF1\xE5\xC3I\xA7W\xF1\xEA\xA3\xE0y6\xD6\xFFn>1\xE7\x9B\xEB:\xF7(\x9B\x9C\x84ûͯ}|\xCF\xC1\n\xE1\xFA\x84\xDB䀇K\x8D\xDAo:\xE2/]4\xF6n\xC3\xE6\xBAfN\xC2\xC5 \xF3\x81\xC3\xC1LJ`|\xAAvdp\xE7W\xF7w\xDEK\xE3,谇\xF6&j\xF2!9?\xE6\xD8\xE9\xF2\xFC^IN\x8F<\xBF\xF8\xC7\xC7\xC7\xF1{\xB7\xCF\xDD|\xBE|\x9E\xA9\xCD[\xFB\xB6w\xCF\xC1?7_]|\xFD\xF5\xE1\xFB\xA7\x83|\xB5\xB9\xEA\xE7?\xD7;2\xF3\x8F\xE9\xC9\x9Fؤg\x9B\xF3p\xB8\xBF\x8B\xED\xD9\xDB\xD9\xF5"\xEBy\xDE\|s\x90\x99\xB3h\x9Dn{3y\xB8\xA7\x87k\xDFj\xE1\xD5G\xC1\xE6\xC6\x9E\xCF\xE6\xE7\xFCp6\xD6C\x8DG{\xDC\xE1\xDC\>H\xEF\xF9<\xEC\xE6\\x9D;\xE1\xE7\xF7ws\xC1+\xED7\xF1Ç\xF0\xF3wGv\xBD
+\x9Bk,u\xD8O\xE3\x8B\xC0\xA6\xC1\xDA7\xB7d|\xBD</\x9E\x8F\xE7t\x83\xCB\xC5\xE6\xC1\x9A\x99\x81M3×\x9EM\xF6\xB6\xF3\xE3\xF5\xE7\xD3W/z\xE3G\xDFކ͜3\xEB[\xE6\xAFl3\xA9\xB3\xBB\xAFN~\xBA\xCDk\xC1\xF1\x89r\xED\xDF\xEBh\xFCn\xE7Nx~\xB4+\x87\xD8\xE9\x910\x8D~\xD93?\x8E\xC7-\xF0&./ \xD3\xF8\x87Y\xF8\xBEc\xB2w\xFFsg\xCB\xC5\xC5\xE38cyի'<?ڹ\x8E\xCB9\x81 \xF3! @L` \xC4 @L` \xC4 @\xEC\xB5\xC0\xFF0\xEB+#l\xDE~}u\x8BqNXmÛ\x86}i>\xCF
+uqX \xF8\xBDX?\xBD\xAE>N\xFD\x82d\xDE4\xAC\xBA\x80\xEF\xE9\x85\xC0\xBA\xFE\xB3\xF6Fؼ\xBD\xFA]W\xC6y\xD3 {\xF7\xAE\x9Df?2
+ &\xF9 @\xEC\x9F\xF1\xB7\xBF\x85{\xEF\xF7\x8A\xAF\xFFz\xFAwn\xAEn\xBC\xEC\xE6o\xD2\xDE\xFB\x85؛\xBF}}s\xC0\xC5~}L\xFC:\xEE\xF9\xFD\x9D\xFC\xB5\xE7\x87{ze\xCCӫ\x9B\xFC\xDD\xF5'6 ~\x96Q`=r\xE4\xF9\xC37\xCF7>?\x95.n\<\xA7\xEE}\xCAj=\xFE\xE0>\xEB\xD5-\xBE\xBE\xB7\xCF\xAE^\xE4\xF1\xF5\x9F\xFDz\xDE\xDF\xC9M|vj0\xA5\x87KMn\xF6\xCC\x8Epsu{\xE7\xC0\xE4\xFC̜ \xF0SL\xBDE\xF8\xFC<:~
+\xDFk\xA9\xB5\xC5R\x87\xAB^\x8C|\xFB\xD7\xFC\xE0\x83Oz=\xFF\xB9\xB7\xEBf֛7\xB3\xBF\xE3U.un\xB3ׯ\xB1\x8D_@\xDA\\xDD\xDE9\xF0\xF8z]c{\x87\xCF\xCBW \xFC\xA3W\xB0\xDF2\xFBB7\xE9ܮ=Y\xC4\xF3\xCB37oo\xED\x98\xE3{\xB6֓\xF3\xB1\xB5/\xDF\xF9d\x80W|k\xF0\xDE\xD3O\xF7\xEA\xAE}\xC2$\xEC\xAD\xE2\xCAQxi\xA9w\xEE\xCD \xFD\xB4\xB5\xC0\x97\xBDE8\xF9z\xC6\xDE[E\x8Bq\xA3-\x96:\\xDD\xE0\xB3V\x87\x9B\xB4\xBE\xDB\xDEg\xC2\xC6\xEB\xDA\v\xFC\xCA\xD0\xE6\xD1\xF7w\xF1\xDE\xE2\xDE\xDD\xD6K\xCDo\xF6\x89\xF1\xAB\xDB;\x9F\xC1\xAC\xDDG\xAF \xF8M\xA6\x9E\x92\x9F>\xBE\xAF\xFES\xD8\xE3\xBB\xEB\xF4|\xFC\xFF\xFBh{K\xF6\xD3\xE6\xC8\xEB\xDB'\xB9%\xEBw\xA9\xF6Y\xDFmr\xF3\xC6\xFB\xBB\xB9\x8A\xC3=ݛ\xD5\xF1f\xEE`\xFBg\xBEu\xB8\x87\xDB\xFC\xB8\xC5KY \xFCP\x9E\xC3\xFE\xE7\xCAӹ \x9E\xF9A\xA3W\xA9+ `A||̽ḷ\x94 @\xCC[\x84 1\x81 X 1\x81 X 1\x81 X 1\x81 X 1\x81 X 1\x81 X 1\x81 X 1\x81 X 1\x81 \xDB
+\xAC\xDB\x{DDBE}e}\xE3\xE1R \x9B\xA9W\xB0٤\xA8 F\x81\xF5'\x9E\x9E\xEA~\xBF\xBF\xBA\x82\xC5\xEB^\x82 \xF8\xF5\x82\xCF`\xED5\x93\x96 \xFEN\xFF\xEC}\xE3~\xBF\x9F.\xA4\x8B/z \xFChg^\xC1\x87ן\xEF\xDE\xEF\xF7GZ=\xDEj\\xBF\xE7 \xF0\xFB쾂\xB5\xE9\xD1F\x8F\x8Aڼ\xDB\xE6\xEDn\xBC\xDDn^\xD3 ~\xB73\xAF`=\xBF: \xC0\xC2l`-\xFE'\xE0\xE2m\xBEŇ\xAE\xBC \xFC͎k\xF1b\xD5\xFD\xC9\xF3\x8D\x83\xE4 \xF8\xAB\xD6\xFA\xFF.>\x86\xB5\xFEz}O \x80\xBF\xCA(\xB0\xAFQ-\xBE\xF8\xF3\xE1\xFA\x95\xAD\xC5_}N \xF8;\xF9?} \xB1\xE0'\xB9 \xF0L` \xC4 @l\xF7'\xB9\xFB?\x80c>\xBB \xEC\xF1
+ @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @\xECv\xBF߿z ~\x95\xF6\xBEq\xBB\xDD>s;~a
+ \xEC\xF1! @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @\xECv\xBF߿z ~\xAF` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4 @L` \xC4\xFE\xBE\xAC_\xAB\xBE\xC8%\xD0 IEND\xAEB`\x82
\ No newline at end of file
Property changes on: trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.png
___________________________________________________________________
Added: svn:executable
Added: trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.txt (0 => 96582)
--- trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/chromium-win/css3/font-feature-settings-rendering-expected.txt 2011-10-04 10:16:05 UTC (rev 96582)
@@ -0,0 +1,19 @@
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock {P} at (0,0) size 784x40
+ RenderText {#text} at (0,0) size 783x39
+ text run at (0,0) width 235: "Test for font-feature-settings property. "
+ text run at (235,0) width 548: "The first word of the following three words should be displayed like \"WebKit\", while others"
+ text run at (0,20) width 217: "should be displayed as black boxes."
+ RenderBlock {DIV} at (0,56) size 784x17
+ RenderText {#text} at (0,0) size 30x16
+ text run at (0,0) width 30: "WebKit"
+ RenderBlock {DIV} at (0,73) size 784x17
+ RenderText {#text} at (0,0) size 96x16
+ text run at (0,0) width 96: "WebKit"
+ RenderBlock {DIV} at (0,90) size 784x17
+ RenderText {#text} at (0,0) size 96x16
+ text run at (0,0) width 96: "WebKit"
Modified: trunk/Source/WebCore/ChangeLog (96581 => 96582)
--- trunk/Source/WebCore/ChangeLog 2011-10-04 10:07:39 UTC (rev 96581)
+++ trunk/Source/WebCore/ChangeLog 2011-10-04 10:16:05 UTC (rev 96582)
@@ -1,3 +1,26 @@
+2011-10-04 Kenichi Ishibashi <[email protected]>
+
+ [Chromium] Implement font shaping with font-feature-settings on Windows
+ https://bugs.webkit.org/show_bug.cgi?id=65904
+
+ Reviewed by Kenneth Russell.
+
+ Use Uniscribe's OpenType APIs to shape complex text to support -webkit-font-feature-settings property.
+
+ No new tests. css3/font-feature-settings-rendering.html should pass by this patch.
+
+ * platform/graphics/chromium/UniscribeHelper.cpp:
+ (WebCore::loadOpenTypeFunctions):
+ (WebCore::UniscribeHelper::UniscribeHelper): Calls loadOpenTypeFunctions if needed.
+ (WebCore::UniscribeHelper::fillRuns): Uses ScriptItemizeOpenType() if possible.
+ (WebCore::UniscribeHelper::shape): Uses ScriptShapeOpenType() if possible.
+ (WebCore::UniscribeHelper::fillShapes): Adds OpenType script tag as an argument.
+ (WebCore::convertFeatureTag): Added.
+ (WebCore::UniscribeHelper::setRangeProperties): Added.
+ * platform/graphics/chromium/UniscribeHelper.h:
+ * platform/graphics/chromium/UniscribeHelperTextRun.cpp:
+ (WebCore::UniscribeHelperTextRun::UniscribeHelperTextRun): Calls setRangeProperties().
+
2011-10-04 Ryuan Choi <[email protected]>
[EFL] Implement declared but missing functions.
Modified: trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.cpp (96581 => 96582)
--- trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.cpp 2011-10-04 10:07:39 UTC (rev 96581)
+++ trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.cpp 2011-10-04 10:16:05 UTC (rev 96582)
@@ -41,6 +41,44 @@
namespace WebCore {
+// The function types for ScriptItemizeOpenType() and ScriptShapeOpenType().
+// We want to use these functions for OpenType feature support, but we can't
+// call them directly because usp10.dll does not always have them.
+// Instead, we use GetProcAddress() to check whether we can actually use these
+// function. If we can't use these functions, we substitute ScriptItemze() and
+// ScriptShape().
+typedef HRESULT (WINAPI *ScriptItemizeOpenTypeFunc)(const WCHAR*, int, int,
+ const SCRIPT_CONTROL*,
+ const SCRIPT_STATE*,
+ SCRIPT_ITEM*,
+ OPENTYPE_TAG*, int*);
+typedef HRESULT (WINAPI *ScriptShapeOpenTypeFunc)(HDC, SCRIPT_CACHE*,
+ SCRIPT_ANALYSIS*,
+ OPENTYPE_TAG, OPENTYPE_TAG,
+ int*, TEXTRANGE_PROPERTIES**,
+ int, const WCHAR*, int, int,
+ WORD*, SCRIPT_CHARPROP*,
+ WORD*, SCRIPT_GLYPHPROP*,
+ int*);
+
+static ScriptItemizeOpenTypeFunc gScriptItemizeOpenTypeFunc = 0;
+static ScriptShapeOpenTypeFunc gScriptShapeOpenTypeFunc = 0;
+static bool gOpenTypeFunctionsLoaded = false;
+
+static void loadOpenTypeFunctions()
+{
+ HMODULE hModule = GetModuleHandle(L"usp10");
+ if (hModule) {
+ gScriptItemizeOpenTypeFunc = reinterpret_cast<ScriptItemizeOpenTypeFunc>(GetProcAddress(hModule, "ScriptItemizeOpenType"));
+ gScriptShapeOpenTypeFunc = reinterpret_cast<ScriptShapeOpenTypeFunc>(GetProcAddress(hModule, "ScriptShapeOpenType"));
+ }
+ if (!gScriptItemizeOpenTypeFunc || !gScriptShapeOpenTypeFunc) {
+ gScriptItemizeOpenTypeFunc = 0;
+ gScriptShapeOpenTypeFunc = 0;
+ }
+ gOpenTypeFunctionsLoaded = true;
+}
+
// HFONT is the 'incarnation' of 'everything' about font, but it's an opaque
// handle and we can't directly query it to make a new HFONT sharing
// its characteristics (height, style, etc) except for family name.
@@ -92,6 +130,8 @@
{
m_logfont.lfFaceName[0] = 0;
+ if (!gOpenTypeFunctionsLoaded)
+ loadOpenTypeFunctions();
}
UniscribeHelper::~UniscribeHelper()
@@ -418,7 +458,8 @@
void UniscribeHelper::fillRuns()
{
HRESULT hr;
- m_runs.resize(UNISCRIBE_HELPER_STACK_RUNS);
+ m_runs.resize(cUniscribeHelperStackRuns);
+ m_scriptTags.resize(cUniscribeHelperStackRuns);
SCRIPT_STATE inputState;
inputState.uBidiLevel = m_isRtl;
@@ -473,10 +514,35 @@
// It seems to be doing at least two passes, the first where it puts a
// lot of intermediate data into our items, and the second where it
// collates them.
- hr = ScriptItemize(m_input, m_inputLength,
- static_cast<int>(m_runs.size()) - 1, &inputControl,
- &inputState,
- &m_runs[0], &numberOfItems);
+ if (gScriptItemizeOpenTypeFunc) {
+ hr = gScriptItemizeOpenTypeFunc(m_input, m_inputLength,
+ static_cast<int>(m_runs.size()) - 1,
+ &inputControl, &inputState,
+ &m_runs[0], &m_scriptTags[0],
+ &numberOfItems);
+ if (SUCCEEDED(hr)) {
+ // Pack consecutive runs, the script tag of which are
+ // SCRIPT_TAG_UNKNOWN, to reduce the number of runs.
+ for (int i = 0; i < numberOfItems; ++i) {
+ if (m_scriptTags[i] == SCRIPT_TAG_UNKNOWN) {
+ int j = 1;
+ while (i + j < numberOfItems && m_scriptTags[i + j] == SCRIPT_TAG_UNKNOWN)
+ ++j;
+ if (--j) {
+ m_runs.remove(i + 1, j);
+ m_scriptTags.remove(i + 1, j);
+ numberOfItems -= j;
+ }
+ }
+ }
+ m_scriptTags.resize(numberOfItems);
+ }
+ } else {
+ hr = ScriptItemize(m_input, m_inputLength,
+ static_cast<int>(m_runs.size()) - 1,
+ &inputControl, &inputState, &m_runs[0],
+ &numberOfItems);
+ }
if (SUCCEEDED(hr)) {
m_runs.resize(numberOfItems);
break;
@@ -488,6 +554,7 @@
}
// There was not enough items for it to write into, expand.
m_runs.resize(m_runs.size() * 2);
+ m_scriptTags.resize(m_runs.size());
}
}
@@ -495,11 +562,14 @@
int itemLength,
int numGlyphs,
SCRIPT_ITEM& run,
+ OPENTYPE_TAG scriptTag,
Shaping& shaping)
{
HFONT hfont = m_hfont;
SCRIPT_CACHE* scriptCache = m_scriptCache;
SCRIPT_FONTPROPERTIES* fontProperties = m_fontProperties;
+ Vector<SCRIPT_CHARPROP, cUniscribeHelperStackChars> charProps;
+ Vector<SCRIPT_GLYPHPROP, cUniscribeHelperStackChars> glyphProps;
int ascent = m_ascent;
WORD spaceGlyph = m_spaceGlyph;
HDC tempDC = 0;
@@ -522,6 +592,8 @@
shaping.m_logs.resize(itemLength);
shaping.m_glyphs.resize(numGlyphs);
shaping.m_visualAttributes.resize(numGlyphs);
+ charProps.resize(itemLength);
+ glyphProps.resize(numGlyphs);
#ifdef PURIFY
// http://code.google.com/p/chromium/issues/detail?id=5309
@@ -542,13 +614,23 @@
ZeroMemory(&shaping.m_glyphs[0],
sizeof(shaping.m_glyphs[0]) * shaping.m_glyphs.size());
#endif
-
// Firefox sets SCRIPT_ANALYSIS.SCRIPT_STATE.fDisplayZWG to true
// here. Is that what we want? It will display control characters.
- hr = ScriptShape(tempDC, scriptCache, input, itemLength,
- numGlyphs, &run.a,
- &shaping.m_glyphs[0], &shaping.m_logs[0],
- &shaping.m_visualAttributes[0], &generatedGlyphs);
+ if (gScriptShapeOpenTypeFunc) {
+ TEXTRANGE_PROPERTIES* rangeProps = m_featureRecords.size() ? &m_rangeProperties : 0;
+ hr = gScriptShapeOpenTypeFunc(tempDC, scriptCache, &run.a,
+ scriptTag, 0, &itemLength,
+ &rangeProps, rangeProps ? 1 : 0,
+ input, itemLength, numGlyphs,
+ &shaping.m_logs[0], &charProps[0],
+ &shaping.m_glyphs[0], &glyphProps[0],
+ &generatedGlyphs);
+ } else {
+ hr = ScriptShape(tempDC, scriptCache, input, itemLength,
+ numGlyphs, &run.a,
+ &shaping.m_glyphs[0], &shaping.m_logs[0],
+ &shaping.m_visualAttributes[0], &generatedGlyphs);
+ }
if (hr == E_PENDING) {
// Allocate the DC.
tempDC = GetDC(0);
@@ -645,6 +727,12 @@
cleanup:
shaping.m_glyphs.resize(generatedGlyphs);
shaping.m_visualAttributes.resize(generatedGlyphs);
+ // If we use ScriptShapeOpenType(), visual attributes information for each
+ // characters are stored in |glyphProps[i].sva|.
+ if (gScriptShapeOpenTypeFunc) {
+ for (int i = 0; i < generatedGlyphs; ++i)
+ memcpy(&shaping.m_visualAttributes[i], &glyphProps[i].sva, sizeof(SCRIPT_VISATTR));
+ }
shaping.m_advance.resize(generatedGlyphs);
shaping.m_offsets.resize(generatedGlyphs);
if (tempDC) {
@@ -668,11 +756,11 @@
itemLength = m_runs[i + 1].iCharPos - startItem;
int numGlyphs;
- if (itemLength < UNISCRIBE_HELPER_STACK_CHARS) {
+ if (itemLength < cUniscribeHelperStackChars) {
// We'll start our buffer sizes with the current stack space
// available in our buffers if the current input fits. As long as
// it doesn't expand past that we'll save a lot of time mallocing.
- numGlyphs = UNISCRIBE_HELPER_STACK_CHARS;
+ numGlyphs = cUniscribeHelperStackChars;
} else {
// When the input doesn't fit, give up with the stack since it will
// almost surely not be enough room (unless the input actually
@@ -685,7 +773,7 @@
// Convert a string to a glyph string trying the primary font, fonts in
// the fallback list and then script-specific last resort font.
Shaping& shaping = m_shapes[i];
- if (!shape(&m_input[startItem], itemLength, numGlyphs, m_runs[i], shaping))
+ if (!shape(&m_input[startItem], itemLength, numGlyphs, m_runs[i], m_scriptTags[i], shaping))
continue;
// At the moment, the only time m_disableFontFallback is set is
@@ -724,6 +812,7 @@
// Some error we don't know how to handle. Nuke all of our data
// since we can't deal with partially valid data later.
m_runs.clear();
+ m_scriptTags.clear();
m_shapes.clear();
m_screenOrder.clear();
}
@@ -932,5 +1021,25 @@
return false;
}
+static OPENTYPE_TAG convertFeatureTag(const String& tag)
+{
+ return ((tag[0] & 0xFF) | ((tag[1] & 0xFF) << 8) | ((tag[2] & 0xFF) << 16) | ((tag[3] & 0xFF) << 24));
+}
+void UniscribeHelper::setRangeProperties(const FontFeatureSettings* featureSettings)
+{
+ if (!featureSettings || !featureSettings->size()) {
+ m_featureRecords.resize(0);
+ return;
+ }
+
+ m_featureRecords.resize(featureSettings->size());
+ for (unsigned i = 0; i < featureSettings->size(); ++i) {
+ m_featureRecords[i].lParameter = featureSettings->at(i).value();
+ m_featureRecords[i].tagFeature = convertFeatureTag(featureSettings->at(i).tag());
+ }
+ m_rangeProperties.potfRecords = &m_featureRecords[0];
+ m_rangeProperties.cotfRecords = m_featureRecords.size();
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.h (96581 => 96582)
--- trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.h 2011-10-04 10:07:39 UTC (rev 96581)
+++ trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelper.h 2011-10-04 10:16:05 UTC (rev 96582)
@@ -44,10 +44,12 @@
namespace WebCore {
+class FontFeatureSettings;
class GraphicsContext;
-#define UNISCRIBE_HELPER_STACK_RUNS 8
-#define UNISCRIBE_HELPER_STACK_CHARS 32
+const unsigned cUniscribeHelperStackRuns = 8;
+const unsigned cUniscribeHelperStackChars = 32;
+const unsigned cUniscribeHelperFeatures = 4;
// This object should be safe to create & destroy frequently, as long as the
// caller preserves the script_cache when possible (this data may be slow to
@@ -158,6 +160,10 @@
m_disableFontFallback = true;
}
+ // Set TEXTRANGE_PROPERTIES structure which contains
+ // OpenType feature records generated from FontFeatureSettings.
+ void setRangeProperties(const FontFeatureSettings*);
+
// You must call this after setting any options but before doing any
// other calls like asking for widths or drawing.
void init()
@@ -269,7 +275,7 @@
// Glyph indices in the font used to display this item. These indices
// are in screen order.
- Vector<WORD, UNISCRIBE_HELPER_STACK_CHARS> m_glyphs;
+ Vector<WORD, cUniscribeHelperStackChars> m_glyphs;
// For each input character, this tells us the first glyph index it
// generated. This is the only array with size of the input chars.
@@ -278,20 +284,20 @@
// can generate one glyph, in which case there will be adjacent
// duplicates in this list. One character can also generate multiple
// glyphs, in which case there will be skipped indices in this list.
- Vector<WORD, UNISCRIBE_HELPER_STACK_CHARS> m_logs;
+ Vector<WORD, cUniscribeHelperStackChars> m_logs;
// Flags and such for each glyph.
- Vector<SCRIPT_VISATTR, UNISCRIBE_HELPER_STACK_CHARS> m_visualAttributes;
+ Vector<SCRIPT_VISATTR, cUniscribeHelperStackChars> m_visualAttributes;
// Horizontal advances for each glyph listed above, this is basically
// how wide each glyph is.
- Vector<int, UNISCRIBE_HELPER_STACK_CHARS> m_advance;
+ Vector<int, cUniscribeHelperStackChars> m_advance;
// This contains glyph offsets, from the nominal position of a glyph.
// It is used to adjust the positions of multiple combining characters
// around/above/below base characters in a context-sensitive manner so
// that they don't bump against each other and the base character.
- Vector<GOFFSET, UNISCRIBE_HELPER_STACK_CHARS> m_offsets;
+ Vector<GOFFSET, cUniscribeHelperStackChars> m_offsets;
// Filled by a call to Justify, this is empty for nonjustified text.
// If nonempty, this contains the array of justify characters for each
@@ -300,7 +306,7 @@
// This is the same as the advance array, but with extra space added
// for some characters. The difference between a glyph's |justify|
// width and it's |advance| width is the extra space added.
- Vector<int, UNISCRIBE_HELPER_STACK_CHARS> m_justify;
+ Vector<int, cUniscribeHelperStackChars> m_justify;
// Sizing information for this run. This treats the entire run as a
// character with a preceeding advance, width, and ending advance. The
@@ -358,7 +364,7 @@
// by |input| comes from ScriptItemize and is supposed to contain
// characters belonging to a single script aside from characters common to
// all scripts (e.g. space).
- bool shape(const UChar* input, int itemLength, int numGlyphs, SCRIPT_ITEM& run, Shaping&);
+ bool shape(const UChar* input, int itemLength, int numGlyphs, SCRIPT_ITEM& run, OPENTYPE_TAG, Shaping&);
// Gets Windows font data for the next best font to try in the list
// of fonts. When there's no more font available, returns false
@@ -405,9 +411,10 @@
// Uniscribe breaks the text into Runs. These are one length of text that is
// in one script and one direction. This array is in reading order.
- Vector<SCRIPT_ITEM, UNISCRIBE_HELPER_STACK_RUNS> m_runs;
+ Vector<SCRIPT_ITEM, cUniscribeHelperStackRuns> m_runs;
- Vector<Shaping, UNISCRIBE_HELPER_STACK_RUNS> m_shapes;
+ Vector<Shaping, cUniscribeHelperStackRuns> m_shapes;
+ Vector<OPENTYPE_TAG, cUniscribeHelperStackRuns> m_scriptTags;
// This is a mapping between reading order and screen order for the items.
// Uniscribe's items array are in reading order. For right-to-left text,
@@ -416,7 +423,12 @@
// and positions. This list is in screen order from left to right, and
// gives the index into the |m_runs| and |m_shapes| arrays of each
// subsequent item.
- Vector<int, UNISCRIBE_HELPER_STACK_RUNS> m_screenOrder;
+ Vector<int, cUniscribeHelperStackRuns> m_screenOrder;
+
+ // This contains Uniscribe's OpenType feature settings. This structure
+ // is filled by using WebKit's |FontFeatureSettings|.
+ TEXTRANGE_PROPERTIES m_rangeProperties;
+ Vector<OPENTYPE_FEATURE_RECORD, cUniscribeHelperFeatures> m_featureRecords;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelperTextRun.cpp (96581 => 96582)
--- trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelperTextRun.cpp 2011-10-04 10:07:39 UTC (rev 96581)
+++ trunk/Source/WebCore/platform/graphics/chromium/UniscribeHelperTextRun.cpp 2011-10-04 10:16:05 UTC (rev 96582)
@@ -53,6 +53,7 @@
setSpaceWidth(font.spaceWidth());
setWordSpacing(font.wordSpacing());
setAscent(font.fontMetrics().ascent());
+ setRangeProperties(font.fontDescription().featureSettings());
init();
_______________________________________________ webkit-changes mailing list [email protected] http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes
