tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

cursor_unittest.cc (3071B)


      1 /*
      2 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/desktop_capture/win/cursor.h"
     12 
     13 #include <memory>
     14 
     15 #include "modules/desktop_capture/desktop_frame.h"
     16 #include "modules/desktop_capture/desktop_geometry.h"
     17 #include "modules/desktop_capture/mouse_cursor.h"
     18 #include "modules/desktop_capture/win/cursor_unittest_resources.h"
     19 #include "modules/desktop_capture/win/scoped_gdi_object.h"
     20 #include "test/gmock.h"
     21 
     22 namespace webrtc {
     23 
     24 namespace {
     25 
     26 // Loads `left` from resources, converts it to a `MouseCursor` instance and
     27 // compares pixels with `right`. Returns true of MouseCursor bits match `right`.
     28 // `right` must be a 32bpp cursor with alpha channel.
     29 bool ConvertToMouseShapeAndCompare(unsigned left, unsigned right) {
     30  HMODULE instance = GetModuleHandle(NULL);
     31 
     32  // Load `left` from the EXE module's resources.
     33  win::ScopedCursor cursor(reinterpret_cast<HCURSOR>(
     34      LoadImage(instance, MAKEINTRESOURCE(left), IMAGE_CURSOR, 0, 0, 0)));
     35  EXPECT_TRUE(cursor != NULL);
     36 
     37  // Convert `cursor` to `mouse_shape`.
     38  HDC dc = GetDC(NULL);
     39  std::unique_ptr<MouseCursor> mouse_shape(
     40      CreateMouseCursorFromHCursor(dc, cursor));
     41  ReleaseDC(NULL, dc);
     42 
     43  EXPECT_TRUE(mouse_shape.get());
     44 
     45  // Load `right`.
     46  cursor.Set(reinterpret_cast<HCURSOR>(
     47      LoadImage(instance, MAKEINTRESOURCE(right), IMAGE_CURSOR, 0, 0, 0)));
     48 
     49  ICONINFO iinfo;
     50  EXPECT_TRUE(GetIconInfo(cursor, &iinfo));
     51  EXPECT_TRUE(iinfo.hbmColor);
     52 
     53  // Make sure the bitmaps will be freed.
     54  win::ScopedBitmap scoped_mask(iinfo.hbmMask);
     55  win::ScopedBitmap scoped_color(iinfo.hbmColor);
     56 
     57  // Get `scoped_color` dimensions.
     58  BITMAP bitmap_info;
     59  EXPECT_TRUE(GetObject(scoped_color, sizeof(bitmap_info), &bitmap_info));
     60 
     61  int width = bitmap_info.bmWidth;
     62  int height = bitmap_info.bmHeight;
     63  EXPECT_TRUE(DesktopSize(width, height).equals(mouse_shape->image()->size()));
     64 
     65  // Get the pixels from `scoped_color`.
     66  int size = width * height;
     67  std::unique_ptr<uint32_t[]> data(new uint32_t[size]);
     68  EXPECT_TRUE(GetBitmapBits(scoped_color, size * sizeof(uint32_t), data.get()));
     69 
     70  // Compare the 32bpp image in `mouse_shape` with the one loaded from `right`.
     71  return memcmp(data.get(), mouse_shape->image()->data(),
     72                size * sizeof(uint32_t)) == 0;
     73 }
     74 
     75 }  // namespace
     76 
     77 TEST(MouseCursorTest, MatchCursors) {
     78  EXPECT_TRUE(
     79      ConvertToMouseShapeAndCompare(IDD_CURSOR1_24BPP, IDD_CURSOR1_32BPP));
     80 
     81  EXPECT_TRUE(
     82      ConvertToMouseShapeAndCompare(IDD_CURSOR1_8BPP, IDD_CURSOR1_32BPP));
     83 
     84  EXPECT_TRUE(
     85      ConvertToMouseShapeAndCompare(IDD_CURSOR2_1BPP, IDD_CURSOR2_32BPP));
     86 
     87  EXPECT_TRUE(
     88      ConvertToMouseShapeAndCompare(IDD_CURSOR3_4BPP, IDD_CURSOR3_32BPP));
     89 }
     90 
     91 }  // namespace webrtc