OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) | 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. |
7 * Copyright (C) 2009 Google Inc. All rights reserved. | 7 * Copyright (C) 2009 Google Inc. All rights reserved. |
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) | 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) |
9 * | 9 * |
10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
831 } | 831 } |
832 | 832 |
833 if (!container) | 833 if (!container) |
834 return 0; | 834 return 0; |
835 if (container->hasClipOrOverflowClip()) | 835 if (container->hasClipOrOverflowClip()) |
836 return container; | 836 return container; |
837 } | 837 } |
838 return 0; | 838 return 0; |
839 } | 839 } |
840 | 840 |
841 static bool mustRepaintFillLayers(const RenderObject& renderer, const FillLayer* layer) | 841 bool RenderObject::borderImageIsLoadedAndCanBeRendered() const |
esprehn
2014/05/29 22:20:12
canRenderBorderImage()
Xianzhu
2014/05/30 00:47:56
Done.
| |
842 { | |
843 ASSERT(style()->hasBorder()); | |
844 | |
845 StyleImage* borderImage = style()->borderImage().image(); | |
846 return borderImage && borderImage->canRender(*this, style()->effectiveZoom() ) && borderImage->isLoaded(); | |
847 } | |
848 | |
849 bool RenderObject::mustRepaintFillLayersOnWidthChange(const FillLayer* layer) co nst | |
842 { | 850 { |
843 // Nobody will use multiple layers without wanting fancy positioning. | 851 // Nobody will use multiple layers without wanting fancy positioning. |
844 if (layer->next()) | 852 if (layer->next()) |
845 return true; | 853 return true; |
846 | 854 |
847 // Make sure we have a valid image. | 855 // Make sure we have a valid image. |
848 StyleImage* img = layer->image(); | 856 StyleImage* img = layer->image(); |
849 if (!img || !img->canRender(renderer, renderer.style()->effectiveZoom())) | 857 if (!img || !img->canRender(*this, style()->effectiveZoom())) |
850 return false; | 858 return false; |
851 | 859 |
852 if (!layer->xPosition().isZero() || !layer->yPosition().isZero()) | 860 if (layer->repeatX() != RepeatFill && layer->repeatX() != NoRepeatFill) |
861 return true; | |
862 | |
863 if (layer->xPosition().isPercent() && !layer->xPosition().isZero()) | |
864 return true; | |
865 | |
866 if (layer->backgroundXOrigin() != LeftEdge) | |
853 return true; | 867 return true; |
854 | 868 |
855 EFillSizeType sizeType = layer->sizeType(); | 869 EFillSizeType sizeType = layer->sizeType(); |
856 | 870 |
857 if (sizeType == Contain || sizeType == Cover) | 871 if (sizeType == Contain || sizeType == Cover) |
858 return true; | 872 return true; |
859 | 873 |
860 if (sizeType == SizeLength) { | 874 if (sizeType == SizeLength) { |
861 if (layer->sizeLength().width().isPercent() || layer->sizeLength().heigh t().isPercent()) | 875 if (layer->sizeLength().width().isPercent() && !layer->sizeLength().widt h().isZero()) |
862 return true; | 876 return true; |
863 if (img->isGeneratedImage() && (layer->sizeLength().width().isAuto() || layer->sizeLength().height().isAuto())) | 877 if (img->isGeneratedImage() && layer->sizeLength().width().isAuto()) |
864 return true; | 878 return true; |
865 } else if (img->usesImageContainerSize()) { | 879 } else if (img->usesImageContainerSize()) { |
866 return true; | 880 return true; |
867 } | 881 } |
868 | 882 |
869 return false; | 883 return false; |
870 } | 884 } |
871 | 885 |
872 bool RenderObject::borderImageIsLoadedAndCanBeRendered() const | 886 bool RenderObject::mustRepaintFillLayersOnHeightChange(const FillLayer* layer) c onst |
873 { | 887 { |
874 ASSERT(style()->hasBorder()); | 888 // Nobody will use multiple layers without wanting fancy positioning. |
889 if (layer->next()) | |
890 return true; | |
875 | 891 |
876 StyleImage* borderImage = style()->borderImage().image(); | 892 // Make sure we have a valid image. |
877 return borderImage && borderImage->canRender(*this, style()->effectiveZoom() ) && borderImage->isLoaded(); | 893 StyleImage* img = layer->image(); |
894 if (!img || !img->canRender(*this, style()->effectiveZoom())) | |
895 return false; | |
896 | |
897 if (layer->repeatY() != RepeatFill && layer->repeatY() != NoRepeatFill) | |
898 return true; | |
899 | |
900 if (layer->yPosition().isPercent() && !layer->yPosition().isZero()) | |
901 return true; | |
902 | |
903 if (layer->backgroundYOrigin() != TopEdge) | |
904 return true; | |
905 | |
906 EFillSizeType sizeType = layer->sizeType(); | |
907 | |
908 if (sizeType == Contain || sizeType == Cover) | |
909 return true; | |
910 | |
911 if (sizeType == SizeLength) { | |
912 if (layer->sizeLength().height().isPercent() && !layer->sizeLength().hei ght().isZero()) | |
913 return true; | |
914 if (img->isGeneratedImage() && layer->sizeLength().height().isAuto()) | |
915 return true; | |
916 } else if (img->usesImageContainerSize()) { | |
917 return true; | |
918 } | |
919 | |
920 return false; | |
878 } | 921 } |
879 | 922 |
880 bool RenderObject::mustRepaintBackgroundOrBorder() const | 923 bool RenderObject::mustRepaintBackgroundOrBorderOnWidthChange() const |
881 { | 924 { |
882 if (hasMask() && mustRepaintFillLayers(*this, style()->maskLayers())) | 925 if (hasMask() && mustRepaintFillLayersOnWidthChange(style()->maskLayers())) |
883 return true; | 926 return true; |
884 | 927 |
885 // If we don't have a background/border/mask, then nothing to do. | 928 // If we don't have a background/border/mask, then nothing to do. |
886 if (!hasBoxDecorations()) | 929 if (!hasBoxDecorations()) |
887 return false; | 930 return false; |
888 | 931 |
889 if (mustRepaintFillLayers(*this, style()->backgroundLayers())) | 932 if (mustRepaintFillLayersOnWidthChange(style()->backgroundLayers())) |
933 return true; | |
934 | |
935 // Our fill layers are ok. Let's check border. | |
936 if (style()->hasBorder() && borderImageIsLoadedAndCanBeRendered()) | |
937 return true; | |
938 | |
939 return false; | |
940 } | |
941 | |
942 bool RenderObject::mustRepaintBackgroundOrBorderOnHeightChange() const | |
943 { | |
944 if (hasMask() && mustRepaintFillLayersOnHeightChange(style()->maskLayers())) | |
945 return true; | |
946 | |
947 // If we don't have a background/border/mask, then nothing to do. | |
948 if (!hasBoxDecorations()) | |
949 return false; | |
950 | |
951 if (mustRepaintFillLayersOnHeightChange(style()->backgroundLayers())) | |
890 return true; | 952 return true; |
891 | 953 |
892 // Our fill layers are ok. Let's check border. | 954 // Our fill layers are ok. Let's check border. |
893 if (style()->hasBorder() && borderImageIsLoadedAndCanBeRendered()) | 955 if (style()->hasBorder() && borderImageIsLoadedAndCanBeRendered()) |
894 return true; | 956 return true; |
895 | 957 |
896 return false; | 958 return false; |
897 } | 959 } |
898 | 960 |
899 void RenderObject::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, | 961 void RenderObject::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1, int y1, int x2, int y2, |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1594 | 1656 |
1595 if (invalidationReason == InvalidationIncremental && compositingState() != P aintsIntoOwnBacking && newLocation != oldLocation) | 1657 if (invalidationReason == InvalidationIncremental && compositingState() != P aintsIntoOwnBacking && newLocation != oldLocation) |
1596 invalidationReason = InvalidationLocationChange; | 1658 invalidationReason = InvalidationLocationChange; |
1597 | 1659 |
1598 // If the bounds are the same then we know that none of the statements below | 1660 // If the bounds are the same then we know that none of the statements below |
1599 // can match, so we can early out since we will not need to do any | 1661 // can match, so we can early out since we will not need to do any |
1600 // invalidation. | 1662 // invalidation. |
1601 if (invalidationReason == InvalidationIncremental && oldBounds == newBounds) | 1663 if (invalidationReason == InvalidationIncremental && oldBounds == newBounds) |
1602 return false; | 1664 return false; |
1603 | 1665 |
1604 if (invalidationReason == InvalidationIncremental && mustRepaintBackgroundOr Border()) | 1666 if (invalidationReason == InvalidationIncremental) { |
1605 invalidationReason = InvalidationBoundsChangeWithBackground; | 1667 if (oldBounds.width() != newBounds.width() && mustRepaintBackgroundOrBor derOnWidthChange()) |
1668 invalidationReason = InvalidationBoundsChangeWithBackground; | |
1669 else if (oldBounds.height() != newBounds.height() && mustRepaintBackgrou ndOrBorderOnHeightChange()) | |
1670 invalidationReason = InvalidationBoundsChangeWithBackground; | |
1671 } | |
1606 | 1672 |
1607 // If we shifted, we don't know the exact reason so we are conservative and trigger a full invalidation. Shifting could | 1673 // If we shifted, we don't know the exact reason so we are conservative and trigger a full invalidation. Shifting could |
1608 // be caused by some layout property (left / top) or some in-flow renderer i nserted / removed before us in the tree. | 1674 // be caused by some layout property (left / top) or some in-flow renderer i nserted / removed before us in the tree. |
1609 if (invalidationReason == InvalidationIncremental && newBounds.location() != oldBounds.location()) | 1675 if (invalidationReason == InvalidationIncremental && newBounds.location() != oldBounds.location()) |
1610 invalidationReason = InvalidationBoundsChange; | 1676 invalidationReason = InvalidationBoundsChange; |
1611 | 1677 |
1612 // If the size is zero on one of our bounds then we know we're going to have | 1678 // If the size is zero on one of our bounds then we know we're going to have |
1613 // to do a full invalidation of either old bounds or new bounds. If we fall | 1679 // to do a full invalidation of either old bounds or new bounds. If we fall |
1614 // into the incremental invalidation we'll issue two invalidations instead | 1680 // into the incremental invalidation we'll issue two invalidations instead |
1615 // of one. | 1681 // of one. |
(...skipping 1843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3459 { | 3525 { |
3460 if (object1) { | 3526 if (object1) { |
3461 const WebCore::RenderObject* root = object1; | 3527 const WebCore::RenderObject* root = object1; |
3462 while (root->parent()) | 3528 while (root->parent()) |
3463 root = root->parent(); | 3529 root = root->parent(); |
3464 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); | 3530 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); |
3465 } | 3531 } |
3466 } | 3532 } |
3467 | 3533 |
3468 #endif | 3534 #endif |
OLD | NEW |