int wfFontObjectCache::releaseRf(struct nfrf *rf) { #ifdef DEBUG WF_TRACEMSG( ("NF: Deleting rf (0x%x).", rf) ); #endif /* DEBUG */ struct wfListElement *tmp = head; int nrelease = 0; while(tmp) { struct font_store *ele = (struct font_store *) tmp->item; // We know that this Font object was created by us. So we can // snoop into its implementation to call implementation specific // methods. cfImpl *oimpl = cf2cfImpl(ele->f); FontObject *fob = (FontObject *)oimpl->object; // // WARNING: Before calling FontObject::releaseRf we need to get the // next item in the list. This is because the FontObject could turn // around and decide to remove itself from our list. // tmp = tmp->next; int n = fob->releaseRf(rf); if (n) { // Run the garbage collector since some rf was released. This // could even cause the font object to be deleted. if (!fob->GC()) { struct nff *f_to_delete = (struct nff *) ele->f; // Delete the FontObject. Deleting the FontObject will turn // around and delete the element in the fontObjectCache list // by calling FontObjectCache::releaseFont(). // // So DONT REMOVE THE ELEMENT. It will be removed. // wfList::remove(ele); nff_addRef(f_to_delete, NULL); nff_release(f_to_delete, NULL); } } nrelease += n; } if (nrelease) { // Some font had this rf. It is not possbile then for the same rf // exist with webfonts. Skip looking into the webfonts. return(nrelease); } return (nrelease); }
/*ARGSUSED*/ _cf_release(struct cf* self, jint op, JMCException* *exc) { cfImplHeader* impl = (cfImplHeader*)cf2cfImpl(self); --impl->refcount; // Run the GC cfImpl *oimpl = cf2cfImpl(self); FontObject *fob = (FontObject *)oimpl->object; int ret = fob->GC(); if (impl->refcount == 0) { cf_finalize(self, exc); } }