summaryrefslogtreecommitdiffstats
path: root/dom/svg/SVGTextContentElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/svg/SVGTextContentElement.cpp')
-rw-r--r--dom/svg/SVGTextContentElement.cpp161
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