skia2/modules/skparagraph/include/Paragraph.h
Julia Lavrova 149f22d447 ICU optimization
Mainly rearranging the code to perform all ICU iterations once
and cache the results for the next text layouts.

Change-Id: I514d04229d04778c1f2238064acccddf6b548c00
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/294400
Commit-Queue: Ben Wagner <bungeman@google.com>
Commit-Queue: Julia Lavrova <jlavrova@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
2020-06-04 23:46:24 +00:00

94 lines
3.1 KiB
C++

// Copyright 2019 Google LLC.
#ifndef Paragraph_DEFINED
#define Paragraph_DEFINED
#include "modules/skparagraph/include/FontCollection.h"
#include "modules/skparagraph/include/Metrics.h"
#include "modules/skparagraph/include/ParagraphStyle.h"
#include "modules/skparagraph/include/TextStyle.h"
class SkCanvas;
namespace skia {
namespace textlayout {
class Paragraph {
public:
Paragraph(ParagraphStyle style, sk_sp<FontCollection> fonts);
virtual ~Paragraph() = default;
SkScalar getMaxWidth() { return fWidth; }
SkScalar getHeight() { return fHeight; }
SkScalar getMinIntrinsicWidth() { return fMinIntrinsicWidth; }
SkScalar getMaxIntrinsicWidth() { return fMaxIntrinsicWidth; }
SkScalar getAlphabeticBaseline() { return fAlphabeticBaseline; }
SkScalar getIdeographicBaseline() { return fIdeographicBaseline; }
SkScalar getLongestLine() { return fLongestLine; }
bool didExceedMaxLines() { return fExceededMaxLines; }
virtual void layout(SkScalar width) = 0;
virtual void paint(SkCanvas* canvas, SkScalar x, SkScalar y) = 0;
// Returns a vector of bounding boxes that enclose all text between
// start and end glyph indexes, including start and excluding end
virtual std::vector<TextBox> getRectsForRange(unsigned start,
unsigned end,
RectHeightStyle rectHeightStyle,
RectWidthStyle rectWidthStyle) = 0;
virtual std::vector<TextBox> getRectsForPlaceholders() = 0;
// Returns the index of the glyph that corresponds to the provided coordinate,
// with the top left corner as the origin, and +y direction as down
virtual PositionWithAffinity getGlyphPositionAtCoordinate(SkScalar dx, SkScalar dy) = 0;
// Finds the first and last glyphs that define a word containing
// the glyph at index offset
virtual SkRange<size_t> getWordBoundary(unsigned offset) = 0;
virtual void getLineMetrics(std::vector<LineMetrics>&) = 0;
virtual size_t lineNumber() = 0;
virtual void markDirty() = 0;
// This function will return the number of unresolved glyphs or
// -1 if not applicable (has not been shaped yet - valid case)
virtual int32_t unresolvedGlyphs() = 0;
// Experimental API that allows fast way to update "immutable" paragraph
virtual void updateTextAlign(TextAlign textAlign) = 0;
virtual void updateText(size_t from, SkString text) = 0;
virtual void updateFontSize(size_t from, size_t to, SkScalar fontSize) = 0;
virtual void updateForegroundPaint(size_t from, size_t to, SkPaint paint) = 0;
virtual void updateBackgroundPaint(size_t from, size_t to, SkPaint paint) = 0;
protected:
sk_sp<FontCollection> fFontCollection;
ParagraphStyle fParagraphStyle;
// Things for Flutter
SkScalar fAlphabeticBaseline;
SkScalar fIdeographicBaseline;
SkScalar fHeight;
SkScalar fWidth;
SkScalar fMaxIntrinsicWidth;
SkScalar fMinIntrinsicWidth;
SkScalar fLongestLine;
bool fExceededMaxLines;
};
} // namespace textlayout
} // namespace skia
#endif // Paragraph_DEFINED