dmose%mozilla.org 0efb7c174c updated xPL license boilerplate to v1.1, a=chofmann@netscape.com,r=endico@mozilla.org
git-svn-id: svn://10.0.0.236/trunk@52910 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-06 03:43:54 +00:00

245 lines
4.6 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/*
* wfSzList.cpp (FontObject.cpp)
*
* Object local to libfont. This is used to track the association between
* rc, sizes[] and rf[] for a particular fh in a Font Object.
*
* dp Suresh <dp@netscape.com>
*/
#include "wfSzList.h"
wfSizesList::wfSizesList() : sizesLen(-1), sizes(NULL), rfs(NULL), rfcount(0),
maxrfcount(0), rfAllocStep(4)
{
}
wfSizesList::~wfSizesList()
{
freeSizes();
if (rfs)
{
WF_FREE(rfs);
}
}
int
wfSizesList::initialized()
{
return(sizesLen >= 0 );
}
jdouble *
wfSizesList::getSizes()
{
jdouble *ret = NULL;
if (sizesLen)
{
ret = sizes;
}
return (ret);
}
int
wfSizesList::addSizes(jdouble *s)
{
if (sizesLen)
{
// A list of sizes already exists for this. We will just free
// it and use the current sizes list.
freeSizes();
}
sizes = s;
for (sizesLen=0; sizes && sizes[sizesLen]>=0; sizesLen++);
return 0;
}
int
wfSizesList::removeSize(jdouble size)
{
int ret = -1;
for(int i=0; i<sizesLen; i++)
{
if (sizes[i] == size)
{
// Remove the size from the array
// by moving the last element to this spot
sizes[i] = sizes[sizesLen-1];
sizesLen--;
sizes[sizesLen] = -1;
ret = 0;
}
}
return (ret);
}
int wfSizesList::supportsSize(jdouble size)
{
#if defined(XP_WIN) && !defined(WIN32)
/* for win16, don't use the size list, */
return(1);
#else
int found = 0;
if (sizes)
{
for (int i=0; i<sizesLen; i++)
{
if (sizes[i] == size || sizes[i] == 0)
{
found = 1;
break;
}
}
}
return (found);
#endif
}
int
/*ARGSUSED*/
wfSizesList::addRf(struct nfrf *rf)
{
// We are changing logic here. All we are going to do is to
// add the rf in the list of rf's that were created here.
// size is not used.
if (rfcount + 1 > maxrfcount)
{
// need more memory
if (maxrfcount == 0)
{
rfs = (struct nfrf **)WF_ALLOC(rfAllocStep * sizeof (*rfs));
}
else
{
rfs = (struct nfrf **) WF_REALLOC(rfs,
(maxrfcount+rfAllocStep) * sizeof(*rfs));
}
if (!rfs)
{
// XXX no more memory. things are about to go horribly
// wrong. The garbage collection code is banking on this
// to be able to keep track of the rfs that were created.
return -1;
}
maxrfcount += rfAllocStep;
}
rfs[rfcount] = rf;
// NOTE: we should not increment the reference count here
// This was done so that the rfs will release normally.
// If we did increment the refcount, then this rf will
// never be released. That is why we have nffbp::RfDone()
// to notify us that this rf is going away.
// nfrf_addRef((struct nfrf *)rf, NULL);
rfcount++;
return (0);
}
int
wfSizesList::removeRf(struct nfrf *rf)
{
int ret = 0;
int i = 0;
while (i < rfcount)
{
if (rfs[i] == rf)
{
// NOTE: we dont have to decrement the reference count here
// as we are not incrementing the reference count for
// the rf's stored int he rfs[]. This was done so that
// the rfs will release normally. If we did increment
// the refcount, then this rf will never be released.
// That is why we have nffbp::RfDone() to notify us
// that this rf is going away.
rfs[i] = rfs[rfcount-1];
rfcount--;
ret ++;
}
else
{
i++;
}
}
return (ret);
}
int
wfSizesList::isRfExist(struct nfrf *rf)
{
int ret = 0;
for (int i = 0; i < rfcount; i++)
{
if (rfs[i] == rf)
{
ret++;
}
}
return (ret);
}
int
wfSizesList::getRfCount()
{
return (rfcount);
}
struct nfrf *
wfSizesList::getRf(jdouble pointsize)
{
struct nfrf *rf = NULL;
for (int i = 0; i < rfcount; i++)
{
if (nfrf_GetPointSize(rfs[i], NULL) == pointsize)
{
rf = rfs[i];
break;
}
}
return (rf);
}
//
// Private method implementations
//
void
wfSizesList::freeSizes()
{
if (sizes)
{
// XXX Possible alloc/free mismatch
WF_FREE(sizes);
sizes = NULL;
}
}