Bug 784382 - Part 1: Use new ID2D1DeviceContext interface for subpixel AA with clipping in cairo. r=jrmuizel

This commit is contained in:
Bas Schouten 2012-09-25 20:14:53 +02:00
parent 9a52450250
commit fe33b070f1
2 changed files with 398 additions and 9 deletions

View File

@ -46,6 +46,9 @@
// Required for using placement new.
#include <new>
// HACK WARNING - Workaround for Windows 8 since we don't have the windows 8 SDK.
#include "moz-d2d1-1.h"
#define CAIRO_INT_STATUS_SUCCESS (cairo_int_status_t)CAIRO_STATUS_SUCCESS
struct Vertex
@ -900,19 +903,38 @@ push_clip (cairo_d2d_surface_t *d2dsurf, cairo_clip_path_t *clip_path)
hr = d2dsurf->rt->CreateLayer (&layer);
D2D1_LAYER_OPTIONS options = D2D1_LAYER_OPTIONS_NONE;
D2D1_LAYER_OPTIONS1 options1 = D2D1_LAYER_OPTIONS1_NONE;
if (d2dsurf->base.content == CAIRO_CONTENT_COLOR) {
options = D2D1_LAYER_OPTIONS_INITIALIZE_FOR_CLEARTYPE;
options1 = D2D1_LAYER_OPTIONS1_IGNORE_ALPHA;
options1 = D2D1_LAYER_OPTIONS1_INITIALIZE_FROM_BACKGROUND;
}
d2dsurf->rt->PushLayer(D2D1::LayerParameters(
D2D1::InfiniteRect(),
geom,
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
D2D1::IdentityMatrix(),
1.0,
0,
options),
layer);
RefPtr<ID2D1DeviceContext> dc;
hr = d2dsurf->rt->QueryInterface(IID_ID2D1DeviceContext, (void**)&dc);
if (FAILED(hr)) {
d2dsurf->rt->PushLayer(D2D1::LayerParameters(
D2D1::InfiniteRect(),
geom,
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
D2D1::IdentityMatrix(),
1.0,
0,
options),
layer);
} else {
dc->PushLayer(D2D1::LayerParameters1(
D2D1::InfiniteRect(),
geom,
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
D2D1::IdentityMatrix(),
1.0,
0,
options1),
layer);
}
d2dsurf->d2d_clip = new d2d_clip_t(d2dsurf->d2d_clip, d2d_clip_t::LAYER);
}

View File

@ -0,0 +1,367 @@
//---------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// This file is automatically generated. Please do not edit it directly.
//
// File name: D2D1_1.h
//---------------------------------------------------------------------------
#pragma once
#ifndef _D2D1_1_H_
#ifndef _D2D1_H_
#include <d2d1.h>
#endif // #ifndef _D2D1_H_
//+-----------------------------------------------------------------------------
//
// Flag:
// D2D1_LAYER_OPTIONS1
//
// Synopsis:
// Specifies how the layer contents should be prepared.
//
//------------------------------------------------------------------------------
typedef enum D2D1_LAYER_OPTIONS1
{
D2D1_LAYER_OPTIONS1_NONE = 0,
D2D1_LAYER_OPTIONS1_INITIALIZE_FROM_BACKGROUND = 1,
D2D1_LAYER_OPTIONS1_IGNORE_ALPHA = 2,
D2D1_LAYER_OPTIONS1_FORCE_DWORD = 0xffffffff
} D2D1_LAYER_OPTIONS1;
//+-----------------------------------------------------------------------------
//
// Struct:
// D2D1_LAYER_PARAMETERS1
//
// Synopsis:
// All parameters related to pushing a layer.
//
//------------------------------------------------------------------------------
typedef struct D2D1_LAYER_PARAMETERS1
{
D2D1_RECT_F contentBounds;
ID2D1Geometry *geometricMask;
D2D1_ANTIALIAS_MODE maskAntialiasMode;
D2D1_MATRIX_3X2_F maskTransform;
FLOAT opacity;
ID2D1Brush *opacityBrush;
D2D1_LAYER_OPTIONS1 layerOptions;
} D2D1_LAYER_PARAMETERS1;
DEFINE_ENUM_FLAG_OPERATORS(D2D1_LAYER_OPTIONS1);
#ifndef DX_DECLARE_INTERFACE
#define DX_DECLARE_INTERFACE(x) DECLSPEC_UUID(x) DECLSPEC_NOVTABLE
#endif
namespace D2D1
{
D2D1FORCEINLINE
D2D1_LAYER_PARAMETERS1
LayerParameters1(
CONST D2D1_RECT_F &contentBounds = D2D1::InfiniteRect(),
ID2D1Geometry *geometricMask = NULL,
D2D1_ANTIALIAS_MODE maskAntialiasMode = D2D1_ANTIALIAS_MODE_PER_PRIMITIVE,
D2D1_MATRIX_3X2_F maskTransform = D2D1::IdentityMatrix(),
FLOAT opacity = 1.0,
ID2D1Brush *opacityBrush = NULL,
D2D1_LAYER_OPTIONS1 layerOptions = D2D1_LAYER_OPTIONS1_NONE
)
{
D2D1_LAYER_PARAMETERS1 layerParameters = { 0 };
layerParameters.contentBounds = contentBounds;
layerParameters.geometricMask = geometricMask;
layerParameters.maskAntialiasMode = maskAntialiasMode;
layerParameters.maskTransform = maskTransform;
layerParameters.opacity = opacity;
layerParameters.opacityBrush = opacityBrush;
layerParameters.layerOptions = layerOptions;
return layerParameters;
}
}
DEFINE_GUID(IID_ID2D1DeviceContext, 0xe8f7fe7a, 0x191c, 0x466d, 0xad, 0x95, 0x97, 0x56, 0x78, 0xbd, 0xa9, 0x98);
//+-----------------------------------------------------------------------------
//
// Interface:
// ID2D1DeviceContext
//
// Synopsis:
// The device context represents a set of state and a command buffer that is used
// to render to a target bitmap.
//
//------------------------------------------------------------------------------
interface DX_DECLARE_INTERFACE("e8f7fe7a-191c-466d-ad95-975678bda998") ID2D1DeviceContext : public ID2D1RenderTarget
{
//
// Creates a bitmap with extended bitmap properties, potentially from a block of
// memory.
//
STDMETHOD(CreateBitmap)() PURE;
//
// Create a D2D bitmap by copying a WIC bitmap.
//
STDMETHOD(CreateBitmapFromWicBitmap)() PURE;
//
// Creates a color context from a color space. If the space is Custom, the context
// is initialized from the profile/profileSize arguments. Otherwise the context is
// initialized with the profile bytes associated with the space and
// profile/profileSize are ignored.
//
STDMETHOD(CreateColorContext)() PURE;
STDMETHOD(CreateColorContextFromFilename)() PURE;
STDMETHOD(CreateColorContextFromWicColorContext)() PURE;
//
// Creates a bitmap from a DXGI surface with a set of extended properties.
//
STDMETHOD(CreateBitmapFromDxgiSurface)() PURE;
//
// Create a new effect, the effect must either be built in or previously registered
// through ID2D1Factory1::RegisterEffectFromStream or
// ID2D1Factory1::RegisterEffectFromString.
//
STDMETHOD(CreateEffect)() PURE;
//
// A gradient stop collection represents a set of stops in an ideal unit length.
// This is the source resource for a linear gradient and radial gradient brush.
//
STDMETHOD(CreateGradientStopCollection)() PURE;
//
// Creates an image brush, the input image can be any type of image, including a
// bitmap, effect and a command list.
//
STDMETHOD(CreateImageBrush)() PURE;
STDMETHOD(CreateBitmapBrush)() PURE;
//
// Creates a new command list.
//
STDMETHOD(CreateCommandList)() PURE;
//
// Indicates whether the format is supported by D2D.
//
STDMETHOD_(BOOL, IsDxgiFormatSupported)() CONST PURE;
//
// Indicates whether the buffer precision is supported by D2D.
//
STDMETHOD_(BOOL, IsBufferPrecisionSupported)() CONST PURE;
//
// This retrieves the local-space bounds in DIPs of the current image using the
// device context DPI.
//
STDMETHOD(GetImageLocalBounds)() CONST PURE;
//
// This retrieves the world-space bounds in DIPs of the current image using the
// device context DPI.
//
STDMETHOD(GetImageWorldBounds)() CONST PURE;
//
// Retrieves the world-space bounds in DIPs of the glyph run using the device
// context DPI.
//
STDMETHOD(GetGlyphRunWorldBounds)() CONST PURE;
//
// Retrieves the device associated with this device context.
//
STDMETHOD_(void, GetDevice)() CONST PURE;
//
// Sets the target for this device context to point to the given image. The image
// can be a command list or a bitmap created with the D2D1_BITMAP_OPTIONS_TARGET
// flag.
//
STDMETHOD_(void, SetTarget)() PURE;
//
// Gets the target that this device context is currently pointing to.
//
STDMETHOD_(void, GetTarget)() CONST PURE;
//
// Sets tuning parameters for internal rendering inside the device context.
//
STDMETHOD_(void, SetRenderingControls)() PURE;
//
// This retrieves the rendering controls currently selected into the device
// context.
//
STDMETHOD_(void, GetRenderingControls)() CONST PURE;
//
// Changes the primitive blending mode for all of the rendering operations.
//
STDMETHOD_(void, SetPrimitiveBlend)() PURE;
//
// Returns the primitive blend currently selected into the device context.
//
STDMETHOD_(void, GetPrimitiveBlend)(
) CONST PURE;
//
// Changes the units used for all of the rendering operations.
//
STDMETHOD_(void, SetUnitMode)() PURE;
//
// Returns the unit mode currently set on the device context.
//
STDMETHOD_(void, GetUnitMode)(
) CONST PURE;
//
// Draws the glyph run with an extended description to describe the glyphs.
//
STDMETHOD_(void, DrawGlyphRun)() PURE;
//
// Draw an image to the device context. The image represents either a concrete
// bitmap or the output of an effect graph.
//
STDMETHOD_(void, DrawImage)() PURE;
//
// Draw a metafile to the device context.
//
STDMETHOD_(void, DrawGdiMetafile)() PURE;
STDMETHOD_(void, DrawBitmap)() PURE;
//
// Push a layer on the device context.
//
STDMETHOD_(void, PushLayer)(
_In_ CONST D2D1_LAYER_PARAMETERS1 *layerParameters,
_In_opt_ ID2D1Layer *layer
) PURE;
using ID2D1RenderTarget::PushLayer;
//
// This indicates that a portion of an effect's input is invalid. This method can
// be called many times.
//
STDMETHOD(InvalidateEffectInputRectangle)() PURE;
//
// Gets the number of invalid ouptut rectangles that have accumulated at the
// effect.
//
STDMETHOD(GetEffectInvalidRectangleCount)() PURE;
//
// Gets the invalid rectangles that are at the output of the effect.
//
STDMETHOD(GetEffectInvalidRectangles)() PURE;
//
// Gets the maximum region of each specified input which would be used during a
// subsequent rendering operation
//
STDMETHOD(GetEffectRequiredInputRectangles)() PURE;
//
// Fill using the alpha channel of the supplied opacity mask bitmap. The brush
// opacity will be modulated by the mask. The render target antialiasing mode must
// be set to aliased.
//
STDMETHOD_(void, FillOpacityMask)() PURE;
HRESULT CreateBitmap1() { return S_OK; }
HRESULT CreateBitmap2() { return S_OK; }
HRESULT CreateBitmap3() { return S_OK; }
HRESULT CreateBitmap4() { return S_OK; }
HRESULT CreateImageBrush1() { return S_OK; }
HRESULT CreateImageBrush2() { return S_OK; }
HRESULT CreateBitmapBrush1() { return S_OK; }
HRESULT CreateBitmapBrush2() { return S_OK; }
HRESULT CreateBitmapBrush3() { return S_OK; }
//
// Draws the output of the effect as an image.
//
void DrawImage1() {}
void DrawImage2() {}
void DrawImage3() {}
void DrawImage4() {}
void DrawImage5() {}
void DrawImage6() {}
void DrawImage7() {}
void
PushLayer(
CONST D2D1_LAYER_PARAMETERS1 &layerParameters,
_In_opt_ ID2D1Layer *layer
)
{
PushLayer(&layerParameters, layer);
}
void DrawGdiMetafile1() {}
void DrawBitmap1() {}
void DrawBitmap2() {}
void DrawBitmap3() {}
void FillOpacityMask1() {}
void FillOpacityMask2() {}
//
// Sets tuning parameters for internal rendering inside the device context.
//
void SetRenderingControls1() {}
}; // interface ID2D1DeviceContext
#endif // #ifndef _D2D1_1_H_