diff -r 000000000000 -r 6474c204b198 layout/inspector/nsFontFaceList.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/inspector/nsFontFaceList.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,95 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsFontFaceList.h" +#include "nsFontFace.h" +#include "nsFontFaceLoader.h" +#include "nsIFrame.h" +#include "gfxFont.h" +#include "mozilla/gfx/2D.h" + +nsFontFaceList::nsFontFaceList() +{ +} + +nsFontFaceList::~nsFontFaceList() +{ +} + +//////////////////////////////////////////////////////////////////////// +// nsISupports + +NS_IMPL_ISUPPORTS(nsFontFaceList, nsIDOMFontFaceList) + +//////////////////////////////////////////////////////////////////////// +// nsIDOMFontFaceList + +/* nsIDOMFontFace item (in unsigned long index); */ +struct FindByIndexData { + uint32_t mTarget; + uint32_t mCurrent; + nsIDOMFontFace* mResult; +}; + +static PLDHashOperator +FindByIndex(gfxFontEntry* aKey, nsIDOMFontFace* aData, void* aUserData) +{ + FindByIndexData* data = static_cast(aUserData); + if (data->mCurrent == data->mTarget) { + data->mResult = aData; + return PL_DHASH_STOP; + } + data->mCurrent++; + return PL_DHASH_NEXT; +} + +NS_IMETHODIMP +nsFontFaceList::Item(uint32_t index, nsIDOMFontFace **_retval) +{ + NS_ENSURE_TRUE(index < mFontFaces.Count(), NS_ERROR_INVALID_ARG); + FindByIndexData userData; + userData.mTarget = index; + userData.mCurrent = 0; + userData.mResult = nullptr; + mFontFaces.EnumerateRead(FindByIndex, &userData); + NS_ASSERTION(userData.mResult != nullptr, "null entry in nsFontFaceList?"); + NS_IF_ADDREF(*_retval = userData.mResult); + return NS_OK; +} + +/* readonly attribute unsigned long length; */ +NS_IMETHODIMP +nsFontFaceList::GetLength(uint32_t *aLength) +{ + *aLength = mFontFaces.Count(); + return NS_OK; +} + +//////////////////////////////////////////////////////////////////////// +// nsFontFaceList + +nsresult +nsFontFaceList::AddFontsFromTextRun(gfxTextRun* aTextRun, + uint32_t aOffset, uint32_t aLength) +{ + gfxTextRun::GlyphRunIterator iter(aTextRun, aOffset, aLength); + while (iter.NextRun()) { + gfxFontEntry *fe = iter.GetGlyphRun()->mFont->GetFontEntry(); + // if we have already listed this face, just make sure the match type is + // recorded + nsFontFace* existingFace = + static_cast(mFontFaces.GetWeak(fe)); + if (existingFace) { + existingFace->AddMatchType(iter.GetGlyphRun()->mMatchType); + } else { + // A new font entry we haven't seen before + nsRefPtr ff = + new nsFontFace(fe, aTextRun->GetFontGroup(), + iter.GetGlyphRun()->mMatchType); + mFontFaces.Put(fe, ff); + } + } + + return NS_OK; +}