Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: Source/core/rendering/RenderObject.cpp

Issue 306483011: Combine background repaint conditions in RenderStyle and RenderObject (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add missing small-apple.jpg Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698