1 /* -*- Mode: C++; tab-width: 20; 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/. */
6 #include "RecordedEvent.h"
7 #include "PathRecording.h"
16 static std::string
NameFromBackend(BackendType aType
)
21 case BACKEND_DIRECT2D
:
28 #define LOAD_EVENT_TYPE(_typeenum, _class) \
29 case _typeenum: return new _class(aStream)
32 RecordedEvent::LoadEventFromStream(std::istream
&aStream
, EventType aType
)
35 LOAD_EVENT_TYPE(DRAWTARGETCREATION
, RecordedDrawTargetCreation
);
36 LOAD_EVENT_TYPE(DRAWTARGETDESTRUCTION
, RecordedDrawTargetDestruction
);
37 LOAD_EVENT_TYPE(FILLRECT
, RecordedFillRect
);
38 LOAD_EVENT_TYPE(STROKERECT
, RecordedStrokeRect
);
39 LOAD_EVENT_TYPE(STROKELINE
, RecordedStrokeLine
);
40 LOAD_EVENT_TYPE(CLEARRECT
, RecordedClearRect
);
41 LOAD_EVENT_TYPE(COPYSURFACE
, RecordedCopySurface
);
42 LOAD_EVENT_TYPE(SETTRANSFORM
, RecordedSetTransform
);
43 LOAD_EVENT_TYPE(PUSHCLIPRECT
, RecordedPushClipRect
);
44 LOAD_EVENT_TYPE(PUSHCLIP
, RecordedPushClip
);
45 LOAD_EVENT_TYPE(POPCLIP
, RecordedPopClip
);
46 LOAD_EVENT_TYPE(FILL
, RecordedFill
);
47 LOAD_EVENT_TYPE(FILLGLYPHS
, RecordedFillGlyphs
);
48 LOAD_EVENT_TYPE(MASK
, RecordedMask
);
49 LOAD_EVENT_TYPE(STROKE
, RecordedStroke
);
50 LOAD_EVENT_TYPE(DRAWSURFACE
, RecordedDrawSurface
);
51 LOAD_EVENT_TYPE(DRAWSURFACEWITHSHADOW
, RecordedDrawSurfaceWithShadow
);
52 LOAD_EVENT_TYPE(PATHCREATION
, RecordedPathCreation
);
53 LOAD_EVENT_TYPE(PATHDESTRUCTION
, RecordedPathDestruction
);
54 LOAD_EVENT_TYPE(SOURCESURFACECREATION
, RecordedSourceSurfaceCreation
);
55 LOAD_EVENT_TYPE(SOURCESURFACEDESTRUCTION
, RecordedSourceSurfaceDestruction
);
56 LOAD_EVENT_TYPE(GRADIENTSTOPSCREATION
, RecordedGradientStopsCreation
);
57 LOAD_EVENT_TYPE(GRADIENTSTOPSDESTRUCTION
, RecordedGradientStopsDestruction
);
58 LOAD_EVENT_TYPE(SNAPSHOT
, RecordedSnapshot
);
59 LOAD_EVENT_TYPE(SCALEDFONTCREATION
, RecordedScaledFontCreation
);
60 LOAD_EVENT_TYPE(SCALEDFONTDESTRUCTION
, RecordedScaledFontDestruction
);
67 RecordedEvent::RecordPatternData(std::ostream
&aStream
, const PatternStorage
&aPattern
) const
69 WriteElement(aStream
, aPattern
.mType
);
71 switch (aPattern
.mType
) {
74 WriteElement(aStream
, *reinterpret_cast<const ColorPatternStorage
*>(&aPattern
.mStorage
));
77 case PATTERN_LINEAR_GRADIENT
:
79 WriteElement(aStream
, *reinterpret_cast<const LinearGradientPatternStorage
*>(&aPattern
.mStorage
));
82 case PATTERN_RADIAL_GRADIENT
:
84 WriteElement(aStream
, *reinterpret_cast<const RadialGradientPatternStorage
*>(&aPattern
.mStorage
));
89 WriteElement(aStream
, *reinterpret_cast<const SurfacePatternStorage
*>(&aPattern
.mStorage
));
98 RecordedEvent::ReadPatternData(std::istream
&aStream
, PatternStorage
&aPattern
) const
100 ReadElement(aStream
, aPattern
.mType
);
102 switch (aPattern
.mType
) {
105 ReadElement(aStream
, *reinterpret_cast<ColorPatternStorage
*>(&aPattern
.mStorage
));
108 case PATTERN_LINEAR_GRADIENT
:
110 ReadElement(aStream
, *reinterpret_cast<LinearGradientPatternStorage
*>(&aPattern
.mStorage
));
113 case PATTERN_RADIAL_GRADIENT
:
115 ReadElement(aStream
, *reinterpret_cast<RadialGradientPatternStorage
*>(&aPattern
.mStorage
));
118 case PATTERN_SURFACE
:
120 ReadElement(aStream
, *reinterpret_cast<SurfacePatternStorage
*>(&aPattern
.mStorage
));
129 RecordedEvent::StorePattern(PatternStorage
&aDestination
, const Pattern
&aSource
) const
131 aDestination
.mType
= aSource
.GetType();
133 switch (aSource
.GetType()) {
136 reinterpret_cast<ColorPatternStorage
*>(&aDestination
.mStorage
)->mColor
=
137 static_cast<const ColorPattern
*>(&aSource
)->mColor
;
140 case PATTERN_LINEAR_GRADIENT
:
142 LinearGradientPatternStorage
*store
=
143 reinterpret_cast<LinearGradientPatternStorage
*>(&aDestination
.mStorage
);
144 const LinearGradientPattern
*pat
=
145 static_cast<const LinearGradientPattern
*>(&aSource
);
146 store
->mBegin
= pat
->mBegin
;
147 store
->mEnd
= pat
->mEnd
;
148 store
->mMatrix
= pat
->mMatrix
;
149 store
->mStops
= pat
->mStops
.get();
152 case PATTERN_RADIAL_GRADIENT
:
154 RadialGradientPatternStorage
*store
=
155 reinterpret_cast<RadialGradientPatternStorage
*>(&aDestination
.mStorage
);
156 const RadialGradientPattern
*pat
=
157 static_cast<const RadialGradientPattern
*>(&aSource
);
158 store
->mCenter1
= pat
->mCenter1
;
159 store
->mCenter2
= pat
->mCenter2
;
160 store
->mRadius1
= pat
->mRadius1
;
161 store
->mRadius2
= pat
->mRadius2
;
162 store
->mMatrix
= pat
->mMatrix
;
163 store
->mStops
= pat
->mStops
.get();
166 case PATTERN_SURFACE
:
168 SurfacePatternStorage
*store
=
169 reinterpret_cast<SurfacePatternStorage
*>(&aDestination
.mStorage
);
170 const SurfacePattern
*pat
=
171 static_cast<const SurfacePattern
*>(&aSource
);
172 store
->mExtend
= pat
->mExtendMode
;
173 store
->mFilter
= pat
->mFilter
;
174 store
->mMatrix
= pat
->mMatrix
;
175 store
->mSurface
= pat
->mSurface
;
182 RecordedEvent::RecordStrokeOptions(std::ostream
&aStream
, const StrokeOptions
&aStrokeOptions
) const
184 JoinStyle joinStyle
= aStrokeOptions
.mLineJoin
;
185 CapStyle capStyle
= aStrokeOptions
.mLineCap
;
187 WriteElement(aStream
, uint64_t(aStrokeOptions
.mDashLength
));
188 WriteElement(aStream
, aStrokeOptions
.mDashOffset
);
189 WriteElement(aStream
, aStrokeOptions
.mLineWidth
);
190 WriteElement(aStream
, aStrokeOptions
.mMiterLimit
);
191 WriteElement(aStream
, joinStyle
);
192 WriteElement(aStream
, capStyle
);
194 if (!aStrokeOptions
.mDashPattern
) {
198 aStream
.write((char*)aStrokeOptions
.mDashPattern
, sizeof(Float
) * aStrokeOptions
.mDashLength
);
202 RecordedEvent::ReadStrokeOptions(std::istream
&aStream
, StrokeOptions
&aStrokeOptions
)
208 ReadElement(aStream
, dashLength
);
209 ReadElement(aStream
, aStrokeOptions
.mDashOffset
);
210 ReadElement(aStream
, aStrokeOptions
.mLineWidth
);
211 ReadElement(aStream
, aStrokeOptions
.mMiterLimit
);
212 ReadElement(aStream
, joinStyle
);
213 ReadElement(aStream
, capStyle
);
214 // On 32 bit we truncate the value of dashLength.
215 // See also bug 811850 for history.
216 aStrokeOptions
.mDashLength
= size_t(dashLength
);
217 aStrokeOptions
.mLineJoin
= joinStyle
;
218 aStrokeOptions
.mLineCap
= capStyle
;
220 if (!aStrokeOptions
.mDashLength
) {
224 mDashPatternStorage
.resize(aStrokeOptions
.mDashLength
);
225 aStrokeOptions
.mDashPattern
= &mDashPatternStorage
.front();
226 aStream
.read((char*)aStrokeOptions
.mDashPattern
, sizeof(Float
) * aStrokeOptions
.mDashLength
);
230 RecordedEvent::OutputSimplePatternInfo(const PatternStorage
&aStorage
, std::stringstream
&aOutput
) const
232 switch (aStorage
.mType
) {
235 const Color color
= reinterpret_cast<const ColorPatternStorage
*>(&aStorage
.mStorage
)->mColor
;
236 aOutput
<< "Color: (" << color
.r
<< ", " << color
.g
<< ", " << color
.b
<< ", " << color
.a
<< ")";
239 case PATTERN_LINEAR_GRADIENT
:
241 const LinearGradientPatternStorage
*store
=
242 reinterpret_cast<const LinearGradientPatternStorage
*>(&aStorage
.mStorage
);
244 aOutput
<< "LinearGradient (" << store
->mBegin
.x
<< ", " << store
->mBegin
.y
<<
245 ") - (" << store
->mEnd
.x
<< ", " << store
->mEnd
.y
<< ") Stops: " << store
->mStops
;
248 case PATTERN_RADIAL_GRADIENT
:
250 const RadialGradientPatternStorage
*store
=
251 reinterpret_cast<const RadialGradientPatternStorage
*>(&aStorage
.mStorage
);
252 aOutput
<< "RadialGradient (Center 1: (" << store
->mCenter1
.x
<< ", " <<
253 store
->mCenter2
.y
<< ") Radius 2: " << store
->mRadius2
;
256 case PATTERN_SURFACE
:
258 const SurfacePatternStorage
*store
=
259 reinterpret_cast<const SurfacePatternStorage
*>(&aStorage
.mStorage
);
260 aOutput
<< "Surface (0x" << store
->mSurface
<< ")";
266 RecordedDrawingEvent::RecordedDrawingEvent(EventType aType
, std::istream
&aStream
)
267 : RecordedEvent(aType
)
269 ReadElement(aStream
, mDT
);
273 RecordedDrawingEvent::RecordToStream(ostream
&aStream
) const
275 WriteElement(aStream
, mDT
);
279 RecordedDrawingEvent::GetObject() const
285 RecordedDrawTargetCreation::PlayEvent(Translator
*aTranslator
) const
287 RefPtr
<DrawTarget
> newDT
=
288 aTranslator
->GetReferenceDrawTarget()->CreateSimilarDrawTarget(mSize
, mFormat
);
289 aTranslator
->AddDrawTarget(mRefPtr
, newDT
);
293 RecordedDrawTargetCreation::RecordToStream(ostream
&aStream
) const
295 WriteElement(aStream
, mRefPtr
);
296 WriteElement(aStream
, mBackendType
);
297 WriteElement(aStream
, mSize
);
298 WriteElement(aStream
, mFormat
);
301 RecordedDrawTargetCreation::RecordedDrawTargetCreation(istream
&aStream
)
302 : RecordedEvent(DRAWTARGETCREATION
)
304 ReadElement(aStream
, mRefPtr
);
305 ReadElement(aStream
, mBackendType
);
306 ReadElement(aStream
, mSize
);
307 ReadElement(aStream
, mFormat
);
311 RecordedDrawTargetCreation::OutputSimpleEventInfo(stringstream
&aStringStream
) const
313 aStringStream
<< "[" << mRefPtr
<< "] DrawTarget Creation (Type: " << NameFromBackend(mBackendType
) << ", Size: " << mSize
.width
<< "x" << mSize
.height
<< ")";
318 RecordedDrawTargetDestruction::PlayEvent(Translator
*aTranslator
) const
320 aTranslator
->RemoveDrawTarget(mRefPtr
);
324 RecordedDrawTargetDestruction::RecordToStream(ostream
&aStream
) const
326 WriteElement(aStream
, mRefPtr
);
329 RecordedDrawTargetDestruction::RecordedDrawTargetDestruction(istream
&aStream
)
330 : RecordedEvent(DRAWTARGETDESTRUCTION
)
332 ReadElement(aStream
, mRefPtr
);
336 RecordedDrawTargetDestruction::OutputSimpleEventInfo(stringstream
&aStringStream
) const
338 aStringStream
<< "[" << mRefPtr
<< "] DrawTarget Destruction";
341 struct GenericPattern
343 GenericPattern(const PatternStorage
&aStorage
, Translator
*aTranslator
)
344 : mPattern(NULL
), mTranslator(aTranslator
)
346 mStorage
= const_cast<PatternStorage
*>(&aStorage
);
351 mPattern
->~Pattern();
357 switch(mStorage
->mType
) {
359 return new (mColPat
) ColorPattern(reinterpret_cast<ColorPatternStorage
*>(&mStorage
->mStorage
)->mColor
);
360 case PATTERN_SURFACE
:
362 SurfacePatternStorage
*storage
= reinterpret_cast<SurfacePatternStorage
*>(&mStorage
->mStorage
);
364 new (mSurfPat
) SurfacePattern(mTranslator
->LookupSourceSurface(storage
->mSurface
),
365 storage
->mExtend
, storage
->mMatrix
, storage
->mFilter
);
368 case PATTERN_LINEAR_GRADIENT
:
370 LinearGradientPatternStorage
*storage
= reinterpret_cast<LinearGradientPatternStorage
*>(&mStorage
->mStorage
);
372 new (mLinGradPat
) LinearGradientPattern(storage
->mBegin
, storage
->mEnd
,
373 mTranslator
->LookupGradientStops(storage
->mStops
),
377 case PATTERN_RADIAL_GRADIENT
:
379 RadialGradientPatternStorage
*storage
= reinterpret_cast<RadialGradientPatternStorage
*>(&mStorage
->mStorage
);
381 new (mRadGradPat
) RadialGradientPattern(storage
->mCenter1
, storage
->mCenter2
,
382 storage
->mRadius1
, storage
->mRadius2
,
383 mTranslator
->LookupGradientStops(storage
->mStops
),
388 return new (mColPat
) ColorPattern(Color());
395 char mColPat
[sizeof(ColorPattern
)];
396 char mLinGradPat
[sizeof(LinearGradientPattern
)];
397 char mRadGradPat
[sizeof(RadialGradientPattern
)];
398 char mSurfPat
[sizeof(SurfacePattern
)];
401 PatternStorage
*mStorage
;
403 Translator
*mTranslator
;
407 RecordedFillRect::PlayEvent(Translator
*aTranslator
) const
409 aTranslator
->LookupDrawTarget(mDT
)->FillRect(mRect
, *GenericPattern(mPattern
, aTranslator
), mOptions
);
413 RecordedFillRect::RecordToStream(ostream
&aStream
) const
415 RecordedDrawingEvent::RecordToStream(aStream
);
416 WriteElement(aStream
, mRect
);
417 WriteElement(aStream
, mOptions
);
418 RecordPatternData(aStream
, mPattern
);
421 RecordedFillRect::RecordedFillRect(istream
&aStream
)
422 : RecordedDrawingEvent(FILLRECT
, aStream
)
424 ReadElement(aStream
, mRect
);
425 ReadElement(aStream
, mOptions
);
426 ReadPatternData(aStream
, mPattern
);
430 RecordedFillRect::OutputSimpleEventInfo(stringstream
&aStringStream
) const
432 aStringStream
<< "[" << mDT
<< "] FillRect (" << mRect
.x
<< ", " << mRect
.y
<< " - " << mRect
.width
<< " x " << mRect
.height
<< ") ";
433 OutputSimplePatternInfo(mPattern
, aStringStream
);
437 RecordedStrokeRect::PlayEvent(Translator
*aTranslator
) const
439 aTranslator
->LookupDrawTarget(mDT
)->StrokeRect(mRect
, *GenericPattern(mPattern
, aTranslator
), mStrokeOptions
, mOptions
);
443 RecordedStrokeRect::RecordToStream(ostream
&aStream
) const
445 RecordedDrawingEvent::RecordToStream(aStream
);
446 WriteElement(aStream
, mRect
);
447 WriteElement(aStream
, mOptions
);
448 RecordPatternData(aStream
, mPattern
);
449 RecordStrokeOptions(aStream
, mStrokeOptions
);
452 RecordedStrokeRect::RecordedStrokeRect(istream
&aStream
)
453 : RecordedDrawingEvent(STROKERECT
, aStream
)
455 ReadElement(aStream
, mRect
);
456 ReadElement(aStream
, mOptions
);
457 ReadPatternData(aStream
, mPattern
);
458 ReadStrokeOptions(aStream
, mStrokeOptions
);
462 RecordedStrokeRect::OutputSimpleEventInfo(stringstream
&aStringStream
) const
464 aStringStream
<< "[" << mDT
<< "] StrokeRect (" << mRect
.x
<< ", " << mRect
.y
<< " - " << mRect
.width
<< " x " << mRect
.height
465 << ") LineWidth: " << mStrokeOptions
.mLineWidth
<< "px ";
466 OutputSimplePatternInfo(mPattern
, aStringStream
);
470 RecordedStrokeLine::PlayEvent(Translator
*aTranslator
) const
472 aTranslator
->LookupDrawTarget(mDT
)->StrokeLine(mBegin
, mEnd
, *GenericPattern(mPattern
, aTranslator
), mStrokeOptions
, mOptions
);
476 RecordedStrokeLine::RecordToStream(ostream
&aStream
) const
478 RecordedDrawingEvent::RecordToStream(aStream
);
479 WriteElement(aStream
, mBegin
);
480 WriteElement(aStream
, mEnd
);
481 WriteElement(aStream
, mOptions
);
482 RecordPatternData(aStream
, mPattern
);
483 RecordStrokeOptions(aStream
, mStrokeOptions
);
486 RecordedStrokeLine::RecordedStrokeLine(istream
&aStream
)
487 : RecordedDrawingEvent(STROKELINE
, aStream
)
489 ReadElement(aStream
, mBegin
);
490 ReadElement(aStream
, mEnd
);
491 ReadElement(aStream
, mOptions
);
492 ReadPatternData(aStream
, mPattern
);
493 ReadStrokeOptions(aStream
, mStrokeOptions
);
497 RecordedStrokeLine::OutputSimpleEventInfo(stringstream
&aStringStream
) const
499 aStringStream
<< "[" << mDT
<< "] StrokeLine (" << mBegin
.x
<< ", " << mBegin
.y
<< " - " << mEnd
.x
<< ", " << mEnd
.y
500 << ") LineWidth: " << mStrokeOptions
.mLineWidth
<< "px ";
501 OutputSimplePatternInfo(mPattern
, aStringStream
);
505 RecordedFill::PlayEvent(Translator
*aTranslator
) const
507 aTranslator
->LookupDrawTarget(mDT
)->Fill(aTranslator
->LookupPath(mPath
), *GenericPattern(mPattern
, aTranslator
), mOptions
);
510 RecordedFill::RecordedFill(istream
&aStream
)
511 : RecordedDrawingEvent(FILL
, aStream
)
513 ReadElement(aStream
, mPath
);
514 ReadElement(aStream
, mOptions
);
515 ReadPatternData(aStream
, mPattern
);
519 RecordedFill::RecordToStream(ostream
&aStream
) const
521 RecordedDrawingEvent::RecordToStream(aStream
);
522 WriteElement(aStream
, mPath
);
523 WriteElement(aStream
, mOptions
);
524 RecordPatternData(aStream
, mPattern
);
528 RecordedFill::OutputSimpleEventInfo(stringstream
&aStringStream
) const
530 aStringStream
<< "[" << mDT
<< "] Fill (" << mPath
<< ") ";
531 OutputSimplePatternInfo(mPattern
, aStringStream
);
534 RecordedFillGlyphs::~RecordedFillGlyphs()
540 RecordedFillGlyphs::PlayEvent(Translator
*aTranslator
) const
543 buffer
.mGlyphs
= mGlyphs
;
544 buffer
.mNumGlyphs
= mNumGlyphs
;
545 aTranslator
->LookupDrawTarget(mDT
)->FillGlyphs(aTranslator
->LookupScaledFont(mScaledFont
), buffer
, *GenericPattern(mPattern
, aTranslator
), mOptions
);
548 RecordedFillGlyphs::RecordedFillGlyphs(istream
&aStream
)
549 : RecordedDrawingEvent(FILLGLYPHS
, aStream
)
551 ReadElement(aStream
, mScaledFont
);
552 ReadElement(aStream
, mOptions
);
553 ReadPatternData(aStream
, mPattern
);
554 ReadElement(aStream
, mNumGlyphs
);
555 mGlyphs
= new Glyph
[mNumGlyphs
];
556 aStream
.read((char*)mGlyphs
, sizeof(Glyph
) * mNumGlyphs
);
560 RecordedFillGlyphs::RecordToStream(ostream
&aStream
) const
562 RecordedDrawingEvent::RecordToStream(aStream
);
563 WriteElement(aStream
, mScaledFont
);
564 WriteElement(aStream
, mOptions
);
565 RecordPatternData(aStream
, mPattern
);
566 WriteElement(aStream
, mNumGlyphs
);
567 aStream
.write((char*)mGlyphs
, sizeof(Glyph
) * mNumGlyphs
);
571 RecordedFillGlyphs::OutputSimpleEventInfo(stringstream
&aStringStream
) const
573 aStringStream
<< "[" << mDT
<< "] FillGlyphs (" << mScaledFont
<< ") ";
574 OutputSimplePatternInfo(mPattern
, aStringStream
);
578 RecordedMask::PlayEvent(Translator
*aTranslator
) const
580 aTranslator
->LookupDrawTarget(mDT
)->Mask(*GenericPattern(mSource
, aTranslator
), *GenericPattern(mMask
, aTranslator
), mOptions
);
583 RecordedMask::RecordedMask(istream
&aStream
)
584 : RecordedDrawingEvent(MASK
, aStream
)
586 ReadElement(aStream
, mOptions
);
587 ReadPatternData(aStream
, mSource
);
588 ReadPatternData(aStream
, mMask
);
592 RecordedMask::RecordToStream(ostream
&aStream
) const
594 RecordedDrawingEvent::RecordToStream(aStream
);
595 WriteElement(aStream
, mOptions
);
596 RecordPatternData(aStream
, mSource
);
597 RecordPatternData(aStream
, mMask
);
601 RecordedMask::OutputSimpleEventInfo(stringstream
&aStringStream
) const
603 aStringStream
<< "[" << mDT
<< "] Mask (Source: ";
604 OutputSimplePatternInfo(mSource
, aStringStream
);
605 aStringStream
<< " Mask: ";
606 OutputSimplePatternInfo(mMask
, aStringStream
);
610 RecordedStroke::PlayEvent(Translator
*aTranslator
) const
612 aTranslator
->LookupDrawTarget(mDT
)->Stroke(aTranslator
->LookupPath(mPath
), *GenericPattern(mPattern
, aTranslator
), mStrokeOptions
, mOptions
);
616 RecordedStroke::RecordToStream(ostream
&aStream
) const
618 RecordedDrawingEvent::RecordToStream(aStream
);
619 WriteElement(aStream
, mPath
);
620 WriteElement(aStream
, mOptions
);
621 RecordPatternData(aStream
, mPattern
);
622 RecordStrokeOptions(aStream
, mStrokeOptions
);
625 RecordedStroke::RecordedStroke(istream
&aStream
)
626 : RecordedDrawingEvent(STROKE
, aStream
)
628 ReadElement(aStream
, mPath
);
629 ReadElement(aStream
, mOptions
);
630 ReadPatternData(aStream
, mPattern
);
631 ReadStrokeOptions(aStream
, mStrokeOptions
);
635 RecordedStroke::OutputSimpleEventInfo(stringstream
&aStringStream
) const
637 aStringStream
<< "[" << mDT
<< "] Stroke ("<< mPath
<< ") LineWidth: " << mStrokeOptions
.mLineWidth
<< "px ";
638 OutputSimplePatternInfo(mPattern
, aStringStream
);
642 RecordedClearRect::PlayEvent(Translator
*aTranslator
) const
644 aTranslator
->LookupDrawTarget(mDT
)->ClearRect(mRect
);
648 RecordedClearRect::RecordToStream(ostream
&aStream
) const
650 RecordedDrawingEvent::RecordToStream(aStream
);
651 WriteElement(aStream
, mRect
);
654 RecordedClearRect::RecordedClearRect(istream
&aStream
)
655 : RecordedDrawingEvent(CLEARRECT
, aStream
)
657 ReadElement(aStream
, mRect
);
661 RecordedClearRect::OutputSimpleEventInfo(stringstream
&aStringStream
) const
663 aStringStream
<< "[" << mDT
<< "] ClearRect (" << mRect
.x
<< ", " << mRect
.y
<< " - " << mRect
.width
<< " x " << mRect
.height
<< ") ";
667 RecordedCopySurface::PlayEvent(Translator
*aTranslator
) const
669 aTranslator
->LookupDrawTarget(mDT
)->CopySurface(aTranslator
->LookupSourceSurface(mSourceSurface
),
674 RecordedCopySurface::RecordToStream(ostream
&aStream
) const
676 RecordedDrawingEvent::RecordToStream(aStream
);
677 WriteElement(aStream
, mSourceSurface
);
678 WriteElement(aStream
, mSourceRect
);
679 WriteElement(aStream
, mDest
);
682 RecordedCopySurface::RecordedCopySurface(istream
&aStream
)
683 : RecordedDrawingEvent(COPYSURFACE
, aStream
)
685 ReadElement(aStream
, mSourceSurface
);
686 ReadElement(aStream
, mSourceRect
);
687 ReadElement(aStream
, mDest
);
691 RecordedCopySurface::OutputSimpleEventInfo(stringstream
&aStringStream
) const
693 aStringStream
<< "[" << mDT
<< "] CopySurface (" << mSourceSurface
<< ")";
697 RecordedPushClip::PlayEvent(Translator
*aTranslator
) const
699 aTranslator
->LookupDrawTarget(mDT
)->PushClip(aTranslator
->LookupPath(mPath
));
703 RecordedPushClip::RecordToStream(ostream
&aStream
) const
705 RecordedDrawingEvent::RecordToStream(aStream
);
706 WriteElement(aStream
, mPath
);
709 RecordedPushClip::RecordedPushClip(istream
&aStream
)
710 : RecordedDrawingEvent(PUSHCLIP
, aStream
)
712 ReadElement(aStream
, mPath
);
716 RecordedPushClip::OutputSimpleEventInfo(stringstream
&aStringStream
) const
718 aStringStream
<< "[" << mDT
<< "] PushClip (" << mPath
<< ") ";
722 RecordedPushClipRect::PlayEvent(Translator
*aTranslator
) const
724 aTranslator
->LookupDrawTarget(mDT
)->PushClipRect(mRect
);
728 RecordedPushClipRect::RecordToStream(ostream
&aStream
) const
730 RecordedDrawingEvent::RecordToStream(aStream
);
731 WriteElement(aStream
, mRect
);
734 RecordedPushClipRect::RecordedPushClipRect(istream
&aStream
)
735 : RecordedDrawingEvent(PUSHCLIPRECT
, aStream
)
737 ReadElement(aStream
, mRect
);
741 RecordedPushClipRect::OutputSimpleEventInfo(stringstream
&aStringStream
) const
743 aStringStream
<< "[" << mDT
<< "] PushClipRect (" << mRect
.x
<< ", " << mRect
.y
<< " - " << mRect
.width
<< " x " << mRect
.height
<< ") ";
747 RecordedPopClip::PlayEvent(Translator
*aTranslator
) const
749 aTranslator
->LookupDrawTarget(mDT
)->PopClip();
753 RecordedPopClip::RecordToStream(ostream
&aStream
) const
755 RecordedDrawingEvent::RecordToStream(aStream
);
758 RecordedPopClip::RecordedPopClip(istream
&aStream
)
759 : RecordedDrawingEvent(POPCLIP
, aStream
)
764 RecordedPopClip::OutputSimpleEventInfo(stringstream
&aStringStream
) const
766 aStringStream
<< "[" << mDT
<< "] PopClip";
770 RecordedSetTransform::PlayEvent(Translator
*aTranslator
) const
772 aTranslator
->LookupDrawTarget(mDT
)->SetTransform(mTransform
);
776 RecordedSetTransform::RecordToStream(ostream
&aStream
) const
778 RecordedDrawingEvent::RecordToStream(aStream
);
779 WriteElement(aStream
, mTransform
);
782 RecordedSetTransform::RecordedSetTransform(istream
&aStream
)
783 : RecordedDrawingEvent(SETTRANSFORM
, aStream
)
785 ReadElement(aStream
, mTransform
);
789 RecordedSetTransform::OutputSimpleEventInfo(stringstream
&aStringStream
) const
791 aStringStream
<< "[" << mDT
<< "] SetTransform [ " << mTransform
._11
<< " " << mTransform
._12
<< " ; " <<
792 mTransform
._21
<< " " << mTransform
._22
<< " ; " << mTransform
._31
<< " " << mTransform
._32
<< " ]";
796 RecordedDrawSurface::PlayEvent(Translator
*aTranslator
) const
798 aTranslator
->LookupDrawTarget(mDT
)->
799 DrawSurface(aTranslator
->LookupSourceSurface(mRefSource
), mDest
, mSource
,
800 mDSOptions
, mOptions
);
804 RecordedDrawSurface::RecordToStream(ostream
&aStream
) const
806 RecordedDrawingEvent::RecordToStream(aStream
);
807 WriteElement(aStream
, mRefSource
);
808 WriteElement(aStream
, mDest
);
809 WriteElement(aStream
, mSource
);
810 WriteElement(aStream
, mDSOptions
);
811 WriteElement(aStream
, mOptions
);
814 RecordedDrawSurface::RecordedDrawSurface(istream
&aStream
)
815 : RecordedDrawingEvent(DRAWSURFACE
, aStream
)
817 ReadElement(aStream
, mRefSource
);
818 ReadElement(aStream
, mDest
);
819 ReadElement(aStream
, mSource
);
820 ReadElement(aStream
, mDSOptions
);
821 ReadElement(aStream
, mOptions
);
825 RecordedDrawSurface::OutputSimpleEventInfo(stringstream
&aStringStream
) const
827 aStringStream
<< "[" << mDT
<< "] DrawSurface (" << mRefSource
<< ")";
831 RecordedDrawSurfaceWithShadow::PlayEvent(Translator
*aTranslator
) const
833 aTranslator
->LookupDrawTarget(mDT
)->
834 DrawSurfaceWithShadow(aTranslator
->LookupSourceSurface(mRefSource
),
835 mDest
, mColor
, mOffset
, mSigma
, mOp
);
839 RecordedDrawSurfaceWithShadow::RecordToStream(ostream
&aStream
) const
841 RecordedDrawingEvent::RecordToStream(aStream
);
842 WriteElement(aStream
, mRefSource
);
843 WriteElement(aStream
, mDest
);
844 WriteElement(aStream
, mColor
);
845 WriteElement(aStream
, mOffset
);
846 WriteElement(aStream
, mSigma
);
847 WriteElement(aStream
, mOp
);
850 RecordedDrawSurfaceWithShadow::RecordedDrawSurfaceWithShadow(istream
&aStream
)
851 : RecordedDrawingEvent(DRAWSURFACEWITHSHADOW
, aStream
)
853 ReadElement(aStream
, mRefSource
);
854 ReadElement(aStream
, mDest
);
855 ReadElement(aStream
, mColor
);
856 ReadElement(aStream
, mOffset
);
857 ReadElement(aStream
, mSigma
);
858 ReadElement(aStream
, mOp
);
862 RecordedDrawSurfaceWithShadow::OutputSimpleEventInfo(stringstream
&aStringStream
) const
864 aStringStream
<< "[" << mDT
<< "] DrawSurfaceWithShadow (" << mRefSource
<< ") Color: (" <<
865 mColor
.r
<< ", " << mColor
.g
<< ", " << mColor
.b
<< ", " << mColor
.a
<< ")";
868 RecordedPathCreation::RecordedPathCreation(PathRecording
*aPath
)
869 : RecordedEvent(PATHCREATION
), mRefPtr(aPath
), mFillRule(aPath
->mFillRule
), mPathOps(aPath
->mPathOps
)
873 RecordedPathCreation::~RecordedPathCreation()
878 RecordedPathCreation::PlayEvent(Translator
*aTranslator
) const
880 RefPtr
<PathBuilder
> builder
=
881 aTranslator
->GetReferenceDrawTarget()->CreatePathBuilder(mFillRule
);
883 for (size_t i
= 0; i
< mPathOps
.size(); i
++) {
884 const PathOp
&op
= mPathOps
[i
];
886 case PathOp::OP_MOVETO
:
887 builder
->MoveTo(op
.mP1
);
889 case PathOp::OP_LINETO
:
890 builder
->LineTo(op
.mP1
);
892 case PathOp::OP_BEZIERTO
:
893 builder
->BezierTo(op
.mP1
, op
.mP2
, op
.mP3
);
895 case PathOp::OP_QUADRATICBEZIERTO
:
896 builder
->QuadraticBezierTo(op
.mP1
, op
.mP2
);
898 case PathOp::OP_CLOSE
:
904 RefPtr
<Path
> path
= builder
->Finish();
905 aTranslator
->AddPath(mRefPtr
, path
);
909 RecordedPathCreation::RecordToStream(ostream
&aStream
) const
911 WriteElement(aStream
, mRefPtr
);
912 WriteElement(aStream
, uint64_t(mPathOps
.size()));
913 WriteElement(aStream
, mFillRule
);
914 typedef std::vector
<PathOp
> pathOpVec
;
915 for (pathOpVec::const_iterator iter
= mPathOps
.begin(); iter
!= mPathOps
.end(); iter
++) {
916 WriteElement(aStream
, iter
->mType
);
917 if (sPointCount
[iter
->mType
] >= 1) {
918 WriteElement(aStream
, iter
->mP1
);
920 if (sPointCount
[iter
->mType
] >= 2) {
921 WriteElement(aStream
, iter
->mP2
);
923 if (sPointCount
[iter
->mType
] >= 3) {
924 WriteElement(aStream
, iter
->mP3
);
930 RecordedPathCreation::RecordedPathCreation(istream
&aStream
)
931 : RecordedEvent(PATHCREATION
)
935 ReadElement(aStream
, mRefPtr
);
936 ReadElement(aStream
, size
);
937 ReadElement(aStream
, mFillRule
);
939 for (uint64_t i
= 0; i
< size
; i
++) {
941 ReadElement(aStream
, newPathOp
.mType
);
942 if (sPointCount
[newPathOp
.mType
] >= 1) {
943 ReadElement(aStream
, newPathOp
.mP1
);
945 if (sPointCount
[newPathOp
.mType
] >= 2) {
946 ReadElement(aStream
, newPathOp
.mP2
);
948 if (sPointCount
[newPathOp
.mType
] >= 3) {
949 ReadElement(aStream
, newPathOp
.mP3
);
952 mPathOps
.push_back(newPathOp
);
958 RecordedPathCreation::OutputSimpleEventInfo(stringstream
&aStringStream
) const
960 aStringStream
<< "[" << mRefPtr
<< "] Path created (OpCount: " << mPathOps
.size() << ")";
963 RecordedPathDestruction::PlayEvent(Translator
*aTranslator
) const
965 aTranslator
->RemovePath(mRefPtr
);
969 RecordedPathDestruction::RecordToStream(ostream
&aStream
) const
971 WriteElement(aStream
, mRefPtr
);
974 RecordedPathDestruction::RecordedPathDestruction(istream
&aStream
)
975 : RecordedEvent(PATHDESTRUCTION
)
977 ReadElement(aStream
, mRefPtr
);
981 RecordedPathDestruction::OutputSimpleEventInfo(stringstream
&aStringStream
) const
983 aStringStream
<< "[" << mRefPtr
<< "] Path Destroyed";
986 RecordedSourceSurfaceCreation::~RecordedSourceSurfaceCreation()
994 RecordedSourceSurfaceCreation::PlayEvent(Translator
*aTranslator
) const
996 RefPtr
<SourceSurface
> src
= aTranslator
->GetReferenceDrawTarget()->
997 CreateSourceSurfaceFromData(mData
, mSize
, mSize
.width
* BytesPerPixel(mFormat
), mFormat
);
998 aTranslator
->AddSourceSurface(mRefPtr
, src
);
1002 RecordedSourceSurfaceCreation::RecordToStream(ostream
&aStream
) const
1004 WriteElement(aStream
, mRefPtr
);
1005 WriteElement(aStream
, mSize
);
1006 WriteElement(aStream
, mFormat
);
1007 for (int y
= 0; y
< mSize
.height
; y
++) {
1008 aStream
.write((const char*)mData
+ y
* mStride
, BytesPerPixel(mFormat
) * mSize
.width
);
1012 RecordedSourceSurfaceCreation::RecordedSourceSurfaceCreation(istream
&aStream
)
1013 : RecordedEvent(SOURCESURFACECREATION
), mDataOwned(true)
1015 ReadElement(aStream
, mRefPtr
);
1016 ReadElement(aStream
, mSize
);
1017 ReadElement(aStream
, mFormat
);
1018 mData
= (uint8_t*)new char[mSize
.width
* mSize
.height
* BytesPerPixel(mFormat
)];
1019 aStream
.read((char*)mData
, mSize
.width
* mSize
.height
* BytesPerPixel(mFormat
));
1023 RecordedSourceSurfaceCreation::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1025 aStringStream
<< "[" << mRefPtr
<< "] SourceSurface created (Size: " << mSize
.width
<< "x" << mSize
.height
<< ")";
1029 RecordedSourceSurfaceDestruction::PlayEvent(Translator
*aTranslator
) const
1031 aTranslator
->RemoveSourceSurface(mRefPtr
);
1035 RecordedSourceSurfaceDestruction::RecordToStream(ostream
&aStream
) const
1037 WriteElement(aStream
, mRefPtr
);
1040 RecordedSourceSurfaceDestruction::RecordedSourceSurfaceDestruction(istream
&aStream
)
1041 : RecordedEvent(SOURCESURFACEDESTRUCTION
)
1043 ReadElement(aStream
, mRefPtr
);
1047 RecordedSourceSurfaceDestruction::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1049 aStringStream
<< "[" << mRefPtr
<< "] SourceSurface Destroyed";
1052 RecordedGradientStopsCreation::~RecordedGradientStopsCreation()
1060 RecordedGradientStopsCreation::PlayEvent(Translator
*aTranslator
) const
1062 RefPtr
<GradientStops
> src
= aTranslator
->GetReferenceDrawTarget()->
1063 CreateGradientStops(mStops
, mNumStops
, mExtendMode
);
1064 aTranslator
->AddGradientStops(mRefPtr
, src
);
1068 RecordedGradientStopsCreation::RecordToStream(ostream
&aStream
) const
1070 WriteElement(aStream
, mRefPtr
);
1071 WriteElement(aStream
, mExtendMode
);
1072 WriteElement(aStream
, mNumStops
);
1073 aStream
.write((const char*)mStops
, mNumStops
* sizeof(GradientStop
));
1076 RecordedGradientStopsCreation::RecordedGradientStopsCreation(istream
&aStream
)
1077 : RecordedEvent(GRADIENTSTOPSCREATION
), mDataOwned(true)
1079 ReadElement(aStream
, mRefPtr
);
1080 ReadElement(aStream
, mExtendMode
);
1081 ReadElement(aStream
, mNumStops
);
1082 mStops
= new GradientStop
[mNumStops
];
1084 aStream
.read((char*)mStops
, mNumStops
* sizeof(GradientStop
));
1088 RecordedGradientStopsCreation::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1090 aStringStream
<< "[" << mRefPtr
<< "] GradientStops created (Stops: " << mNumStops
<< ")";
1094 RecordedGradientStopsDestruction::PlayEvent(Translator
*aTranslator
) const
1096 aTranslator
->RemoveGradientStops(mRefPtr
);
1100 RecordedGradientStopsDestruction::RecordToStream(ostream
&aStream
) const
1102 WriteElement(aStream
, mRefPtr
);
1105 RecordedGradientStopsDestruction::RecordedGradientStopsDestruction(istream
&aStream
)
1106 : RecordedEvent(GRADIENTSTOPSDESTRUCTION
)
1108 ReadElement(aStream
, mRefPtr
);
1112 RecordedGradientStopsDestruction::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1114 aStringStream
<< "[" << mRefPtr
<< "] GradientStops Destroyed";
1118 RecordedSnapshot::PlayEvent(Translator
*aTranslator
) const
1120 RefPtr
<SourceSurface
> src
= aTranslator
->LookupDrawTarget(mDT
)->Snapshot();
1121 aTranslator
->AddSourceSurface(mRefPtr
, src
);
1125 RecordedSnapshot::RecordToStream(ostream
&aStream
) const
1127 WriteElement(aStream
, mRefPtr
);
1128 WriteElement(aStream
, mDT
);
1131 RecordedSnapshot::RecordedSnapshot(istream
&aStream
)
1132 : RecordedEvent(SNAPSHOT
)
1134 ReadElement(aStream
, mRefPtr
);
1135 ReadElement(aStream
, mDT
);
1139 RecordedSnapshot::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1141 aStringStream
<< "[" << mRefPtr
<< "] Snapshot Created (DT: " << mDT
<< ")";
1144 RecordedScaledFontCreation::~RecordedScaledFontCreation()
1150 RecordedScaledFontCreation::PlayEvent(Translator
*aTranslator
) const
1152 RefPtr
<ScaledFont
> scaledFont
=
1153 Factory::CreateScaledFontForTrueTypeData(mData
, mSize
, mIndex
, mGlyphSize
,
1154 aTranslator
->GetDesiredFontType());
1155 aTranslator
->AddScaledFont(mRefPtr
, scaledFont
);
1159 RecordedScaledFontCreation::RecordToStream(std::ostream
&aStream
) const
1161 WriteElement(aStream
, mRefPtr
);
1162 WriteElement(aStream
, mIndex
);
1163 WriteElement(aStream
, mGlyphSize
);
1164 WriteElement(aStream
, mSize
);
1165 aStream
.write((const char*)mData
, mSize
);
1169 RecordedScaledFontCreation::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1171 aStringStream
<< "[" << mRefPtr
<< "] ScaledFont Created";
1175 RecordedScaledFontCreation::SetFontData(const uint8_t *aData
, uint32_t aSize
, uint32_t aIndex
, Float aGlyphSize
)
1177 mData
= new uint8_t[aSize
];
1178 memcpy(mData
, aData
, aSize
);
1181 mGlyphSize
= aGlyphSize
;
1184 RecordedScaledFontCreation::RecordedScaledFontCreation(istream
&aStream
)
1185 : RecordedEvent(SCALEDFONTCREATION
)
1187 ReadElement(aStream
, mRefPtr
);
1188 ReadElement(aStream
, mIndex
);
1189 ReadElement(aStream
, mGlyphSize
);
1190 ReadElement(aStream
, mSize
);
1191 mData
= new uint8_t[mSize
];
1192 aStream
.read((char*)mData
, mSize
);
1196 RecordedScaledFontDestruction::PlayEvent(Translator
*aTranslator
) const
1198 aTranslator
->RemoveScaledFont(mRefPtr
);
1202 RecordedScaledFontDestruction::RecordToStream(ostream
&aStream
) const
1204 WriteElement(aStream
, mRefPtr
);
1207 RecordedScaledFontDestruction::RecordedScaledFontDestruction(istream
&aStream
)
1208 : RecordedEvent(SCALEDFONTDESTRUCTION
)
1210 ReadElement(aStream
, mRefPtr
);
1214 RecordedScaledFontDestruction::OutputSimpleEventInfo(stringstream
&aStringStream
) const
1216 aStringStream
<< "[" << mRefPtr
<< "] ScaledFont Destroyed";