diff options
Diffstat (limited to 'dom/svg/SVGTextContentElement.cpp')
-rw-r--r-- | dom/svg/SVGTextContentElement.cpp | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/dom/svg/SVGTextContentElement.cpp b/dom/svg/SVGTextContentElement.cpp new file mode 100644 index 000000000..a3e813e7e --- /dev/null +++ b/dom/svg/SVGTextContentElement.cpp @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/dom/SVGTextContentElement.h" +#include "nsISVGPoint.h" +#include "SVGTextFrame.h" +#include "mozilla/dom/SVGIRect.h" + +namespace mozilla { +namespace dom { + +nsSVGEnumMapping SVGTextContentElement::sLengthAdjustMap[] = { + { &nsGkAtoms::spacing, SVG_LENGTHADJUST_SPACING }, + { &nsGkAtoms::spacingAndGlyphs, SVG_LENGTHADJUST_SPACINGANDGLYPHS }, + { nullptr, 0 } +}; + +nsSVGElement::EnumInfo SVGTextContentElement::sEnumInfo[1] = +{ + { &nsGkAtoms::lengthAdjust, sLengthAdjustMap, SVG_LENGTHADJUST_SPACING } +}; + +nsSVGElement::LengthInfo SVGTextContentElement::sLengthInfo[1] = +{ + { &nsGkAtoms::textLength, 0, nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER, SVGContentUtils::XY } +}; + +SVGTextFrame* +SVGTextContentElement::GetSVGTextFrame() +{ + nsIFrame* frame = GetPrimaryFrame(Flush_Layout); + while (frame) { + SVGTextFrame* textFrame = do_QueryFrame(frame); + if (textFrame) { + return textFrame; + } + frame = frame->GetParent(); + } + return nullptr; +} + +already_AddRefed<SVGAnimatedLength> +SVGTextContentElement::TextLength() +{ + return LengthAttributes()[TEXTLENGTH].ToDOMAnimatedLength(this); +} + +already_AddRefed<SVGAnimatedEnumeration> +SVGTextContentElement::LengthAdjust() +{ + return EnumAttributes()[LENGTHADJUST].ToDOMAnimatedEnum(this); +} + +//---------------------------------------------------------------------- + +int32_t +SVGTextContentElement::GetNumberOfChars() +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + return textFrame ? textFrame->GetNumberOfChars(this) : 0; +} + +float +SVGTextContentElement::GetComputedTextLength() +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + return textFrame ? textFrame->GetComputedTextLength(this) : 0.0f; +} + +void +SVGTextContentElement::SelectSubString(uint32_t charnum, uint32_t nchars, ErrorResult& rv) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + if (!textFrame) + return; + + rv = textFrame->SelectSubString(this, charnum, nchars); +} + +float +SVGTextContentElement::GetSubStringLength(uint32_t charnum, uint32_t nchars, ErrorResult& rv) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + if (!textFrame) + return 0.0f; + + float length = 0.0f; + rv = textFrame->GetSubStringLength(this, charnum, nchars, &length); + return length; +} + +already_AddRefed<nsISVGPoint> +SVGTextContentElement::GetStartPositionOfChar(uint32_t charnum, ErrorResult& rv) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + if (!textFrame) { + rv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + + nsCOMPtr<nsISVGPoint> point; + rv = textFrame->GetStartPositionOfChar(this, charnum, getter_AddRefs(point)); + return point.forget(); +} + +already_AddRefed<nsISVGPoint> +SVGTextContentElement::GetEndPositionOfChar(uint32_t charnum, ErrorResult& rv) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + if (!textFrame) { + rv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + + nsCOMPtr<nsISVGPoint> point; + rv = textFrame->GetEndPositionOfChar(this, charnum, getter_AddRefs(point)); + return point.forget(); +} + +already_AddRefed<SVGIRect> +SVGTextContentElement::GetExtentOfChar(uint32_t charnum, ErrorResult& rv) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + + if (!textFrame) { + rv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + + RefPtr<SVGIRect> rect; + rv = textFrame->GetExtentOfChar(this, charnum, getter_AddRefs(rect)); + return rect.forget(); +} + +float +SVGTextContentElement::GetRotationOfChar(uint32_t charnum, ErrorResult& rv) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + + if (!textFrame) { + rv.Throw(NS_ERROR_FAILURE); + return 0.0f; + } + + float rotation; + rv = textFrame->GetRotationOfChar(this, charnum, &rotation); + return rotation; +} + +int32_t +SVGTextContentElement::GetCharNumAtPosition(nsISVGPoint& aPoint) +{ + SVGTextFrame* textFrame = GetSVGTextFrame(); + return textFrame ? textFrame->GetCharNumAtPosition(this, &aPoint) : -1; +} + +} // namespace dom +} // namespace mozilla |