1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ENTERPRISE_WATERMARK_WATERMARK_VIEW_H_
#define CHROME_BROWSER_ENTERPRISE_WATERMARK_WATERMARK_VIEW_H_
#include "components/enterprise/watermarking/watermark.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/view.h"
namespace gfx {
class Canvas;
class RenderText;
}
namespace enterprise_watermark {
// WatermarkView represents a view that can superimpose a watermark on top of
// other views. The view should be appropriately sized using its parent's layout
// manager.
class WatermarkView : public views::View {
METADATA_HEADER(WatermarkView, views::View)
public:
WatermarkView();
~WatermarkView() override;
// Set this to a translucent value for testing. Useful for visualizing the
// view's bounds when performing transformations.
void SetBackgroundColor(SkColor color);
// Convenience function to draw a simple, text-based watermark. `text` must be
// UTF-8 encoded.
void SetString(const std::string& text,
SkColor fill_color,
SkColor outline_color);
// Alternative to SetString. Allows watermark to be set to any drawing
// represented by a cc::PaintRecord instance.
void SetWatermarkPaintRecord(cc::PaintRecord record);
// views::View
void OnPaint(gfx::Canvas* canvas) override;
bool has_text_for_testing() const { return !watermark_block_.record.empty(); }
private:
// Background color of the whole `WatermarkView`. This is normally
// transparent, but can be an arbitrary color for testing with the
// "watermark_app" target.
SkColor background_color_;
// Height required to draw all the lines in `text_fill_`/`text_outline_` in a
// single block.
int block_height_ = 0;
// Pre-recorded Skia draw commands that draw a single watermark text block.
// Since the block is repeated across the web page, this is more efficient
// than repeated calls to `RenderText::Draw()`, which need to do additional
// work such as loading font configs, shaping text, calculating line height,
// etc. This only needs to be updated when the watermark text changes.
WatermarkBlock watermark_block_;
};
} // namespace enterprise_watermark
#endif // CHROME_BROWSER_ENTERPRISE_WATERMARK_WATERMARK_VIEW_H_
|