summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp4
-rw-r--r--core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp4
-rw-r--r--core/fxge/cfx_facecache.cpp55
3 files changed, 56 insertions, 7 deletions
diff --git a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp
index 91e625ab26..3770e98d86 100644
--- a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp
@@ -43,11 +43,11 @@ TEST_F(CPDFSecurityHandlerEmbeddertest, OwnerPassword) {
TEST_F(CPDFSecurityHandlerEmbeddertest, PasswordAfterGenerateSave) {
#if _FX_PLATFORM_ == _FX_PLATFORM_LINUX_
- const char md5[] = "7048dca58e2ed8f93339008b91e4eb4e";
+ const char md5[] = "e4a3701ca5b2a759e06455aa8d97d46e";
#elif _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
const char md5[] = "6951b6c9891dfe0332a5b1983e484400";
#else
- const char md5[] = "a5dde3c6c37b8716b9b369a03752a728";
+ const char md5[] = "50985f3440d3f66c3b599ab138214015";
#endif // _FX_PLATFORM_ == _FX_PLATFORM_LINUX_
{
ASSERT_TRUE(OpenDocument("encrypted.pdf", "5678", true));
diff --git a/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp b/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
index bf2fd6d10f..bb186924b6 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
@@ -115,9 +115,9 @@ TEST_F(FPDFParserDecodeEmbeddertest, Bug_455199) {
#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
const char kExpectedMd5sum[] = "b90475ca64d1348c3bf5e2b77ad9187a";
#elif _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_
- const char kExpectedMd5sum[] = "e5a6fa28298db07484cd922f3e210c88";
+ const char kExpectedMd5sum[] = "9a2637b73fd5265309bfddd9c69476cd";
#else
- const char kExpectedMd5sum[] = "2baa4c0e1758deba1b9c908e1fbd04ed";
+ const char kExpectedMd5sum[] = "f7e129d97c58e91adeace32a4327b925";
#endif
CompareBitmap(bitmap, 200, 200, kExpectedMd5sum);
FPDFBitmap_Destroy(bitmap);
diff --git a/core/fxge/cfx_facecache.cpp b/core/fxge/cfx_facecache.cpp
index 3f037ac65a..a3e58ff29c 100644
--- a/core/fxge/cfx_facecache.cpp
+++ b/core/fxge/cfx_facecache.cpp
@@ -35,8 +35,48 @@ namespace {
constexpr uint32_t kInvalidGlyphIndex = static_cast<uint32_t>(-1);
+constexpr int kMinPixel = 0;
+constexpr int kMaxPixel = 255;
+
constexpr int kMaxGlyphDimension = 2048;
+void ContrastAdjust(uint8_t* pDataIn,
+ uint8_t* pDataOut,
+ int nWidth,
+ int nHeight,
+ int nSrcRowBytes,
+ int nDstRowBytes) {
+ int max = kMinPixel;
+ int min = kMaxPixel;
+ for (int row = 0; row < nHeight; row++) {
+ uint8_t* pRow = pDataIn + row * nSrcRowBytes;
+ for (int col = 0; col < nWidth; col++) {
+ int val = pRow[col];
+ max = std::max(val, max);
+ min = std::min(val, min);
+ }
+ }
+ int diff = max - min;
+ if (diff == kMinPixel || diff == kMaxPixel) {
+ int rowbytes = std::min(abs(nSrcRowBytes), nDstRowBytes);
+ for (int row = 0; row < nHeight; row++) {
+ memcpy(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes,
+ rowbytes);
+ }
+ return;
+ }
+ float rate = 255.f / diff;
+ for (int row = 0; row < nHeight; row++) {
+ uint8_t* pSrcRow = pDataIn + row * nSrcRowBytes;
+ uint8_t* pDstRow = pDataOut + row * nDstRowBytes;
+ for (int col = 0; col < nWidth; col++) {
+ int val = static_cast<int>((pSrcRow[col] - min) * rate + 0.5);
+ pDstRow[col] =
+ static_cast<uint8_t>(pdfium::clamp(val, kMinPixel, kMaxPixel));
+ }
+ }
+}
+
struct UniqueKeyGen {
void Generate(int count, ...);
@@ -184,9 +224,18 @@ std::unique_ptr<CFX_GlyphBitmap> CFX_FaceCache::RenderGlyph(
}
} else {
memset(pDestBuf, 0, dest_pitch * bmheight);
- int rowbytes = std::min(abs(src_pitch), dest_pitch);
- for (int row = 0; row < bmheight; row++)
- memcpy(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);
+ if (anti_alias == FXFT_RENDER_MODE_MONO &&
+ FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) ==
+ FXFT_PIXEL_MODE_MONO) {
+ int rowbytes = abs(src_pitch) > dest_pitch ? dest_pitch : abs(src_pitch);
+ for (int row = 0; row < bmheight; row++) {
+ memcpy(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch,
+ rowbytes);
+ }
+ } else {
+ ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch,
+ dest_pitch);
+ }
}
return pGlyphBitmap;
}