Title: [127162] trunk
Revision
127162
Author
[email protected]
Date
2012-08-30 11:02:52 -0700 (Thu, 30 Aug 2012)

Log Message

Add support for blendmode to webkit rendering engine
https://bugs.webkit.org/show_bug.cgi?id=95258

Patch by Rik Cabanier <[email protected]> on 2012-08-30
Reviewed by Simon Fraser.

Source/WebCore:

This code adds support for blendmodes to the WebCore engine. The CSS parser already
supported this keyword but didn't pass it along. Support for rendering blending will
be provided in subsequent patches

Test: css3/compositing/should-have-compositing-layer.html

* css/StyleBuilder.cpp:
(WebCore::StyleBuilder::StyleBuilder):
* css/StyleResolver.cpp:
(WebCore::StyleResolver::collectMatchingRulesForList):
* rendering/RenderBox.h:
* rendering/RenderBoxModelObject.h:
(RenderBoxModelObject):
(WebCore::RenderBoxModelObject::requiresLayer):
* rendering/RenderInline.h:
(WebCore::RenderInline::requiresLayer):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore):
(WebCore::RenderLayer::updateBlendMode):
(WebCore::RenderLayer::ensureBacking):
(WebCore::RenderLayer::shouldBeNormalFlowOnly):
(WebCore::RenderLayer::styleChanged):
* rendering/RenderLayer.h:
(RenderLayer):
(WebCore::RenderLayer::hasBlendMode):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresCompositingLayer):
(WebCore::RenderLayerCompositor::requiresOwnBackingStore):
(WebCore::RenderLayerCompositor::reasonForCompositing):
(WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason):
(WebCore::RenderLayerCompositor::requiresCompositingForBlending):
(WebCore):
* rendering/RenderLayerCompositor.h:
(RenderLayerCompositor):
* rendering/RenderObject.h:
(RenderObject):
(WebCore::RenderObject::hasBlendMode):
(WebCore::RenderObject::createsGroup):
* rendering/RenderTableRow.h:
* rendering/style/RenderStyle.h:

LayoutTests:

Enable test to verify that blending modes introduce a new compositing layer

* css3/compositing/resources: Added.
* css3/compositing/resources/reference.png: Added.
* css3/compositing/should-have-compositing-layer-expected.txt: Added.
* css3/compositing/should-have-compositing-layer.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (127161 => 127162)


--- trunk/LayoutTests/ChangeLog	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/LayoutTests/ChangeLog	2012-08-30 18:02:52 UTC (rev 127162)
@@ -1,3 +1,17 @@
+2012-08-30  Rik Cabanier  <[email protected]>
+
+        Add support for blendmode to webkit rendering engine
+        https://bugs.webkit.org/show_bug.cgi?id=95258
+
+        Reviewed by Simon Fraser.
+
+        Enable test to verify that blending modes introduce a new compositing layer
+
+        * css3/compositing/resources: Added.
+        * css3/compositing/resources/reference.png: Added.
+        * css3/compositing/should-have-compositing-layer-expected.txt: Added.
+        * css3/compositing/should-have-compositing-layer.html: Added.
+
 2012-08-30  Xianzhu Wang  <[email protected]>
 
         [Chromium-Android] Upstream layout test rebaselined expectations

Added: trunk/LayoutTests/css3/compositing/resources/reference.png (0 => 127162)


--- trunk/LayoutTests/css3/compositing/resources/reference.png	                        (rev 0)
+++ trunk/LayoutTests/css3/compositing/resources/reference.png	2012-08-30 18:02:52 UTC (rev 127162)
@@ -0,0 +1,31 @@
+\x89PNG
+
+
+IHDR\xA0Z?\xC6]R
+CiCCPICC profilexڝSwX\x93\xF7>\xDF\xF7eVB\xD8\xF0\xB1\x97l\x81"#\xAC\xC8Y\xA2\x92a\x84@Ņ\x88
+V\x9CHUĂ\xD5
+H\x9D\x88\xE2\xA0(\xB8gA\x8A\x88Z\x8BU\8\xEEܧ\xB5}z\xEF\xED\xED\xFB\xD7\xFB\xBC\xE7\x9C\xE7\xFC\xCEy\xCF\x80&\x91\xE6\xA2j9R\x85<:\xD8\x8FOH\xC4ɽ\x80H\xE0 \xE6\xCB\xC2g\xC5\xF0yx~t\xB0?\xFC\xAFop\xD5.$\xC7\xE1\xFF\x83\xBAP&W \x91\xE0"\xE7\x90R\xC8.T\xC8\xC8\xB0S\xB3d
+\x94ly|B"\xAA
+\xEC\xF4I>ة\x93\xDCآ\xA9\x8D\x99(G$@\xBB`U\x81R,\xC0\xC2\xA0\xAC@".\xC0\xAE\x80Y\xB62G\x80\xBDv\x8EX\x90@`\x80\x99B,\xCC 8C\xCD L\xA00ҿ\xE0\xA9_p\x85\xB8H\xC0˕͗K\xD23\xB8\x95\xD0w\xF2\xF0\xE0\xE2!\xE2\xC2l\xB1Ba)f	\xE4"\x9C\x97\x9B#H\xE7L\xCE\xF9\xD1\xC1\xFE8?\x90\xE7\xE6\xE4\xE1\xE6f\xE7l\xEF\xF4Ţ\xFEk\xF0o">!\xF1\xDF\xFE\xBC\x8CN\xCF\xEF\xDA_\xE5\xE5\xD6p\xC7\xB0u\xBFk\xA9[\xDAVh\xDF\xF9]3\xDB	\xA0Z
+\xD0z\xF9\x8By8\xFC@\x9E\xA1P\xC8<
+\xED%b\xA1\xBD0\xE3\x8B>\xFF3\xE1o\xE0\x8B~\xF6\xFC@\xFE\xDBz\xF0q\x9A@\x99\xAD\xC0\xA3\x83\xFDqanv\xAER\x8E\xE7\xCBB1n\xF7\xE7#\xFEDž\xFD\x8E)\xD1\xE24\xB1\,\x8A\xF1X\x89\xB8P"M\xC7y\xB9R\x91D!ɕ\xE2\xE92\xF1\x96\xFD	\x93w
+\xAC\x86O\xC0N\xB6\xB5\xCBl\xC0~\xEE\x8BX\xD2v@~\xF3-\x8C\x91g42y\xF7\x93\xBF\xF9\x8F@+͗\xA4\xE3\xBC\xE8\\xA8\x94L\xC6D\xA0\x81*\xB0A\xC1\xAC\xC0\x9C\xC1\xBC\xC0aD@$\xC0<B\xE4\x80
+\xA1\x96AT\xC0:\xD8\xB5\xB0\xA0\x9A\xE1\xB4\xC118
+\xE7\xE0\\x81\xEBp`\x9E\xC2\xBC\x86	A\xC8a!:\x88b\x8E\xD8"\xCE\x99\x8E"aH4\x92\x80\xA4 \xE9\x88Q"\xC5\xC8r\xA4\xA9Bj\x91]H#\xF2-r9\x8D\@\xFA\x90\xDB\xC8 2\x8A\xFC\x8A\xBCG1\x94\x81\xB2Q\xD4u@\xB9\xA8\x8AƠs\xD1t4]\x80\x96\xA2k\xD1\xB4=\x80\xB6\xA2\xA7\xD1K\xE8ut}\x8A\x8Ec\x80\xD11f\x8C\xD9a\\x8C\x87E`\x89X&\xC7c\xE5X5V\x8F5cX7v\xC0\x9Ea\xEF$\x8B\x80\xEC^\x84\xC2l\x82\x90\x90GXLXC\xA8%\xEC#\xB4\xBAW	\x83\x841\xC2'"\x93\xA8O\xB4%z\xF9\xC4xb:\xB1\x90XF\xAC&\xEE!!\x9E%^'_\x93H$ɒ\xE4N
+!%\x902IIkH\xDBH-\xA4S\xA4>\xD2i\x9CL&\xEB\x90m\xC9\xDE\xE4\xB2\x80\xAC \x97\x91\xB7\x90\x90O\x92\xFB\xC9\xC3\xE4\xB7:ň\xE2L	\xA2$R\xA4\x94J5e?\xE5\xA5\x9F2B\x99\xA0\xAAQͩ\x9E\xD4\xAA\x88:\x9FZIm\xA0vP/S\x87\xA94u\x9A%͛Cˤ-\xA3\xD5Кigi\xF7h/\xE9t\xBA	݃E\x97З\xD2k\xE8\xE9\xE7\xE9\x83\xF4w
+\x86
+\x83\xC7Hb(k{\xA7\xB7/\x99L\xA6ӗ\x99\xC8T0\xD72\x99g\x98\x98oUX*\xF6*|\x91\xCA\x95:\x95V\x95~\x95\xE7\xAATUsU?\xD5y\xAAT\xABU\xAB^V}\xA6FU\xB3P\xE3\xA9	\xD4\xABթU\xBB\xA96\xAE\xCERwR\x8FP\xCFQ_\xA3\xBE_\xFD\x82\xFAc
+\xB2\x86\x85F\xA0\x86H\xA3Tc\xB7\xC6\x8D!\xC62e\xF1XB\xD6rV\xEB,k\x98Mb[\xB2\xF9\xECLv\xFBv/{LSCs\xAAf\xACf\x91f\x9D\xE6q\xCDƱ\xE0\xF09ٜJ\xCE!\xCE
+\xCE{--?-\xB1\xD6j\xADf\xAD~\xAD7\xDAzھ\xDAb\xEDr\xED\xED\xEB\xDA\xEFup\x9D@\x9D,\x9D\xF5:m:\xF7u	\xBA6\xBAQ\xBA\x85\xBA\xDBu\xCF\xEA>\xD3c\xEBy\xE9	\xF5\xCA\xF5\xE9\xDD\xD1G\xF5m\xF4\xA3\xF5\xEA\xEF\xD6\xEF\xD17046\x90l18c\xF0̐c\xE8k\x98i\xB8\xD1\xF0\x84\xE1\xA8\xCBh\xBA\x91\xC4h\xA3\xD1I\xA3'\xB8&\xEE\x87g\xE35x>f\xACob\xAC4\xDEe\xDCk<abi2ۤĤ\xC5\xE4\xBE)͔k\x9Af\xBAѴ\xD3t\xCC\xCC\xC8,ܬج\xC9\xEC\x8E9՜k\x9Ea\xBEټ\xDB\xFC\x8D\x85\xA5E\x9C\xC5J\x8B6\x8Bǖږ|\xCB\x96M\x96\xF7\xAC\x98V>VyV\xF5V׬I\xD6\\xEB,\xEBm\xD6WlPW\x9B\x9B:\x9B˶\xA8\xAD\x9B\xAD\xC4v\x9Bm\xDF\xE2\x8F)\xD2)\xF5Sn\xDA1\xEC\xFC\xEC
+\xEC\x9A\xEC\xED9\xF6a\xF6%\xF6m\xF6\xCF\xCC\xD6;t;|rtu\xCCvlp\xBC\xEB\xA4\xE14éĩ\xC3\xE9Wgg\xA1s\x9D\xF35\xA6K\x90\xCB\x97v\x97Sm\xA7\x8A\xA7n\x9Fz˕\xE5\xEE\xBAҵ\xD3\x{1636FB}\x9Bܭ\xD9m\xD4\xDD\xCC=\xC5}\xAB\xFBM.\x9B\xC9]\xC3=\xEFA\xF4\xF0\xF7X\xE2q\xCC㝧\x9B\xA7\xC2\xF3\x90\xE7/^v^Y^\xFB\xBDO\xB3\x9C&\x9E\xD60m\xC8\xDB\xC4[\xE0\xBD\xCB{`:>=e\xFA\xCE\xE9>\xC6>\x9Fz\x9F\x87\xBE\xA6\xBE"\xDF=\xBE#~\xD6~\x99~\xFC\x9E\xFB;\xFA\xCB\xFD\x8F\xF8\xBF\xE1y\xF2\xF1N`\xC1\xE5\xBD\x81\x81\xB3k\x99\xA55\x8D\xBB/>B	
+Yr\x93o\xC0\xF2\xF9c3\xDCg,\x9A\xD1\xCA\x9DZ\xFA0\xCC&L\xD6\x8E\x86\xCF\xDF~o\xA6\xF9L\xE9̶\x88\xE0Gl\x88\xB8i\x99\xF9})*2\xAA.\xEAQ\xB4Stqt\xF7,֬\xE4Y\xFBg\xBD\x8E񏩌\xB9;\xDBj\xB6rvg\xACjlRlc웸\x80\xB8\xAA\xB8\x81x\x87\xF8E\xF1\x97t$	\xED\x89\xE4\xC4\xD8\xC4=\x89\xE3s\xE7l\x9A3\x9C\xE4\x9AT\x96tc\xAE\xE5ܢ\xB9\xE6\xE9\xCE˞w<Y5Y\x90|8\x85\x98\x97\xB2?\xE5\x83 BP/O\xE5\xA7nM򄛅OE\xBE\xA2\x8D\xA2Q\xB1\xB7\xB8J<\x92\xE6\x9DV\x95\xF68\xDD;}C\xFAh\x86OFu\xC63	OR+y\x91\x92\xB9#\xF3MVD\xD6ެ\xCF\xD9q\xD9-9\x94\x9C\x94\x9C\xA3R
+i\x96\xB4+\xD70\xB7(\xB7Of++\x93
+\xE4y\xE6m\xCA\x93\x87\xCA\xF7\xE4#\xF9s\xF3\xDBl\x85Lѣ\xB4R\xAEPL/\xA8+x[[x\xB8H\xBDHZ\xD43\xDFf\xFE\xEA\xF9#\x82|\xBD\x90\xB0P\xB8\xB0\xB3ظxY\xF1\xE0"\xBFE\xBB#\x8BSw.1]R\xBAdxi\xF0\xD2}\xCBh˲\x96\xFDP\xE2XRU\xF2jy\xDC\xF2\x8ER\x83ҥ\xA5C+\x82W4\x95\xA9\x94\xC9\xCBn\xAE\xF4Z\xB9ca\x95dU\xEFj\x97\xD5[V*\x95_\xACp\xAC\xA8\xAE\xF8\xB0F\xB8\xE6\xE2WN_\xD5|\xF5ym\xDA\xDA\xDEJ\xB7\xCA\xED\xEBH\xEB\xA4\xEBn\xAC\xF7Y\xBF\xAFJ\xBDjA\xD5І\xF0
+\xAD\xF1\x8D\xE5_mJ\xDEt\xA1zj\xF5\x8Eʹ\xCD\xCA\xCD5a5\xED[̶\xAC\xDB\xF2\xA16\xA3\xF6z\x9D]\xCBV\xFD\xAD\xAB\xB7\xBE\xD9&\xDAֿ\xDDw{\xF3\x83;\xDE\xEF\x94켵+xWk\xBDE}\xF5n\xD2\xEE\x82ݏb\xBA\xBF\xE6~ݸGwOŞ\x8F{\xA5{\xF6E\xEF\xEBjtolܯ\xBF\xBF\xB2	mR6\x8DH:p囀oڛ\xED\x9Aw\xB5pZ*\xC2A\xE5\xC1'ߦ|{\xE3P\xE8\xA1\xCE\xC3\xDC\xC3\xCDߙ\xB7\xF5\xEBHy+\xD2:\xBFu\xAC-\xA3m\xA0=\xA1\xBD\xEF茣\x9D^G\xBE\xB7\xFF~\xEF1\xE3cu\xC75\x8FW\x9E\xA0\x9D(=\xF1\xF9䂓\xE3\xA7d\xA7\x9E\x9DN?=ԙ\xDCy\xF7L\xFC\x99k]Q]\xBDgCϞ?t\xEEL\xB7_\xF7\xC9\xF3\xDE\xE7\x8F]\xF0\xBCp\xF4"\xF7b\xDB%\xB7K\xAD=\xAE=G~p\xFD\xE1H\xAF[o\xEBe\xF7\xCB\xEDW<\xAEt\xF4M\xEB;\xD1\xEF\xD3\xFAj\xC0\xD5s\xD7\xF8\xD7.]\x9Fy\xBD\xEF\xC6\xEC\xB7n&\xDD\xB8%\xBA\xF5\xF8v\xF6\xEDw
+\xEEL\xDC]z\x8Fx\xAF\xFC\xBE\xDA\xFD\xEA\xFA\xEA\xB4\xFE\xB1e\xC0m\xE0\xF8`\xC0`\xCF\xC3Y\xEF	\x87\x9E\xFE\x94\xFFӇ\xE1\xD2G\xCCG\xD5#F#\x8D\x8F\x9D
+\xBD\xF2dΓ᧲\xA7\xCF\xCA~V\xFFy\xEBs\xAB\xE7\xDF\xFD\xE2\xFBK\xCFX\xFC\xD8\xF0\xF9\x8BϿ\xAEy\xA9\xF3r﫩\xAF:\xC7#\xC7\xBC\xCEy=\xF1\xA6\xFC\xAD\xCE\xDB}\xEF\xB8\xEF\xBA\xDFǽ\x99(\xFC@\xFEP\xF3\xD1\xFAcǧ\xD0O\xF7>\xE7|\xFE\xFC/\xF7\x84\xF3\xFB\x809%bKGD\xFF\xFF\xFF\xA0\xBD\xA7\x93	pHYs\x9A\x9CtIME\xDC\xA8oi\xDA\xBAIDATx\xDA\xED\xDD=j\x94A\x87\xF1YM\x97M\xB2ُ\xA8\x85X\xEB	\xBC\x81\xE7H\xFCH!b%v&DSVb
+O\xAC\xBC\x81 jc@\xC1B\xDD\xDDl\xB2&\x91\xE4\xF5
+\xFFb\x96\x88\xFC\x9E\xFAa\xDE]xvv\x98wZM)M	\x95\x8Ca\xE8\x8D*{\xE3\xCA\xDE^eo\xBF\xB2wz\xD3\xD0\xFBz\x87\x95\x9F{\xAEg\x88!@ \x88\xFF\x9F\xB9N\x93\x89M\xF8\xF8\xE9\x8Fp\xBCae/\xDC\xE2hF\x95Ǜ\x84^\xB8e\xD2\xECW\xF6*o\x85\xA4\xA4[5f@X\x82!@@\x80  @ ̔V)M\xB8\xFE\xE5\x9F
+\xF9\xD7O\x8F\xA4\xA7=&\x95\xBDڧGj\x9F
+9
+\xBDl+\xC4K0\x84\x81\x99\xD2*\xE1۱\xCBb4`\xBB\xB4Co\xA1\xD4|\xEERY\x8A\xBCN\xE9\x84\xDEr\xE4uK\xB7\xB2׋\xBC^\xE8\xF5K?\xF4\x917\x88\xBD\xEC\xFB\x9Aa	\x86B\x80\x80!@@\x80 0S\xE6Rq\xBAz\xEDp\xC0\x85\xD0\x9Fn\x84\x94\x92\xBEl\xB9\xB2\xD7\xBD\xEEi\xE6\xF5\x9B\xBA\xDE }n\xE8e5f@X\x82!@@\x80  @ ̖x'd\xB1\x95\xBDe\xA9\xBE\x8D)\xDEie\xDER\xE8uBo9\xF5Ÿp7\xF4z\xE7C/o\x8E\xD7\xBDAXL\xB8b\x84%\x84B\x80\xC0li5MvO\xC8p\x98\xDD\xEB\x91z\xA3Ѩ\xAA7\x8F\xABz{{\xD9=!\x93ɤ\xAA\xB7\xBF\x9F\xDD\xFFqp\x90\xDD\xC31\x9Df;S\x87\x87\x87U\xBD\xF4\xB9f@X\x82!@@\x80  @ ̔\xB9\xC1\xD5L\xDCx\x93x3Y\xFF\x9C\xBD\xB5\xE9\xE10;\x9C\xF1\xE8K\xF6=^\xECf\xBF\xB9\xCD\xD9x\xF7?e\x9Fokzy\xF7\xDE\xFD\x89\xBC\x{DDFF}#\xEF\xEEǓ\xC8{\xFA\xFEW\xE4\xAD}\xCD\xC6{^\xD4n\x84%\x84B\x80\xC0L\x99۹\xB2\x89//oD\xDE\xC9Q6\xDE\xC5\xD5\xF5Ȼ~|'\xF2V\x9A\xEC\xF3\xEDoE\xDE\xF6\xFCf\xE4}\xBFp;\xF2\xBA\x97^E޵\xA3\x9B\x91wc\xFEq\xE4\xBD\xFE\xB6y\xCF\xCBV\xE4\xED\x96\xD50\xAD'f@X\x82B\x80\x80!@@\x80  @\x9C=͖\xAF;\xA2PIEND\xAEB`\x82
\ No newline at end of file

Added: trunk/LayoutTests/css3/compositing/should-have-compositing-layer-expected.txt (0 => 127162)


--- trunk/LayoutTests/css3/compositing/should-have-compositing-layer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/css3/compositing/should-have-compositing-layer-expected.txt	2012-08-30 18:02:52 UTC (rev 127162)
@@ -0,0 +1,8 @@
+Test to make sure a blend mode creates a compositing layer. Test is successful of render tree shows compositing
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+FAIL no compositing layers
+
+

Added: trunk/LayoutTests/css3/compositing/should-have-compositing-layer.html (0 => 127162)


--- trunk/LayoutTests/css3/compositing/should-have-compositing-layer.html	                        (rev 0)
+++ trunk/LayoutTests/css3/compositing/should-have-compositing-layer.html	2012-08-30 18:02:52 UTC (rev 127162)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<script>
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    function doTest()
+    {
+        description("Test to make sure a blend mode creates a compositing layer. Test is successful of render tree shows compositing");
+        if (window.testRunner) {
+            var layers = testRunner.layerTreeAsText();
+            if (layers == "")
+                testFailed("no compositing layers");
+            else
+                testPassed("content has compositing layers");
+            document.getElementById("layertree").innerText = layers;
+            testRunner.notifyDone();
+        }
+    }
+    
+    window.addEventListener('load', doTest, false);
+
+</script>
+<img style="-webkit-blend-mode: multiply;" src=""
+<pre id="layertree"></pre>

Modified: trunk/Source/WebCore/ChangeLog (127161 => 127162)


--- trunk/Source/WebCore/ChangeLog	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/ChangeLog	2012-08-30 18:02:52 UTC (rev 127162)
@@ -1,3 +1,52 @@
+2012-08-30  Rik Cabanier  <[email protected]>
+
+        Add support for blendmode to webkit rendering engine
+        https://bugs.webkit.org/show_bug.cgi?id=95258
+
+        Reviewed by Simon Fraser.
+
+        This code adds support for blendmodes to the WebCore engine. The CSS parser already
+        supported this keyword but didn't pass it along. Support for rendering blending will
+        be provided in subsequent patches
+
+        Test: css3/compositing/should-have-compositing-layer.html
+
+        * css/StyleBuilder.cpp:
+        (WebCore::StyleBuilder::StyleBuilder):
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::collectMatchingRulesForList):
+        * rendering/RenderBox.h:
+        * rendering/RenderBoxModelObject.h:
+        (RenderBoxModelObject):
+        (WebCore::RenderBoxModelObject::requiresLayer):
+        * rendering/RenderInline.h:
+        (WebCore::RenderInline::requiresLayer):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore):
+        (WebCore::RenderLayer::updateBlendMode):
+        (WebCore::RenderLayer::ensureBacking):
+        (WebCore::RenderLayer::shouldBeNormalFlowOnly):
+        (WebCore::RenderLayer::styleChanged):
+        * rendering/RenderLayer.h:
+        (RenderLayer):
+        (WebCore::RenderLayer::hasBlendMode):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::requiresCompositingLayer):
+        (WebCore::RenderLayerCompositor::requiresOwnBackingStore):
+        (WebCore::RenderLayerCompositor::reasonForCompositing):
+        (WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason):
+        (WebCore::RenderLayerCompositor::requiresCompositingForBlending):
+        (WebCore):
+        * rendering/RenderLayerCompositor.h:
+        (RenderLayerCompositor):
+        * rendering/RenderObject.h:
+        (RenderObject):
+        (WebCore::RenderObject::hasBlendMode):
+        (WebCore::RenderObject::createsGroup):
+        * rendering/RenderTableRow.h:
+        * rendering/style/RenderStyle.h:
+
 2012-08-30  Tony Chang  <[email protected]>
 
         Make RenderBox::computeInlineDirectionMargins const

Modified: trunk/Source/WebCore/css/StyleBuilder.cpp (127161 => 127162)


--- trunk/Source/WebCore/css/StyleBuilder.cpp	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/css/StyleBuilder.cpp	2012-08-30 18:02:52 UTC (rev 127162)
@@ -1929,6 +1929,9 @@
     setPropertyHandler(CSSPropertyWebkitBackgroundComposite, ApplyPropertyFillLayer<CompositeOperator, CSSPropertyWebkitBackgroundComposite, BackgroundFillLayer, &RenderStyle::accessBackgroundLayers, &RenderStyle::backgroundLayers, &FillLayer::isCompositeSet, &FillLayer::composite, &FillLayer::setComposite, &FillLayer::clearComposite, &FillLayer::initialFillComposite, &CSSToStyleMap::mapFillComposite>::createHandler());
     setPropertyHandler(CSSPropertyWebkitBackgroundOrigin, CSSPropertyBackgroundOrigin);
     setPropertyHandler(CSSPropertyWebkitBackgroundSize, CSSPropertyBackgroundSize);
+#if ENABLE(CSS_COMPOSITING)
+    setPropertyHandler(CSSPropertyWebkitBlendMode, ApplyPropertyDefault<BlendMode, &RenderStyle::blendMode, BlendMode, &RenderStyle::setBlendMode, BlendMode, &RenderStyle::initialBlendMode>::createHandler());
+#endif
     setPropertyHandler(CSSPropertyWebkitBorderFit, ApplyPropertyDefault<EBorderFit, &RenderStyle::borderFit, EBorderFit, &RenderStyle::setBorderFit, EBorderFit, &RenderStyle::initialBorderFit>::createHandler());
     setPropertyHandler(CSSPropertyWebkitBorderHorizontalSpacing, ApplyPropertyComputeLength<short, &RenderStyle::horizontalBorderSpacing, &RenderStyle::setHorizontalBorderSpacing, &RenderStyle::initialHorizontalBorderSpacing>::createHandler());
     setPropertyHandler(CSSPropertyWebkitBorderImage, ApplyPropertyBorderImage<Image, CSSPropertyWebkitBorderImage, &RenderStyle::borderImage, &RenderStyle::setBorderImage>::createHandler());
@@ -2064,9 +2067,6 @@
     setPropertyHandler(CSSPropertyWordWrap, ApplyPropertyDefault<EWordWrap, &RenderStyle::wordWrap, EWordWrap, &RenderStyle::setWordWrap, EWordWrap, &RenderStyle::initialWordWrap>::createHandler());
     setPropertyHandler(CSSPropertyZIndex, ApplyPropertyAuto<int, &RenderStyle::zIndex, &RenderStyle::setZIndex, &RenderStyle::hasAutoZIndex, &RenderStyle::setHasAutoZIndex>::createHandler());
     setPropertyHandler(CSSPropertyZoom, ApplyPropertyZoom::createHandler());
-#if ENABLE(CSS_COMPOSITING)
-    setPropertyHandler(CSSPropertyWebkitBlendMode, ApplyPropertyDefault<BlendMode, &RenderStyle::blendMode, BlendMode, &RenderStyle::setBlendMode, BlendMode, &RenderStyle::initialBlendMode>::createHandler());
-#endif
 }
 
 

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (127161 => 127162)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2012-08-30 18:02:52 UTC (rev 127162)
@@ -2197,6 +2197,7 @@
         || style->hasMask()
         || style->boxReflect()
         || style->hasFilter()
+        || style->hasBlendMode()
         || style->position() == StickyPosition
 #ifdef FIXED_POSITION_CREATES_STACKING_CONTEXT
         || style->position() == FixedPosition

Modified: trunk/Source/WebCore/rendering/RenderBox.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderBox.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderBox.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -44,7 +44,7 @@
 
     // hasAutoZIndex only returns true if the element is positioned or a flex-item since
     // position:static elements that are not flex-items get their z-index coerced to auto.
-    virtual bool requiresLayer() const OVERRIDE { return isRoot() || isPositioned() || isTransparent() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasMask() || hasReflection() || hasFilter() || style()->specifiesColumns() || !style()->hasAutoZIndex(); }
+    virtual bool requiresLayer() const OVERRIDE { return isRoot() || isPositioned() || createsGroup() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasReflection() || style()->specifiesColumns() || !style()->hasAutoZIndex(); }
 
     // Use this with caution! No type checking is done!
     RenderBox* firstChildBox() const;

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -86,8 +86,9 @@
 
     bool hasSelfPaintingLayer() const;
     RenderLayer* layer() const { return m_layer; }
-    virtual bool requiresLayer() const { return isRoot() || isPositioned() || isTransparent() || hasTransform() || hasHiddenBackface() || hasMask() || hasReflection() || hasFilter() || style()->specifiesColumns(); }
 
+    virtual bool requiresLayer() const { return isRoot() || isPositioned() || createsGroup() || hasTransform() || hasHiddenBackface() || hasReflection() || style()->specifiesColumns(); }
+
     // This will work on inlines to return the bounding box of all of the lines' border boxes.
     virtual IntRect borderBoundingBox() const = 0;
 

Modified: trunk/Source/WebCore/rendering/RenderInline.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderInline.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderInline.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -125,7 +125,7 @@
 
     virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
 
-    virtual bool requiresLayer() const { return isInFlowPositioned() || isTransparent() || hasMask() || hasFilter(); }
+    virtual bool requiresLayer() const { return isInFlowPositioned() || createsGroup(); }
 
     virtual LayoutUnit offsetLeft() const;
     virtual LayoutUnit offsetTop() const;

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-08-30 18:02:52 UTC (rev 127162)
@@ -161,6 +161,9 @@
 #if ENABLE(CSS_FILTERS)
     , m_hasFilterInfo(false)
 #endif
+#if ENABLE(CSS_COMPOSITING)
+    , m_blendMode(BlendModeNormal)
+#endif
     , m_renderer(renderer)
     , m_parent(0)
     , m_previous(0)
@@ -543,6 +546,18 @@
         m_marquee->updateMarqueePosition();
 }
 
+#if ENABLE(CSS_COMPOSITING)
+void RenderLayer::updateBlendMode()
+{
+    BlendMode newBlendMode = renderer()->style()->blendMode();
+    if (newBlendMode != m_blendMode) {
+        m_blendMode = newBlendMode;
+        if (backing())
+            backing()->setBlendMode(newBlendMode);
+    }
+}
+#endif
+
 void RenderLayer::updateTransform()
 {
     // hasTransform() on the renderer is also true when there is transform-style: preserve-3d or perspective set,
@@ -4421,6 +4436,9 @@
 #if ENABLE(CSS_FILTERS)
         updateOrRemoveFilterEffect();
 #endif
+#if ENABLE(CSS_COMPOSITING)
+        backing()->setBlendMode(m_blendMode);
+#endif
     }
     return m_backing.get();
 }
@@ -4807,6 +4825,9 @@
 #if ENABLE(CSS_FILTERS)
             && !renderer()->hasFilter()
 #endif
+#if ENABLE(CSS_COMPOSITING)
+            && !renderer()->hasBlendMode()
+#endif
             && !isTransparent()
             && !usesCompositedScrolling();
 }
@@ -4960,6 +4981,9 @@
 
     updateDescendantDependentFlags();
     updateTransform();
+#if ENABLE(CSS_COMPOSITING)
+    updateBlendMode();
+#endif
 
 #if USE(ACCELERATED_COMPOSITING)
     if (compositor()->updateLayerCompositingState(this))

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -613,6 +613,12 @@
     bool hasFilter() const { return false; }
 #endif
 
+#if ENABLE(CSS_COMPOSITING)
+    bool hasBlendMode() const { return renderer()->hasBlendMode(); }
+#else
+    bool hasBlendMode() const { return false; }
+#endif
+
     // Overloaded new operator. Derived classes must override operator new
     // in order to allocate out of the RenderArena.
     void* operator new(size_t, RenderArena*);

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2012-08-30 18:02:52 UTC (rev 127162)
@@ -1445,7 +1445,8 @@
         || requiresCompositingForAnimation(renderer)
         || requiresCompositingForFilters(renderer)
         || requiresCompositingForPosition(renderer, layer)
-        || requiresCompositingForOverflowScrolling(layer);
+        || requiresCompositingForOverflowScrolling(layer)
+        || requiresCompositingForBlending(renderer);
 }
 
 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const
@@ -1473,6 +1474,7 @@
         || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
         || requiresCompositingForAnimation(renderer)
         || requiresCompositingForFilters(renderer)
+        || requiresCompositingForBlending(renderer)
         || requiresCompositingForPosition(renderer, layer)
         || requiresCompositingForOverflowScrolling(layer)
         || renderer->isTransparent()
@@ -1559,6 +1561,9 @@
 
         if (renderer->hasFilter())
             return "filter with composited descendants";
+            
+        if (renderer->hasBlendMode())
+            return "blending with composited descendants";
     }
 
     if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForPerspective)
@@ -1771,7 +1776,7 @@
 
     // When a layer has composited descendants, some effects, like 2d transforms, filters, masks etc must be implemented
     // via compositing so that they also apply to those composited descdendants.
-    if (hasCompositedDescendants && (layer->transform() || renderer->isTransparent() || renderer->hasMask() || renderer->hasReflection() || renderer->hasFilter())) {
+    if (hasCompositedDescendants && (layer->transform() || renderer->createsGroup() || renderer->hasReflection())) {
         reason = RenderLayer::IndirectCompositingForGraphicalEffect;
         return true;
     }
@@ -1807,6 +1812,16 @@
 #endif
 }
 
+bool RenderLayerCompositor::requiresCompositingForBlending(RenderObject* renderer) const
+{
+#if ENABLE(CSS_COMPOSITING)
+    return renderer->hasBlendMode();
+#else
+    UNUSED_PARAM(renderer);
+    return false;
+#endif
+}
+
 bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer) const
 {
     // position:fixed elements that create their own stacking context (e.g. have an explicit z-index,

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -290,6 +290,7 @@
     bool requiresCompositingForPlugin(RenderObject*) const;
     bool requiresCompositingForFrame(RenderObject*) const;
     bool requiresCompositingForFilters(RenderObject*) const;
+    bool requiresCompositingForBlending(RenderObject* renderer) const;
     bool requiresCompositingForScrollableFrame() const;
     bool requiresCompositingForPosition(RenderObject*, const RenderLayer*) const;
     bool requiresCompositingForOverflowScrolling(const RenderLayer*) const;

Modified: trunk/Source/WebCore/rendering/RenderObject.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderObject.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -567,6 +567,12 @@
     bool hasFilter() const { return false; }
 #endif
 
+#if ENABLE(CSS_COMPOSITING)
+    bool hasBlendMode() const { return style() && style()->hasBlendMode(); }
+#else
+    bool hasBlendMode() const { return false; }
+#endif
+
     inline bool preservesNewline() const;
 
     // The pseudo element style can be cached or uncached.  Use the cached method if the pseudo element doesn't respect
@@ -905,6 +911,9 @@
     bool shouldUseTransformFromContainer(const RenderObject* container) const;
     void getTransformFromContainer(const RenderObject* container, const LayoutSize& offsetInContainer, TransformationMatrix&) const;
     
+    // return true if this object requires a new stacking context
+    bool createsGroup() const { return isTransparent() || hasMask() || hasFilter() || hasBlendMode(); } 
+    
     virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint&) { };
 
     LayoutRect absoluteOutlineBounds() const
@@ -932,7 +941,7 @@
     void paintFocusRing(GraphicsContext*, const LayoutPoint&, RenderStyle*);
     void paintOutline(GraphicsContext*, const LayoutRect&);
     void addPDFURLRect(GraphicsContext*, const LayoutRect&);
-
+    
     virtual LayoutRect viewRect() const;
 
     void adjustRectForOutlineAndShadow(LayoutRect&) const;

Modified: trunk/Source/WebCore/rendering/RenderTableRow.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/RenderTableRow.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/RenderTableRow.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -97,7 +97,7 @@
     virtual LayoutRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer) const;
     virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
 
-    virtual bool requiresLayer() const OVERRIDE { return isTransparent() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasMask() || hasFilter(); }
+    virtual bool requiresLayer() const OVERRIDE { return hasOverflowClip() || hasTransform() || hasHiddenBackface() || createsGroup(); }
 
     virtual void paint(PaintInfo&, const LayoutPoint&);
 

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (127161 => 127162)


--- trunk/Source/WebCore/rendering/style/RenderStyle.h	2012-08-30 17:59:47 UTC (rev 127161)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h	2012-08-30 18:02:52 UTC (rev 127162)
@@ -990,7 +990,7 @@
 #if ENABLE(CSS_COMPOSITING)
     BlendMode blendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode); }
     void setBlendMode(BlendMode v) { rareNonInheritedData.access()->m_effectiveBlendMode = v; }
-    bool hasBlendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode) == BlendModeNormal; }
+    bool hasBlendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode) != BlendModeNormal; }
 #else
     bool hasBlendMode() const { return false; }
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to