Index: src/views/SkTextBox.cpp |
diff --git a/src/views/SkTextBox.cpp b/src/views/SkTextBox.cpp |
deleted file mode 100644 |
index 55d75a64dac74e1f3e3f5aa5005ef9ab69be31ec..0000000000000000000000000000000000000000 |
--- a/src/views/SkTextBox.cpp |
+++ /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; |
-} |