blob: c6f4910dd12de89ea057bcff1b7303fa29de59e6 [file] [log] [blame] [edit]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_QT_QT_INTERFACE_H_
#define UI_QT_QT_INTERFACE_H_
// This file shouldn't include any standard C++ headers (directly or indirectly)
#if defined(__has_attribute) && __has_attribute(no_sanitize)
#define DISABLE_CFI_VCALL __attribute__((no_sanitize("cfi-vcall")))
#else
#define DISABLE_CFI_VCALL
#endif
#include <stdint.h>
#include <stdlib.h>
using SkColor = uint32_t;
namespace qt {
// std::string cannot be passed over the library boundary, so this class acts
// as an interface between QT and Chrome.
class String {
public:
String();
explicit String(const char* str);
String(String&& other);
String& operator=(String&& other);
~String();
// May be nullptr.
const char* c_str() const { return str_; }
private:
char* str_ = nullptr;
};
// A generic bag of bytes.
class Buffer {
public:
Buffer();
// Creates a copy of `data`.
Buffer(const uint8_t* data, size_t size);
Buffer(Buffer&& other);
Buffer& operator=(Buffer&& other);
~Buffer();
// Take ownership of the data in this buffer (resetting `this`).
uint8_t* Take();
uint8_t* data() { return data_; }
size_t size() const { return size_; }
private:
uint8_t* data_ = nullptr;
size_t size_ = 0;
};
enum class FontHinting {
kDefault,
kNone,
kLight,
kFull,
};
enum class ColorType {
kWindowBg,
kWindowFg,
kHighlightBg,
kHighlightFg,
kEntryBg,
kEntryFg,
kButtonBg,
kButtonFg,
kLight,
kMidlight,
kDark,
kMidground,
kShadow,
};
enum class ColorState {
kNormal,
kDisabled,
kInactive,
};
struct FontRenderParams {
bool antialiasing;
bool use_bitmaps;
FontHinting hinting;
};
struct FontDescription {
String family;
int size_pixels;
int size_points;
bool is_italic;
int weight;
};
struct Image {
int width = 0;
int height = 0;
float scale = 1.0f;
// The data is stored as ARGB32 (premultiplied).
Buffer data_argb;
};
struct MonitorScale {
int x_px;
int y_px;
int width_px;
int height_px;
float scale;
};
class QtInterface {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void FontChanged() = 0;
virtual void ThemeChanged() = 0;
virtual void ScaleFactorMaybeChanged() = 0;
};
QtInterface() = default;
QtInterface(const QtInterface&) = delete;
QtInterface& operator=(const QtInterface&) = delete;
virtual ~QtInterface() = default;
// Returns the size of `monitors`. `monitors` will be valid while this class
// is alive until the next call to `GetMonitorConfig()`.
virtual size_t GetMonitorConfig(MonitorScale** monitors,
float* primary_scale) = 0;
virtual FontRenderParams GetFontRenderParams() const = 0;
virtual FontDescription GetFontDescription() const = 0;
virtual Image GetIconForContentType(const String& content_type,
int size) const = 0;
virtual SkColor GetColor(ColorType role, ColorState state) const = 0;
virtual SkColor GetFrameColor(ColorState state,
bool use_custom_frame) const = 0;
virtual Image DrawHeader(int width,
int height,
SkColor default_color,
ColorState state,
bool use_custom_frame) const = 0;
virtual int GetCursorBlinkIntervalMs() const = 0;
virtual int GetAnimationDurationMs() const = 0;
};
} // namespace qt
// This should be the only thing exported from qt_shim.
extern "C" __attribute__((visibility("default"))) qt::QtInterface*
CreateQtInterface(qt::QtInterface::Delegate* delegate, int* argc, char** argv);
#endif // UI_QT_QT_INTERFACE_H_