Bug 1285320 - (Part 1) Add struct "CachedBorderImageData" to keep cached data for border in nsStyleImage. r=dholbert

--HG--
extra : rebase_source : 5c654bd0dab03864ed1e1bf2883525bccea73d8a
This commit is contained in:
Kevin Chen 2016-07-28 03:12:00 +02:00
Родитель b89b0e13a4
Коммит 2850db7128
3 изменённых файлов: 54 добавлений и 8 удалений

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

@ -1909,6 +1909,30 @@ nsStyleGradient::HasCalc()
mRadiusX.IsCalcUnit() || mRadiusY.IsCalcUnit();
}
// --------------------
// CachedBorderImageData
//
void
CachedBorderImageData::PurgeCachedImages()
{
mSubImages.Clear();
}
void
CachedBorderImageData::SetSubImage(uint8_t aIndex, imgIContainer* aSubImage)
{
mSubImages.ReplaceObjectAt(aSubImage, aIndex);
}
imgIContainer*
CachedBorderImageData::GetSubImage(uint8_t aIndex)
{
imgIContainer* subImage = nullptr;
if (aIndex < mSubImages.Count())
subImage = mSubImages[aIndex];
return subImage;
}
// --------------------
// nsStyleImage
//
@ -2004,7 +2028,9 @@ nsStyleImage::SetImageData(imgRequestProxy* aImage)
mImage = aImage;
mType = eStyleImageType_Image;
}
mSubImages.Clear();
if (mCachedBIData) {
mCachedBIData->PurgeCachedImages();
}
}
void

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

@ -18,6 +18,7 @@
#include "mozilla/SheetType.h"
#include "mozilla/StaticPtr.h"
#include "mozilla/StyleStructContext.h"
#include "mozilla/UniquePtr.h"
#include "nsAutoPtr.h"
#include "nsColor.h"
#include "nsCoord.h"
@ -246,6 +247,16 @@ enum nsStyleImageType {
eStyleImageType_Element
};
struct CachedBorderImageData
{
void PurgeCachedImages();
void SetSubImage(uint8_t aIndex, imgIContainer* aSubImage);
imgIContainer* GetSubImage(uint8_t aIndex);
private:
nsCOMArray<imgIContainer> mSubImages;
};
/**
* Represents a paintable image of one of the following types.
* (1) A real image loaded from an external source.
@ -361,9 +372,11 @@ struct nsStyleImage
private:
void DoCopy(const nsStyleImage& aOther);
void EnsureCachedBIData() const;
// Cache for border-image painting.
nsCOMArray<imgIContainer> mSubImages;
// This variable keeps some cache data for border image and is lazily
// allocated since it is only used in border image case.
mozilla::UniquePtr<CachedBorderImageData> mCachedBIData;
nsStyleImageType mType;
union {

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

@ -16,19 +16,26 @@
#include "nsIContent.h" // for GetParent()
#include "nsTextFrame.h" // for nsTextFrame::ShouldSuppressLineBreak
inline void
nsStyleImage::EnsureCachedBIData() const
{
if (!mCachedBIData) {
const_cast<nsStyleImage*>(this)->mCachedBIData =
mozilla::MakeUnique<CachedBorderImageData>();
}
}
inline void
nsStyleImage::SetSubImage(uint8_t aIndex, imgIContainer* aSubImage) const
{
const_cast<nsStyleImage*>(this)->mSubImages.ReplaceObjectAt(aSubImage, aIndex);
EnsureCachedBIData();
mCachedBIData->SetSubImage(aIndex, aSubImage);
}
inline imgIContainer*
nsStyleImage::GetSubImage(uint8_t aIndex) const
{
imgIContainer* subImage = nullptr;
if (aIndex < mSubImages.Count())
subImage = mSubImages[aIndex];
return subImage;
return (mCachedBIData) ? mCachedBIData->GetSubImage(aIndex) : nullptr;
}
bool