DrawTargetCapture.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2. * This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #ifndef MOZILLA_GFX_DRAWTARGETCAPTURE_H_
  6. #define MOZILLA_GFX_DRAWTARGETCAPTURE_H_
  7. #include "2D.h"
  8. #include <vector>
  9. #include "Filters.h"
  10. namespace mozilla {
  11. namespace gfx {
  12. class DrawingCommand;
  13. class DrawTargetCaptureImpl : public DrawTargetCapture
  14. {
  15. public:
  16. DrawTargetCaptureImpl()
  17. {}
  18. bool Init(const IntSize& aSize, DrawTarget* aRefDT);
  19. virtual BackendType GetBackendType() const { return mRefDT->GetBackendType(); }
  20. virtual DrawTargetType GetType() const { return mRefDT->GetType(); }
  21. virtual already_AddRefed<SourceSurface> Snapshot();
  22. virtual void DetachAllSnapshots();
  23. virtual IntSize GetSize() { return mSize; }
  24. virtual void Flush() {}
  25. virtual void DrawSurface(SourceSurface *aSurface,
  26. const Rect &aDest,
  27. const Rect &aSource,
  28. const DrawSurfaceOptions &aSurfOptions,
  29. const DrawOptions &aOptions);
  30. virtual void DrawFilter(FilterNode *aNode,
  31. const Rect &aSourceRect,
  32. const Point &aDestPoint,
  33. const DrawOptions &aOptions = DrawOptions());
  34. virtual void DrawSurfaceWithShadow(SourceSurface *aSurface,
  35. const Point &aDest,
  36. const Color &aColor,
  37. const Point &aOffset,
  38. Float aSigma,
  39. CompositionOp aOperator) { /* Not implemented */ }
  40. virtual void ClearRect(const Rect &aRect);
  41. virtual void MaskSurface(const Pattern &aSource,
  42. SourceSurface *aMask,
  43. Point aOffset,
  44. const DrawOptions &aOptions = DrawOptions());
  45. virtual void CopySurface(SourceSurface *aSurface,
  46. const IntRect &aSourceRect,
  47. const IntPoint &aDestination);
  48. virtual void FillRect(const Rect &aRect,
  49. const Pattern &aPattern,
  50. const DrawOptions &aOptions = DrawOptions());
  51. virtual void StrokeRect(const Rect &aRect,
  52. const Pattern &aPattern,
  53. const StrokeOptions &aStrokeOptions = StrokeOptions(),
  54. const DrawOptions &aOptions = DrawOptions());
  55. virtual void StrokeLine(const Point &aStart,
  56. const Point &aEnd,
  57. const Pattern &aPattern,
  58. const StrokeOptions &aStrokeOptions = StrokeOptions(),
  59. const DrawOptions &aOptions = DrawOptions());
  60. virtual void Stroke(const Path *aPath,
  61. const Pattern &aPattern,
  62. const StrokeOptions &aStrokeOptions = StrokeOptions(),
  63. const DrawOptions &aOptions = DrawOptions());
  64. virtual void Fill(const Path *aPath,
  65. const Pattern &aPattern,
  66. const DrawOptions &aOptions = DrawOptions());
  67. virtual void FillGlyphs(ScaledFont *aFont,
  68. const GlyphBuffer &aBuffer,
  69. const Pattern &aPattern,
  70. const DrawOptions &aOptions = DrawOptions(),
  71. const GlyphRenderingOptions *aRenderingOptions = nullptr);
  72. virtual void Mask(const Pattern &aSource,
  73. const Pattern &aMask,
  74. const DrawOptions &aOptions = DrawOptions());
  75. virtual void PushClip(const Path *aPath);
  76. virtual void PushClipRect(const Rect &aRect);
  77. virtual void PopClip();
  78. virtual void SetTransform(const Matrix &aTransform);
  79. virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData(unsigned char *aData,
  80. const IntSize &aSize,
  81. int32_t aStride,
  82. SurfaceFormat aFormat) const
  83. {
  84. return mRefDT->CreateSourceSurfaceFromData(aData, aSize, aStride, aFormat);
  85. }
  86. virtual already_AddRefed<SourceSurface> OptimizeSourceSurface(SourceSurface *aSurface) const
  87. {
  88. return mRefDT->OptimizeSourceSurface(aSurface);
  89. }
  90. virtual already_AddRefed<SourceSurface>
  91. CreateSourceSurfaceFromNativeSurface(const NativeSurface &aSurface) const
  92. {
  93. return mRefDT->CreateSourceSurfaceFromNativeSurface(aSurface);
  94. }
  95. virtual already_AddRefed<DrawTarget>
  96. CreateSimilarDrawTarget(const IntSize &aSize, SurfaceFormat aFormat) const
  97. {
  98. return mRefDT->CreateSimilarDrawTarget(aSize, aFormat);
  99. }
  100. virtual already_AddRefed<PathBuilder> CreatePathBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const
  101. {
  102. return mRefDT->CreatePathBuilder(aFillRule);
  103. }
  104. virtual already_AddRefed<GradientStops>
  105. CreateGradientStops(GradientStop *aStops,
  106. uint32_t aNumStops,
  107. ExtendMode aExtendMode = ExtendMode::CLAMP) const
  108. {
  109. return mRefDT->CreateGradientStops(aStops, aNumStops, aExtendMode);
  110. }
  111. virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType)
  112. {
  113. return mRefDT->CreateFilter(aType);
  114. }
  115. void ReplayToDrawTarget(DrawTarget* aDT, const Matrix& aTransform);
  116. protected:
  117. ~DrawTargetCaptureImpl();
  118. private:
  119. // This storage system was used to minimize the amount of heap allocations
  120. // that are required while recording. It should be noted there's no
  121. // guarantees on the alignments of DrawingCommands allocated in this array.
  122. template<typename T>
  123. T* AppendToCommandList()
  124. {
  125. size_t oldSize = mDrawCommandStorage.size();
  126. mDrawCommandStorage.resize(mDrawCommandStorage.size() + sizeof(T) + sizeof(uint32_t));
  127. uint8_t* nextDrawLocation = &mDrawCommandStorage.front() + oldSize;
  128. *(uint32_t*)(nextDrawLocation) = sizeof(T) + sizeof(uint32_t);
  129. return reinterpret_cast<T*>(nextDrawLocation + sizeof(uint32_t));
  130. }
  131. RefPtr<DrawTarget> mRefDT;
  132. IntSize mSize;
  133. std::vector<uint8_t> mDrawCommandStorage;
  134. };
  135. } // namespace gfx
  136. } // namespace mozilla
  137. #endif /* MOZILLA_GFX_DRAWTARGETCAPTURE_H_ */