TemporaryRef<SourceSurface> DrawTargetSkia::OptimizeSourceSurface(SourceSurface *aSurface) const { if (aSurface->GetType() == SurfaceType::SKIA) { return aSurface; } if (!UsingSkiaGPU()) { // If we're not using skia-gl then drawing doesn't require any // uploading, so any data surface is fine. Call GetDataSurface // to trigger any required readback so that it only happens // once. return aSurface->GetDataSurface(); } // If we are using skia-gl then we want to copy into a surface that // will cache the uploaded gl texture. RefPtr<DataSourceSurface> dataSurf = aSurface->GetDataSurface(); DataSourceSurface::MappedSurface map; if (!dataSurf->Map(DataSourceSurface::READ, &map)) { return nullptr; } RefPtr<SourceSurface> result = CreateSourceSurfaceFromData(map.mData, dataSurf->GetSize(), map.mStride, dataSurf->GetFormat()); dataSurf->Unmap(); return result.forget(); }
TemporaryRef<SourceSurface> DrawTargetSkia::OptimizeSourceSurface(SourceSurface *aSurface) const { if (aSurface->GetType() == SurfaceType::SKIA) { return aSurface; } if (aSurface->GetType() != SurfaceType::DATA) { return nullptr; } RefPtr<DataSourceSurface> data = aSurface->GetDataSurface(); RefPtr<SourceSurface> surface = CreateSourceSurfaceFromData(data->GetData(), data->GetSize(), data->Stride(), data->GetFormat()); return data.forget(); }