#ifndef TextIndicator_h
#define TextIndicator_h
#include "FloatRect.h"
#include "Image.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
namespace WebCore {
class Frame;
class GraphicsContext;
class Range;
enum class TextIndicatorPresentationTransition {
None,
Bounce,
BounceAndCrossfade,
FadeIn,
};
enum TextIndicatorOption : uint8_t {
TextIndicatorOptionDefault = 0,
TextIndicatorOptionRespectTextColor = 1 << 0,
TextIndicatorOptionPaintBackgrounds = 1 << 1,
TextIndicatorOptionPaintAllContent = 1 << 2,
TextIndicatorOptionIncludeSnapshotWithSelectionHighlight = 1 << 3,
TextIndicatorOptionTightlyFitContent = 1 << 4,
TextIndicatorOptionUseBoundingRectAndPaintAllContentForComplexRanges = 1 << 5,
TextIndicatorOptionIncludeMarginIfRangeMatchesSelection = 1 << 6,
TextIndicatorOptionDoNotClipToVisibleRect = 1 << 7,
};
typedef uint8_t TextIndicatorOptions;
struct TextIndicatorData {
FloatRect selectionRectInRootViewCoordinates;
FloatRect textBoundingRectInRootViewCoordinates;
Vector<FloatRect> textRectsInBoundingRectCoordinates;
float contentImageScaleFactor;
RefPtr<Image> contentImageWithHighlight;
RefPtr<Image> contentImage;
TextIndicatorPresentationTransition presentationTransition;
TextIndicatorOptions options;
};
class TextIndicator : public RefCounted<TextIndicator> {
public:
constexpr static float defaultHorizontalMargin { 2 };
constexpr static float defaultVerticalMargin { 1 };
WEBCORE_EXPORT static Ref<TextIndicator> create(const TextIndicatorData&);
WEBCORE_EXPORT static RefPtr<TextIndicator> createWithSelectionInFrame(Frame&, TextIndicatorOptions, TextIndicatorPresentationTransition, FloatSize margin = FloatSize(defaultHorizontalMargin, defaultVerticalMargin));
WEBCORE_EXPORT static RefPtr<TextIndicator> createWithRange(const Range&, TextIndicatorOptions, TextIndicatorPresentationTransition, FloatSize margin = FloatSize(defaultHorizontalMargin, defaultVerticalMargin));
WEBCORE_EXPORT ~TextIndicator();
FloatRect selectionRectInRootViewCoordinates() const { return m_data.selectionRectInRootViewCoordinates; }
FloatRect textBoundingRectInRootViewCoordinates() const { return m_data.textBoundingRectInRootViewCoordinates; }
const Vector<FloatRect>& textRectsInBoundingRectCoordinates() const { return m_data.textRectsInBoundingRectCoordinates; }
float contentImageScaleFactor() const { return m_data.contentImageScaleFactor; }
Image* contentImageWithHighlight() const { return m_data.contentImageWithHighlight.get(); }
Image* contentImage() const { return m_data.contentImage.get(); }
TextIndicatorPresentationTransition presentationTransition() const { return m_data.presentationTransition; }
void setPresentationTransition(TextIndicatorPresentationTransition transition) { m_data.presentationTransition = transition; }
TextIndicatorData data() const { return m_data; }
private:
TextIndicator(const TextIndicatorData&);
TextIndicatorData m_data;
};
}
#endif // TextIndicator_h