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 +}