Bug 849918 - Initial support for PannerNode's 3D positional audio (equalpower panning...
[gecko.git] / gfx / 2d / RecordedEvent.cpp
blobc8b649b93098bb64ae614f6eab3daa93c9b58dc3
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"
9 #include "Tools.h"
11 namespace mozilla {
12 namespace gfx {
14 using namespace std;
16 static std::string NameFromBackend(BackendType aType)
18 switch (aType) {
19 case BACKEND_NONE:
20 return "None";
21 case BACKEND_DIRECT2D:
22 return "Direct2D";
23 default:
24 return "Unknown";
28 #define LOAD_EVENT_TYPE(_typeenum, _class) \
29 case _typeenum: return new _class(aStream)
31 RecordedEvent *
32 RecordedEvent::LoadEventFromStream(std::istream &aStream, EventType aType)
34 switch (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);
61 default:
62 return NULL;
66 void
67 RecordedEvent::RecordPatternData(std::ostream &aStream, const PatternStorage &aPattern) const
69 WriteElement(aStream, aPattern.mType);
71 switch (aPattern.mType) {
72 case PATTERN_COLOR:
74 WriteElement(aStream, *reinterpret_cast<const ColorPatternStorage*>(&aPattern.mStorage));
75 return;
77 case PATTERN_LINEAR_GRADIENT:
79 WriteElement(aStream, *reinterpret_cast<const LinearGradientPatternStorage*>(&aPattern.mStorage));
80 return;
82 case PATTERN_RADIAL_GRADIENT:
84 WriteElement(aStream, *reinterpret_cast<const RadialGradientPatternStorage*>(&aPattern.mStorage));
85 return;
87 case PATTERN_SURFACE:
89 WriteElement(aStream, *reinterpret_cast<const SurfacePatternStorage*>(&aPattern.mStorage));
90 return;
92 default:
93 return;
97 void
98 RecordedEvent::ReadPatternData(std::istream &aStream, PatternStorage &aPattern) const
100 ReadElement(aStream, aPattern.mType);
102 switch (aPattern.mType) {
103 case PATTERN_COLOR:
105 ReadElement(aStream, *reinterpret_cast<ColorPatternStorage*>(&aPattern.mStorage));
106 return;
108 case PATTERN_LINEAR_GRADIENT:
110 ReadElement(aStream, *reinterpret_cast<LinearGradientPatternStorage*>(&aPattern.mStorage));
111 return;
113 case PATTERN_RADIAL_GRADIENT:
115 ReadElement(aStream, *reinterpret_cast<RadialGradientPatternStorage*>(&aPattern.mStorage));
116 return;
118 case PATTERN_SURFACE:
120 ReadElement(aStream, *reinterpret_cast<SurfacePatternStorage*>(&aPattern.mStorage));
121 return;
123 default:
124 return;
128 void
129 RecordedEvent::StorePattern(PatternStorage &aDestination, const Pattern &aSource) const
131 aDestination.mType = aSource.GetType();
133 switch (aSource.GetType()) {
134 case PATTERN_COLOR:
136 reinterpret_cast<ColorPatternStorage*>(&aDestination.mStorage)->mColor =
137 static_cast<const ColorPattern*>(&aSource)->mColor;
138 return;
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();
150 return;
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();
164 return;
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;
176 return;
181 void
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) {
195 return;
198 aStream.write((char*)aStrokeOptions.mDashPattern, sizeof(Float) * aStrokeOptions.mDashLength);
201 void
202 RecordedEvent::ReadStrokeOptions(std::istream &aStream, StrokeOptions &aStrokeOptions)
204 uint64_t dashLength;
205 JoinStyle joinStyle;
206 CapStyle capStyle;
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) {
221 return;
224 mDashPatternStorage.resize(aStrokeOptions.mDashLength);
225 aStrokeOptions.mDashPattern = &mDashPatternStorage.front();
226 aStream.read((char*)aStrokeOptions.mDashPattern, sizeof(Float) * aStrokeOptions.mDashLength);
229 void
230 RecordedEvent::OutputSimplePatternInfo(const PatternStorage &aStorage, std::stringstream &aOutput) const
232 switch (aStorage.mType) {
233 case PATTERN_COLOR:
235 const Color color = reinterpret_cast<const ColorPatternStorage*>(&aStorage.mStorage)->mColor;
236 aOutput << "Color: (" << color.r << ", " << color.g << ", " << color.b << ", " << color.a << ")";
237 return;
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;
246 return;
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;
254 return;
256 case PATTERN_SURFACE:
258 const SurfacePatternStorage *store =
259 reinterpret_cast<const SurfacePatternStorage*>(&aStorage.mStorage);
260 aOutput << "Surface (0x" << store->mSurface << ")";
261 return;
266 RecordedDrawingEvent::RecordedDrawingEvent(EventType aType, std::istream &aStream)
267 : RecordedEvent(aType)
269 ReadElement(aStream, mDT);
272 void
273 RecordedDrawingEvent::RecordToStream(ostream &aStream) const
275 WriteElement(aStream, mDT);
278 ReferencePtr
279 RecordedDrawingEvent::GetObject() const
281 return mDT;
284 void
285 RecordedDrawTargetCreation::PlayEvent(Translator *aTranslator) const
287 RefPtr<DrawTarget> newDT =
288 aTranslator->GetReferenceDrawTarget()->CreateSimilarDrawTarget(mSize, mFormat);
289 aTranslator->AddDrawTarget(mRefPtr, newDT);
292 void
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);
310 void
311 RecordedDrawTargetCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
313 aStringStream << "[" << mRefPtr << "] DrawTarget Creation (Type: " << NameFromBackend(mBackendType) << ", Size: " << mSize.width << "x" << mSize.height << ")";
317 void
318 RecordedDrawTargetDestruction::PlayEvent(Translator *aTranslator) const
320 aTranslator->RemoveDrawTarget(mRefPtr);
323 void
324 RecordedDrawTargetDestruction::RecordToStream(ostream &aStream) const
326 WriteElement(aStream, mRefPtr);
329 RecordedDrawTargetDestruction::RecordedDrawTargetDestruction(istream &aStream)
330 : RecordedEvent(DRAWTARGETDESTRUCTION)
332 ReadElement(aStream, mRefPtr);
335 void
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);
349 ~GenericPattern() {
350 if (mPattern) {
351 mPattern->~Pattern();
355 operator Pattern*()
357 switch(mStorage->mType) {
358 case PATTERN_COLOR:
359 return new (mColPat) ColorPattern(reinterpret_cast<ColorPatternStorage*>(&mStorage->mStorage)->mColor);
360 case PATTERN_SURFACE:
362 SurfacePatternStorage *storage = reinterpret_cast<SurfacePatternStorage*>(&mStorage->mStorage);
363 mPattern =
364 new (mSurfPat) SurfacePattern(mTranslator->LookupSourceSurface(storage->mSurface),
365 storage->mExtend, storage->mMatrix, storage->mFilter);
366 return mPattern;
368 case PATTERN_LINEAR_GRADIENT:
370 LinearGradientPatternStorage *storage = reinterpret_cast<LinearGradientPatternStorage*>(&mStorage->mStorage);
371 mPattern =
372 new (mLinGradPat) LinearGradientPattern(storage->mBegin, storage->mEnd,
373 mTranslator->LookupGradientStops(storage->mStops),
374 storage->mMatrix);
375 return mPattern;
377 case PATTERN_RADIAL_GRADIENT:
379 RadialGradientPatternStorage *storage = reinterpret_cast<RadialGradientPatternStorage*>(&mStorage->mStorage);
380 mPattern =
381 new (mRadGradPat) RadialGradientPattern(storage->mCenter1, storage->mCenter2,
382 storage->mRadius1, storage->mRadius2,
383 mTranslator->LookupGradientStops(storage->mStops),
384 storage->mMatrix);
385 return mPattern;
387 default:
388 return new (mColPat) ColorPattern(Color());
391 return mPattern;
394 union {
395 char mColPat[sizeof(ColorPattern)];
396 char mLinGradPat[sizeof(LinearGradientPattern)];
397 char mRadGradPat[sizeof(RadialGradientPattern)];
398 char mSurfPat[sizeof(SurfacePattern)];
401 PatternStorage *mStorage;
402 Pattern *mPattern;
403 Translator *mTranslator;
406 void
407 RecordedFillRect::PlayEvent(Translator *aTranslator) const
409 aTranslator->LookupDrawTarget(mDT)->FillRect(mRect, *GenericPattern(mPattern, aTranslator), mOptions);
412 void
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);
429 void
430 RecordedFillRect::OutputSimpleEventInfo(stringstream &aStringStream) const
432 aStringStream << "[" << mDT << "] FillRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height << ") ";
433 OutputSimplePatternInfo(mPattern, aStringStream);
436 void
437 RecordedStrokeRect::PlayEvent(Translator *aTranslator) const
439 aTranslator->LookupDrawTarget(mDT)->StrokeRect(mRect, *GenericPattern(mPattern, aTranslator), mStrokeOptions, mOptions);
442 void
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);
461 void
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);
469 void
470 RecordedStrokeLine::PlayEvent(Translator *aTranslator) const
472 aTranslator->LookupDrawTarget(mDT)->StrokeLine(mBegin, mEnd, *GenericPattern(mPattern, aTranslator), mStrokeOptions, mOptions);
475 void
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);
496 void
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);
504 void
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);
518 void
519 RecordedFill::RecordToStream(ostream &aStream) const
521 RecordedDrawingEvent::RecordToStream(aStream);
522 WriteElement(aStream, mPath);
523 WriteElement(aStream, mOptions);
524 RecordPatternData(aStream, mPattern);
527 void
528 RecordedFill::OutputSimpleEventInfo(stringstream &aStringStream) const
530 aStringStream << "[" << mDT << "] Fill (" << mPath << ") ";
531 OutputSimplePatternInfo(mPattern, aStringStream);
534 RecordedFillGlyphs::~RecordedFillGlyphs()
536 delete [] mGlyphs;
539 void
540 RecordedFillGlyphs::PlayEvent(Translator *aTranslator) const
542 GlyphBuffer buffer;
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);
559 void
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);
570 void
571 RecordedFillGlyphs::OutputSimpleEventInfo(stringstream &aStringStream) const
573 aStringStream << "[" << mDT << "] FillGlyphs (" << mScaledFont << ") ";
574 OutputSimplePatternInfo(mPattern, aStringStream);
577 void
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);
591 void
592 RecordedMask::RecordToStream(ostream &aStream) const
594 RecordedDrawingEvent::RecordToStream(aStream);
595 WriteElement(aStream, mOptions);
596 RecordPatternData(aStream, mSource);
597 RecordPatternData(aStream, mMask);
600 void
601 RecordedMask::OutputSimpleEventInfo(stringstream &aStringStream) const
603 aStringStream << "[" << mDT << "] Mask (Source: ";
604 OutputSimplePatternInfo(mSource, aStringStream);
605 aStringStream << " Mask: ";
606 OutputSimplePatternInfo(mMask, aStringStream);
609 void
610 RecordedStroke::PlayEvent(Translator *aTranslator) const
612 aTranslator->LookupDrawTarget(mDT)->Stroke(aTranslator->LookupPath(mPath), *GenericPattern(mPattern, aTranslator), mStrokeOptions, mOptions);
615 void
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);
634 void
635 RecordedStroke::OutputSimpleEventInfo(stringstream &aStringStream) const
637 aStringStream << "[" << mDT << "] Stroke ("<< mPath << ") LineWidth: " << mStrokeOptions.mLineWidth << "px ";
638 OutputSimplePatternInfo(mPattern, aStringStream);
641 void
642 RecordedClearRect::PlayEvent(Translator *aTranslator) const
644 aTranslator->LookupDrawTarget(mDT)->ClearRect(mRect);
647 void
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);
660 void
661 RecordedClearRect::OutputSimpleEventInfo(stringstream &aStringStream) const
663 aStringStream << "[" << mDT<< "] ClearRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height << ") ";
666 void
667 RecordedCopySurface::PlayEvent(Translator *aTranslator) const
669 aTranslator->LookupDrawTarget(mDT)->CopySurface(aTranslator->LookupSourceSurface(mSourceSurface),
670 mSourceRect, mDest);
673 void
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);
690 void
691 RecordedCopySurface::OutputSimpleEventInfo(stringstream &aStringStream) const
693 aStringStream << "[" << mDT<< "] CopySurface (" << mSourceSurface << ")";
696 void
697 RecordedPushClip::PlayEvent(Translator *aTranslator) const
699 aTranslator->LookupDrawTarget(mDT)->PushClip(aTranslator->LookupPath(mPath));
702 void
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);
715 void
716 RecordedPushClip::OutputSimpleEventInfo(stringstream &aStringStream) const
718 aStringStream << "[" << mDT << "] PushClip (" << mPath << ") ";
721 void
722 RecordedPushClipRect::PlayEvent(Translator *aTranslator) const
724 aTranslator->LookupDrawTarget(mDT)->PushClipRect(mRect);
727 void
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);
740 void
741 RecordedPushClipRect::OutputSimpleEventInfo(stringstream &aStringStream) const
743 aStringStream << "[" << mDT << "] PushClipRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height << ") ";
746 void
747 RecordedPopClip::PlayEvent(Translator *aTranslator) const
749 aTranslator->LookupDrawTarget(mDT)->PopClip();
752 void
753 RecordedPopClip::RecordToStream(ostream &aStream) const
755 RecordedDrawingEvent::RecordToStream(aStream);
758 RecordedPopClip::RecordedPopClip(istream &aStream)
759 : RecordedDrawingEvent(POPCLIP, aStream)
763 void
764 RecordedPopClip::OutputSimpleEventInfo(stringstream &aStringStream) const
766 aStringStream << "[" << mDT << "] PopClip";
769 void
770 RecordedSetTransform::PlayEvent(Translator *aTranslator) const
772 aTranslator->LookupDrawTarget(mDT)->SetTransform(mTransform);
775 void
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);
788 void
789 RecordedSetTransform::OutputSimpleEventInfo(stringstream &aStringStream) const
791 aStringStream << "[" << mDT << "] SetTransform [ " << mTransform._11 << " " << mTransform._12 << " ; " <<
792 mTransform._21 << " " << mTransform._22 << " ; " << mTransform._31 << " " << mTransform._32 << " ]";
795 void
796 RecordedDrawSurface::PlayEvent(Translator *aTranslator) const
798 aTranslator->LookupDrawTarget(mDT)->
799 DrawSurface(aTranslator->LookupSourceSurface(mRefSource), mDest, mSource,
800 mDSOptions, mOptions);
803 void
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);
824 void
825 RecordedDrawSurface::OutputSimpleEventInfo(stringstream &aStringStream) const
827 aStringStream << "[" << mDT << "] DrawSurface (" << mRefSource << ")";
830 void
831 RecordedDrawSurfaceWithShadow::PlayEvent(Translator *aTranslator) const
833 aTranslator->LookupDrawTarget(mDT)->
834 DrawSurfaceWithShadow(aTranslator->LookupSourceSurface(mRefSource),
835 mDest, mColor, mOffset, mSigma, mOp);
838 void
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);
861 void
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()
877 void
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];
885 switch (op.mType) {
886 case PathOp::OP_MOVETO:
887 builder->MoveTo(op.mP1);
888 break;
889 case PathOp::OP_LINETO:
890 builder->LineTo(op.mP1);
891 break;
892 case PathOp::OP_BEZIERTO:
893 builder->BezierTo(op.mP1, op.mP2, op.mP3);
894 break;
895 case PathOp::OP_QUADRATICBEZIERTO:
896 builder->QuadraticBezierTo(op.mP1, op.mP2);
897 break;
898 case PathOp::OP_CLOSE:
899 builder->Close();
900 break;
904 RefPtr<Path> path = builder->Finish();
905 aTranslator->AddPath(mRefPtr, path);
908 void
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)
933 uint64_t size;
935 ReadElement(aStream, mRefPtr);
936 ReadElement(aStream, size);
937 ReadElement(aStream, mFillRule);
939 for (uint64_t i = 0; i < size; i++) {
940 PathOp newPathOp;
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);
957 void
958 RecordedPathCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
960 aStringStream << "[" << mRefPtr << "] Path created (OpCount: " << mPathOps.size() << ")";
962 void
963 RecordedPathDestruction::PlayEvent(Translator *aTranslator) const
965 aTranslator->RemovePath(mRefPtr);
968 void
969 RecordedPathDestruction::RecordToStream(ostream &aStream) const
971 WriteElement(aStream, mRefPtr);
974 RecordedPathDestruction::RecordedPathDestruction(istream &aStream)
975 : RecordedEvent(PATHDESTRUCTION)
977 ReadElement(aStream, mRefPtr);
980 void
981 RecordedPathDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
983 aStringStream << "[" << mRefPtr << "] Path Destroyed";
986 RecordedSourceSurfaceCreation::~RecordedSourceSurfaceCreation()
988 if (mDataOwned) {
989 delete [] mData;
993 void
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);
1001 void
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));
1022 void
1023 RecordedSourceSurfaceCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
1025 aStringStream << "[" << mRefPtr << "] SourceSurface created (Size: " << mSize.width << "x" << mSize.height << ")";
1028 void
1029 RecordedSourceSurfaceDestruction::PlayEvent(Translator *aTranslator) const
1031 aTranslator->RemoveSourceSurface(mRefPtr);
1034 void
1035 RecordedSourceSurfaceDestruction::RecordToStream(ostream &aStream) const
1037 WriteElement(aStream, mRefPtr);
1040 RecordedSourceSurfaceDestruction::RecordedSourceSurfaceDestruction(istream &aStream)
1041 : RecordedEvent(SOURCESURFACEDESTRUCTION)
1043 ReadElement(aStream, mRefPtr);
1046 void
1047 RecordedSourceSurfaceDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
1049 aStringStream << "[" << mRefPtr << "] SourceSurface Destroyed";
1052 RecordedGradientStopsCreation::~RecordedGradientStopsCreation()
1054 if (mDataOwned) {
1055 delete [] mStops;
1059 void
1060 RecordedGradientStopsCreation::PlayEvent(Translator *aTranslator) const
1062 RefPtr<GradientStops> src = aTranslator->GetReferenceDrawTarget()->
1063 CreateGradientStops(mStops, mNumStops, mExtendMode);
1064 aTranslator->AddGradientStops(mRefPtr, src);
1067 void
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));
1087 void
1088 RecordedGradientStopsCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
1090 aStringStream << "[" << mRefPtr << "] GradientStops created (Stops: " << mNumStops << ")";
1093 void
1094 RecordedGradientStopsDestruction::PlayEvent(Translator *aTranslator) const
1096 aTranslator->RemoveGradientStops(mRefPtr);
1099 void
1100 RecordedGradientStopsDestruction::RecordToStream(ostream &aStream) const
1102 WriteElement(aStream, mRefPtr);
1105 RecordedGradientStopsDestruction::RecordedGradientStopsDestruction(istream &aStream)
1106 : RecordedEvent(GRADIENTSTOPSDESTRUCTION)
1108 ReadElement(aStream, mRefPtr);
1111 void
1112 RecordedGradientStopsDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
1114 aStringStream << "[" << mRefPtr << "] GradientStops Destroyed";
1117 void
1118 RecordedSnapshot::PlayEvent(Translator *aTranslator) const
1120 RefPtr<SourceSurface> src = aTranslator->LookupDrawTarget(mDT)->Snapshot();
1121 aTranslator->AddSourceSurface(mRefPtr, src);
1124 void
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);
1138 void
1139 RecordedSnapshot::OutputSimpleEventInfo(stringstream &aStringStream) const
1141 aStringStream << "[" << mRefPtr << "] Snapshot Created (DT: " << mDT << ")";
1144 RecordedScaledFontCreation::~RecordedScaledFontCreation()
1146 delete [] mData;
1149 void
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);
1158 void
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);
1168 void
1169 RecordedScaledFontCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
1171 aStringStream << "[" << mRefPtr << "] ScaledFont Created";
1174 void
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);
1179 mSize = aSize;
1180 mIndex = aIndex;
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);
1195 void
1196 RecordedScaledFontDestruction::PlayEvent(Translator *aTranslator) const
1198 aTranslator->RemoveScaledFont(mRefPtr);
1201 void
1202 RecordedScaledFontDestruction::RecordToStream(ostream &aStream) const
1204 WriteElement(aStream, mRefPtr);
1207 RecordedScaledFontDestruction::RecordedScaledFontDestruction(istream &aStream)
1208 : RecordedEvent(SCALEDFONTDESTRUCTION)
1210 ReadElement(aStream, mRefPtr);
1213 void
1214 RecordedScaledFontDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
1216 aStringStream << "[" << mRefPtr << "] ScaledFont Destroyed";