2016-06-29 06:24:44 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#ifndef RectTextureImage_h_
|
|
|
|
#define RectTextureImage_h_
|
|
|
|
|
2018-11-14 20:03:36 +03:00
|
|
|
#include "GLTypes.h"
|
|
|
|
#include "mozilla/gfx/2D.h"
|
2016-06-29 06:24:44 +03:00
|
|
|
#include "mozilla/RefPtr.h"
|
2018-11-14 20:03:36 +03:00
|
|
|
#include "Units.h"
|
2016-06-29 06:24:44 +03:00
|
|
|
|
|
|
|
class MacIOSurface;
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
namespace gl {
|
|
|
|
class GLContext;
|
|
|
|
} // namespace gl
|
|
|
|
|
2018-11-14 20:03:36 +03:00
|
|
|
namespace layers {
|
|
|
|
class GLManager;
|
|
|
|
} // namespace layers
|
|
|
|
|
2016-06-29 06:24:44 +03:00
|
|
|
namespace widget {
|
|
|
|
|
|
|
|
// Manages a texture which can resize dynamically, binds to the
|
|
|
|
// LOCAL_GL_TEXTURE_RECTANGLE_ARB texture target and is automatically backed
|
|
|
|
// by a power-of-two size GL texture. The latter two features are used for
|
|
|
|
// compatibility with older Mac hardware which we block GL layers on.
|
|
|
|
// RectTextureImages are used both for accelerated GL layers drawing and for
|
|
|
|
// OMTC BasicLayers drawing.
|
|
|
|
class RectTextureImage {
|
|
|
|
public:
|
2016-06-29 06:24:44 +03:00
|
|
|
RectTextureImage();
|
2016-06-29 06:24:44 +03:00
|
|
|
|
|
|
|
virtual ~RectTextureImage();
|
|
|
|
|
|
|
|
already_AddRefed<gfx::DrawTarget> BeginUpdate(
|
|
|
|
const LayoutDeviceIntSize& aNewSize,
|
|
|
|
const LayoutDeviceIntRegion& aDirtyRegion = LayoutDeviceIntRegion());
|
2016-06-29 06:24:44 +03:00
|
|
|
void EndUpdate();
|
2016-06-29 06:24:44 +03:00
|
|
|
|
|
|
|
void UpdateIfNeeded(const LayoutDeviceIntSize& aNewSize,
|
|
|
|
const LayoutDeviceIntRegion& aDirtyRegion,
|
|
|
|
void (^aCallback)(gfx::DrawTarget*, const LayoutDeviceIntRegion&)) {
|
|
|
|
RefPtr<gfx::DrawTarget> drawTarget = BeginUpdate(aNewSize, aDirtyRegion);
|
|
|
|
if (drawTarget) {
|
|
|
|
aCallback(drawTarget, GetUpdateRegion());
|
|
|
|
EndUpdate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UpdateFromCGContext(const LayoutDeviceIntSize& aNewSize,
|
|
|
|
const LayoutDeviceIntRegion& aDirtyRegion, CGContextRef aCGContext);
|
|
|
|
|
|
|
|
LayoutDeviceIntRegion GetUpdateRegion() {
|
|
|
|
MOZ_ASSERT(mInUpdate, "update region only valid during update");
|
|
|
|
return mUpdateRegion;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Draw(mozilla::layers::GLManager* aManager, const LayoutDeviceIntPoint& aLocation,
|
|
|
|
const gfx::Matrix4x4& aTransform = gfx::Matrix4x4());
|
|
|
|
|
|
|
|
protected:
|
2016-06-29 06:24:44 +03:00
|
|
|
void DeleteTexture();
|
2018-04-10 00:07:58 +03:00
|
|
|
bool BindIOSurfaceToTexture(gl::GLContext* aGL);
|
2016-06-29 06:24:44 +03:00
|
|
|
|
2016-06-29 06:24:44 +03:00
|
|
|
RefPtr<MacIOSurface> mIOSurface;
|
2016-06-29 06:24:44 +03:00
|
|
|
gl::GLContext* mGLContext;
|
|
|
|
LayoutDeviceIntRegion mUpdateRegion;
|
|
|
|
LayoutDeviceIntSize mBufferSize;
|
|
|
|
GLuint mTexture;
|
|
|
|
bool mInUpdate;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace widget
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif // RectTextureImage_h_
|