already_AddRefed<gfxASurface> gfxQuartzSurface::CreateSimilarSurface(gfxContentType aType, const gfxIntSize& aSize) { cairo_surface_t *surface = cairo_quartz_surface_create_cg_layer(mSurface, (cairo_content_t)aType, aSize.width, aSize.height); if (cairo_surface_status(surface)) { cairo_surface_destroy(surface); return nullptr; } nsRefPtr<gfxASurface> result = Wrap(surface); cairo_surface_destroy(surface); return result.forget(); }
already_AddRefed<DrawTarget> PrintTarget::GetReferenceDrawTarget(DrawEventRecorder* aRecorder) { if (!mRefDT) { const IntSize size(1, 1); cairo_surface_t* similar; switch (cairo_surface_get_type(mCairoSurface)) { #ifdef CAIRO_HAS_WIN32_SURFACE case CAIRO_SURFACE_TYPE_WIN32: similar = cairo_win32_surface_create_with_dib( CairoContentToCairoFormat(cairo_surface_get_content(mCairoSurface)), size.width, size.height); break; #endif #ifdef CAIRO_HAS_QUARTZ_SURFACE case CAIRO_SURFACE_TYPE_QUARTZ: similar = cairo_quartz_surface_create_cg_layer( mCairoSurface, cairo_surface_get_content(mCairoSurface), size.width, size.height); break; #endif default: similar = cairo_surface_create_similar( mCairoSurface, cairo_surface_get_content(mCairoSurface), size.width, size.height); break; } if (cairo_surface_status(similar)) { return nullptr; } RefPtr<DrawTarget> dt = Factory::CreateDrawTargetForCairoSurface(similar, size); // The DT addrefs the surface, so we need drop our own reference to it: cairo_surface_destroy(similar); if (!dt || !dt->IsValid()) { return nullptr; } mRefDT = dt.forget(); } if (aRecorder) { if (!mRecordingRefDT) { RefPtr<DrawTarget> dt = CreateRecordingDrawTarget(aRecorder, mRefDT); if (!dt || !dt->IsValid()) { return nullptr; } mRecordingRefDT = dt.forget(); #ifdef DEBUG mRecorder = aRecorder; #endif } #ifdef DEBUG else { MOZ_ASSERT(aRecorder == mRecorder, "Caching mRecordingRefDT assumes the aRecorder is an invariant"); } #endif return do_AddRef(mRecordingRefDT); } return do_AddRef(mRefDT); }