1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SkTextBox_DEFINED 11 #define SkTextBox_DEFINED 12 13 #include "SkCanvas.h" 14 15 /** \class SkTextBox 16 17 SkTextBox is a helper class for drawing 1 or more lines of text 18 within a rectangle. The textbox is positioned and clipped by its Frame. 19 The Margin rectangle controls where the text is drawn relative to 20 the Frame. Line-breaks occur inside the Margin rectangle. 21 22 Spacing is a linear equation used to compute the distance between lines 23 of text. Spacing consists of two scalars: mul and add, and the spacing 24 between lines is computed as: spacing = paint.getTextSize() * mul + add 25 */ 26 class SkTextBox { 27 public: 28 SkTextBox(); 29 30 enum Mode { 31 kOneLine_Mode, 32 kLineBreak_Mode, 33 34 kModeCount 35 }; 36 Mode getMode() const { return (Mode)fMode; } 37 void setMode(Mode); 38 39 enum SpacingAlign { 40 kStart_SpacingAlign, 41 kCenter_SpacingAlign, 42 kEnd_SpacingAlign, 43 44 kSpacingAlignCount 45 }; 46 SpacingAlign getSpacingAlign() const { return (SpacingAlign)fSpacingAlign; } 47 void setSpacingAlign(SpacingAlign); 48 49 void getBox(SkRect*) const; 50 void setBox(const SkRect&); 51 void setBox(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom); 52 53 void getSpacing(SkScalar* mul, SkScalar* add) const; 54 void setSpacing(SkScalar mul, SkScalar add); 55 56 void draw(SkCanvas*, const char text[], size_t len, const SkPaint&); 57 58 void setText(const char text[], size_t len, const SkPaint&); 59 void draw(SkCanvas*); 60 int countLines() const; 61 SkScalar getTextHeight() const; 62 63 sk_sp<SkTextBlob> snapshotTextBlob(SkScalar* computedBottom) const; 64 65 class Visitor { 66 public: 67 virtual ~Visitor() {} 68 virtual void operator()(const char*, size_t, SkScalar x, SkScalar y, const SkPaint&) = 0; 69 }; 70 71 private: 72 SkRect fBox; 73 SkScalar fSpacingMul, fSpacingAdd; 74 uint8_t fMode, fSpacingAlign; 75 const char* fText; 76 size_t fLen; 77 const SkPaint* fPaint; 78 79 SkScalar visit(Visitor&, const char text[], size_t len, const SkPaint&) const; 80 }; 81 82 class SkTextLineBreaker { 83 public: 84 static int CountLines(const char text[], size_t len, const SkPaint&, SkScalar width); 85 }; 86 87 #endif 88