Bug 1234485 - Part 7. Implement CSSMaskLayerUserData to store css positioned mask user data. r=mstange

MozReview-Commit-ID: JZVcAfipKYX

--HG--
extra : rebase_source : f123995c61dda5cc27d57d4d09bc829495923c47
This commit is contained in:
cku 2016-11-01 16:43:34 +08:00
Родитель 690ab041c6
Коммит 73c622f3dc
1 изменённых файлов: 100 добавлений и 0 удалений

Просмотреть файл

@ -97,6 +97,12 @@ uint8_t gLayerManagerUserData;
* The user data is a MaskLayerUserData.
*/
uint8_t gMaskLayerUserData;
/**
* The address of gCSSMaskLayerUserData is used as the user
* data key for mask layers of css masking managed by FrameLayerBuilder.
* The user data is a CSSMaskLayerUserData.
*/
uint8_t gCSSMaskLayerUserData;
// a global cache of image containers used for mask layers
static MaskLayerImageCache* gMaskLayerImageCache = nullptr;
@ -1527,6 +1533,100 @@ struct MaskLayerUserData : public LayerUserData
int32_t mAppUnitsPerDevPixel;
};
/*
* User data for layers which will be used as masks for css positioned mask.
*/
struct CSSMaskLayerUserData : public LayerUserData
{
CSSMaskLayerUserData()
: mImageLayers(nsStyleImageLayers::LayerType::Mask)
{ }
CSSMaskLayerUserData(nsIFrame* aFrame, const nsRect& aBound)
: mImageLayers(aFrame->StyleSVGReset()->mMask),
mContentRect(aFrame->GetContentRectRelativeToSelf()),
mPaddingRect(aFrame->GetPaddingRectRelativeToSelf()),
mBorderRect(aFrame->GetRectRelativeToSelf()),
mMarginRect(aFrame->GetMarginRectRelativeToSelf()),
mBounds(aBound)
{
Hash(aFrame);
}
CSSMaskLayerUserData& operator=(const CSSMaskLayerUserData& aOther)
{
mImageLayers = aOther.mImageLayers;
mContentRect = aOther.mContentRect;
mPaddingRect = aOther.mPaddingRect;
mBorderRect = aOther.mBorderRect;
mMarginRect = aOther.mMarginRect;
mBounds = aOther.mBounds;
mHash = aOther.mHash;
return *this;
}
bool
operator==(const CSSMaskLayerUserData& aOther) const
{
if (mHash != aOther.mHash) {
return false;
}
if (mImageLayers.mLayers != aOther.mImageLayers.mLayers) {
return false;
}
if (!mContentRect.IsEqualEdges(aOther.mContentRect) ||
!mPaddingRect.IsEqualEdges(aOther.mPaddingRect) ||
!mBorderRect.IsEqualEdges(aOther.mBorderRect) ||
!mMarginRect.IsEqualEdges(aOther.mMarginRect)) {
return false;
}
if (!mBounds.IsEqualEdges(aOther.mBounds)) {
return false;
}
return true;
}
private:
void Hash(nsIFrame* aFrame)
{
uint32_t hash = 0;
const nsStyleImageLayers& imageLayers = aFrame->StyleSVGReset()->mMask;
for (uint32_t i = 0; i < imageLayers.mLayers.Length(); i++) {
const nsStyleImageLayers::Layer& newLayer = imageLayers.mLayers[i];
hash = AddToHash(hash, HashBytes(&newLayer, sizeof(newLayer)));
}
hash = AddToHash(hash, HashBytes(&mContentRect, sizeof(mContentRect)));
hash = AddToHash(hash, HashBytes(&mPaddingRect, sizeof(mPaddingRect)));
hash = AddToHash(hash, HashBytes(&mBorderRect, sizeof(mBorderRect)));
hash = AddToHash(hash, HashBytes(&mMarginRect, sizeof(mMarginRect)));
hash = AddToHash(hash, HashBytes(&mBounds, sizeof(mBounds)));
mHash = hash;
}
nsStyleImageLayers mImageLayers;
nsRect mContentRect;
nsRect mPaddingRect;
nsRect mBorderRect;
nsRect mMarginRect;
nsRect mBounds;
uint32_t mHash;
};
/*
* A helper object to create a draw target for painting mask and create a
* image container to hold the drawing result. The caller can then bind this