mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 790673. Add BorrowedCGContext. r=bas
This can be used to safely get at the underlying CGContext.
This commit is contained in:
parent
443792d1cc
commit
d5a116ea3f
43
gfx/2d/2D.h
43
gfx/2d/2D.h
@ -40,6 +40,9 @@ struct IDWriteRenderingParams;
|
|||||||
class GrContext;
|
class GrContext;
|
||||||
struct GrGLInterface;
|
struct GrGLInterface;
|
||||||
|
|
||||||
|
struct CGContext;
|
||||||
|
typedef struct CGContext *CGContextRef;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
namespace gfx {
|
namespace gfx {
|
||||||
@ -993,6 +996,46 @@ private:
|
|||||||
static DrawEventRecorder *mRecorder;
|
static DrawEventRecorder *mRecorder;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef XP_MACOSX
|
||||||
|
/* This is a helper class that let's you borrow a CGContextRef from a
|
||||||
|
* DrawTargetCG. This is used for drawing themed widgets.
|
||||||
|
*
|
||||||
|
* Callers should check the cg member after constructing the object
|
||||||
|
* to see if it succeeded. The DrawTarget should not be used while
|
||||||
|
* the context is borrowed. */
|
||||||
|
class BorrowedCGContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BorrowedCGContext(DrawTarget *aDT) : mDT(aDT)
|
||||||
|
{
|
||||||
|
cg = BorrowCGContextFromDrawTarget(aDT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The caller needs to call Finish if cg is non-null when
|
||||||
|
// they are done with the context. This is currently explicit
|
||||||
|
// instead of happening implicitly in the destructor to make
|
||||||
|
// what's happening in the caller more clear. It also
|
||||||
|
// let's you resume using the DrawTarget in the same scope.
|
||||||
|
void Finish()
|
||||||
|
{
|
||||||
|
if (cg) {
|
||||||
|
ReturnCGContextToDrawTarget(mDT, cg);
|
||||||
|
cg = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~BorrowedCGContext() {
|
||||||
|
MOZ_ASSERT(!cg);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGContextRef cg;
|
||||||
|
private:
|
||||||
|
static CGContextRef BorrowCGContextFromDrawTarget(DrawTarget *aDT);
|
||||||
|
static void ReturnCGContextToDrawTarget(DrawTarget *aDT, CGContextRef cg);
|
||||||
|
DrawTarget *mDT;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1166,6 +1166,33 @@ DrawTargetCG::MarkChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGContextRef
|
||||||
|
BorrowedCGContext::BorrowCGContextFromDrawTarget(DrawTarget *aDT)
|
||||||
|
{
|
||||||
|
if (aDT->GetType() == BACKEND_COREGRAPHICS || aDT->GetType() == BACKEND_COREGRAPHICS_ACCELERATED) {
|
||||||
|
DrawTargetCG* cgDT = static_cast<DrawTargetCG*>(aDT);
|
||||||
|
cgDT->MarkChanged();
|
||||||
|
|
||||||
|
// swap out the context
|
||||||
|
CGContextRef cg = cgDT->mCg;
|
||||||
|
cgDT->mCg = nullptr;
|
||||||
|
|
||||||
|
// save the state to make it easier for callers to avoid mucking with things
|
||||||
|
CGContextSaveGState(cg);
|
||||||
|
|
||||||
|
return cg;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BorrowedCGContext::ReturnCGContextToDrawTarget(DrawTarget *aDT, CGContextRef cg)
|
||||||
|
{
|
||||||
|
DrawTargetCG* cgDT = static_cast<DrawTargetCG*>(aDT);
|
||||||
|
|
||||||
|
CGContextRestoreGState(cg);
|
||||||
|
cgDT->mCg = cg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,7 @@ SetStrokeOptions(CGContextRef cg, const StrokeOptions &aStrokeOptions)
|
|||||||
class DrawTargetCG : public DrawTarget
|
class DrawTargetCG : public DrawTarget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
friend BorrowedCGContext;
|
||||||
DrawTargetCG();
|
DrawTargetCG();
|
||||||
virtual ~DrawTargetCG();
|
virtual ~DrawTargetCG();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user