summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libs/rs/rsContext.cpp2
-rw-r--r--libs/rs/rsFont.cpp21
-rw-r--r--libs/rs/rsFont.h1
-rw-r--r--libs/rs/rsScript.cpp2
-rw-r--r--libs/rs/rsScriptC.cpp24
-rw-r--r--libs/rs/rsScriptC.h4
6 files changed, 36 insertions, 18 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 40cb5c7..1dfedb3 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -528,6 +528,7 @@ void * Context::threadProc(void *vrsc) {
void Context::destroyWorkerThreadResources() {
//LOGV("destroyWorkerThreadResources 1");
+ ObjectBase::zeroAllUserRef(this);
if (mIsGraphicsContext) {
mRaster.clear();
mFragment.clear();
@@ -542,7 +543,6 @@ void Context::destroyWorkerThreadResources() {
mStateFont.deinit(this);
mShaderCache.cleanupAll();
}
- ObjectBase::zeroAllUserRef(this);
//LOGV("destroyWorkerThreadResources 2");
mExit = true;
}
diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp
index 8571c32..7fdfbe0 100644
--- a/libs/rs/rsFont.cpp
+++ b/libs/rs/rsFont.cpp
@@ -74,6 +74,15 @@ bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data
return true;
}
+void Font::preDestroy() const {
+ for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
+ if (mRSC->mStateFont.mActiveFonts[ct] == this) {
+ mRSC->mStateFont.mActiveFonts.removeAt(ct);
+ break;
+ }
+ }
+}
+
void Font::invalidateTextureCache() {
for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
mCachedGlyphs.valueAt(i)->mIsValid = false;
@@ -309,13 +318,6 @@ Font::~Font() {
FT_Done_Face(mFace);
}
- for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
- if (mRSC->mStateFont.mActiveFonts[ct] == this) {
- mRSC->mStateFont.mActiveFonts.removeAt(ct);
- break;
- }
- }
-
for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i);
delete glyph;
@@ -799,11 +801,6 @@ void FontState::deinit(Context *rsc) {
mDefault.clear();
- Vector<Font*> fontsToDereference = mActiveFonts;
- for (uint32_t i = 0; i < fontsToDereference.size(); i ++) {
- fontsToDereference[i]->zeroUserRef();
- }
-
if (mLibrary) {
FT_Done_FreeType( mLibrary );
mLibrary = NULL;
diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h
index 00d77c8..4820999 100644
--- a/libs/rs/rsFont.h
+++ b/libs/rs/rsFont.h
@@ -119,6 +119,7 @@ protected:
Font(Context *rsc);
bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0);
+ virtual void preDestroy() const;
FT_Face mFace;
bool mInitialized;
bool mHasKerning;
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index efdc626..9ada9c2 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -78,8 +78,6 @@ void Script::setVarObj(uint32_t slot, ObjectBase *val) {
(*destPtr)->decSysRef();
}
*destPtr = val;
- } else {
- LOGV("Calling setVarObj on slot = %i which is null. This is dangerous because the script will not hold a ref count on the object.", slot);
}
}
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 3858e1c..fc673a2 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -94,16 +94,24 @@ char *genCacheFileName(const char *cacheDir,
}
ScriptC::ScriptC(Context *rsc) : Script(rsc) {
- LOGD(">>>> ScriptC ctor called, obj=%p", this);
mBccScript = NULL;
memset(&mProgram, 0, sizeof(mProgram));
}
ScriptC::~ScriptC() {
- LOGD(">>>> ~ScriptC() mBccScript = %p", mBccScript);
if (mBccScript) {
+ if (mProgram.mObjectSlotList) {
+ for (size_t ct=0; ct < mProgram.mObjectSlotCount; ct++) {
+ setVarObj(mProgram.mObjectSlotList[ct], NULL);
+ }
+ delete [] mProgram.mObjectSlotList;
+ mProgram.mObjectSlotList = NULL;
+ mProgram.mObjectSlotCount = 0;
+ }
+
+
+ LOGD(">>>> ~ScriptC bccDisposeScript(%p)", mBccScript);
bccDisposeScript(mBccScript);
- LOGD(">>>> ~ScriptC(mBCCScript)");
}
free(mEnviroment.mScriptText);
mEnviroment.mScriptText = NULL;
@@ -589,6 +597,16 @@ bool ScriptCState::runCompiler(Context *rsc,
return false;
}
}
+
+ size_t objectSlotCount = bccGetObjectSlotCount(s->mBccScript);
+ uint32_t *objectSlots = NULL;
+ if (objectSlotCount) {
+ objectSlots = new uint32_t[objectSlotCount];
+ bccGetObjectSlotList(s->mBccScript, objectSlotCount, objectSlots);
+ s->mProgram.mObjectSlotList = objectSlots;
+ s->mProgram.mObjectSlotCount = objectSlotCount;
+ }
+
return true;
}
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 7143c67..e794feb 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -42,8 +42,12 @@ public:
RunScript_t mRoot;
VoidFunc_t mInit;
+
+ uint32_t * mObjectSlotList;
+ uint32_t mObjectSlotCount;
};
+
Program_t mProgram;
BCCScriptRef mBccScript;