/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: sw=2 ts=8 et : */ /* 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/. */ include LayersSurfaces; include protocol PCompositorBridge; include protocol PRenderFrame; include protocol PTexture; include "gfxipc/ShadowLayerUtils.h"; include "mozilla/GfxMessageUtils.h"; include "ImageLayers.h"; using mozilla::gfx::SamplingFilter from "mozilla/gfx/2D.h"; using struct mozilla::gfx::Color from "mozilla/gfx/2D.h"; using struct mozilla::gfx::Point3D from "mozilla/gfx/Point.h"; using mozilla::gfx::IntPoint from "mozilla/gfx/Point.h"; using class mozilla::gfx::Matrix4x4 from "mozilla/gfx/Matrix.h"; using nscoord from "nsCoord.h"; using struct nsRect from "nsRect.h"; using struct nsPoint from "nsPoint.h"; using class mozilla::TimeDuration from "mozilla/TimeStamp.h"; using class mozilla::TimeStamp from "mozilla/TimeStamp.h"; using mozilla::ScreenRotation from "mozilla/WidgetUtils.h"; using nsCSSPropertyID from "nsCSSPropertyID.h"; using mozilla::dom::ScreenOrientationInternal from "mozilla/dom/ScreenOrientation.h"; using struct mozilla::layers::TextureInfo from "mozilla/layers/CompositorTypes.h"; using mozilla::LayerMargin from "Units.h"; using mozilla::LayerPoint from "Units.h"; using mozilla::LayerCoord from "Units.h"; using mozilla::LayerSize from "Units.h"; using mozilla::LayerRect from "Units.h"; using mozilla::LayerIntRegion from "Units.h"; using mozilla::ParentLayerIntRect from "Units.h"; using mozilla::LayoutDeviceIntRect from "Units.h"; using mozilla::layers::ScaleMode from "mozilla/layers/LayersTypes.h"; using mozilla::layers::EventRegions from "mozilla/layers/LayersTypes.h"; using mozilla::layers::EventRegionsOverride from "mozilla/layers/LayersTypes.h"; using mozilla::layers::DiagnosticTypes from "mozilla/layers/CompositorTypes.h"; using struct mozilla::layers::ScrollMetadata from "FrameMetrics.h"; using mozilla::layers::FrameMetrics::ViewID from "FrameMetrics.h"; using mozilla::layers::LayersBackend from "mozilla/layers/LayersTypes.h"; using mozilla::layers::MaybeLayerClip from "FrameMetrics.h"; using mozilla::gfx::Glyph from "Layers.h"; using mozilla::layers::BorderColors from "mozilla/layers/LayersTypes.h"; using mozilla::layers::BorderCorners from "mozilla/layers/LayersTypes.h"; using mozilla::layers::BorderWidths from "mozilla/layers/LayersTypes.h"; using mozilla::layers::LayerHandle from "mozilla/layers/LayersTypes.h"; using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h"; using mozilla::layers::ReadLockHandle from "mozilla/layers/LayersTypes.h"; using mozilla::layers::SimpleLayerAttributes from "mozilla/layers/LayerAttributes.h"; using mozilla::CrossProcessSemaphoreHandle from "mozilla/ipc/CrossProcessSemaphore.h"; namespace mozilla { namespace layers { struct TargetConfig { IntRect naturalBounds; ScreenRotation rotation; ScreenOrientationInternal orientation; nsIntRegion clearRegion; }; // Create a shadow layer for |layer| struct OpCreatePaintedLayer { LayerHandle layer; }; struct OpCreateContainerLayer { LayerHandle layer; }; struct OpCreateImageLayer { LayerHandle layer; }; struct OpCreateColorLayer { LayerHandle layer; }; struct OpCreateTextLayer { LayerHandle layer; }; struct OpCreateBorderLayer { LayerHandle layer; }; struct OpCreateCanvasLayer { LayerHandle layer; }; struct OpCreateRefLayer { LayerHandle layer; }; struct OpAttachCompositable { LayerHandle layer; CompositableHandle compositable; }; struct OpAttachAsyncCompositable { LayerHandle layer; CompositableHandle compositable; }; struct ThebesBufferData { IntRect rect; IntPoint rotation; }; struct CubicBezierFunction { float x1; float y1; float x2; float y2; }; struct StepFunction { int steps; // 1 = nsTimingFunction::StepStart, 2 = nsTimingFunction::StepEnd int type; }; struct FramesFunction { int frames; }; union TimingFunction { null_t; CubicBezierFunction; StepFunction; FramesFunction; }; // Send the angle with units rather than sending all angles in radians // to avoid having floating point error introduced by unit switching. struct CSSAngle { float value; int unit; // an nsCSSUnit that is valid for angles }; struct LayerColor { Color value; }; struct Perspective { float value; }; struct RotationX { CSSAngle angle; }; struct RotationY { CSSAngle angle; }; struct RotationZ { CSSAngle angle; }; struct Rotation { CSSAngle angle; }; struct Rotation3D { float x; float y; float z; CSSAngle angle; }; struct Scale { float x; float y; float z; }; struct Skew { CSSAngle x; CSSAngle y; }; struct SkewX { CSSAngle x; }; struct SkewY { CSSAngle y; }; struct TransformMatrix { Matrix4x4 value; }; struct Translation { float x; float y; float z; }; union TransformFunction { Perspective; RotationX; RotationY; RotationZ; Rotation; Rotation3D; Scale; Skew; SkewX; SkewY; Translation; TransformMatrix; }; union Animatable { null_t; float; TransformFunction[]; }; struct AnimationSegment { Animatable startState; Animatable endState; float startPortion; float endPortion; uint8_t startComposite; uint8_t endComposite; TimingFunction sampleFn; }; // Transforms need extra information to correctly convert the list of transform // functions to a Matrix4x4 that can be applied directly to the layer. struct TransformData { // the origin of the frame being transformed in app units nsPoint origin; // the transform-origin property for the transform in device pixels Point3D transformOrigin; nsRect bounds; int32_t appUnitsPerDevPixel; }; union AnimationData { null_t; TransformData; }; struct Animation { TimeStamp startTime; TimeDuration delay; TimeDuration endDelay; // The value of the animation's current time at the moment it was sent to the // compositor. This value will be used for below cases: // 1) Animations that are play-pending. Initially these animations will have a // null |startTime|. Once the animation is read to start (i.e. painting has // finished), we calculate an appropriate value of |startTime| such that // playback begins from |holdTime|. // 2) Not playing animations (e.g. paused and finished animations). In this // case the |holdTime| represents the current time the animation will // maintain. TimeDuration holdTime; TimeDuration duration; // For each frame, the interpolation point is computed based on the // startTime, the direction, the duration, and the current time. // The segments must uniquely cover the portion from 0.0 to 1.0 AnimationSegment[] segments; // Number of times to repeat the animation, including positive infinity. // Values <= 0 mean the animation will not play (although events are still // dispatched on the main thread). float iterations; float iterationStart; // This uses the NS_STYLE_ANIMATION_DIRECTION_* constants. uint8_t direction; // This uses dom::FillMode. uint8_t fillMode; nsCSSPropertyID property; AnimationData data; float playbackRate; // This is used in the transformed progress calculation. TimingFunction easingFunction; uint8_t iterationComposite; // True if the animation has a fixed current time (e.g. paused and // forward-filling animations). bool isNotPlaying; // The base style that animations should composite with. This is only set for // animations with a composite mode of additive or accumulate, and only for // the first animation in the set (i.e. the animation that is lowest in the // stack). In all other cases the value is null_t. Animatable baseStyle; }; struct CompositorAnimations { Animation[] animations; // This id is used to map the layer animations between content // and compositor side uint64_t id; }; // Change a layer's attributes struct CommonLayerAttributes { LayerIntRegion visibleRegion; EventRegions eventRegions; bool useClipRect; ParentLayerIntRect clipRect; LayerHandle maskLayer; LayerHandle[] ancestorMaskLayers; // Animated colors will only honored for ColorLayers. CompositorAnimations compositorAnimations; nsIntRegion invalidRegion; ScrollMetadata[] scrollMetadata; nsCString displayListLog; }; struct PaintedLayerAttributes { nsIntRegion validRegion; }; struct ContainerLayerAttributes { float preXScale; float preYScale; float inheritedXScale; float inheritedYScale; float presShellResolution; bool scaleToResolution; EventRegionsOverride eventRegionsOverride; }; struct GlyphArray { LayerColor color; Glyph[] glyphs; }; // XXX - Bas - Hack warning! This is using a raw pointer to a ScaledFont* // and won't work with e10s. struct TextLayerAttributes { IntRect bounds; GlyphArray[] glyphs; uintptr_t scaledFont; }; struct ColorLayerAttributes { LayerColor color; IntRect bounds; }; struct CanvasLayerAttributes { SamplingFilter samplingFilter; IntRect bounds; }; struct RefLayerAttributes { uint64_t id; // TODO: Once bug 1132895 is fixed we shouldn't need to propagate the override // explicitly here. EventRegionsOverride eventRegionsOverride; }; struct ImageLayerAttributes { SamplingFilter samplingFilter; IntSize scaleToSize; ScaleMode scaleMode; }; struct BorderLayerAttributes { LayerRect rect; BorderColors colors; BorderCorners corners; BorderWidths widths; }; union SpecificLayerAttributes { null_t; PaintedLayerAttributes; ContainerLayerAttributes; ColorLayerAttributes; CanvasLayerAttributes; TextLayerAttributes; RefLayerAttributes; ImageLayerAttributes; BorderLayerAttributes; }; struct LayerAttributes { CommonLayerAttributes common; SpecificLayerAttributes specific; }; // See nsIWidget Configurations struct PluginWindowData { uintptr_t windowId; LayoutDeviceIntRect[] clip; LayoutDeviceIntRect bounds; bool visible; }; struct OpSetSimpleLayerAttributes { LayerHandle layer; SimpleLayerAttributes attrs; }; struct OpSetLayerAttributes { LayerHandle layer; LayerAttributes attrs; }; // Monkey with the tree structure struct OpSetRoot { LayerHandle root; }; struct OpInsertAfter { LayerHandle container; LayerHandle childLayer; LayerHandle after; }; struct OpPrependChild { LayerHandle container; LayerHandle childLayer; }; struct OpRemoveChild { LayerHandle container; LayerHandle childLayer; }; struct OpRepositionChild { LayerHandle container; LayerHandle childLayer; LayerHandle after; }; struct OpRaiseToTopChild { LayerHandle container; LayerHandle childLayer; }; struct OpSetDiagnosticTypes { DiagnosticTypes diagnostics; }; struct OpWindowOverlayChanged { }; struct ShmemSection { Shmem shmem; uint32_t offset; size_t size; }; struct CrossProcessSemaphoreDescriptor { CrossProcessSemaphoreHandle sem; }; union ReadLockDescriptor { ShmemSection; CrossProcessSemaphoreDescriptor; uintptr_t; null_t; }; struct ReadLockInit { ReadLockDescriptor sharedLock; ReadLockHandle handle; }; union MaybeTexture { PTexture; null_t; }; struct TexturedTileDescriptor { PTexture texture; MaybeTexture textureOnWhite; IntRect updateRect; ReadLockDescriptor sharedLock; ReadLockDescriptor sharedLockOnWhite; bool wasPlaceholder; }; struct PlaceholderTileDescriptor { }; union TileDescriptor { TexturedTileDescriptor; PlaceholderTileDescriptor; }; struct SurfaceDescriptorTiles { nsIntRegion validRegion; TileDescriptor[] tiles; IntPoint tileOrigin; IntSize tileSize; int firstTileX; int firstTileY; int retainedWidth; int retainedHeight; float resolution; float frameXResolution; float frameYResolution; bool isProgressive; }; struct OpUseTiledLayerBuffer { SurfaceDescriptorTiles tileLayerDescriptor; }; struct OpPaintTextureRegion { ThebesBufferData bufferData; nsIntRegion updatedRegion; }; /** * Tells the CompositableHost to remove the corresponding TextureHost */ struct OpRemoveTexture { PTexture texture; }; struct TimedTexture { PTexture texture; ReadLockHandle sharedLock; TimeStamp timeStamp; IntRect picture; uint32_t frameID; uint32_t producerID; }; /** * Tells the compositor-side which textures to use (for example, as front buffer * if there are several textures for double buffering). * This provides a list of textures with timestamps, ordered by timestamp. * The newest texture whose timestamp is <= the current time is rendered * (where null is considered less than every other timestamp). If there is no * such texture, the first texture is rendered. * The first timestamp value can be null, but the others must not be. * The list must not be empty. */ struct OpUseTexture { TimedTexture[] textures; }; struct OpUseComponentAlphaTextures { PTexture textureOnBlack; PTexture textureOnWhite; ReadLockHandle sharedLockBlack; ReadLockHandle sharedLockWhite; }; union MaybeRegion { nsIntRegion; null_t; }; struct OpNotifyNotUsed { uint64_t TextureId; uint64_t fwdTransactionId; }; union CompositableOperationDetail { OpPaintTextureRegion; OpUseTiledLayerBuffer; OpRemoveTexture; OpUseTexture; OpUseComponentAlphaTextures; }; struct CompositableOperation { CompositableHandle compositable; CompositableOperationDetail detail; }; // A unit of a changeset; a set of these comprise a changeset // If adding a new edit type that requires the hit testing tree to be updated, // set the updateHitTestingTree flag to true in RecvUpdate() union Edit { OpCreatePaintedLayer; OpCreateContainerLayer; OpCreateImageLayer; OpCreateColorLayer; OpCreateTextLayer; OpCreateBorderLayer; OpCreateCanvasLayer; OpCreateRefLayer; OpSetDiagnosticTypes; OpWindowOverlayChanged; OpSetRoot; OpInsertAfter; OpPrependChild; OpRemoveChild; OpRepositionChild; OpRaiseToTopChild; OpAttachCompositable; OpAttachAsyncCompositable; CompositableOperation; }; // Operations related to destroying resources, always handled after the other // operations for safety. union OpDestroy { PTexture; CompositableHandle; }; // Replies to operations struct OpContentBufferSwap { CompositableHandle compositable; nsIntRegion frontUpdatedRegion; }; /** * An ImageCompositeNotification is sent the first time a particular * image is composited by an ImageHost. */ struct ImageCompositeNotification { CompositableHandle compositable; TimeStamp imageTimeStamp; TimeStamp firstCompositeTimeStamp; uint32_t frameID; uint32_t producerID; }; union AsyncParentMessageData { OpNotifyNotUsed; }; struct PaintTiming { float serializeMs; float sendMs; float dlMs; float flbMs; float rasterMs; }; struct TransactionInfo { Edit[] cset; OpSetSimpleLayerAttributes[] setSimpleAttrs; OpSetLayerAttributes[] setAttrs; CompositableOperation[] paints; OpDestroy[] toDestroy; uint64_t fwdTransactionId; uint64_t id; TargetConfig targetConfig; PluginWindowData[] plugins; bool isFirstPaint; bool scheduleComposite; uint32_t paintSequenceNumber; bool isRepeatTransaction; TimeStamp transactionStart; }; } // namespace } // namespace