gfx/2d/RecordedEvent.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/2d/RecordedEvent.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,1561 @@
     1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     1.5 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "RecordedEvent.h"
    1.10 +#include "PathRecording.h"
    1.11 +
    1.12 +#include "Tools.h"
    1.13 +#include "Filters.h"
    1.14 +
    1.15 +namespace mozilla {
    1.16 +namespace gfx {
    1.17 +
    1.18 +using namespace std;
    1.19 +
    1.20 +static std::string NameFromBackend(BackendType aType)
    1.21 +{
    1.22 +  switch (aType) {
    1.23 +  case BackendType::NONE:
    1.24 +    return "None";
    1.25 +  case BackendType::DIRECT2D:
    1.26 +    return "Direct2D";
    1.27 +  default:
    1.28 +    return "Unknown";
    1.29 +  }
    1.30 +}
    1.31 +
    1.32 +#define LOAD_EVENT_TYPE(_typeenum, _class) \
    1.33 +  case _typeenum: return new _class(aStream)
    1.34 +
    1.35 +RecordedEvent *
    1.36 +RecordedEvent::LoadEventFromStream(std::istream &aStream, EventType aType)
    1.37 +{
    1.38 +  switch (aType) {
    1.39 +    LOAD_EVENT_TYPE(DRAWTARGETCREATION, RecordedDrawTargetCreation);
    1.40 +    LOAD_EVENT_TYPE(DRAWTARGETDESTRUCTION, RecordedDrawTargetDestruction);
    1.41 +    LOAD_EVENT_TYPE(FILLRECT, RecordedFillRect);
    1.42 +    LOAD_EVENT_TYPE(STROKERECT, RecordedStrokeRect);
    1.43 +    LOAD_EVENT_TYPE(STROKELINE, RecordedStrokeLine);
    1.44 +    LOAD_EVENT_TYPE(CLEARRECT, RecordedClearRect);
    1.45 +    LOAD_EVENT_TYPE(COPYSURFACE, RecordedCopySurface);
    1.46 +    LOAD_EVENT_TYPE(SETTRANSFORM, RecordedSetTransform);
    1.47 +    LOAD_EVENT_TYPE(PUSHCLIPRECT, RecordedPushClipRect);
    1.48 +    LOAD_EVENT_TYPE(PUSHCLIP, RecordedPushClip);
    1.49 +    LOAD_EVENT_TYPE(POPCLIP, RecordedPopClip);
    1.50 +    LOAD_EVENT_TYPE(FILL, RecordedFill);
    1.51 +    LOAD_EVENT_TYPE(FILLGLYPHS, RecordedFillGlyphs);
    1.52 +    LOAD_EVENT_TYPE(MASK, RecordedMask);
    1.53 +    LOAD_EVENT_TYPE(STROKE, RecordedStroke);
    1.54 +    LOAD_EVENT_TYPE(DRAWSURFACE, RecordedDrawSurface);
    1.55 +    LOAD_EVENT_TYPE(DRAWSURFACEWITHSHADOW, RecordedDrawSurfaceWithShadow);
    1.56 +    LOAD_EVENT_TYPE(DRAWFILTER, RecordedDrawFilter);
    1.57 +    LOAD_EVENT_TYPE(PATHCREATION, RecordedPathCreation);
    1.58 +    LOAD_EVENT_TYPE(PATHDESTRUCTION, RecordedPathDestruction);
    1.59 +    LOAD_EVENT_TYPE(SOURCESURFACECREATION, RecordedSourceSurfaceCreation);
    1.60 +    LOAD_EVENT_TYPE(SOURCESURFACEDESTRUCTION, RecordedSourceSurfaceDestruction);
    1.61 +    LOAD_EVENT_TYPE(FILTERNODECREATION, RecordedFilterNodeCreation);
    1.62 +    LOAD_EVENT_TYPE(FILTERNODEDESTRUCTION, RecordedFilterNodeDestruction);
    1.63 +    LOAD_EVENT_TYPE(GRADIENTSTOPSCREATION, RecordedGradientStopsCreation);
    1.64 +    LOAD_EVENT_TYPE(GRADIENTSTOPSDESTRUCTION, RecordedGradientStopsDestruction);
    1.65 +    LOAD_EVENT_TYPE(SNAPSHOT, RecordedSnapshot);
    1.66 +    LOAD_EVENT_TYPE(SCALEDFONTCREATION, RecordedScaledFontCreation);
    1.67 +    LOAD_EVENT_TYPE(SCALEDFONTDESTRUCTION, RecordedScaledFontDestruction);
    1.68 +    LOAD_EVENT_TYPE(MASKSURFACE, RecordedMaskSurface);
    1.69 +    LOAD_EVENT_TYPE(FILTERNODESETATTRIBUTE, RecordedFilterNodeSetAttribute);
    1.70 +    LOAD_EVENT_TYPE(FILTERNODESETINPUT, RecordedFilterNodeSetInput);
    1.71 +  default:
    1.72 +    return nullptr;
    1.73 +  }
    1.74 +}
    1.75 +
    1.76 +string
    1.77 +RecordedEvent::GetEventName(EventType aType)
    1.78 +{
    1.79 +  switch (aType) {
    1.80 +  case DRAWTARGETCREATION:
    1.81 +    return "DrawTarget Creation";
    1.82 +  case DRAWTARGETDESTRUCTION:
    1.83 +    return "DrawTarget Destruction";
    1.84 +  case FILLRECT:
    1.85 +    return "FillRect";
    1.86 +  case STROKERECT:
    1.87 +    return "StrokeRect";
    1.88 +  case STROKELINE:
    1.89 +    return "StrokeLine";
    1.90 +  case CLEARRECT:
    1.91 +    return "ClearRect";
    1.92 +  case COPYSURFACE:
    1.93 +    return "CopySurface";
    1.94 +  case SETTRANSFORM:
    1.95 +    return "SetTransform";
    1.96 +  case PUSHCLIP:
    1.97 +    return "PushClip";
    1.98 +  case PUSHCLIPRECT:
    1.99 +    return "PushClipRect";
   1.100 +  case POPCLIP:
   1.101 +    return "PopClip";
   1.102 +  case FILL:
   1.103 +    return "Fill";
   1.104 +  case FILLGLYPHS:
   1.105 +    return "FillGlyphs";
   1.106 +  case MASK:
   1.107 +    return "Mask";
   1.108 +  case STROKE:
   1.109 +    return "Stroke";
   1.110 +  case DRAWSURFACE:
   1.111 +    return "DrawSurface";
   1.112 +  case DRAWSURFACEWITHSHADOW:
   1.113 +    return "DrawSurfaceWithShadow";
   1.114 +  case DRAWFILTER:
   1.115 +    return "DrawFilter";
   1.116 +  case PATHCREATION:
   1.117 +    return "PathCreation";
   1.118 +  case PATHDESTRUCTION:
   1.119 +    return "PathDestruction";
   1.120 +  case SOURCESURFACECREATION:
   1.121 +    return "SourceSurfaceCreation";
   1.122 +  case SOURCESURFACEDESTRUCTION:
   1.123 +    return "SourceSurfaceDestruction";
   1.124 +  case FILTERNODECREATION:
   1.125 +    return "FilterNodeCreation";
   1.126 +  case FILTERNODEDESTRUCTION:
   1.127 +    return "FilterNodeDestruction";
   1.128 +  case GRADIENTSTOPSCREATION:
   1.129 +    return "GradientStopsCreation";
   1.130 +  case GRADIENTSTOPSDESTRUCTION:
   1.131 +    return "GradientStopsDestruction";
   1.132 +  case SNAPSHOT:
   1.133 +    return "Snapshot";
   1.134 +  case SCALEDFONTCREATION:
   1.135 +    return "ScaledFontCreation";
   1.136 +  case SCALEDFONTDESTRUCTION:
   1.137 +    return "ScaledFontDestruction";
   1.138 +  case MASKSURFACE:
   1.139 +    return "MaskSurface";
   1.140 +  case FILTERNODESETATTRIBUTE:
   1.141 +    return "SetAttribute";
   1.142 +  case FILTERNODESETINPUT:
   1.143 +    return "SetInput";
   1.144 +  default:
   1.145 +    return "Unknown";
   1.146 +  }
   1.147 +}
   1.148 +
   1.149 +void
   1.150 +RecordedEvent::RecordPatternData(std::ostream &aStream, const PatternStorage &aPattern) const
   1.151 +{
   1.152 +  WriteElement(aStream, aPattern.mType);
   1.153 +
   1.154 +  switch (aPattern.mType) {
   1.155 +  case PatternType::COLOR:
   1.156 +    {
   1.157 +      WriteElement(aStream, *reinterpret_cast<const ColorPatternStorage*>(&aPattern.mStorage));
   1.158 +      return;
   1.159 +    }
   1.160 +  case PatternType::LINEAR_GRADIENT:
   1.161 +    {
   1.162 +      WriteElement(aStream, *reinterpret_cast<const LinearGradientPatternStorage*>(&aPattern.mStorage));
   1.163 +      return;
   1.164 +    }
   1.165 +  case PatternType::RADIAL_GRADIENT:
   1.166 +    {
   1.167 +      WriteElement(aStream, *reinterpret_cast<const RadialGradientPatternStorage*>(&aPattern.mStorage));
   1.168 +      return;
   1.169 +    }
   1.170 +  case PatternType::SURFACE:
   1.171 +    {
   1.172 +      WriteElement(aStream, *reinterpret_cast<const SurfacePatternStorage*>(&aPattern.mStorage));
   1.173 +      return;
   1.174 +    }
   1.175 +  default:
   1.176 +    return;
   1.177 +  }
   1.178 +}
   1.179 +
   1.180 +void
   1.181 +RecordedEvent::ReadPatternData(std::istream &aStream, PatternStorage &aPattern) const
   1.182 +{
   1.183 +  ReadElement(aStream, aPattern.mType);
   1.184 +
   1.185 +  switch (aPattern.mType) {
   1.186 +  case PatternType::COLOR:
   1.187 +    {
   1.188 +      ReadElement(aStream, *reinterpret_cast<ColorPatternStorage*>(&aPattern.mStorage));
   1.189 +      return;
   1.190 +    }
   1.191 +  case PatternType::LINEAR_GRADIENT:
   1.192 +    {
   1.193 +      ReadElement(aStream, *reinterpret_cast<LinearGradientPatternStorage*>(&aPattern.mStorage));
   1.194 +      return;
   1.195 +    }
   1.196 +  case PatternType::RADIAL_GRADIENT:
   1.197 +    {
   1.198 +      ReadElement(aStream, *reinterpret_cast<RadialGradientPatternStorage*>(&aPattern.mStorage));
   1.199 +      return;
   1.200 +    }
   1.201 +  case PatternType::SURFACE:
   1.202 +    {
   1.203 +      ReadElement(aStream, *reinterpret_cast<SurfacePatternStorage*>(&aPattern.mStorage));
   1.204 +      return;
   1.205 +    }
   1.206 +  default:
   1.207 +    return;
   1.208 +  }
   1.209 +}
   1.210 +
   1.211 +void
   1.212 +RecordedEvent::StorePattern(PatternStorage &aDestination, const Pattern &aSource) const
   1.213 +{
   1.214 +  aDestination.mType = aSource.GetType();
   1.215 +  
   1.216 +  switch (aSource.GetType()) {
   1.217 +  case PatternType::COLOR:
   1.218 +    {
   1.219 +      reinterpret_cast<ColorPatternStorage*>(&aDestination.mStorage)->mColor =
   1.220 +        static_cast<const ColorPattern*>(&aSource)->mColor;
   1.221 +      return;
   1.222 +    }
   1.223 +  case PatternType::LINEAR_GRADIENT:
   1.224 +    {
   1.225 +      LinearGradientPatternStorage *store =
   1.226 +        reinterpret_cast<LinearGradientPatternStorage*>(&aDestination.mStorage);
   1.227 +      const LinearGradientPattern *pat =
   1.228 +        static_cast<const LinearGradientPattern*>(&aSource);
   1.229 +      store->mBegin = pat->mBegin;
   1.230 +      store->mEnd = pat->mEnd;
   1.231 +      store->mMatrix = pat->mMatrix;
   1.232 +      store->mStops = pat->mStops.get();
   1.233 +      return;
   1.234 +    }
   1.235 +  case PatternType::RADIAL_GRADIENT:
   1.236 +    {
   1.237 +      RadialGradientPatternStorage *store =
   1.238 +        reinterpret_cast<RadialGradientPatternStorage*>(&aDestination.mStorage);
   1.239 +      const RadialGradientPattern *pat =
   1.240 +        static_cast<const RadialGradientPattern*>(&aSource);
   1.241 +      store->mCenter1 = pat->mCenter1;
   1.242 +      store->mCenter2 = pat->mCenter2;
   1.243 +      store->mRadius1 = pat->mRadius1;
   1.244 +      store->mRadius2 = pat->mRadius2;
   1.245 +      store->mMatrix = pat->mMatrix;
   1.246 +      store->mStops = pat->mStops.get();
   1.247 +      return;
   1.248 +    }
   1.249 +  case PatternType::SURFACE:
   1.250 +    {
   1.251 +      SurfacePatternStorage *store =
   1.252 +        reinterpret_cast<SurfacePatternStorage*>(&aDestination.mStorage);
   1.253 +      const SurfacePattern *pat =
   1.254 +        static_cast<const SurfacePattern*>(&aSource);
   1.255 +      store->mExtend = pat->mExtendMode;
   1.256 +      store->mFilter = pat->mFilter;
   1.257 +      store->mMatrix = pat->mMatrix;
   1.258 +      store->mSurface = pat->mSurface;
   1.259 +      return;
   1.260 +    }
   1.261 +  }
   1.262 +}
   1.263 +
   1.264 +void
   1.265 +RecordedEvent::RecordStrokeOptions(std::ostream &aStream, const StrokeOptions &aStrokeOptions) const
   1.266 +{
   1.267 +  JoinStyle joinStyle = aStrokeOptions.mLineJoin;
   1.268 +  CapStyle capStyle = aStrokeOptions.mLineCap;
   1.269 +
   1.270 +  WriteElement(aStream, uint64_t(aStrokeOptions.mDashLength));
   1.271 +  WriteElement(aStream, aStrokeOptions.mDashOffset);
   1.272 +  WriteElement(aStream, aStrokeOptions.mLineWidth);
   1.273 +  WriteElement(aStream, aStrokeOptions.mMiterLimit);
   1.274 +  WriteElement(aStream, joinStyle);
   1.275 +  WriteElement(aStream, capStyle);
   1.276 +
   1.277 +  if (!aStrokeOptions.mDashPattern) {
   1.278 +    return;
   1.279 +  }
   1.280 +
   1.281 +  aStream.write((char*)aStrokeOptions.mDashPattern, sizeof(Float) * aStrokeOptions.mDashLength);
   1.282 +}
   1.283 +
   1.284 +void
   1.285 +RecordedEvent::ReadStrokeOptions(std::istream &aStream, StrokeOptions &aStrokeOptions)
   1.286 +{
   1.287 +  uint64_t dashLength;
   1.288 +  JoinStyle joinStyle;
   1.289 +  CapStyle capStyle;
   1.290 +
   1.291 +  ReadElement(aStream, dashLength);
   1.292 +  ReadElement(aStream, aStrokeOptions.mDashOffset);
   1.293 +  ReadElement(aStream, aStrokeOptions.mLineWidth);
   1.294 +  ReadElement(aStream, aStrokeOptions.mMiterLimit);
   1.295 +  ReadElement(aStream, joinStyle);
   1.296 +  ReadElement(aStream, capStyle);
   1.297 +  // On 32 bit we truncate the value of dashLength.
   1.298 +  // See also bug 811850 for history.
   1.299 +  aStrokeOptions.mDashLength = size_t(dashLength);
   1.300 +  aStrokeOptions.mLineJoin = joinStyle;
   1.301 +  aStrokeOptions.mLineCap = capStyle;
   1.302 +
   1.303 +  if (!aStrokeOptions.mDashLength) {
   1.304 +    return;
   1.305 +  }
   1.306 +
   1.307 +  mDashPatternStorage.resize(aStrokeOptions.mDashLength);
   1.308 +  aStrokeOptions.mDashPattern = &mDashPatternStorage.front();
   1.309 +  aStream.read((char*)aStrokeOptions.mDashPattern, sizeof(Float) * aStrokeOptions.mDashLength);
   1.310 +}
   1.311 +
   1.312 +void
   1.313 +RecordedEvent::OutputSimplePatternInfo(const PatternStorage &aStorage, std::stringstream &aOutput) const
   1.314 +{
   1.315 +  switch (aStorage.mType) {
   1.316 +  case PatternType::COLOR:
   1.317 +    {
   1.318 +      const Color color = reinterpret_cast<const ColorPatternStorage*>(&aStorage.mStorage)->mColor;
   1.319 +      aOutput << "Color: (" << color.r << ", " << color.g << ", " << color.b << ", " << color.a << ")";
   1.320 +      return;
   1.321 +    }
   1.322 +  case PatternType::LINEAR_GRADIENT:
   1.323 +    {
   1.324 +      const LinearGradientPatternStorage *store =
   1.325 +        reinterpret_cast<const LinearGradientPatternStorage*>(&aStorage.mStorage);
   1.326 +
   1.327 +      aOutput << "LinearGradient (" << store->mBegin.x << ", " << store->mBegin.y <<
   1.328 +        ") - (" << store->mEnd.x << ", " << store->mEnd.y << ") Stops: " << store->mStops;
   1.329 +      return;
   1.330 +    }
   1.331 +  case PatternType::RADIAL_GRADIENT:
   1.332 +    {
   1.333 +      const RadialGradientPatternStorage *store =
   1.334 +        reinterpret_cast<const RadialGradientPatternStorage*>(&aStorage.mStorage);
   1.335 +      aOutput << "RadialGradient (Center 1: (" << store->mCenter1.x << ", " <<
   1.336 +        store->mCenter2.y << ") Radius 2: " << store->mRadius2;
   1.337 +      return;
   1.338 +    }
   1.339 +  case PatternType::SURFACE:
   1.340 +    {
   1.341 +      const SurfacePatternStorage *store =
   1.342 +        reinterpret_cast<const SurfacePatternStorage*>(&aStorage.mStorage);
   1.343 +      aOutput << "Surface (0x" << store->mSurface << ")";
   1.344 +      return;
   1.345 +    }
   1.346 +  }
   1.347 +}
   1.348 +
   1.349 +RecordedDrawingEvent::RecordedDrawingEvent(EventType aType, std::istream &aStream)
   1.350 +  : RecordedEvent(aType)
   1.351 +{
   1.352 +  ReadElement(aStream, mDT);
   1.353 +}
   1.354 +
   1.355 +void
   1.356 +RecordedDrawingEvent::RecordToStream(ostream &aStream) const
   1.357 +{
   1.358 +  WriteElement(aStream, mDT);
   1.359 +}
   1.360 +
   1.361 +ReferencePtr
   1.362 +RecordedDrawingEvent::GetObjectRef() const
   1.363 +{
   1.364 +  return mDT;
   1.365 +}
   1.366 +
   1.367 +void
   1.368 +RecordedDrawTargetCreation::PlayEvent(Translator *aTranslator) const
   1.369 +{
   1.370 +  RefPtr<DrawTarget> newDT =
   1.371 +    aTranslator->GetReferenceDrawTarget()->CreateSimilarDrawTarget(mSize, mFormat);
   1.372 +  aTranslator->AddDrawTarget(mRefPtr, newDT);
   1.373 +
   1.374 +  if (mHasExistingData) {
   1.375 +    Rect dataRect(0, 0, mExistingData->GetSize().width, mExistingData->GetSize().height);
   1.376 +    newDT->DrawSurface(mExistingData, dataRect, dataRect);
   1.377 +  }
   1.378 +}
   1.379 +
   1.380 +void
   1.381 +RecordedDrawTargetCreation::RecordToStream(ostream &aStream) const
   1.382 +{
   1.383 +  WriteElement(aStream, mRefPtr);
   1.384 +  WriteElement(aStream, mBackendType);
   1.385 +  WriteElement(aStream, mSize);
   1.386 +  WriteElement(aStream, mFormat);
   1.387 +  WriteElement(aStream, mHasExistingData);
   1.388 +
   1.389 +  if (mHasExistingData) {
   1.390 +    MOZ_ASSERT(mExistingData);
   1.391 +    MOZ_ASSERT(mExistingData->GetSize() == mSize);
   1.392 +    RefPtr<DataSourceSurface> dataSurf = mExistingData->GetDataSurface();
   1.393 +    for (int y = 0; y < mSize.height; y++) {
   1.394 +      aStream.write((const char*)dataSurf->GetData() + y * dataSurf->Stride(),
   1.395 +                    BytesPerPixel(mFormat) * mSize.width);
   1.396 +    }
   1.397 +  }
   1.398 +}
   1.399 +
   1.400 +RecordedDrawTargetCreation::RecordedDrawTargetCreation(istream &aStream)
   1.401 +  : RecordedEvent(DRAWTARGETCREATION)
   1.402 +{
   1.403 +  ReadElement(aStream, mRefPtr);
   1.404 +  ReadElement(aStream, mBackendType);
   1.405 +  ReadElement(aStream, mSize);
   1.406 +  ReadElement(aStream, mFormat);
   1.407 +  ReadElement(aStream, mHasExistingData);
   1.408 +
   1.409 +  if (mHasExistingData) {
   1.410 +    RefPtr<DataSourceSurface> dataSurf = Factory::CreateDataSourceSurface(mSize, mFormat);
   1.411 +    for (int y = 0; y < mSize.height; y++) {
   1.412 +      aStream.read((char*)dataSurf->GetData() + y * dataSurf->Stride(),
   1.413 +                    BytesPerPixel(mFormat) * mSize.width);
   1.414 +    }
   1.415 +    mExistingData = dataSurf;
   1.416 +  }
   1.417 +}
   1.418 +
   1.419 +void
   1.420 +RecordedDrawTargetCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.421 +{
   1.422 +  aStringStream << "[" << mRefPtr << "] DrawTarget Creation (Type: " << NameFromBackend(mBackendType) << ", Size: " << mSize.width << "x" << mSize.height << ")";
   1.423 +}
   1.424 +
   1.425 +
   1.426 +void
   1.427 +RecordedDrawTargetDestruction::PlayEvent(Translator *aTranslator) const
   1.428 +{
   1.429 +  aTranslator->RemoveDrawTarget(mRefPtr);
   1.430 +}
   1.431 +
   1.432 +void
   1.433 +RecordedDrawTargetDestruction::RecordToStream(ostream &aStream) const
   1.434 +{
   1.435 +  WriteElement(aStream, mRefPtr);
   1.436 +}
   1.437 +
   1.438 +RecordedDrawTargetDestruction::RecordedDrawTargetDestruction(istream &aStream)
   1.439 +  : RecordedEvent(DRAWTARGETDESTRUCTION)
   1.440 +{
   1.441 +  ReadElement(aStream, mRefPtr);
   1.442 +}
   1.443 +
   1.444 +void
   1.445 +RecordedDrawTargetDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.446 +{
   1.447 +  aStringStream << "[" << mRefPtr << "] DrawTarget Destruction";
   1.448 +}
   1.449 +
   1.450 +struct GenericPattern
   1.451 +{
   1.452 +  GenericPattern(const PatternStorage &aStorage, Translator *aTranslator)
   1.453 +    : mPattern(nullptr), mTranslator(aTranslator)
   1.454 +  {
   1.455 +    mStorage = const_cast<PatternStorage*>(&aStorage);
   1.456 +  }
   1.457 +
   1.458 +  ~GenericPattern() {
   1.459 +    if (mPattern) {
   1.460 +      mPattern->~Pattern();
   1.461 +    }
   1.462 +  }
   1.463 +
   1.464 +  operator Pattern*()
   1.465 +  {
   1.466 +    switch(mStorage->mType) {
   1.467 +    case PatternType::COLOR:
   1.468 +      return new (mColPat) ColorPattern(reinterpret_cast<ColorPatternStorage*>(&mStorage->mStorage)->mColor);
   1.469 +    case PatternType::SURFACE:
   1.470 +      {
   1.471 +        SurfacePatternStorage *storage = reinterpret_cast<SurfacePatternStorage*>(&mStorage->mStorage);
   1.472 +        mPattern =
   1.473 +          new (mSurfPat) SurfacePattern(mTranslator->LookupSourceSurface(storage->mSurface),
   1.474 +                                        storage->mExtend, storage->mMatrix, storage->mFilter);
   1.475 +        return mPattern;
   1.476 +      }
   1.477 +    case PatternType::LINEAR_GRADIENT:
   1.478 +      {
   1.479 +        LinearGradientPatternStorage *storage = reinterpret_cast<LinearGradientPatternStorage*>(&mStorage->mStorage);
   1.480 +        mPattern =
   1.481 +          new (mLinGradPat) LinearGradientPattern(storage->mBegin, storage->mEnd,
   1.482 +                                                  mTranslator->LookupGradientStops(storage->mStops),
   1.483 +                                                  storage->mMatrix);
   1.484 +        return mPattern;
   1.485 +      }
   1.486 +    case PatternType::RADIAL_GRADIENT:
   1.487 +      {
   1.488 +        RadialGradientPatternStorage *storage = reinterpret_cast<RadialGradientPatternStorage*>(&mStorage->mStorage);
   1.489 +        mPattern =
   1.490 +          new (mRadGradPat) RadialGradientPattern(storage->mCenter1, storage->mCenter2,
   1.491 +                                                  storage->mRadius1, storage->mRadius2,
   1.492 +                                                  mTranslator->LookupGradientStops(storage->mStops),
   1.493 +                                                  storage->mMatrix);
   1.494 +        return mPattern;
   1.495 +      }
   1.496 +    default:
   1.497 +      return new (mColPat) ColorPattern(Color());
   1.498 +    }
   1.499 +
   1.500 +    return mPattern;
   1.501 +  }
   1.502 +
   1.503 +  union {
   1.504 +    char mColPat[sizeof(ColorPattern)];
   1.505 +    char mLinGradPat[sizeof(LinearGradientPattern)];
   1.506 +    char mRadGradPat[sizeof(RadialGradientPattern)];
   1.507 +    char mSurfPat[sizeof(SurfacePattern)];
   1.508 +  };
   1.509 +
   1.510 +  PatternStorage *mStorage;
   1.511 +  Pattern *mPattern;
   1.512 +  Translator *mTranslator;
   1.513 +};
   1.514 +
   1.515 +void
   1.516 +RecordedFillRect::PlayEvent(Translator *aTranslator) const
   1.517 +{
   1.518 +  aTranslator->LookupDrawTarget(mDT)->FillRect(mRect, *GenericPattern(mPattern, aTranslator), mOptions);
   1.519 +}
   1.520 +
   1.521 +void
   1.522 +RecordedFillRect::RecordToStream(ostream &aStream) const
   1.523 +{
   1.524 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.525 +  WriteElement(aStream, mRect);
   1.526 +  WriteElement(aStream, mOptions);
   1.527 +  RecordPatternData(aStream, mPattern);
   1.528 +}
   1.529 +
   1.530 +RecordedFillRect::RecordedFillRect(istream &aStream)
   1.531 +  : RecordedDrawingEvent(FILLRECT, aStream)
   1.532 +{
   1.533 +  ReadElement(aStream, mRect);
   1.534 +  ReadElement(aStream, mOptions);
   1.535 +  ReadPatternData(aStream, mPattern);
   1.536 +}
   1.537 +
   1.538 +void
   1.539 +RecordedFillRect::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.540 +{
   1.541 +  aStringStream << "[" << mDT << "] FillRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height << ") ";
   1.542 +  OutputSimplePatternInfo(mPattern, aStringStream);
   1.543 +}
   1.544 +
   1.545 +void
   1.546 +RecordedStrokeRect::PlayEvent(Translator *aTranslator) const
   1.547 +{
   1.548 +  aTranslator->LookupDrawTarget(mDT)->StrokeRect(mRect, *GenericPattern(mPattern, aTranslator), mStrokeOptions, mOptions);
   1.549 +}
   1.550 +
   1.551 +void
   1.552 +RecordedStrokeRect::RecordToStream(ostream &aStream) const
   1.553 +{
   1.554 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.555 +  WriteElement(aStream, mRect);
   1.556 +  WriteElement(aStream, mOptions);
   1.557 +  RecordPatternData(aStream, mPattern);
   1.558 +  RecordStrokeOptions(aStream, mStrokeOptions);
   1.559 +}
   1.560 +
   1.561 +RecordedStrokeRect::RecordedStrokeRect(istream &aStream)
   1.562 +  : RecordedDrawingEvent(STROKERECT, aStream)
   1.563 +{
   1.564 +  ReadElement(aStream, mRect);
   1.565 +  ReadElement(aStream, mOptions);
   1.566 +  ReadPatternData(aStream, mPattern);
   1.567 +  ReadStrokeOptions(aStream, mStrokeOptions);
   1.568 +}
   1.569 +
   1.570 +void
   1.571 +RecordedStrokeRect::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.572 +{
   1.573 +  aStringStream << "[" << mDT << "] StrokeRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height
   1.574 +                << ") LineWidth: " << mStrokeOptions.mLineWidth << "px ";
   1.575 +  OutputSimplePatternInfo(mPattern, aStringStream);
   1.576 +}
   1.577 +
   1.578 +void
   1.579 +RecordedStrokeLine::PlayEvent(Translator *aTranslator) const
   1.580 +{
   1.581 +  aTranslator->LookupDrawTarget(mDT)->StrokeLine(mBegin, mEnd, *GenericPattern(mPattern, aTranslator), mStrokeOptions, mOptions);
   1.582 +}
   1.583 +
   1.584 +void
   1.585 +RecordedStrokeLine::RecordToStream(ostream &aStream) const
   1.586 +{
   1.587 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.588 +  WriteElement(aStream, mBegin);
   1.589 +  WriteElement(aStream, mEnd);
   1.590 +  WriteElement(aStream, mOptions);
   1.591 +  RecordPatternData(aStream, mPattern);
   1.592 +  RecordStrokeOptions(aStream, mStrokeOptions);
   1.593 +}
   1.594 +
   1.595 +RecordedStrokeLine::RecordedStrokeLine(istream &aStream)
   1.596 +  : RecordedDrawingEvent(STROKELINE, aStream)
   1.597 +{
   1.598 +  ReadElement(aStream, mBegin);
   1.599 +  ReadElement(aStream, mEnd);
   1.600 +  ReadElement(aStream, mOptions);
   1.601 +  ReadPatternData(aStream, mPattern);
   1.602 +  ReadStrokeOptions(aStream, mStrokeOptions);
   1.603 +}
   1.604 +
   1.605 +void
   1.606 +RecordedStrokeLine::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.607 +{
   1.608 +  aStringStream << "[" << mDT << "] StrokeLine (" << mBegin.x << ", " << mBegin.y << " - " << mEnd.x << ", " << mEnd.y
   1.609 +                << ") LineWidth: " << mStrokeOptions.mLineWidth << "px ";
   1.610 +  OutputSimplePatternInfo(mPattern, aStringStream);
   1.611 +}
   1.612 +
   1.613 +void
   1.614 +RecordedFill::PlayEvent(Translator *aTranslator) const
   1.615 +{
   1.616 +  aTranslator->LookupDrawTarget(mDT)->Fill(aTranslator->LookupPath(mPath), *GenericPattern(mPattern, aTranslator), mOptions);
   1.617 +}
   1.618 +
   1.619 +RecordedFill::RecordedFill(istream &aStream)
   1.620 +  : RecordedDrawingEvent(FILL, aStream)
   1.621 +{
   1.622 +  ReadElement(aStream, mPath);
   1.623 +  ReadElement(aStream, mOptions);
   1.624 +  ReadPatternData(aStream, mPattern);
   1.625 +}
   1.626 +
   1.627 +void
   1.628 +RecordedFill::RecordToStream(ostream &aStream) const
   1.629 +{
   1.630 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.631 +  WriteElement(aStream, mPath);
   1.632 +  WriteElement(aStream, mOptions);
   1.633 +  RecordPatternData(aStream, mPattern);
   1.634 +}
   1.635 +
   1.636 +void
   1.637 +RecordedFill::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.638 +{
   1.639 +  aStringStream << "[" << mDT << "] Fill (" << mPath << ") ";
   1.640 +  OutputSimplePatternInfo(mPattern, aStringStream);
   1.641 +}
   1.642 +
   1.643 +RecordedFillGlyphs::~RecordedFillGlyphs()
   1.644 +{
   1.645 +  delete [] mGlyphs;
   1.646 +}
   1.647 +
   1.648 +void
   1.649 +RecordedFillGlyphs::PlayEvent(Translator *aTranslator) const
   1.650 +{
   1.651 +  GlyphBuffer buffer;
   1.652 +  buffer.mGlyphs = mGlyphs;
   1.653 +  buffer.mNumGlyphs = mNumGlyphs;
   1.654 +  aTranslator->LookupDrawTarget(mDT)->FillGlyphs(aTranslator->LookupScaledFont(mScaledFont), buffer, *GenericPattern(mPattern, aTranslator), mOptions);
   1.655 +}
   1.656 +
   1.657 +RecordedFillGlyphs::RecordedFillGlyphs(istream &aStream)
   1.658 +  : RecordedDrawingEvent(FILLGLYPHS, aStream)
   1.659 +{
   1.660 +  ReadElement(aStream, mScaledFont);
   1.661 +  ReadElement(aStream, mOptions);
   1.662 +  ReadPatternData(aStream, mPattern);
   1.663 +  ReadElement(aStream, mNumGlyphs);
   1.664 +  mGlyphs = new Glyph[mNumGlyphs];
   1.665 +  aStream.read((char*)mGlyphs, sizeof(Glyph) * mNumGlyphs);
   1.666 +}
   1.667 +
   1.668 +void
   1.669 +RecordedFillGlyphs::RecordToStream(ostream &aStream) const
   1.670 +{
   1.671 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.672 +  WriteElement(aStream, mScaledFont);
   1.673 +  WriteElement(aStream, mOptions);
   1.674 +  RecordPatternData(aStream, mPattern);
   1.675 +  WriteElement(aStream, mNumGlyphs);
   1.676 +  aStream.write((char*)mGlyphs, sizeof(Glyph) * mNumGlyphs);
   1.677 +}
   1.678 +
   1.679 +void
   1.680 +RecordedFillGlyphs::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.681 +{
   1.682 +  aStringStream << "[" << mDT << "] FillGlyphs (" << mScaledFont << ") ";
   1.683 +  OutputSimplePatternInfo(mPattern, aStringStream);
   1.684 +}
   1.685 +
   1.686 +void
   1.687 +RecordedMask::PlayEvent(Translator *aTranslator) const
   1.688 +{
   1.689 +  aTranslator->LookupDrawTarget(mDT)->Mask(*GenericPattern(mSource, aTranslator), *GenericPattern(mMask, aTranslator), mOptions);
   1.690 +}
   1.691 +
   1.692 +RecordedMask::RecordedMask(istream &aStream)
   1.693 +  : RecordedDrawingEvent(MASK, aStream)
   1.694 +{
   1.695 +  ReadElement(aStream, mOptions);
   1.696 +  ReadPatternData(aStream, mSource);
   1.697 +  ReadPatternData(aStream, mMask);
   1.698 +}
   1.699 +
   1.700 +void
   1.701 +RecordedMask::RecordToStream(ostream &aStream) const
   1.702 +{
   1.703 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.704 +  WriteElement(aStream, mOptions);
   1.705 +  RecordPatternData(aStream, mSource);
   1.706 +  RecordPatternData(aStream, mMask);
   1.707 +}
   1.708 +
   1.709 +void
   1.710 +RecordedMask::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.711 +{
   1.712 +  aStringStream << "[" << mDT << "] Mask (Source: ";
   1.713 +  OutputSimplePatternInfo(mSource, aStringStream);
   1.714 +  aStringStream << " Mask: ";
   1.715 +  OutputSimplePatternInfo(mMask, aStringStream);
   1.716 +}
   1.717 +
   1.718 +void
   1.719 +RecordedStroke::PlayEvent(Translator *aTranslator) const
   1.720 +{
   1.721 +  aTranslator->LookupDrawTarget(mDT)->Stroke(aTranslator->LookupPath(mPath), *GenericPattern(mPattern, aTranslator), mStrokeOptions, mOptions);
   1.722 +}
   1.723 +
   1.724 +void
   1.725 +RecordedStroke::RecordToStream(ostream &aStream) const
   1.726 +{
   1.727 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.728 +  WriteElement(aStream, mPath);
   1.729 +  WriteElement(aStream, mOptions);
   1.730 +  RecordPatternData(aStream, mPattern);
   1.731 +  RecordStrokeOptions(aStream, mStrokeOptions);
   1.732 +}
   1.733 +
   1.734 +RecordedStroke::RecordedStroke(istream &aStream)
   1.735 +  : RecordedDrawingEvent(STROKE, aStream)
   1.736 +{
   1.737 +  ReadElement(aStream, mPath);
   1.738 +  ReadElement(aStream, mOptions);
   1.739 +  ReadPatternData(aStream, mPattern);
   1.740 +  ReadStrokeOptions(aStream, mStrokeOptions);
   1.741 +}
   1.742 +
   1.743 +void
   1.744 +RecordedStroke::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.745 +{
   1.746 +  aStringStream << "[" << mDT << "] Stroke ("<< mPath << ") LineWidth: " << mStrokeOptions.mLineWidth << "px ";
   1.747 +  OutputSimplePatternInfo(mPattern, aStringStream);
   1.748 +}
   1.749 +
   1.750 +void
   1.751 +RecordedClearRect::PlayEvent(Translator *aTranslator) const
   1.752 +{
   1.753 +  aTranslator->LookupDrawTarget(mDT)->ClearRect(mRect);
   1.754 +}
   1.755 +
   1.756 +void
   1.757 +RecordedClearRect::RecordToStream(ostream &aStream) const
   1.758 +{
   1.759 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.760 +  WriteElement(aStream, mRect);
   1.761 +}
   1.762 +
   1.763 +RecordedClearRect::RecordedClearRect(istream &aStream)
   1.764 +  : RecordedDrawingEvent(CLEARRECT, aStream)
   1.765 +{
   1.766 +    ReadElement(aStream, mRect);
   1.767 +}
   1.768 +
   1.769 +void
   1.770 +RecordedClearRect::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.771 +{
   1.772 +  aStringStream << "[" << mDT<< "] ClearRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height << ") ";
   1.773 +}
   1.774 +
   1.775 +void
   1.776 +RecordedCopySurface::PlayEvent(Translator *aTranslator) const
   1.777 +{
   1.778 +	aTranslator->LookupDrawTarget(mDT)->CopySurface(aTranslator->LookupSourceSurface(mSourceSurface),
   1.779 +                                                  mSourceRect, mDest);
   1.780 +}
   1.781 +
   1.782 +void
   1.783 +RecordedCopySurface::RecordToStream(ostream &aStream) const
   1.784 +{
   1.785 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.786 +  WriteElement(aStream, mSourceSurface);
   1.787 +  WriteElement(aStream, mSourceRect);
   1.788 +  WriteElement(aStream, mDest);
   1.789 +}
   1.790 +
   1.791 +RecordedCopySurface::RecordedCopySurface(istream &aStream)
   1.792 +  : RecordedDrawingEvent(COPYSURFACE, aStream)
   1.793 +{
   1.794 +  ReadElement(aStream, mSourceSurface);
   1.795 +  ReadElement(aStream, mSourceRect);
   1.796 +  ReadElement(aStream, mDest);
   1.797 +}
   1.798 +
   1.799 +void
   1.800 +RecordedCopySurface::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.801 +{
   1.802 +  aStringStream << "[" << mDT<< "] CopySurface (" << mSourceSurface << ")";
   1.803 +}
   1.804 +
   1.805 +void
   1.806 +RecordedPushClip::PlayEvent(Translator *aTranslator) const
   1.807 +{
   1.808 +  aTranslator->LookupDrawTarget(mDT)->PushClip(aTranslator->LookupPath(mPath));
   1.809 +}
   1.810 +
   1.811 +void
   1.812 +RecordedPushClip::RecordToStream(ostream &aStream) const
   1.813 +{
   1.814 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.815 +  WriteElement(aStream, mPath);
   1.816 +}
   1.817 +
   1.818 +RecordedPushClip::RecordedPushClip(istream &aStream)
   1.819 +  : RecordedDrawingEvent(PUSHCLIP, aStream)
   1.820 +{
   1.821 +  ReadElement(aStream, mPath);
   1.822 +}
   1.823 +
   1.824 +void
   1.825 +RecordedPushClip::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.826 +{
   1.827 +  aStringStream << "[" << mDT << "] PushClip (" << mPath << ") ";
   1.828 +}
   1.829 +
   1.830 +void
   1.831 +RecordedPushClipRect::PlayEvent(Translator *aTranslator) const
   1.832 +{
   1.833 +  aTranslator->LookupDrawTarget(mDT)->PushClipRect(mRect);
   1.834 +}
   1.835 +
   1.836 +void
   1.837 +RecordedPushClipRect::RecordToStream(ostream &aStream) const
   1.838 +{
   1.839 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.840 +  WriteElement(aStream, mRect);
   1.841 +}
   1.842 +
   1.843 +RecordedPushClipRect::RecordedPushClipRect(istream &aStream)
   1.844 +  : RecordedDrawingEvent(PUSHCLIPRECT, aStream)
   1.845 +{
   1.846 +  ReadElement(aStream, mRect);
   1.847 +}
   1.848 +
   1.849 +void
   1.850 +RecordedPushClipRect::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.851 +{
   1.852 +  aStringStream << "[" << mDT << "] PushClipRect (" << mRect.x << ", " << mRect.y << " - " << mRect.width << " x " << mRect.height << ") ";
   1.853 +}
   1.854 +
   1.855 +void
   1.856 +RecordedPopClip::PlayEvent(Translator *aTranslator) const
   1.857 +{
   1.858 +  aTranslator->LookupDrawTarget(mDT)->PopClip();
   1.859 +}
   1.860 +
   1.861 +void
   1.862 +RecordedPopClip::RecordToStream(ostream &aStream) const
   1.863 +{
   1.864 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.865 +}
   1.866 +
   1.867 +RecordedPopClip::RecordedPopClip(istream &aStream)
   1.868 +  : RecordedDrawingEvent(POPCLIP, aStream)
   1.869 +{
   1.870 +}
   1.871 +
   1.872 +void
   1.873 +RecordedPopClip::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.874 +{
   1.875 +  aStringStream << "[" << mDT << "] PopClip";
   1.876 +}
   1.877 +
   1.878 +void
   1.879 +RecordedSetTransform::PlayEvent(Translator *aTranslator) const
   1.880 +{
   1.881 +  aTranslator->LookupDrawTarget(mDT)->SetTransform(mTransform);
   1.882 +}
   1.883 +
   1.884 +void
   1.885 +RecordedSetTransform::RecordToStream(ostream &aStream) const
   1.886 +{
   1.887 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.888 +  WriteElement(aStream, mTransform);
   1.889 +}
   1.890 +
   1.891 +RecordedSetTransform::RecordedSetTransform(istream &aStream)
   1.892 +  : RecordedDrawingEvent(SETTRANSFORM, aStream)
   1.893 +{
   1.894 +  ReadElement(aStream, mTransform);
   1.895 +}
   1.896 +
   1.897 +void
   1.898 +RecordedSetTransform::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.899 +{
   1.900 +  aStringStream << "[" << mDT << "] SetTransform [ " << mTransform._11 << " " << mTransform._12 << " ; " <<
   1.901 +    mTransform._21 << " " << mTransform._22 << " ; " << mTransform._31 << " " << mTransform._32 << " ]";
   1.902 +}
   1.903 +
   1.904 +void
   1.905 +RecordedDrawSurface::PlayEvent(Translator *aTranslator) const
   1.906 +{
   1.907 +  aTranslator->LookupDrawTarget(mDT)->
   1.908 +    DrawSurface(aTranslator->LookupSourceSurface(mRefSource), mDest, mSource,
   1.909 +                mDSOptions, mOptions);
   1.910 +}
   1.911 +
   1.912 +void
   1.913 +RecordedDrawSurface::RecordToStream(ostream &aStream) const
   1.914 +{
   1.915 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.916 +  WriteElement(aStream, mRefSource);
   1.917 +  WriteElement(aStream, mDest);
   1.918 +  WriteElement(aStream, mSource);
   1.919 +  WriteElement(aStream, mDSOptions);
   1.920 +  WriteElement(aStream, mOptions);
   1.921 +}
   1.922 +
   1.923 +RecordedDrawSurface::RecordedDrawSurface(istream &aStream)
   1.924 +  : RecordedDrawingEvent(DRAWSURFACE, aStream)
   1.925 +{
   1.926 +  ReadElement(aStream, mRefSource);
   1.927 +  ReadElement(aStream, mDest);
   1.928 +  ReadElement(aStream, mSource);
   1.929 +  ReadElement(aStream, mDSOptions);
   1.930 +  ReadElement(aStream, mOptions);
   1.931 +}
   1.932 +
   1.933 +void
   1.934 +RecordedDrawSurface::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.935 +{
   1.936 +  aStringStream << "[" << mDT << "] DrawSurface (" << mRefSource << ")";
   1.937 +}
   1.938 +
   1.939 +void
   1.940 +RecordedDrawFilter::PlayEvent(Translator *aTranslator) const
   1.941 +{
   1.942 +  aTranslator->LookupDrawTarget(mDT)->
   1.943 +    DrawFilter(aTranslator->LookupFilterNode(mNode), mSourceRect,
   1.944 +                mDestPoint, mOptions);
   1.945 +}
   1.946 +
   1.947 +void
   1.948 +RecordedDrawFilter::RecordToStream(ostream &aStream) const
   1.949 +{
   1.950 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.951 +  WriteElement(aStream, mNode);
   1.952 +  WriteElement(aStream, mSourceRect);
   1.953 +  WriteElement(aStream, mDestPoint);
   1.954 +  WriteElement(aStream, mOptions);
   1.955 +}
   1.956 +
   1.957 +RecordedDrawFilter::RecordedDrawFilter(istream &aStream)
   1.958 +  : RecordedDrawingEvent(DRAWFILTER, aStream)
   1.959 +{
   1.960 +  ReadElement(aStream, mNode);
   1.961 +  ReadElement(aStream, mSourceRect);
   1.962 +  ReadElement(aStream, mDestPoint);
   1.963 +  ReadElement(aStream, mOptions);
   1.964 +}
   1.965 +
   1.966 +void
   1.967 +RecordedDrawFilter::OutputSimpleEventInfo(stringstream &aStringStream) const
   1.968 +{
   1.969 +  aStringStream << "[" << mDT << "] DrawFilter (" << mNode << ")";
   1.970 +}
   1.971 +
   1.972 +void
   1.973 +RecordedDrawSurfaceWithShadow::PlayEvent(Translator *aTranslator) const
   1.974 +{
   1.975 +  aTranslator->LookupDrawTarget(mDT)->
   1.976 +    DrawSurfaceWithShadow(aTranslator->LookupSourceSurface(mRefSource),
   1.977 +                          mDest, mColor, mOffset, mSigma, mOp);
   1.978 +}
   1.979 +
   1.980 +void
   1.981 +RecordedDrawSurfaceWithShadow::RecordToStream(ostream &aStream) const
   1.982 +{
   1.983 +  RecordedDrawingEvent::RecordToStream(aStream);
   1.984 +  WriteElement(aStream, mRefSource);
   1.985 +  WriteElement(aStream, mDest);
   1.986 +  WriteElement(aStream, mColor);
   1.987 +  WriteElement(aStream, mOffset);
   1.988 +  WriteElement(aStream, mSigma);
   1.989 +  WriteElement(aStream, mOp);
   1.990 +}
   1.991 +
   1.992 +RecordedDrawSurfaceWithShadow::RecordedDrawSurfaceWithShadow(istream &aStream)
   1.993 +  : RecordedDrawingEvent(DRAWSURFACEWITHSHADOW, aStream)
   1.994 +{
   1.995 +  ReadElement(aStream, mRefSource);
   1.996 +  ReadElement(aStream, mDest);
   1.997 +  ReadElement(aStream, mColor);
   1.998 +  ReadElement(aStream, mOffset);
   1.999 +  ReadElement(aStream, mSigma);
  1.1000 +  ReadElement(aStream, mOp);
  1.1001 +}
  1.1002 +
  1.1003 +void
  1.1004 +RecordedDrawSurfaceWithShadow::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1005 +{
  1.1006 +  aStringStream << "[" << mDT << "] DrawSurfaceWithShadow (" << mRefSource << ") Color: (" <<
  1.1007 +    mColor.r << ", " << mColor.g << ", " << mColor.b << ", " << mColor.a << ")";
  1.1008 +}
  1.1009 +
  1.1010 +RecordedPathCreation::RecordedPathCreation(PathRecording *aPath)
  1.1011 +  : RecordedEvent(PATHCREATION), mRefPtr(aPath), mFillRule(aPath->mFillRule), mPathOps(aPath->mPathOps)
  1.1012 +{
  1.1013 +}
  1.1014 +
  1.1015 +RecordedPathCreation::~RecordedPathCreation()
  1.1016 +{
  1.1017 +}
  1.1018 +
  1.1019 +void
  1.1020 +RecordedPathCreation::PlayEvent(Translator *aTranslator) const
  1.1021 +{
  1.1022 +  RefPtr<PathBuilder> builder = 
  1.1023 +    aTranslator->GetReferenceDrawTarget()->CreatePathBuilder(mFillRule);
  1.1024 +
  1.1025 +  for (size_t i = 0; i < mPathOps.size(); i++) {
  1.1026 +    const PathOp &op = mPathOps[i];
  1.1027 +    switch (op.mType) {
  1.1028 +    case PathOp::OP_MOVETO:
  1.1029 +      builder->MoveTo(op.mP1);
  1.1030 +      break;
  1.1031 +    case PathOp::OP_LINETO:
  1.1032 +      builder->LineTo(op.mP1);
  1.1033 +      break;
  1.1034 +    case PathOp::OP_BEZIERTO:
  1.1035 +      builder->BezierTo(op.mP1, op.mP2, op.mP3);
  1.1036 +      break;
  1.1037 +    case PathOp::OP_QUADRATICBEZIERTO:
  1.1038 +      builder->QuadraticBezierTo(op.mP1, op.mP2);
  1.1039 +      break;
  1.1040 +    case PathOp::OP_CLOSE:
  1.1041 +      builder->Close();
  1.1042 +      break;
  1.1043 +    }
  1.1044 +  }
  1.1045 +
  1.1046 +  RefPtr<Path> path = builder->Finish();
  1.1047 +  aTranslator->AddPath(mRefPtr, path);
  1.1048 +}
  1.1049 +
  1.1050 +void
  1.1051 +RecordedPathCreation::RecordToStream(ostream &aStream) const
  1.1052 +{
  1.1053 +  WriteElement(aStream, mRefPtr);
  1.1054 +  WriteElement(aStream, uint64_t(mPathOps.size()));
  1.1055 +  WriteElement(aStream, mFillRule);
  1.1056 +  typedef std::vector<PathOp> pathOpVec;
  1.1057 +  for (pathOpVec::const_iterator iter = mPathOps.begin(); iter != mPathOps.end(); iter++) {
  1.1058 +    WriteElement(aStream, iter->mType);
  1.1059 +    if (sPointCount[iter->mType] >= 1) {
  1.1060 +      WriteElement(aStream, iter->mP1);
  1.1061 +    }
  1.1062 +    if (sPointCount[iter->mType] >= 2) {
  1.1063 +      WriteElement(aStream, iter->mP2);
  1.1064 +    }
  1.1065 +    if (sPointCount[iter->mType] >= 3) {
  1.1066 +      WriteElement(aStream, iter->mP3);
  1.1067 +    }
  1.1068 +  }
  1.1069 +
  1.1070 +}
  1.1071 +
  1.1072 +RecordedPathCreation::RecordedPathCreation(istream &aStream)
  1.1073 +  : RecordedEvent(PATHCREATION)
  1.1074 +{
  1.1075 +  uint64_t size;
  1.1076 +
  1.1077 +  ReadElement(aStream, mRefPtr);
  1.1078 +  ReadElement(aStream, size);
  1.1079 +  ReadElement(aStream, mFillRule);
  1.1080 +
  1.1081 +  for (uint64_t i = 0; i < size; i++) {
  1.1082 +    PathOp newPathOp;
  1.1083 +    ReadElement(aStream, newPathOp.mType);
  1.1084 +    if (sPointCount[newPathOp.mType] >= 1) {
  1.1085 +      ReadElement(aStream, newPathOp.mP1);
  1.1086 +    }
  1.1087 +    if (sPointCount[newPathOp.mType] >= 2) {
  1.1088 +      ReadElement(aStream, newPathOp.mP2);
  1.1089 +    }
  1.1090 +    if (sPointCount[newPathOp.mType] >= 3) {
  1.1091 +      ReadElement(aStream, newPathOp.mP3);
  1.1092 +    }
  1.1093 +
  1.1094 +    mPathOps.push_back(newPathOp);
  1.1095 +  }
  1.1096 +
  1.1097 +}
  1.1098 +
  1.1099 +void
  1.1100 +RecordedPathCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1101 +{
  1.1102 +  aStringStream << "[" << mRefPtr << "] Path created (OpCount: " << mPathOps.size() << ")";
  1.1103 +}
  1.1104 +void
  1.1105 +RecordedPathDestruction::PlayEvent(Translator *aTranslator) const
  1.1106 +{
  1.1107 +  aTranslator->RemovePath(mRefPtr);
  1.1108 +}
  1.1109 +
  1.1110 +void
  1.1111 +RecordedPathDestruction::RecordToStream(ostream &aStream) const
  1.1112 +{
  1.1113 +  WriteElement(aStream, mRefPtr);
  1.1114 +}
  1.1115 +
  1.1116 +RecordedPathDestruction::RecordedPathDestruction(istream &aStream)
  1.1117 +  : RecordedEvent(PATHDESTRUCTION)
  1.1118 +{
  1.1119 +  ReadElement(aStream, mRefPtr);
  1.1120 +}
  1.1121 +
  1.1122 +void
  1.1123 +RecordedPathDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1124 +{
  1.1125 +  aStringStream << "[" << mRefPtr << "] Path Destroyed";
  1.1126 +}
  1.1127 +
  1.1128 +RecordedSourceSurfaceCreation::~RecordedSourceSurfaceCreation()
  1.1129 +{
  1.1130 +  if (mDataOwned) {
  1.1131 +    delete [] mData;
  1.1132 +  }
  1.1133 +}
  1.1134 +
  1.1135 +void
  1.1136 +RecordedSourceSurfaceCreation::PlayEvent(Translator *aTranslator) const
  1.1137 +{
  1.1138 +  RefPtr<SourceSurface> src = aTranslator->GetReferenceDrawTarget()->
  1.1139 +    CreateSourceSurfaceFromData(mData, mSize, mSize.width * BytesPerPixel(mFormat), mFormat);
  1.1140 +  aTranslator->AddSourceSurface(mRefPtr, src);
  1.1141 +}
  1.1142 +
  1.1143 +void
  1.1144 +RecordedSourceSurfaceCreation::RecordToStream(ostream &aStream) const
  1.1145 +{
  1.1146 +  WriteElement(aStream, mRefPtr);
  1.1147 +  WriteElement(aStream, mSize);
  1.1148 +  WriteElement(aStream, mFormat);
  1.1149 +  for (int y = 0; y < mSize.height; y++) {
  1.1150 +    aStream.write((const char*)mData + y * mStride, BytesPerPixel(mFormat) * mSize.width);
  1.1151 +  }
  1.1152 +}
  1.1153 +
  1.1154 +RecordedSourceSurfaceCreation::RecordedSourceSurfaceCreation(istream &aStream)
  1.1155 +  : RecordedEvent(SOURCESURFACECREATION), mDataOwned(true)
  1.1156 +{
  1.1157 +  ReadElement(aStream, mRefPtr);
  1.1158 +  ReadElement(aStream, mSize);
  1.1159 +  ReadElement(aStream, mFormat);
  1.1160 +  mData = (uint8_t*)new char[mSize.width * mSize.height * BytesPerPixel(mFormat)];
  1.1161 +  aStream.read((char*)mData, mSize.width * mSize.height * BytesPerPixel(mFormat));
  1.1162 +}
  1.1163 +
  1.1164 +void
  1.1165 +RecordedSourceSurfaceCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1166 +{
  1.1167 +  aStringStream << "[" << mRefPtr << "] SourceSurface created (Size: " << mSize.width << "x" << mSize.height << ")";
  1.1168 +}
  1.1169 +
  1.1170 +void
  1.1171 +RecordedSourceSurfaceDestruction::PlayEvent(Translator *aTranslator) const
  1.1172 +{
  1.1173 +  aTranslator->RemoveSourceSurface(mRefPtr);
  1.1174 +}
  1.1175 +
  1.1176 +void
  1.1177 +RecordedSourceSurfaceDestruction::RecordToStream(ostream &aStream) const
  1.1178 +{
  1.1179 +  WriteElement(aStream, mRefPtr);
  1.1180 +}
  1.1181 +
  1.1182 +RecordedSourceSurfaceDestruction::RecordedSourceSurfaceDestruction(istream &aStream)
  1.1183 +  : RecordedEvent(SOURCESURFACEDESTRUCTION)
  1.1184 +{
  1.1185 +  ReadElement(aStream, mRefPtr);
  1.1186 +}
  1.1187 +
  1.1188 +void
  1.1189 +RecordedSourceSurfaceDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1190 +{
  1.1191 +  aStringStream << "[" << mRefPtr << "] SourceSurface Destroyed";
  1.1192 +}
  1.1193 +
  1.1194 +RecordedFilterNodeCreation::~RecordedFilterNodeCreation()
  1.1195 +{
  1.1196 +}
  1.1197 +
  1.1198 +void
  1.1199 +RecordedFilterNodeCreation::PlayEvent(Translator *aTranslator) const
  1.1200 +{
  1.1201 +  RefPtr<FilterNode> node = aTranslator->GetReferenceDrawTarget()->
  1.1202 +    CreateFilter(mType);
  1.1203 +  aTranslator->AddFilterNode(mRefPtr, node);
  1.1204 +}
  1.1205 +
  1.1206 +void
  1.1207 +RecordedFilterNodeCreation::RecordToStream(ostream &aStream) const
  1.1208 +{
  1.1209 +  WriteElement(aStream, mRefPtr);
  1.1210 +  WriteElement(aStream, mType);
  1.1211 +}
  1.1212 +
  1.1213 +RecordedFilterNodeCreation::RecordedFilterNodeCreation(istream &aStream)
  1.1214 +  : RecordedEvent(FILTERNODECREATION)
  1.1215 +{
  1.1216 +  ReadElement(aStream, mRefPtr);
  1.1217 +  ReadElement(aStream, mType);
  1.1218 +}
  1.1219 +
  1.1220 +void
  1.1221 +RecordedFilterNodeCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1222 +{
  1.1223 +  aStringStream << "[" << mRefPtr << "] FilterNode created (Type: " << int(mType) << ")";
  1.1224 +}
  1.1225 +
  1.1226 +void
  1.1227 +RecordedFilterNodeDestruction::PlayEvent(Translator *aTranslator) const
  1.1228 +{
  1.1229 +  aTranslator->RemoveFilterNode(mRefPtr);
  1.1230 +}
  1.1231 +
  1.1232 +void
  1.1233 +RecordedFilterNodeDestruction::RecordToStream(ostream &aStream) const
  1.1234 +{
  1.1235 +  WriteElement(aStream, mRefPtr);
  1.1236 +}
  1.1237 +
  1.1238 +RecordedFilterNodeDestruction::RecordedFilterNodeDestruction(istream &aStream)
  1.1239 +  : RecordedEvent(FILTERNODEDESTRUCTION)
  1.1240 +{
  1.1241 +  ReadElement(aStream, mRefPtr);
  1.1242 +}
  1.1243 +
  1.1244 +void
  1.1245 +RecordedFilterNodeDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1246 +{
  1.1247 +  aStringStream << "[" << mRefPtr << "] FilterNode Destroyed";
  1.1248 +}
  1.1249 +
  1.1250 +RecordedGradientStopsCreation::~RecordedGradientStopsCreation()
  1.1251 +{
  1.1252 +  if (mDataOwned) {
  1.1253 +    delete [] mStops;
  1.1254 +  }
  1.1255 +}
  1.1256 +
  1.1257 +void
  1.1258 +RecordedGradientStopsCreation::PlayEvent(Translator *aTranslator) const
  1.1259 +{
  1.1260 +  RefPtr<GradientStops> src = aTranslator->GetReferenceDrawTarget()->
  1.1261 +    CreateGradientStops(mStops, mNumStops, mExtendMode);
  1.1262 +  aTranslator->AddGradientStops(mRefPtr, src);
  1.1263 +}
  1.1264 +
  1.1265 +void
  1.1266 +RecordedGradientStopsCreation::RecordToStream(ostream &aStream) const
  1.1267 +{
  1.1268 +  WriteElement(aStream, mRefPtr);
  1.1269 +  WriteElement(aStream, mExtendMode);
  1.1270 +  WriteElement(aStream, mNumStops);
  1.1271 +  aStream.write((const char*)mStops, mNumStops * sizeof(GradientStop));
  1.1272 +}
  1.1273 +
  1.1274 +RecordedGradientStopsCreation::RecordedGradientStopsCreation(istream &aStream)
  1.1275 +  : RecordedEvent(GRADIENTSTOPSCREATION), mDataOwned(true)
  1.1276 +{
  1.1277 +  ReadElement(aStream, mRefPtr);
  1.1278 +  ReadElement(aStream, mExtendMode);
  1.1279 +  ReadElement(aStream, mNumStops);
  1.1280 +  mStops = new GradientStop[mNumStops];
  1.1281 +
  1.1282 +  aStream.read((char*)mStops, mNumStops * sizeof(GradientStop));
  1.1283 +}
  1.1284 +
  1.1285 +void
  1.1286 +RecordedGradientStopsCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1287 +{
  1.1288 +  aStringStream << "[" << mRefPtr << "] GradientStops created (Stops: " << mNumStops << ")";
  1.1289 +}
  1.1290 +
  1.1291 +void
  1.1292 +RecordedGradientStopsDestruction::PlayEvent(Translator *aTranslator) const
  1.1293 +{
  1.1294 +  aTranslator->RemoveGradientStops(mRefPtr);
  1.1295 +}
  1.1296 +
  1.1297 +void
  1.1298 +RecordedGradientStopsDestruction::RecordToStream(ostream &aStream) const
  1.1299 +{
  1.1300 +  WriteElement(aStream, mRefPtr);
  1.1301 +}
  1.1302 +
  1.1303 +RecordedGradientStopsDestruction::RecordedGradientStopsDestruction(istream &aStream)
  1.1304 +  : RecordedEvent(GRADIENTSTOPSDESTRUCTION)
  1.1305 +{
  1.1306 +  ReadElement(aStream, mRefPtr);
  1.1307 +}
  1.1308 +
  1.1309 +void
  1.1310 +RecordedGradientStopsDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1311 +{
  1.1312 +  aStringStream << "[" << mRefPtr << "] GradientStops Destroyed";
  1.1313 +}
  1.1314 +
  1.1315 +void
  1.1316 +RecordedSnapshot::PlayEvent(Translator *aTranslator) const
  1.1317 +{
  1.1318 +  RefPtr<SourceSurface> src = aTranslator->LookupDrawTarget(mDT)->Snapshot();
  1.1319 +  aTranslator->AddSourceSurface(mRefPtr, src);
  1.1320 +}
  1.1321 +
  1.1322 +void
  1.1323 +RecordedSnapshot::RecordToStream(ostream &aStream) const
  1.1324 +{
  1.1325 +  WriteElement(aStream, mRefPtr);
  1.1326 +  WriteElement(aStream, mDT);
  1.1327 +}
  1.1328 +
  1.1329 +RecordedSnapshot::RecordedSnapshot(istream &aStream)
  1.1330 +  : RecordedEvent(SNAPSHOT)
  1.1331 +{
  1.1332 +  ReadElement(aStream, mRefPtr);
  1.1333 +  ReadElement(aStream, mDT);
  1.1334 +}
  1.1335 +
  1.1336 +void
  1.1337 +RecordedSnapshot::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1338 +{
  1.1339 +  aStringStream << "[" << mRefPtr << "] Snapshot Created (DT: " << mDT << ")";
  1.1340 +}
  1.1341 +
  1.1342 +RecordedScaledFontCreation::~RecordedScaledFontCreation()
  1.1343 +{
  1.1344 +  delete [] mData;
  1.1345 +}
  1.1346 +
  1.1347 +void
  1.1348 +RecordedScaledFontCreation::PlayEvent(Translator *aTranslator) const
  1.1349 +{
  1.1350 +  RefPtr<ScaledFont> scaledFont =
  1.1351 +    Factory::CreateScaledFontForTrueTypeData(mData, mSize, mIndex, mGlyphSize,
  1.1352 +                                             aTranslator->GetDesiredFontType());
  1.1353 +  aTranslator->AddScaledFont(mRefPtr, scaledFont);
  1.1354 +}
  1.1355 +
  1.1356 +void
  1.1357 +RecordedScaledFontCreation::RecordToStream(std::ostream &aStream) const
  1.1358 +{
  1.1359 +  WriteElement(aStream, mRefPtr);
  1.1360 +  WriteElement(aStream, mIndex);
  1.1361 +  WriteElement(aStream, mGlyphSize);
  1.1362 +  WriteElement(aStream, mSize);
  1.1363 +  aStream.write((const char*)mData, mSize);
  1.1364 +}
  1.1365 +
  1.1366 +void
  1.1367 +RecordedScaledFontCreation::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1368 +{
  1.1369 +  aStringStream << "[" << mRefPtr << "] ScaledFont Created";
  1.1370 +}
  1.1371 +
  1.1372 +void
  1.1373 +RecordedScaledFontCreation::SetFontData(const uint8_t *aData, uint32_t aSize, uint32_t aIndex, Float aGlyphSize)
  1.1374 +{
  1.1375 +  mData = new uint8_t[aSize];
  1.1376 +  memcpy(mData, aData, aSize);
  1.1377 +  mSize = aSize;
  1.1378 +  mIndex = aIndex;
  1.1379 +  mGlyphSize = aGlyphSize;
  1.1380 +}
  1.1381 +
  1.1382 +RecordedScaledFontCreation::RecordedScaledFontCreation(istream &aStream)
  1.1383 +  : RecordedEvent(SCALEDFONTCREATION)
  1.1384 +{
  1.1385 +  ReadElement(aStream, mRefPtr);
  1.1386 +  ReadElement(aStream, mIndex);
  1.1387 +  ReadElement(aStream, mGlyphSize);
  1.1388 +  ReadElement(aStream, mSize);
  1.1389 +  mData = new uint8_t[mSize];
  1.1390 +  aStream.read((char*)mData, mSize);
  1.1391 +}
  1.1392 +
  1.1393 +void
  1.1394 +RecordedScaledFontDestruction::PlayEvent(Translator *aTranslator) const
  1.1395 +{
  1.1396 +  aTranslator->RemoveScaledFont(mRefPtr);
  1.1397 +}
  1.1398 +
  1.1399 +void
  1.1400 +RecordedScaledFontDestruction::RecordToStream(ostream &aStream) const
  1.1401 +{
  1.1402 +  WriteElement(aStream, mRefPtr);
  1.1403 +}
  1.1404 +
  1.1405 +RecordedScaledFontDestruction::RecordedScaledFontDestruction(istream &aStream)
  1.1406 +  : RecordedEvent(SCALEDFONTDESTRUCTION)
  1.1407 +{
  1.1408 +  ReadElement(aStream, mRefPtr);
  1.1409 +}
  1.1410 +
  1.1411 +void
  1.1412 +RecordedScaledFontDestruction::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1413 +{
  1.1414 +  aStringStream << "[" << mRefPtr << "] ScaledFont Destroyed";
  1.1415 +}
  1.1416 +
  1.1417 +void
  1.1418 +RecordedMaskSurface::PlayEvent(Translator *aTranslator) const
  1.1419 +{
  1.1420 +  aTranslator->LookupDrawTarget(mDT)->
  1.1421 +    MaskSurface(*GenericPattern(mPattern, aTranslator),
  1.1422 +                aTranslator->LookupSourceSurface(mRefMask),
  1.1423 +                mOffset, mOptions);
  1.1424 +}
  1.1425 +
  1.1426 +void
  1.1427 +RecordedMaskSurface::RecordToStream(ostream &aStream) const
  1.1428 +{
  1.1429 +  RecordedDrawingEvent::RecordToStream(aStream);
  1.1430 +  RecordPatternData(aStream, mPattern);
  1.1431 +  WriteElement(aStream, mRefMask);
  1.1432 +  WriteElement(aStream, mOffset);
  1.1433 +  WriteElement(aStream, mOptions);
  1.1434 +}
  1.1435 +
  1.1436 +RecordedMaskSurface::RecordedMaskSurface(istream &aStream)
  1.1437 +  : RecordedDrawingEvent(MASKSURFACE, aStream)
  1.1438 +{
  1.1439 +  ReadPatternData(aStream, mPattern);
  1.1440 +  ReadElement(aStream, mRefMask);
  1.1441 +  ReadElement(aStream, mOffset);
  1.1442 +  ReadElement(aStream, mOptions);
  1.1443 +}
  1.1444 +
  1.1445 +void
  1.1446 +RecordedMaskSurface::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1447 +{
  1.1448 +  aStringStream << "[" << mDT << "] MaskSurface (" << mRefMask << ")  Offset: (" << mOffset.x << "x" << mOffset.y << ") Pattern: ";
  1.1449 +  OutputSimplePatternInfo(mPattern, aStringStream);
  1.1450 +}
  1.1451 +
  1.1452 +template<typename T>
  1.1453 +void
  1.1454 +ReplaySetAttribute(FilterNode *aNode, uint32_t aIndex, T aValue)
  1.1455 +{
  1.1456 +  aNode->SetAttribute(aIndex, aValue);
  1.1457 +}
  1.1458 +
  1.1459 +void
  1.1460 +RecordedFilterNodeSetAttribute::PlayEvent(Translator *aTranslator) const
  1.1461 +{
  1.1462 +#define REPLAY_SET_ATTRIBUTE(type, argtype) \
  1.1463 +  case ARGTYPE_##argtype: \
  1.1464 +  ReplaySetAttribute(aTranslator->LookupFilterNode(mNode), mIndex, *(type*)&mPayload.front()); \
  1.1465 +  break
  1.1466 +
  1.1467 +  switch (mArgType) {
  1.1468 +    REPLAY_SET_ATTRIBUTE(bool, BOOL);
  1.1469 +    REPLAY_SET_ATTRIBUTE(uint32_t, UINT32);
  1.1470 +    REPLAY_SET_ATTRIBUTE(Float, FLOAT);
  1.1471 +    REPLAY_SET_ATTRIBUTE(Size, SIZE);
  1.1472 +    REPLAY_SET_ATTRIBUTE(IntSize, INTSIZE);
  1.1473 +    REPLAY_SET_ATTRIBUTE(IntPoint, INTPOINT);
  1.1474 +    REPLAY_SET_ATTRIBUTE(Rect, RECT);
  1.1475 +    REPLAY_SET_ATTRIBUTE(IntRect, INTRECT);
  1.1476 +    REPLAY_SET_ATTRIBUTE(Point, POINT);
  1.1477 +    REPLAY_SET_ATTRIBUTE(Matrix5x4, MATRIX5X4);
  1.1478 +    REPLAY_SET_ATTRIBUTE(Point3D, POINT3D);
  1.1479 +    REPLAY_SET_ATTRIBUTE(Color, COLOR);
  1.1480 +  case ARGTYPE_FLOAT_ARRAY:
  1.1481 +    aTranslator->LookupFilterNode(mNode)->SetAttribute(
  1.1482 +      mIndex,
  1.1483 +      reinterpret_cast<const Float*>(&mPayload.front()),
  1.1484 +      mPayload.size() / sizeof(Float));
  1.1485 +    break;
  1.1486 +  }
  1.1487 +}
  1.1488 +
  1.1489 +void
  1.1490 +RecordedFilterNodeSetAttribute::RecordToStream(ostream &aStream) const
  1.1491 +{
  1.1492 +  RecordedEvent::RecordToStream(aStream);
  1.1493 +  WriteElement(aStream, mNode);
  1.1494 +  WriteElement(aStream, mIndex);
  1.1495 +  WriteElement(aStream, mArgType);
  1.1496 +  WriteElement(aStream, uint64_t(mPayload.size()));
  1.1497 +  aStream.write((const char*)&mPayload.front(), mPayload.size());
  1.1498 +}
  1.1499 +
  1.1500 +RecordedFilterNodeSetAttribute::RecordedFilterNodeSetAttribute(istream &aStream)
  1.1501 +  : RecordedEvent(FILTERNODESETATTRIBUTE)
  1.1502 +{
  1.1503 +  ReadElement(aStream, mNode);
  1.1504 +  ReadElement(aStream, mIndex);
  1.1505 +  ReadElement(aStream, mArgType);
  1.1506 +  uint64_t size;
  1.1507 +  ReadElement(aStream, size);
  1.1508 +  mPayload.resize(size_t(size));
  1.1509 +  aStream.read((char*)&mPayload.front(), size);
  1.1510 +}
  1.1511 +
  1.1512 +void
  1.1513 +RecordedFilterNodeSetAttribute::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1514 +{
  1.1515 +  aStringStream << "[" << mNode << "] SetAttribute (" << mIndex << ")";
  1.1516 +}
  1.1517 +
  1.1518 +void
  1.1519 +RecordedFilterNodeSetInput::PlayEvent(Translator *aTranslator) const
  1.1520 +{
  1.1521 +  if (mInputFilter) {
  1.1522 +    aTranslator->LookupFilterNode(mNode)->SetInput(
  1.1523 +      mIndex, aTranslator->LookupFilterNode(mInputFilter));
  1.1524 +  } else {
  1.1525 +    aTranslator->LookupFilterNode(mNode)->SetInput(
  1.1526 +      mIndex, aTranslator->LookupSourceSurface(mInputSurface));
  1.1527 +  }
  1.1528 +}
  1.1529 +
  1.1530 +void
  1.1531 +RecordedFilterNodeSetInput::RecordToStream(ostream &aStream) const
  1.1532 +{
  1.1533 +  RecordedEvent::RecordToStream(aStream);
  1.1534 +  WriteElement(aStream, mNode);
  1.1535 +  WriteElement(aStream, mIndex);
  1.1536 +  WriteElement(aStream, mInputFilter);
  1.1537 +  WriteElement(aStream, mInputSurface);
  1.1538 +}
  1.1539 +
  1.1540 +RecordedFilterNodeSetInput::RecordedFilterNodeSetInput(istream &aStream)
  1.1541 +  : RecordedEvent(FILTERNODESETINPUT)
  1.1542 +{
  1.1543 +  ReadElement(aStream, mNode);
  1.1544 +  ReadElement(aStream, mIndex);
  1.1545 +  ReadElement(aStream, mInputFilter);
  1.1546 +  ReadElement(aStream, mInputSurface);
  1.1547 +}
  1.1548 +
  1.1549 +void
  1.1550 +RecordedFilterNodeSetInput::OutputSimpleEventInfo(stringstream &aStringStream) const
  1.1551 +{
  1.1552 +  aStringStream << "[" << mNode << "] SetAttribute (" << mIndex << ", ";
  1.1553 +
  1.1554 +  if (mInputFilter) {
  1.1555 +    aStringStream << "Filter: " << mInputFilter;
  1.1556 +  } else {
  1.1557 +    aStringStream << "Surface: " << mInputSurface;
  1.1558 +  }
  1.1559 +
  1.1560 +  aStringStream << ")";
  1.1561 +}
  1.1562 +
  1.1563 +}
  1.1564 +}

mercurial