blob: e7094b5a4910a95080eb8ff723bc15206130b240 [file] [log] [blame]
// Copyright 2010-2014, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "win32/base/text_icon.h"
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define _WTL_NO_AUTOMATIC_NAMESPACE
// Workaround against KB813540
#include <atlbase_mozc.h>
#include <atlapp.h>
#include <atlmisc.h>
#include <atlgdi.h>
#include <shlwapi.h>
#include "base/logging.h"
#include "base/mmap.h"
#include "base/util.h"
#include "base/win_font_test_helper.h"
#include "testing/base/public/gunit.h"
namespace mozc {
namespace win32 {
namespace {
using ::WTL::CBitmap;
using ::WTL::CIcon;
using ::testing::AssertionFailure;
using ::testing::AssertionResult;
using ::testing::AssertionSuccess;
class TextIconTest : public testing::Test {
public:
static void SetUpTestCase() {
// On Windows XP, the availability of typical Japanese fonts such are as
// MS Gothic depends on the language edition and language packs.
// So we will register a private font for unit test.
WinFontTestHelper::Initialize();
}
static void TearDownTestCase() {
// Free private fonts although the system automatically frees them when
// this process is terminated.
WinFontTestHelper::Uninitialize();
}
protected:
static string GetGothicFontName() {
return WinFontTestHelper::GetIPAexGothicFontName();
}
};
::testing::AssertionResult ExpectMonochromeIcon(const CIcon &icon,
size_t size) {
if (icon.IsNull()) {
return AssertionFailure() << "|icon| is nullptr.";
}
ICONINFO info = {};
if (!icon.GetIconInfo(&info)) {
return AssertionFailure() << "GetIconInfo failed.";
}
CBitmap xor_bmp = info.hbmColor;
CBitmap and_bmp = info.hbmMask;
if (xor_bmp.IsNull()) {
return AssertionFailure() <<
"XOR bitmap (hbmColor) should not be nullptr. This icon causes a GDI "
"handle leak when it is passed to ITfLangBarItemButton::GetIcon.";
}
if (and_bmp.IsNull()) {
return AssertionFailure() << "AND bitmap (hbmMask) should not be nullptr.";
}
{
BITMAP xor_bmp_info = {};
if (!xor_bmp.GetBitmap(xor_bmp_info)) {
return AssertionFailure() << "GetBitmap failed.";
}
// There seems no way to retrieve the true color depth of given icon object.
// As far as we've observed on Windows XP and Windows 7, |info.hbmColor|
// returned from GetIconInfo always have the same color depth to display
// regardless of the original color depth.
if (xor_bmp_info.bmWidth != size) {
return AssertionFailure()
<< "XOR bitmap (hbmColor) does not have expected width."
<< " expected: " << size
<< " actual: " << xor_bmp_info.bmWidth;
}
if (xor_bmp_info.bmHeight != size) {
return AssertionFailure()
<< "XOR bitmap (hbmColor) does not have expected height."
<< " expected: " << size
<< " actual: " << xor_bmp_info.bmHeight;
}
}
{
BITMAP and_bmp_info = {};
if (!and_bmp.GetBitmap(and_bmp_info)) {
return AssertionFailure() << "GetBitmap failed.";
}
if (and_bmp_info.bmBitsPixel != 1) {
return AssertionFailure()
<< "AND bitmap (hbmMask) does not have expected bit depth."
<< " expected: " << 1
<< " actual: " << and_bmp_info.bmBitsPixel;
}
if (and_bmp_info.bmWidth != size) {
return AssertionFailure()
<< "AND bitmap (hbmMask) does not have expected width."
<< " expected: " << size
<< " actual: " << and_bmp_info.bmWidth;
}
if (and_bmp_info.bmHeight != size) {
return AssertionFailure()
<< "AND bitmap (hbmMask) does not have expected height."
<< " expected: " << size
<< " actual: " << and_bmp_info.bmHeight;
}
}
return AssertionSuccess();
}
#define EXPECT_MONOCHROME_ICON(icon, icon_size) \
EXPECT_TRUE(ExpectMonochromeIcon((icon), (icon_size)))
TEST_F(TextIconTest, CreateMonochromeIcon) {
{
const size_t kIconSize = 20;
CIcon icon = TextIcon::CreateMonochromeIcon(
kIconSize, kIconSize, "A", GetGothicFontName(), RGB(0xff, 0x00, 0xff));
EXPECT_MONOCHROME_ICON(icon, kIconSize);
}
{
// "あ"
const char kText[] = "\xE3\x81\x82";
const size_t kIconSize = 20;
CIcon icon = TextIcon::CreateMonochromeIcon(
kIconSize, kIconSize, kText, GetGothicFontName(),
RGB(0xff, 0x00, 0xff));
EXPECT_MONOCHROME_ICON(icon, kIconSize);
}
}
} // namespace
} // namespace win32
} // namespace mozc