blob: c100fddc463f2a3d358c602e3490188ceda0de02 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_X_X11_SOFTWARE_BITMAP_PRESENTER_H_
#define UI_BASE_X_X11_SOFTWARE_BITMAP_PRESENTER_H_
#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequenced_task_runner.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_types.h"
class SkCanvas;
namespace ui {
class XShmImagePool;
class COMPONENT_EXPORT(UI_BASE_X) X11SoftwareBitmapPresenter {
public:
// Corresponds to SwapBuffersCallback alias in SoftwareOutputDevice.
using SwapBuffersCallback = base::OnceCallback<void(const gfx::Size&)>;
X11SoftwareBitmapPresenter(
gfx::AcceleratedWidget widget,
scoped_refptr<base::SequencedTaskRunner> host_task_runner,
scoped_refptr<base::SequencedTaskRunner> event_task_runner);
~X11SoftwareBitmapPresenter();
void Resize(const gfx::Size& pixel_size);
SkCanvas* GetSkCanvas();
void EndPaint(const gfx::Rect& damage_rect);
void OnSwapBuffers(SwapBuffersCallback swap_ack_callback);
int MaxFramesPending() const;
private:
// Draw |data| over |widget|'s parent-relative background, and write the
// resulting image to |widget|. Returns true on success.
static bool CompositeBitmap(XDisplay* display,
XID widget,
int x,
int y,
int width,
int height,
int depth,
GC gc,
const void* data);
bool ShmPoolReady() const;
void FlushAfterPutImage();
gfx::AcceleratedWidget widget_;
XDisplay* display_;
GC gc_;
XWindowAttributes attributes_;
// If nonzero, indicates that the widget should be drawn over its
// parent-relative background.
int composite_ = 0;
scoped_refptr<ui::XShmImagePool> shm_pool_;
bool needs_swap_ = false;
scoped_refptr<base::SequencedTaskRunner> host_task_runner_;
scoped_refptr<base::SequencedTaskRunner> event_task_runner_;
sk_sp<SkSurface> surface_;
gfx::Size viewport_pixel_size_;
DISALLOW_COPY_AND_ASSIGN(X11SoftwareBitmapPresenter);
};
} // namespace ui
#endif // UI_BASE_X_X11_SOFTWARE_BITMAP_PRESENTER_H_