move SkTextBox into utils
authorreed <reed@google.com>
Mon, 3 Nov 2014 22:55:40 +0000 (14:55 -0800)
committerCommit bot <commit-bot@chromium.org>
Mon, 3 Nov 2014 22:55:40 +0000 (14:55 -0800)
BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/696293005

gyp/utils.gypi
gyp/views.gyp
include/utils/SkTextBox.h [new file with mode: 0644]
include/views/SkTextBox.h [deleted file]
src/utils/SkTextBox.cpp [new file with mode: 0644]
src/views/SkTextBox.cpp [deleted file]

index 7d40a8bf301c731e2c728b1026dc4572d3f1ef66..5148491054546ac8f07589a961ec2794df5c383d 100644 (file)
@@ -37,6 +37,7 @@
         '<(skia_include_path)/utils/SkRandom.h',
         '<(skia_include_path)/utils/SkRTConf.h',
         '<(skia_include_path)/utils/SkProxyCanvas.h',
+        '<(skia_include_path)/utils/SkTextBox.h',
         '<(skia_include_path)/utils/SkWGL.h',
 
         '<(skia_src_path)/utils/SkBase64.cpp',
@@ -86,6 +87,7 @@
         '<(skia_src_path)/utils/SkSHA1.cpp',
         '<(skia_src_path)/utils/SkSHA1.h',
         '<(skia_src_path)/utils/SkRTConf.cpp',
+        '<(skia_src_path)/utils/SkTextBox.cpp',
         '<(skia_src_path)/utils/SkTextureCompressor.cpp',
         '<(skia_src_path)/utils/SkTextureCompressor.h',
         '<(skia_src_path)/utils/SkTextureCompressor_Utils.h',
index 6db85df2bd6d17ab233a4e51340bfd998dfa45ff..f61c11a16e0510bca668abc945e3056f01756aa2 100644 (file)
@@ -33,7 +33,6 @@
         '../include/views/SkOSWindow_Win.h',
         '../include/views/SkStackViewLayout.h',
         '../include/views/SkSystemEventTypes.h',
-        '../include/views/SkTextBox.h',
         '../include/views/SkTouchGesture.h',
         '../include/views/SkView.h',
         '../include/views/SkViewInflate.h',
@@ -49,7 +48,6 @@
         '../src/views/SkStackViewLayout.cpp',
         '../src/views/SkTagList.cpp',
         '../src/views/SkTagList.h',
-        '../src/views/SkTextBox.cpp',
         '../src/views/SkTouchGesture.cpp',
         '../src/views/SkView.cpp',
         '../src/views/SkViewInflate.cpp',
diff --git a/include/utils/SkTextBox.h b/include/utils/SkTextBox.h
new file mode 100644 (file)
index 0000000..e217076
--- /dev/null
@@ -0,0 +1,77 @@
+
+/*
+ * Copyright 2006 The Android Open Source Project
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#ifndef SkTextBox_DEFINED
+#define SkTextBox_DEFINED
+
+#include "SkCanvas.h"
+
+/** \class SkTextBox
+
+    SkTextBox is a helper class for drawing 1 or more lines of text
+    within a rectangle. The textbox is positioned and clipped by its Frame.
+    The Margin rectangle controls where the text is drawn relative to
+    the Frame. Line-breaks occur inside the Margin rectangle.
+
+    Spacing is a linear equation used to compute the distance between lines
+    of text. Spacing consists of two scalars: mul and add, and the spacing
+    between lines is computed as: spacing = paint.getTextSize() * mul + add
+*/
+class SkTextBox {
+public:
+    SkTextBox();
+
+    enum Mode {
+        kOneLine_Mode,
+        kLineBreak_Mode,
+
+        kModeCount
+    };
+    Mode    getMode() const { return (Mode)fMode; }
+    void    setMode(Mode);
+
+    enum SpacingAlign {
+        kStart_SpacingAlign,
+        kCenter_SpacingAlign,
+        kEnd_SpacingAlign,
+
+        kSpacingAlignCount
+    };
+    SpacingAlign    getSpacingAlign() const { return (SpacingAlign)fSpacingAlign; }
+    void            setSpacingAlign(SpacingAlign);
+
+    void    getBox(SkRect*) const;
+    void    setBox(const SkRect&);
+    void    setBox(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom);
+
+    void    getSpacing(SkScalar* mul, SkScalar* add) const;
+    void    setSpacing(SkScalar mul, SkScalar add);
+
+    void    draw(SkCanvas*, const char text[], size_t len, const SkPaint&);
+
+    void    setText(const char text[], size_t len, const SkPaint&);
+    void    draw(SkCanvas*);
+    int     countLines() const;
+    SkScalar getTextHeight() const;
+
+private:
+    SkRect      fBox;
+    SkScalar    fSpacingMul, fSpacingAdd;
+    uint8_t     fMode, fSpacingAlign;
+    const char* fText;
+    size_t      fLen;
+    const SkPaint* fPaint;
+};
+
+class SkTextLineBreaker {
+public:
+    static int CountLines(const char text[], size_t len, const SkPaint&, SkScalar width);
+};
+
+#endif
diff --git a/include/views/SkTextBox.h b/include/views/SkTextBox.h
deleted file mode 100644 (file)
index e217076..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-
-/*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-
-#ifndef SkTextBox_DEFINED
-#define SkTextBox_DEFINED
-
-#include "SkCanvas.h"
-
-/** \class SkTextBox
-
-    SkTextBox is a helper class for drawing 1 or more lines of text
-    within a rectangle. The textbox is positioned and clipped by its Frame.
-    The Margin rectangle controls where the text is drawn relative to
-    the Frame. Line-breaks occur inside the Margin rectangle.
-
-    Spacing is a linear equation used to compute the distance between lines
-    of text. Spacing consists of two scalars: mul and add, and the spacing
-    between lines is computed as: spacing = paint.getTextSize() * mul + add
-*/
-class SkTextBox {
-public:
-    SkTextBox();
-
-    enum Mode {
-        kOneLine_Mode,
-        kLineBreak_Mode,
-
-        kModeCount
-    };
-    Mode    getMode() const { return (Mode)fMode; }
-    void    setMode(Mode);
-
-    enum SpacingAlign {
-        kStart_SpacingAlign,
-        kCenter_SpacingAlign,
-        kEnd_SpacingAlign,
-
-        kSpacingAlignCount
-    };
-    SpacingAlign    getSpacingAlign() const { return (SpacingAlign)fSpacingAlign; }
-    void            setSpacingAlign(SpacingAlign);
-
-    void    getBox(SkRect*) const;
-    void    setBox(const SkRect&);
-    void    setBox(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom);
-
-    void    getSpacing(SkScalar* mul, SkScalar* add) const;
-    void    setSpacing(SkScalar mul, SkScalar add);
-
-    void    draw(SkCanvas*, const char text[], size_t len, const SkPaint&);
-
-    void    setText(const char text[], size_t len, const SkPaint&);
-    void    draw(SkCanvas*);
-    int     countLines() const;
-    SkScalar getTextHeight() const;
-
-private:
-    SkRect      fBox;
-    SkScalar    fSpacingMul, fSpacingAdd;
-    uint8_t     fMode, fSpacingAlign;
-    const char* fText;
-    size_t      fLen;
-    const SkPaint* fPaint;
-};
-
-class SkTextLineBreaker {
-public:
-    static int CountLines(const char text[], size_t len, const SkPaint&, SkScalar width);
-};
-
-#endif
diff --git a/src/utils/SkTextBox.cpp b/src/utils/SkTextBox.cpp
new file mode 100644 (file)
index 0000000..55d75a6
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2006 The Android Open Source Project
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkTextBox.h"
+#include "SkUtils.h"
+
+static inline int is_ws(int c)
+{
+    return !((c - 1) >> 5);
+}
+
+static size_t linebreak(const char text[], const char stop[],
+                        const SkPaint& paint, SkScalar margin,
+                        size_t* trailing = NULL)
+{
+    size_t lengthBreak = paint.breakText(text, stop - text, margin);
+
+    //Check for white space or line breakers before the lengthBreak
+    const char* start = text;
+    const char* word_start = text;
+    int prevWS = true;
+    if (trailing) {
+        *trailing = 0;
+    }
+
+    while (text < stop) {
+        const char* prevText = text;
+        SkUnichar uni = SkUTF8_NextUnichar(&text);
+        int currWS = is_ws(uni);
+
+        if (!currWS && prevWS) {
+            word_start = prevText;
+        }
+        prevWS = currWS;
+
+        if (text > start + lengthBreak) {
+            if (currWS) {
+                // eat the rest of the whitespace
+                while (text < stop && is_ws(SkUTF8_ToUnichar(text))) {
+                    text += SkUTF8_CountUTF8Bytes(text);
+                }
+                if (trailing) {
+                    *trailing = text - prevText;
+                }
+            } else {
+                // backup until a whitespace (or 1 char)
+                if (word_start == start) {
+                    if (prevText > start) {
+                        text = prevText;
+                    }
+                } else {
+                    text = word_start;
+                }
+            }
+            break;
+        }
+
+        if ('\n' == uni) {
+            size_t ret = text - start;
+            size_t lineBreakSize = 1;
+            if (text < stop) {
+                uni = SkUTF8_NextUnichar(&text);
+                if ('\r' == uni) {
+                    ret = text - start;
+                    ++lineBreakSize;
+                }
+            }
+            if (trailing) {
+                *trailing = lineBreakSize;
+            }
+            return ret;
+        }
+
+        if ('\r' == uni) {
+            size_t ret = text - start;
+            size_t lineBreakSize = 1;
+            if (text < stop) {
+                uni = SkUTF8_NextUnichar(&text);
+                if ('\n' == uni) {
+                    ret = text - start;
+                    ++lineBreakSize;
+                }
+            }
+            if (trailing) {
+                *trailing = lineBreakSize;
+            }
+            return ret;
+        }
+    }
+
+    return text - start;
+}
+
+int SkTextLineBreaker::CountLines(const char text[], size_t len, const SkPaint& paint, SkScalar width)
+{
+    const char* stop = text + len;
+    int         count = 0;
+
+    if (width > 0)
+    {
+        do {
+            count += 1;
+            text += linebreak(text, stop, paint, width);
+        } while (text < stop);
+    }
+    return count;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+SkTextBox::SkTextBox()
+{
+    fBox.setEmpty();
+    fSpacingMul = SK_Scalar1;
+    fSpacingAdd = 0;
+    fMode = kLineBreak_Mode;
+    fSpacingAlign = kStart_SpacingAlign;
+}
+
+void SkTextBox::setMode(Mode mode)
+{
+    SkASSERT((unsigned)mode < kModeCount);
+    fMode = SkToU8(mode);
+}
+
+void SkTextBox::setSpacingAlign(SpacingAlign align)
+{
+    SkASSERT((unsigned)align < kSpacingAlignCount);
+    fSpacingAlign = SkToU8(align);
+}
+
+void SkTextBox::getBox(SkRect* box) const
+{
+    if (box)
+        *box = fBox;
+}
+
+void SkTextBox::setBox(const SkRect& box)
+{
+    fBox = box;
+}
+
+void SkTextBox::setBox(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom)
+{
+    fBox.set(left, top, right, bottom);
+}
+
+void SkTextBox::getSpacing(SkScalar* mul, SkScalar* add) const
+{
+    if (mul)
+        *mul = fSpacingMul;
+    if (add)
+        *add = fSpacingAdd;
+}
+
+void SkTextBox::setSpacing(SkScalar mul, SkScalar add)
+{
+    fSpacingMul = mul;
+    fSpacingAdd = add;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+void SkTextBox::draw(SkCanvas* canvas, const char text[], size_t len, const SkPaint& paint)
+{
+    SkASSERT(canvas && (text || len == 0));
+
+    SkScalar marginWidth = fBox.width();
+
+    if (marginWidth <= 0 || len == 0)
+        return;
+
+    const char* textStop = text + len;
+
+    SkScalar                x, y, scaledSpacing, height, fontHeight;
+    SkPaint::FontMetrics    metrics;
+
+    switch (paint.getTextAlign()) {
+    case SkPaint::kLeft_Align:
+        x = 0;
+        break;
+    case SkPaint::kCenter_Align:
+        x = SkScalarHalf(marginWidth);
+        break;
+    default:
+        x = marginWidth;
+        break;
+    }
+    x += fBox.fLeft;
+
+    fontHeight = paint.getFontMetrics(&metrics);
+    scaledSpacing = SkScalarMul(fontHeight, fSpacingMul) + fSpacingAdd;
+    height = fBox.height();
+
+    //  compute Y position for first line
+    {
+        SkScalar textHeight = fontHeight;
+
+        if (fMode == kLineBreak_Mode && fSpacingAlign != kStart_SpacingAlign)
+        {
+            int count = SkTextLineBreaker::CountLines(text, textStop - text, paint, marginWidth);
+            SkASSERT(count > 0);
+            textHeight += scaledSpacing * (count - 1);
+        }
+
+        switch (fSpacingAlign) {
+        case kStart_SpacingAlign:
+            y = 0;
+            break;
+        case kCenter_SpacingAlign:
+            y = SkScalarHalf(height - textHeight);
+            break;
+        default:
+            SkASSERT(fSpacingAlign == kEnd_SpacingAlign);
+            y = height - textHeight;
+            break;
+        }
+        y += fBox.fTop - metrics.fAscent;
+    }
+
+    for (;;)
+    {
+        size_t trailing;
+        len = linebreak(text, textStop, paint, marginWidth, &trailing);
+        if (y + metrics.fDescent + metrics.fLeading > 0)
+            canvas->drawText(text, len - trailing, x, y, paint);
+        text += len;
+        if (text >= textStop)
+            break;
+        y += scaledSpacing;
+        if (y + metrics.fAscent >= fBox.fBottom)
+            break;
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void SkTextBox::setText(const char text[], size_t len, const SkPaint& paint) {
+    fText = text;
+    fLen = len;
+    fPaint = &paint;
+}
+
+void SkTextBox::draw(SkCanvas* canvas) {
+    this->draw(canvas, fText, fLen, *fPaint);
+}
+
+int SkTextBox::countLines() const {
+    return SkTextLineBreaker::CountLines(fText, fLen, *fPaint, fBox.width());
+}
+
+SkScalar SkTextBox::getTextHeight() const {
+    SkScalar spacing = SkScalarMul(fPaint->getTextSize(), fSpacingMul) + fSpacingAdd;
+    return this->countLines() * spacing;
+}
diff --git a/src/views/SkTextBox.cpp b/src/views/SkTextBox.cpp
deleted file mode 100644 (file)
index 55d75a6..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkTextBox.h"
-#include "SkUtils.h"
-
-static inline int is_ws(int c)
-{
-    return !((c - 1) >> 5);
-}
-
-static size_t linebreak(const char text[], const char stop[],
-                        const SkPaint& paint, SkScalar margin,
-                        size_t* trailing = NULL)
-{
-    size_t lengthBreak = paint.breakText(text, stop - text, margin);
-
-    //Check for white space or line breakers before the lengthBreak
-    const char* start = text;
-    const char* word_start = text;
-    int prevWS = true;
-    if (trailing) {
-        *trailing = 0;
-    }
-
-    while (text < stop) {
-        const char* prevText = text;
-        SkUnichar uni = SkUTF8_NextUnichar(&text);
-        int currWS = is_ws(uni);
-
-        if (!currWS && prevWS) {
-            word_start = prevText;
-        }
-        prevWS = currWS;
-
-        if (text > start + lengthBreak) {
-            if (currWS) {
-                // eat the rest of the whitespace
-                while (text < stop && is_ws(SkUTF8_ToUnichar(text))) {
-                    text += SkUTF8_CountUTF8Bytes(text);
-                }
-                if (trailing) {
-                    *trailing = text - prevText;
-                }
-            } else {
-                // backup until a whitespace (or 1 char)
-                if (word_start == start) {
-                    if (prevText > start) {
-                        text = prevText;
-                    }
-                } else {
-                    text = word_start;
-                }
-            }
-            break;
-        }
-
-        if ('\n' == uni) {
-            size_t ret = text - start;
-            size_t lineBreakSize = 1;
-            if (text < stop) {
-                uni = SkUTF8_NextUnichar(&text);
-                if ('\r' == uni) {
-                    ret = text - start;
-                    ++lineBreakSize;
-                }
-            }
-            if (trailing) {
-                *trailing = lineBreakSize;
-            }
-            return ret;
-        }
-
-        if ('\r' == uni) {
-            size_t ret = text - start;
-            size_t lineBreakSize = 1;
-            if (text < stop) {
-                uni = SkUTF8_NextUnichar(&text);
-                if ('\n' == uni) {
-                    ret = text - start;
-                    ++lineBreakSize;
-                }
-            }
-            if (trailing) {
-                *trailing = lineBreakSize;
-            }
-            return ret;
-        }
-    }
-
-    return text - start;
-}
-
-int SkTextLineBreaker::CountLines(const char text[], size_t len, const SkPaint& paint, SkScalar width)
-{
-    const char* stop = text + len;
-    int         count = 0;
-
-    if (width > 0)
-    {
-        do {
-            count += 1;
-            text += linebreak(text, stop, paint, width);
-        } while (text < stop);
-    }
-    return count;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-
-SkTextBox::SkTextBox()
-{
-    fBox.setEmpty();
-    fSpacingMul = SK_Scalar1;
-    fSpacingAdd = 0;
-    fMode = kLineBreak_Mode;
-    fSpacingAlign = kStart_SpacingAlign;
-}
-
-void SkTextBox::setMode(Mode mode)
-{
-    SkASSERT((unsigned)mode < kModeCount);
-    fMode = SkToU8(mode);
-}
-
-void SkTextBox::setSpacingAlign(SpacingAlign align)
-{
-    SkASSERT((unsigned)align < kSpacingAlignCount);
-    fSpacingAlign = SkToU8(align);
-}
-
-void SkTextBox::getBox(SkRect* box) const
-{
-    if (box)
-        *box = fBox;
-}
-
-void SkTextBox::setBox(const SkRect& box)
-{
-    fBox = box;
-}
-
-void SkTextBox::setBox(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom)
-{
-    fBox.set(left, top, right, bottom);
-}
-
-void SkTextBox::getSpacing(SkScalar* mul, SkScalar* add) const
-{
-    if (mul)
-        *mul = fSpacingMul;
-    if (add)
-        *add = fSpacingAdd;
-}
-
-void SkTextBox::setSpacing(SkScalar mul, SkScalar add)
-{
-    fSpacingMul = mul;
-    fSpacingAdd = add;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-void SkTextBox::draw(SkCanvas* canvas, const char text[], size_t len, const SkPaint& paint)
-{
-    SkASSERT(canvas && (text || len == 0));
-
-    SkScalar marginWidth = fBox.width();
-
-    if (marginWidth <= 0 || len == 0)
-        return;
-
-    const char* textStop = text + len;
-
-    SkScalar                x, y, scaledSpacing, height, fontHeight;
-    SkPaint::FontMetrics    metrics;
-
-    switch (paint.getTextAlign()) {
-    case SkPaint::kLeft_Align:
-        x = 0;
-        break;
-    case SkPaint::kCenter_Align:
-        x = SkScalarHalf(marginWidth);
-        break;
-    default:
-        x = marginWidth;
-        break;
-    }
-    x += fBox.fLeft;
-
-    fontHeight = paint.getFontMetrics(&metrics);
-    scaledSpacing = SkScalarMul(fontHeight, fSpacingMul) + fSpacingAdd;
-    height = fBox.height();
-
-    //  compute Y position for first line
-    {
-        SkScalar textHeight = fontHeight;
-
-        if (fMode == kLineBreak_Mode && fSpacingAlign != kStart_SpacingAlign)
-        {
-            int count = SkTextLineBreaker::CountLines(text, textStop - text, paint, marginWidth);
-            SkASSERT(count > 0);
-            textHeight += scaledSpacing * (count - 1);
-        }
-
-        switch (fSpacingAlign) {
-        case kStart_SpacingAlign:
-            y = 0;
-            break;
-        case kCenter_SpacingAlign:
-            y = SkScalarHalf(height - textHeight);
-            break;
-        default:
-            SkASSERT(fSpacingAlign == kEnd_SpacingAlign);
-            y = height - textHeight;
-            break;
-        }
-        y += fBox.fTop - metrics.fAscent;
-    }
-
-    for (;;)
-    {
-        size_t trailing;
-        len = linebreak(text, textStop, paint, marginWidth, &trailing);
-        if (y + metrics.fDescent + metrics.fLeading > 0)
-            canvas->drawText(text, len - trailing, x, y, paint);
-        text += len;
-        if (text >= textStop)
-            break;
-        y += scaledSpacing;
-        if (y + metrics.fAscent >= fBox.fBottom)
-            break;
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-void SkTextBox::setText(const char text[], size_t len, const SkPaint& paint) {
-    fText = text;
-    fLen = len;
-    fPaint = &paint;
-}
-
-void SkTextBox::draw(SkCanvas* canvas) {
-    this->draw(canvas, fText, fLen, *fPaint);
-}
-
-int SkTextBox::countLines() const {
-    return SkTextLineBreaker::CountLines(fText, fLen, *fPaint, fBox.width());
-}
-
-SkScalar SkTextBox::getTextHeight() const {
-    SkScalar spacing = SkScalarMul(fPaint->getTextSize(), fSpacingMul) + fSpacingAdd;
-    return this->countLines() * spacing;
-}