void SVGPolyParser::parsePoints(const DeprecatedString &s) const { if (!s.isEmpty()) { DeprecatedString pointData = s; pointData = pointData.replace(',', ' '); pointData = pointData.simplifyWhiteSpace(); const char* currSegment = pointData.latin1(); const char* eoString = pointData.latin1() + pointData.length(); int segmentNum = 0; while (currSegment < eoString) { const char* prevSegment = currSegment; double xPos = 0; currSegment = parseCoord(currSegment, xPos); if (currSegment == prevSegment) break; if (*currSegment == ',' || *currSegment == ' ') currSegment++; prevSegment = currSegment; double yPos = 0; currSegment = parseCoord(currSegment, yPos); if (currSegment == prevSegment) break; svgPolyTo(xPos, yPos, segmentNum++); if (*currSegment == ' ') currSegment++; } } }
void Color::setNamedColor(const String& name) { DeprecatedString dname = name.deprecatedString(); const NamedColor* foundColor = dname.isAllASCII() ? findColor(dname.latin1(), dname.length()) : 0; color = foundColor ? foundColor->RGBValue : 0; color |= 0xFF000000; valid = foundColor; }
void SVGLength::setValueAsString(const String& s) { if(s.isEmpty()) return; DeprecatedString valueAsQString = s.deprecatedString(); double convertedNumber = 0; const char *start = valueAsQString.latin1(); const char *end = parseCoord(start, convertedNumber); m_valueInSpecifiedUnits = convertedNumber; unsigned int diff = end - start; if (diff < valueAsQString.length()) { if (s.endsWith(UnitText[SVG_LENGTHTYPE_PX])) m_unitType = SVG_LENGTHTYPE_PX; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_CM])) m_unitType = SVG_LENGTHTYPE_CM; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_PC])) m_unitType = SVG_LENGTHTYPE_PC; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_MM])) m_unitType = SVG_LENGTHTYPE_MM; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_IN])) m_unitType = SVG_LENGTHTYPE_IN; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_PT])) m_unitType = SVG_LENGTHTYPE_PT; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_PERCENTAGE])) m_unitType = SVG_LENGTHTYPE_PERCENTAGE; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_EMS])) m_unitType = SVG_LENGTHTYPE_EMS; else if (s.endsWith(UnitText[SVG_LENGTHTYPE_EXS])) m_unitType = SVG_LENGTHTYPE_EXS; else if (s.isEmpty()) m_unitType = SVG_LENGTHTYPE_NUMBER; else m_unitType = SVG_LENGTHTYPE_UNKNOWN; } else m_unitType = SVG_LENGTHTYPE_PX; updateValue(); }
void SVGPathParser::parseSVG( const DeprecatedString &s, bool process ) { if(!s.isEmpty()) { DeprecatedString d = s; d = d.replace(',', ' '); d = d.simplifyWhiteSpace(); const char *ptr = d.latin1(); const char *end = d.latin1() + d.length() + 1; double contrlx, contrly, curx, cury, subpathx, subpathy, tox, toy, x1, y1, x2, y2, xc, yc; double px1, py1, px2, py2, px3, py3; bool relative, closed = true; char command = *(ptr++), lastCommand = ' '; subpathx = subpathy = curx = cury = contrlx = contrly = 0.0; while( ptr < end ) { if( *ptr == ' ' ) ptr++; relative = false; //std::cout << "Command : " << command << std::endl; switch( command ) { case 'm': relative = true; case 'M': { ptr = parseCoord( ptr, tox ); ptr = parseCoord( ptr, toy ); if( process ) { subpathx = curx = relative ? curx + tox : tox; subpathy = cury = relative ? cury + toy : toy; svgMoveTo( curx, cury, closed ); } else svgMoveTo( tox, toy, closed, !relative ); closed = false; break; } case 'l': relative = true; case 'L': { ptr = parseCoord( ptr, tox ); ptr = parseCoord( ptr, toy ); if( process ) { curx = relative ? curx + tox : tox; cury = relative ? cury + toy : toy; svgLineTo( curx, cury ); } else svgLineTo( tox, toy, !relative ); break; } case 'h': { ptr = parseCoord( ptr, tox ); if( process ) { curx = curx + tox; svgLineTo( curx, cury ); } else svgLineToHorizontal( tox, false ); break; } case 'H': { ptr = parseCoord( ptr, tox ); if( process ) { curx = tox; svgLineTo( curx, cury ); } else svgLineToHorizontal( tox ); break; } case 'v': { ptr = parseCoord( ptr, toy ); if( process ) { cury = cury + toy; svgLineTo( curx, cury ); } else svgLineToVertical( toy, false ); break; } case 'V': { ptr = parseCoord( ptr, toy ); if( process ) { cury = toy; svgLineTo( curx, cury ); } else svgLineToVertical( toy ); break; } case 'z': case 'Z': { // reset curx, cury for next path if( process ) { curx = subpathx; cury = subpathy; } closed = true; svgClosePath(); break; } case 'c': relative = true; case 'C': { ptr = parseCoord( ptr, x1 ); ptr = parseCoord( ptr, y1 ); ptr = parseCoord( ptr, x2 ); ptr = parseCoord( ptr, y2 ); ptr = parseCoord( ptr, tox ); ptr = parseCoord( ptr, toy ); if( process ) { px1 = relative ? curx + x1 : x1; py1 = relative ? cury + y1 : y1; px2 = relative ? curx + x2 : x2; py2 = relative ? cury + y2 : y2; px3 = relative ? curx + tox : tox; py3 = relative ? cury + toy : toy; svgCurveToCubic( px1, py1, px2, py2, px3, py3 ); contrlx = relative ? curx + x2 : x2; contrly = relative ? cury + y2 : y2; curx = relative ? curx + tox : tox; cury = relative ? cury + toy : toy; } else svgCurveToCubic( x1, y1, x2, y2, tox, toy, !relative ); break; } case 's': relative = true; case 'S': { ptr = parseCoord( ptr, x2 ); ptr = parseCoord( ptr, y2 ); ptr = parseCoord( ptr, tox ); ptr = parseCoord( ptr, toy ); if(!(lastCommand == 'c' || lastCommand == 'C' || lastCommand == 's' || lastCommand == 'S')) { contrlx = curx; contrly = cury; } if( process ) { px1 = 2 * curx - contrlx; py1 = 2 * cury - contrly; px2 = relative ? curx + x2 : x2; py2 = relative ? cury + y2 : y2; px3 = relative ? curx + tox : tox; py3 = relative ? cury + toy : toy; svgCurveToCubic( px1, py1, px2, py2, px3, py3 ); contrlx = relative ? curx + x2 : x2; contrly = relative ? cury + y2 : y2; curx = relative ? curx + tox : tox; cury = relative ? cury + toy : toy; } else svgCurveToCubicSmooth( x2, y2, tox, toy, !relative ); break; } case 'q': relative = true; case 'Q': { ptr = parseCoord( ptr, x1 ); ptr = parseCoord( ptr, y1 ); ptr = parseCoord( ptr, tox ); ptr = parseCoord( ptr, toy ); if( process ) { px1 = relative ? (curx + 2 * (x1 + curx)) * (1.0 / 3.0) : (curx + 2 * x1) * (1.0 / 3.0); py1 = relative ? (cury + 2 * (y1 + cury)) * (1.0 / 3.0) : (cury + 2 * y1) * (1.0 / 3.0); px2 = relative ? ((curx + tox) + 2 * (x1 + curx)) * (1.0 / 3.0) : (tox + 2 * x1) * (1.0 / 3.0); py2 = relative ? ((cury + toy) + 2 * (y1 + cury)) * (1.0 / 3.0) : (toy + 2 * y1) * (1.0 / 3.0); px3 = relative ? curx + tox : tox; py3 = relative ? cury + toy : toy; svgCurveToCubic( px1, py1, px2, py2, px3, py3 ); contrlx = relative ? curx + x1 : x1; contrly = relative ? cury + y1 : y1; curx = relative ? curx + tox : tox; cury = relative ? cury + toy : toy; } else svgCurveToQuadratic( x1, y1, tox, toy, !relative ); break; } case 't': relative = true; case 'T': { ptr = parseCoord(ptr, tox); ptr = parseCoord(ptr, toy); if(!(lastCommand == 'q' || lastCommand == 'Q' || lastCommand == 't' || lastCommand == 'T')) { contrlx = curx; contrly = cury; } if( process ) { xc = 2 * curx - contrlx; yc = 2 * cury - contrly; px1 = relative ? (curx + 2 * xc) * (1.0 / 3.0) : (curx + 2 * xc) * (1.0 / 3.0); py1 = relative ? (cury + 2 * yc) * (1.0 / 3.0) : (cury + 2 * yc) * (1.0 / 3.0); px2 = relative ? ((curx + tox) + 2 * xc) * (1.0 / 3.0) : (tox + 2 * xc) * (1.0 / 3.0); py2 = relative ? ((cury + toy) + 2 * yc) * (1.0 / 3.0) : (toy + 2 * yc) * (1.0 / 3.0); px3 = relative ? curx + tox : tox; py3 = relative ? cury + toy : toy; svgCurveToCubic( px1, py1, px2, py2, px3, py3 ); contrlx = xc; contrly = yc; curx = relative ? curx + tox : tox; cury = relative ? cury + toy : toy; } else svgCurveToQuadraticSmooth( tox, toy, !relative ); break; } case 'a': relative = true; case 'A': { bool largeArc, sweep; double angle, rx, ry; ptr = parseCoord( ptr, rx ); ptr = parseCoord( ptr, ry ); ptr = parseCoord( ptr, angle ); ptr = parseCoord( ptr, tox ); largeArc = tox == 1; ptr = parseCoord( ptr, tox ); sweep = tox == 1; ptr = parseCoord( ptr, tox ); ptr = parseCoord( ptr, toy ); // Spec: radii are nonnegative numbers rx = fabs(rx); ry = fabs(ry); if( process ) calculateArc( relative, curx, cury, angle, tox, toy, rx, ry, largeArc, sweep ); else svgArcTo( tox, toy, rx, ry, angle, largeArc, sweep, !relative ); break; } default: // FIXME: An error should go to the JavaScript console, or the like. return; } lastCommand = command; if(*ptr == '+' || *ptr == '-' || (*ptr >= '0' && *ptr <= '9')) { // there are still coords in this command if(command == 'M') command = 'L'; else if(command == 'm') command = 'l'; } else command = *(ptr++); if( lastCommand != 'C' && lastCommand != 'c' && lastCommand != 'S' && lastCommand != 's' && lastCommand != 'Q' && lastCommand != 'q' && lastCommand != 'T' && lastCommand != 't' ) { contrlx = curx; contrly = cury; } } } }
void CachedXSLStyleSheet::setCharset( const DeprecatedString &chs ) { if (!chs.isEmpty()) m_decoder->setEncodingName(chs.latin1(), Decoder::EncodingFromHTTPHeader); }
DeprecatedCString StreamingTextDecoderICU::fromUnicode(const DeprecatedString &qcs, bool allowEntities) { TextEncodingID encoding = m_encoding.effectiveEncoding().encodingID(); if (encoding == WinLatin1Encoding && qcs.isAllLatin1()) return qcs.latin1(); if ((encoding == WinLatin1Encoding || encoding == UTF8Encoding || encoding == ASCIIEncoding) && qcs.isAllASCII()) return qcs.ascii(); // FIXME: We should see if there is "force ASCII range" mode in ICU; // until then, we change the backslash into a yen sign. // Encoding will change the yen sign back into a backslash. DeprecatedString copy = qcs; copy.replace('\\', m_encoding.backslashAsCurrencySymbol()); if (!m_converterICU) createICUConverter(); if (!m_converterICU) return DeprecatedCString(); // FIXME: when DeprecatedString buffer is latin1, it would be nice to // convert from that w/o having to allocate a unicode buffer char buffer[ConversionBufferSize]; const UChar* source = reinterpret_cast<const UChar*>(copy.unicode()); const UChar* sourceLimit = source + copy.length(); UErrorCode err = U_ZERO_ERROR; DeprecatedString normalizedString; if (UNORM_YES != unorm_quickCheck(source, copy.length(), UNORM_NFC, &err)) { normalizedString.truncate(copy.length()); // normalization to NFC rarely increases the length, so this first attempt will usually succeed int32_t normalizedLength = unorm_normalize(source, copy.length(), UNORM_NFC, 0, reinterpret_cast<UChar*>(const_cast<DeprecatedChar*>(normalizedString.unicode())), copy.length(), &err); if (err == U_BUFFER_OVERFLOW_ERROR) { err = U_ZERO_ERROR; normalizedString.truncate(normalizedLength); normalizedLength = unorm_normalize(source, copy.length(), UNORM_NFC, 0, reinterpret_cast<UChar*>(const_cast<DeprecatedChar*>(normalizedString.unicode())), normalizedLength, &err); } source = reinterpret_cast<const UChar*>(normalizedString.unicode()); sourceLimit = source + normalizedLength; } DeprecatedCString result(1); // for trailing zero if (allowEntities) ucnv_setFromUCallBack(m_converterICU, UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, 0, 0, &err); else { ucnv_setSubstChars(m_converterICU, "?", 1, &err); ucnv_setFromUCallBack(m_converterICU, UCNV_FROM_U_CALLBACK_SUBSTITUTE, 0, 0, 0, &err); } ASSERT(U_SUCCESS(err)); if (U_FAILURE(err)) return DeprecatedCString(); do { char* target = buffer; char* targetLimit = target + ConversionBufferSize; err = U_ZERO_ERROR; ucnv_fromUnicode(m_converterICU, &target, targetLimit, &source, sourceLimit, 0, true, &err); int count = target - buffer; buffer[count] = 0; result.append(buffer); } while (err == U_BUFFER_OVERFLOW_ERROR); return result; }
void SelectionController::debugRenderer(RenderObject *r, bool selected) const { if (r->node()->isElementNode()) { Element *element = static_cast<Element *>(r->node()); fprintf(stderr, "%s%s\n", selected ? "==> " : " ", element->localName().deprecatedString().latin1()); } else if (r->isText()) { RenderText *textRenderer = static_cast<RenderText *>(r); if (textRenderer->stringLength() == 0 || !textRenderer->firstTextBox()) { fprintf(stderr, "%s#text (empty)\n", selected ? "==> " : " "); return; } static const int max = 36; DeprecatedString text = String(textRenderer->string()).deprecatedString(); int textLength = text.length(); if (selected) { int offset = 0; if (r->node() == m_sel.start().node()) offset = m_sel.start().offset(); else if (r->node() == m_sel.end().node()) offset = m_sel.end().offset(); int pos; InlineTextBox *box = textRenderer->findNextInlineTextBox(offset, pos); text = text.mid(box->m_start, box->m_len); DeprecatedString show; int mid = max / 2; int caret = 0; // text is shorter than max if (textLength < max) { show = text; caret = pos; } // too few characters to left else if (pos - mid < 0) { show = text.left(max - 3) + "..."; caret = pos; } // enough characters on each side else if (pos - mid >= 0 && pos + mid <= textLength) { show = "..." + text.mid(pos - mid + 3, max - 6) + "..."; caret = mid; } // too few characters on right else { show = "..." + text.right(max - 3); caret = pos - (textLength - show.length()); } show.replace('\n', ' '); show.replace('\r', ' '); fprintf(stderr, "==> #text : \"%s\" at offset %d\n", show.latin1(), pos); fprintf(stderr, " "); for (int i = 0; i < caret; i++) fprintf(stderr, " "); fprintf(stderr, "^\n"); } else { if ((int)text.length() > max) text = text.left(max - 3) + "..."; else text = text.left(max); fprintf(stderr, " #text : \"%s\"\n", text.latin1()); } } }
void CachedXBLDocument::setCharset( const DeprecatedString &chs ) { if (!chs.isEmpty()) m_decoder->setEncoding(chs.latin1(), Decoder::EncodingFromHTTPHeader); }