gfx/tests/gtest/TestTextures.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /* vim:set ts=2 sw=2 sts=2 et: */
     2 /* Any copyright is dedicated to the Public Domain.
     3  * http://creativecommons.org/publicdomain/zero/1.0/
     4  */
     6 #include "gtest/gtest.h"
     7 #include "gmock/gmock.h"
     9 #include "mozilla/gfx/2D.h"
    10 #include "mozilla/gfx/Tools.h"
    11 #include "mozilla/layers/TextureClient.h"
    12 #include "mozilla/layers/TextureHost.h"
    13 #include "mozilla/RefPtr.h"
    14 #include "gfx2DGlue.h"
    15 #include "gfxImageSurface.h"
    16 #include "gfxTypes.h"
    17 #include "ImageContainer.h"
    18 #include "mozilla/layers/YCbCrImageDataSerializer.h"
    20 using namespace mozilla;
    21 using namespace mozilla::gfx;
    22 using namespace mozilla::layers;
    24 /*
    25  * This test performs the following actions:
    26  * - creates a surface
    27  * - initialize a texture client with it
    28  * - serilaizes the texture client
    29  * - deserializes the data into a texture host
    30  * - reads the surface from the texture host.
    31  *
    32  * The surface in the end should be equal to the inital one.
    33  * This test is run for different combinations of texture types and
    34  * image formats.
    35  */
    37 namespace mozilla {
    38 namespace layers {
    40 // fills the surface with values betwee 0 and 100.
    41 void SetupSurface(gfxImageSurface* surface) {
    42   int bpp = gfxASurface::BytePerPixelFromFormat(surface->Format());
    43   int stride = surface->Stride();
    44   uint8_t val = 0;
    45   uint8_t* data = surface->Data();
    46   for (int y = 0; y < surface->Height(); ++y) {
    47     for (int x = 0; x < surface->Height(); ++x) {
    48       for (int b = 0; b < bpp; ++b) {
    49         data[y*stride + x*bpp + b] = val;
    50         if (val == 100) {
    51           val = 0;
    52         } else {
    53           ++val;
    54         }
    55       }
    56     }
    57   }
    58 }
    60 // return true if two surfaces contain the same data
    61 void AssertSurfacesEqual(gfxImageSurface* surface1,
    62                          gfxImageSurface* surface2)
    63 {
    64   ASSERT_EQ(surface1->GetSize(), surface2->GetSize());
    65   ASSERT_EQ(surface1->Format(), surface2->Format());
    67   uint8_t* data1 = surface1->Data();
    68   uint8_t* data2 = surface2->Data();
    69   int stride1 = surface1->Stride();
    70   int stride2 = surface2->Stride();
    71   int bpp = gfxASurface::BytePerPixelFromFormat(surface1->Format());
    73   for (int y = 0; y < surface1->Height(); ++y) {
    74     for (int x = 0; x < surface1->Width(); ++x) {
    75       for (int b = 0; b < bpp; ++b) {
    76         ASSERT_EQ(data1[y*stride1 + x*bpp + b],
    77                   data2[y*stride2 + x*bpp + b]);
    78       }
    79     }
    80   }
    81 }
    83 void AssertSurfacesEqual(SourceSurface* surface1,
    84                          SourceSurface* surface2)
    85 {
    86   ASSERT_EQ(surface1->GetSize(), surface2->GetSize());
    87   ASSERT_EQ(surface1->GetFormat(), surface2->GetFormat());
    89   RefPtr<DataSourceSurface> dataSurface1 = surface1->GetDataSurface();
    90   RefPtr<DataSourceSurface> dataSurface2 = surface2->GetDataSurface();
    91   DataSourceSurface::MappedSurface map1;
    92   DataSourceSurface::MappedSurface map2;
    93   if (!dataSurface1->Map(DataSourceSurface::READ, &map1)) {
    94     return;
    95   }
    96   if (!dataSurface2->Map(DataSourceSurface::READ, &map2)) {
    97     dataSurface1->Unmap();
    98     return;
    99   }
   100   uint8_t* data1 = map1.mData;
   101   uint8_t* data2 = map2.mData;
   102   int stride1 = map1.mStride;
   103   int stride2 = map2.mStride;
   104   int bpp = BytesPerPixel(surface1->GetFormat());
   105   int width = surface1->GetSize().width;
   106   int height = surface1->GetSize().height;
   108   for (int y = 0; y < height; ++y) {
   109     for (int x = 0; x < width; ++x) {
   110       for (int b = 0; b < bpp; ++b) {
   111         ASSERT_EQ(data1[y*stride1 + x*bpp + b],
   112                   data2[y*stride2 + x*bpp + b]);
   113       }
   114     }
   115   }
   117   dataSurface1->Unmap();
   118   dataSurface2->Unmap();
   119 }
   121 // Same as above, for YCbCr surfaces
   122 void AssertYCbCrSurfacesEqual(PlanarYCbCrData* surface1,
   123                               PlanarYCbCrData* surface2)
   124 {
   125   ASSERT_EQ(surface1->mYSize, surface2->mYSize);
   126   ASSERT_EQ(surface1->mCbCrSize, surface2->mCbCrSize);
   127   ASSERT_EQ(surface1->mStereoMode, surface2->mStereoMode);
   128   ASSERT_EQ(surface1->mPicSize, surface2->mPicSize);
   130   for (int y = 0; y < surface1->mYSize.height; ++y) {
   131     for (int x = 0; x < surface1->mYSize.width; ++x) {
   132       ASSERT_EQ(surface1->mYChannel[y*surface1->mYStride + x*(1+surface1->mYSkip)],
   133                 surface2->mYChannel[y*surface2->mYStride + x*(1+surface2->mYSkip)]);
   134     }
   135   }
   136   for (int y = 0; y < surface1->mCbCrSize.height; ++y) {
   137     for (int x = 0; x < surface1->mCbCrSize.width; ++x) {
   138       ASSERT_EQ(surface1->mCbChannel[y*surface1->mCbCrStride + x*(1+surface1->mCbSkip)],
   139                 surface2->mCbChannel[y*surface2->mCbCrStride + x*(1+surface2->mCbSkip)]);
   140       ASSERT_EQ(surface1->mCrChannel[y*surface1->mCbCrStride + x*(1+surface1->mCrSkip)],
   141                 surface2->mCrChannel[y*surface2->mCbCrStride + x*(1+surface2->mCrSkip)]);
   142     }
   143   }
   144 }
   146 // Run the test for a texture client and a surface
   147 void TestTextureClientSurface(TextureClient* texture, gfxImageSurface* surface) {
   149   // client allocation
   150   ASSERT_TRUE(texture->CanExposeDrawTarget());
   151   texture->AllocateForSurface(ToIntSize(surface->GetSize()));
   152   ASSERT_TRUE(texture->IsAllocated());
   154   ASSERT_TRUE(texture->Lock(OPEN_READ_WRITE));
   155   // client painting
   156   RefPtr<DrawTarget> dt = texture->GetAsDrawTarget();
   157   RefPtr<SourceSurface> source =
   158     gfxPlatform::GetPlatform()->GetSourceSurfaceForSurface(dt, surface);
   159   dt->CopySurface(source, IntRect(IntPoint(), source->GetSize()), IntPoint());
   161   RefPtr<SourceSurface> snapshot = dt->Snapshot();
   163   AssertSurfacesEqual(snapshot, source);
   165   dt = nullptr; // drop reference before calling Unlock()
   166   texture->Unlock();
   168   // client serialization
   169   SurfaceDescriptor descriptor;
   170   ASSERT_TRUE(texture->ToSurfaceDescriptor(descriptor));
   172   ASSERT_NE(descriptor.type(), SurfaceDescriptor::Tnull_t);
   174   // host deserialization
   175   RefPtr<TextureHost> host = CreateBackendIndependentTextureHost(descriptor, nullptr,
   176                                                                  texture->GetFlags());
   178   ASSERT_TRUE(host.get() != nullptr);
   179   ASSERT_EQ(host->GetFlags(), texture->GetFlags());
   181   // host read
   182   ASSERT_TRUE(host->Lock());
   183   RefPtr<mozilla::gfx::DataSourceSurface> hostDataSurface = host->GetAsSurface();
   184   host->Unlock();
   186   nsRefPtr<gfxImageSurface> hostSurface =
   187     new gfxImageSurface(hostDataSurface->GetData(),
   188                         ThebesIntSize(hostDataSurface->GetSize()),
   189                         hostDataSurface->Stride(),
   190                         SurfaceFormatToImageFormat(hostDataSurface->GetFormat()));
   191   AssertSurfacesEqual(surface, hostSurface.get());
   192 }
   194 // Same as above, for YCbCr surfaces
   195 void TestTextureClientYCbCr(TextureClient* client, PlanarYCbCrData& ycbcrData) {
   197   // client allocation
   198   ASSERT_TRUE(client->AsTextureClientYCbCr() != nullptr);
   199   TextureClientYCbCr* texture = client->AsTextureClientYCbCr();
   200   texture->AllocateForYCbCr(ycbcrData.mYSize,
   201                             ycbcrData.mCbCrSize,
   202                             ycbcrData.mStereoMode);
   203   ASSERT_TRUE(client->IsAllocated());
   205   ASSERT_TRUE(client->Lock(OPEN_READ_WRITE));
   206   // client painting
   207   texture->UpdateYCbCr(ycbcrData);
   208   client->Unlock();
   210   // client serialization
   211   SurfaceDescriptor descriptor;
   212   ASSERT_TRUE(client->ToSurfaceDescriptor(descriptor));
   214   ASSERT_NE(descriptor.type(), SurfaceDescriptor::Tnull_t);
   216   // host deserialization
   217   RefPtr<TextureHost> textureHost = CreateBackendIndependentTextureHost(descriptor, nullptr,
   218                                                                         client->GetFlags());
   220   RefPtr<BufferTextureHost> host = static_cast<BufferTextureHost*>(textureHost.get());
   222   ASSERT_TRUE(host.get() != nullptr);
   223   ASSERT_EQ(host->GetFlags(), client->GetFlags());
   225   // host read
   226   ASSERT_TRUE(host->Lock());
   228   // This will work iff the compositor is not BasicCompositor
   229   ASSERT_EQ(host->GetFormat(), mozilla::gfx::SurfaceFormat::YUV);
   231   YCbCrImageDataDeserializer yuvDeserializer(host->GetBuffer(), host->GetBufferSize());
   232   ASSERT_TRUE(yuvDeserializer.IsValid());
   233   PlanarYCbCrData data;
   234   data.mYChannel = yuvDeserializer.GetYData();
   235   data.mCbChannel = yuvDeserializer.GetCbData();
   236   data.mCrChannel = yuvDeserializer.GetCrData();
   237   data.mYStride = yuvDeserializer.GetYStride();
   238   data.mCbCrStride = yuvDeserializer.GetCbCrStride();
   239   data.mStereoMode = yuvDeserializer.GetStereoMode();
   240   data.mYSize = yuvDeserializer.GetYSize();
   241   data.mCbCrSize = yuvDeserializer.GetCbCrSize();
   242   data.mYSkip = 0;
   243   data.mCbSkip = 0;
   244   data.mCrSkip = 0;
   245   data.mPicSize = data.mYSize;
   246   data.mPicX = 0;
   247   data.mPicY = 0;
   249   AssertYCbCrSurfacesEqual(&ycbcrData, &data);
   250   host->Unlock();
   251 }
   253 } // namespace
   254 } // namespace
   256 TEST(Layers, TextureSerialization) {
   257   // the test is run on all the following image formats
   258   gfxImageFormat formats[3] = {
   259     gfxImageFormat::ARGB32,
   260     gfxImageFormat::RGB24,
   261     gfxImageFormat::A8,
   262   };
   264   for (int f = 0; f < 3; ++f) {
   265     RefPtr<gfxImageSurface> surface = new gfxImageSurface(gfxIntSize(400,300), formats[f]);
   266     SetupSurface(surface.get());
   267     AssertSurfacesEqual(surface, surface);
   269     RefPtr<TextureClient> client
   270       = new MemoryTextureClient(nullptr,
   271                                 mozilla::gfx::ImageFormatToSurfaceFormat(surface->Format()),
   272                                 gfx::BackendType::CAIRO,
   273                                 TEXTURE_DEALLOCATE_CLIENT);
   275     TestTextureClientSurface(client, surface);
   277     // XXX - Test more texture client types.
   278   }
   279 }
   281 TEST(Layers, TextureYCbCrSerialization) {
   282   RefPtr<gfxImageSurface> ySurface = new gfxImageSurface(gfxIntSize(400,300), gfxImageFormat::A8);
   283   RefPtr<gfxImageSurface> cbSurface = new gfxImageSurface(gfxIntSize(200,150), gfxImageFormat::A8);
   284   RefPtr<gfxImageSurface> crSurface = new gfxImageSurface(gfxIntSize(200,150), gfxImageFormat::A8);
   285   SetupSurface(ySurface.get());
   286   SetupSurface(cbSurface.get());
   287   SetupSurface(crSurface.get());
   289   PlanarYCbCrData clientData;
   290   clientData.mYChannel = ySurface->Data();
   291   clientData.mCbChannel = cbSurface->Data();
   292   clientData.mCrChannel = crSurface->Data();
   293   clientData.mYSize = ySurface->GetSize().ToIntSize();
   294   clientData.mPicSize = ySurface->GetSize().ToIntSize();
   295   clientData.mCbCrSize = cbSurface->GetSize().ToIntSize();
   296   clientData.mYStride = ySurface->Stride();
   297   clientData.mCbCrStride = cbSurface->Stride();
   298   clientData.mStereoMode = StereoMode::MONO;
   299   clientData.mYSkip = 0;
   300   clientData.mCbSkip = 0;
   301   clientData.mCrSkip = 0;
   302   clientData.mCrSkip = 0;
   303   clientData.mPicX = 0;
   304   clientData.mPicX = 0;
   306   RefPtr<TextureClient> client
   307     = new MemoryTextureClient(nullptr,
   308                               mozilla::gfx::SurfaceFormat::YUV,
   309                               gfx::BackendType::CAIRO,
   310                               TEXTURE_DEALLOCATE_CLIENT);
   312   TestTextureClientYCbCr(client, clientData);
   314   // XXX - Test more texture client types.
   315 }

mercurial