void nsSVGTextFrame::UpdateGlyphPositioning(PRBool aForceGlobalTransform) { if (mMetricsState == suspended || !mPositioningDirty) return; SetWhitespaceHandling(); nsISVGGlyphFragmentNode* node = GetFirstGlyphFragmentChildNode(); if (!node) return; mPositioningDirty = PR_FALSE; nsISVGGlyphFragmentLeaf *fragment, *firstFragment; firstFragment = node->GetFirstGlyphFragment(); if (!firstFragment) { return; } float x = 0, y = 0; { nsCOMPtr<nsIDOMSVGLengthList> list = GetX(); GetSingleValue(list, &x); } { nsCOMPtr<nsIDOMSVGLengthList> list = GetY(); GetSingleValue(list, &y); } // loop over chunks while (firstFragment) { { nsCOMPtr<nsIDOMSVGLengthList> list = firstFragment->GetX(); GetSingleValue(list, &x); } { nsCOMPtr<nsIDOMSVGLengthList> list = firstFragment->GetY(); GetSingleValue(list, &y); } // check for startOffset on textPath nsSVGTextPathFrame *textPath = firstFragment->FindTextPathParent(); if (textPath) { if (!textPath->GetPathFrame()) { // invalid text path, give up return; } x = textPath->GetStartOffset(); } // determine x offset based on text_anchor: PRUint8 anchor = firstFragment->GetTextAnchor(); float chunkLength = 0.0f; if (anchor != NS_STYLE_TEXT_ANCHOR_START) { // need to get the total chunk length fragment = firstFragment; while (fragment) { float dx = 0.0f; nsCOMPtr<nsIDOMSVGLengthList> list = fragment->GetDx(); GetSingleValue(list, &dx); chunkLength += dx + fragment->GetAdvance(aForceGlobalTransform); fragment = fragment->GetNextGlyphFragment(); if (fragment && fragment->IsAbsolutelyPositioned()) break; } } if (anchor == NS_STYLE_TEXT_ANCHOR_MIDDLE) x -= chunkLength/2.0f; else if (anchor == NS_STYLE_TEXT_ANCHOR_END) x -= chunkLength; // set position of each fragment in this chunk: fragment = firstFragment; while (fragment) { float dx = 0.0f, dy = 0.0f; { nsCOMPtr<nsIDOMSVGLengthList> list = fragment->GetDx(); GetSingleValue(list, &dx); } { nsCOMPtr<nsIDOMSVGLengthList> list = fragment->GetDy(); GetSingleValue(list, &dy); } fragment->SetGlyphPosition(x + dx, y + dy, aForceGlobalTransform); x += dx + fragment->GetAdvance(aForceGlobalTransform); y += dy; fragment = fragment->GetNextGlyphFragment(); if (fragment && fragment->IsAbsolutelyPositioned()) break; } firstFragment = fragment; } }
bool CTextureDatabase::ClearCachedTexture(const std::string &url, std::string &cacheFile) { std::string id = GetSingleValue(PrepareSQL("select id from texture where url='%s'", url.c_str())); return !id.empty() ? ClearCachedTexture(strtol(id.c_str(), NULL, 10), cacheFile) : false; }