From 42613d8961fe1011210facebe2c8187f79c8eb21 Mon Sep 17 00:00:00 2001 From: Henrique Nakashima Date: Fri, 27 Oct 2017 15:36:33 +0000 Subject: Revert "Remove ContrastAdjust()." This reverts commit 53d443f042b590ae2d920def16bc9daf66f8427d. Reason for revert: Breaks PDFToPWGRasterBrowserTest Original change's description: > Remove ContrastAdjust(). > > This post-processing increased the contrast of scaled-down features - > mainly lines and fonts, relative to the background. The effect does not > improved readability and in some cases makes the scaled-down version > look like a different document at a glance. Text that is normal > weight appears bold when scaled down in these cases. > > Change-Id: I2544d45e2bcec25d6742d2a60c1316d8df08cce1 > Reviewed-on: https://pdfium-review.googlesource.com/15471 > Commit-Queue: Henrique Nakashima > Reviewed-by: dsinclair TBR=bungeman@chromium.org,dsinclair@chromium.org,hnakashima@chromium.org # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I7f61650bc6d917b3c6640da60f3f740ef4498de0 Reviewed-on: https://pdfium-review.googlesource.com/16970 Commit-Queue: Henrique Nakashima Reviewed-by: Henrique Nakashima --- core/fxge/cfx_facecache.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) (limited to 'core/fxge') 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(-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((pSrcRow[col] - min) * rate + 0.5); + pDstRow[col] = + static_cast(pdfium::clamp(val, kMinPixel, kMaxPixel)); + } + } +} + struct UniqueKeyGen { void Generate(int count, ...); @@ -184,9 +224,18 @@ std::unique_ptr 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; } -- cgit v1.2.3