summaryrefslogtreecommitdiffstats
path: root/dom/svg/SVGTextContentElement.cpp
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /dom/svg/SVGTextContentElement.cpp
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
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