BucketList *AlphabeticIndex::createBucketList(UErrorCode &errorCode) const { // Initialize indexCharacters. UVector indexCharacters(errorCode); indexCharacters.setDeleter(uprv_deleteUObject); initLabels(indexCharacters, errorCode); if (U_FAILURE(errorCode)) { return NULL; } // Variables for hasMultiplePrimaryWeights(). LocalPointer<CollationElementIterator> cei( collatorPrimaryOnly_->createCollationElementIterator(emptyString_)); if (cei.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } int32_t variableTop; if (collatorPrimaryOnly_->getAttribute(UCOL_ALTERNATE_HANDLING, errorCode) == UCOL_SHIFTED) { variableTop = CollationElementIterator::primaryOrder( (int32_t)collatorPrimaryOnly_->getVariableTop(errorCode)); } else { variableTop = 0; } UBool hasInvisibleBuckets = FALSE; // Helper arrays for Chinese Pinyin collation. Bucket *asciiBuckets[26] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; Bucket *pinyinBuckets[26] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; UBool hasPinyin = FALSE; LocalPointer<UVector> bucketList(new UVector(errorCode)); if (bucketList.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList->setDeleter(uprv_deleteUObject); // underflow bucket Bucket *bucket = new Bucket(getUnderflowLabel(), emptyString_, U_ALPHAINDEX_UNDERFLOW); if (bucket == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList->addElement(bucket, errorCode); if (U_FAILURE(errorCode)) { return NULL; } UnicodeString temp; // fix up the list, adding underflow, additions, overflow // Insert inflow labels as needed. int32_t scriptIndex = -1; const UnicodeString *scriptUpperBoundary = &emptyString_; for (int32_t i = 0; i < indexCharacters.size(); ++i) { UnicodeString ¤t = *getString(indexCharacters, i); if (collatorPrimaryOnly_->compare(current, *scriptUpperBoundary, errorCode) >= 0) { // We crossed the script boundary into a new script. const UnicodeString &inflowBoundary = *scriptUpperBoundary; UBool skippedScript = FALSE; for (;;) { scriptUpperBoundary = getString(*firstCharsInScripts_, ++scriptIndex); if (collatorPrimaryOnly_->compare(current, *scriptUpperBoundary, errorCode) < 0) { break; } skippedScript = TRUE; } if (skippedScript && bucketList->size() > 1) { // We are skipping one or more scripts, // and we are not just getting out of the underflow label. bucket = new Bucket(getInflowLabel(), inflowBoundary, U_ALPHAINDEX_INFLOW); if (bucket == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList->addElement(bucket, errorCode); } } // Add a bucket with the current label. bucket = new Bucket(fixLabel(current, temp), current, U_ALPHAINDEX_NORMAL); if (bucket == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList->addElement(bucket, errorCode); // Remember ASCII and Pinyin buckets for Pinyin redirects. UChar c; if (current.length() == 1 && 0x41 <= (c = current.charAt(0)) && c <= 0x5A) { // A-Z asciiBuckets[c - 0x41] = bucket; } else if (current.length() == BASE_LENGTH + 1 && current.startsWith(BASE, BASE_LENGTH) && 0x41 <= (c = current.charAt(BASE_LENGTH)) && c <= 0x5A) { pinyinBuckets[c - 0x41] = bucket; hasPinyin = TRUE; } // Check for multiple primary weights. if (!current.startsWith(BASE, BASE_LENGTH) && hasMultiplePrimaryWeights(*cei, variableTop, current, errorCode) && current.charAt(current.length() - 1) != 0xFFFF /* !current.endsWith("\uffff") */) { // "AE-ligature" or "Sch" etc. for (int32_t i = bucketList->size() - 2;; --i) { Bucket *singleBucket = getBucket(*bucketList, i); if (singleBucket->labelType_ != U_ALPHAINDEX_NORMAL) { // There is no single-character bucket since the last // underflow or inflow label. break; } if (singleBucket->displayBucket_ == NULL && !hasMultiplePrimaryWeights( *cei, variableTop, singleBucket->lowerBoundary_, errorCode)) { // Add an invisible bucket that redirects strings greater than the expansion // to the previous single-character bucket. // For example, after ... Q R S Sch we add Sch\uFFFF->S // and after ... Q R S Sch Sch\uFFFF St we add St\uFFFF->S. bucket = new Bucket(emptyString_, UnicodeString(current).append((UChar)0xFFFF), U_ALPHAINDEX_NORMAL); if (bucket == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucket->displayBucket_ = singleBucket; bucketList->addElement(bucket, errorCode); hasInvisibleBuckets = TRUE; break; } } } } if (U_FAILURE(errorCode)) { return NULL; } if (bucketList->size() == 1) { // No real labels, show only the underflow label. BucketList *bl = new BucketList(bucketList.getAlias(), bucketList.getAlias()); if (bl == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList.orphan(); return bl; } // overflow bucket bucket = new Bucket(getOverflowLabel(), *scriptUpperBoundary, U_ALPHAINDEX_OVERFLOW); if (bucket == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList->addElement(bucket, errorCode); // final if (hasPinyin) { // Redirect Pinyin buckets. Bucket *asciiBucket = NULL; for (int32_t i = 0; i < 26; ++i) { if (asciiBuckets[i] != NULL) { asciiBucket = asciiBuckets[i]; } if (pinyinBuckets[i] != NULL && asciiBucket != NULL) { pinyinBuckets[i]->displayBucket_ = asciiBucket; hasInvisibleBuckets = TRUE; } } } if (U_FAILURE(errorCode)) { return NULL; } if (!hasInvisibleBuckets) { BucketList *bl = new BucketList(bucketList.getAlias(), bucketList.getAlias()); if (bl == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList.orphan(); return bl; } // Merge inflow buckets that are visually adjacent. // Iterate backwards: Merge inflow into overflow rather than the other way around. int32_t i = bucketList->size() - 1; Bucket *nextBucket = getBucket(*bucketList, i); while (--i > 0) { bucket = getBucket(*bucketList, i); if (bucket->displayBucket_ != NULL) { continue; // skip invisible buckets } if (bucket->labelType_ == U_ALPHAINDEX_INFLOW) { if (nextBucket->labelType_ != U_ALPHAINDEX_NORMAL) { bucket->displayBucket_ = nextBucket; continue; } } nextBucket = bucket; } LocalPointer<UVector> publicBucketList(new UVector(errorCode)); if (bucketList.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } // Do not call publicBucketList->setDeleter(): // This vector shares its objects with the bucketList. for (int32_t i = 0; i < bucketList->size(); ++i) { bucket = getBucket(*bucketList, i); if (bucket->displayBucket_ == NULL) { publicBucketList->addElement(bucket, errorCode); } } if (U_FAILURE(errorCode)) { return NULL; } BucketList *bl = new BucketList(bucketList.getAlias(), publicBucketList.getAlias()); if (bl == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; } bucketList.orphan(); publicBucketList.orphan(); return bl; }
/*static*/ void CChemEqInterface::setChemEqFromString(CModel * model, CReaction & rea, const std::string & ces) { CChemEqInterface cei(model); cei.setChemEqString(ces); cei.writeToChemEq(rea.getChemEq()); }
void CameraFBO::render(render_action_t* ra) { #if OSG_MAJOR_VERSION < 2 OSG::beginEditCP(mFboVP); mFboVP->getTextures()[0] = mCurrentTexture; OSG::endEditCP(mFboVP); #else mTexBuffer->setTexture(mCurrentTexture); #endif #if OSG_MAJOR_VERSION >= 2 OSG::DrawEnv draw_env; draw_env.setAction(ra); draw_env.setViewport(OSG::getCPtr(mFboVP)); draw_env.setWindow(ra->getWindow()); mTexBuffer->bind(&draw_env); mFBO->activate(&draw_env); #endif #if OSG_MAJOR_VERSION < 2 // Do the actual rendering. glClear(GL_DEPTH_BUFFER_BIT); glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); mFboVP->render(ra); glPopMatrix(); glPopAttrib(); mFboVP->bind(ra->getWindow()); // If we are using an FBO, then we should change to the FBO buffer. glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); checkGLError("before glReadPixels"); #endif #if OSG_MAJOR_VERSION < 2 OSG::CPEditor cei(mCurrentImage); #endif // Read the buffer into an OpenSG image. void* buffer = #if OSG_MAJOR_VERSION < 2 mCurrentImage->getData(); #else mCurrentImage->editData(); #endif glReadPixels(mFboVP->getPixelLeft(), mFboVP->getPixelBottom(), mWidth, mHeight, mCurrentImage->getPixelFormat(), GL_UNSIGNED_BYTE, buffer); checkGLError("after glReadPixels"); // XXX: We don't really need to change the read buffer target since we // are not reading from the pixel buffer anywhere else. // Double buffered. //glReadBuffer(GL_BACK); #if OSG_MAJOR_VERSION < 2 mFboVP->stop(ra->getWindow()); #else mFBO->deactivate(&draw_env); #endif }
/*static*/ std::string CChemEqInterface::getChemEqString(CModel * model, const CReaction & rea, bool expanded) { CChemEqInterface cei(model); cei.loadFromChemEq(rea.getChemEq()); return cei.getChemEqString(expanded); }