11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkTextBox_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkTextBox_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkTextBox
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTextBox is a helper class for drawing 1 or more lines of text
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    within a rectangle. The textbox is positioned and clipped by its Frame.
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    The Margin rectangle controls where the text is drawn relative to
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    the Frame. Line-breaks occur inside the Margin rectangle.
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Spacing is a linear equation used to compute the distance between lines
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    of text. Spacing consists of two scalars: mul and add, and the spacing
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    between lines is computed as: spacing = paint.getTextSize() * mul + add
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkTextBox {
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTextBox();
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Mode {
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kOneLine_Mode,
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kLineBreak_Mode,
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kModeCount
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Mode    getMode() const { return (Mode)fMode; }
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    setMode(Mode);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum SpacingAlign {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kStart_SpacingAlign,
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kCenter_SpacingAlign,
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kEnd_SpacingAlign,
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kSpacingAlignCount
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SpacingAlign    getSpacingAlign() const { return (SpacingAlign)fSpacingAlign; }
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void            setSpacingAlign(SpacingAlign);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    getBox(SkRect*) const;
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    setBox(const SkRect&);
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    setBox(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom);
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    getSpacing(SkScalar* mul, SkScalar* add) const;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    setSpacing(SkScalar mul, SkScalar add);
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    draw(SkCanvas*, const char text[], size_t len, const SkPaint&);
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void    setText(const char text[], size_t len, const SkPaint&);
5940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    void    draw(SkCanvas*);
6040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    int     countLines() const;
6140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkScalar getTextHeight() const;
6240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkRect      fBox;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar    fSpacingMul, fSpacingAdd;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t     fMode, fSpacingAlign;
6740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    const char* fText;
6840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    size_t      fLen;
6940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    const SkPaint* fPaint;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkTextLineBreaker {
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int CountLines(const char text[], size_t len, const SkPaint&, SkScalar width);
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
79