Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: src/ports/SkFontHost_win_dw.cpp

Issue 303773002: Better handling of bitmaps in DirectWrite. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkTypes.h" 8 #include "SkTypes.h"
9 #undef GetGlyphIndices 9 #undef GetGlyphIndices
10 10
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 734
735 // GA is the matrix A with rotation removed. 735 // GA is the matrix A with rotation removed.
736 SkMatrix GA(G); 736 SkMatrix GA(G);
737 GA.preConcat(A); 737 GA.preConcat(A);
738 738
739 // realTextSize is the actual device size we want (as opposed to the size th e user requested). 739 // realTextSize is the actual device size we want (as opposed to the size th e user requested).
740 // gdiTextSize is the size we request when GDI compatible. 740 // gdiTextSize is the size we request when GDI compatible.
741 // If the scale is negative, this means the matrix will do the flip anyway. 741 // If the scale is negative, this means the matrix will do the flip anyway.
742 SkScalar realTextSize = SkScalarAbs(GA.get(SkMatrix::kMScaleY)); 742 SkScalar realTextSize = SkScalarAbs(GA.get(SkMatrix::kMScaleY));
743 // Due to floating point math, the lower bits are suspect. Round carefully. 743 // Due to floating point math, the lower bits are suspect. Round carefully.
744 SkScalar roundedTextSize = SkScalarRoundToScalar(realTextSize * 64.0f) / 64. 0f; 744 SkScalar gdiTextSize = SkScalarRoundToScalar(realTextSize * 64.0f) / 64.0f;
745 SkScalar gdiTextSize = SkScalarFloorToScalar(roundedTextSize);
746 if (gdiTextSize == 0) { 745 if (gdiTextSize == 0) {
747 gdiTextSize = SK_Scalar1; 746 gdiTextSize = SK_Scalar1;
748 } 747 }
749 748
750 bool hasBitmap = fRec.fFlags & SkScalerContext::kEmbeddedBitmapText_Flag && 749 bool bitmapRequested = SkToBool(fRec.fFlags & SkScalerContext::kEmbeddedBitm apText_Flag);
751 hasBitmapStrike(typeface, SkScalarTruncToInt(gdiTextSize)); 750 bool hasBitmap = false;
752 bool axisAligned = isAxisAligned(fRec); 751 bool axisAlignedBitmap = false;
753 bool isBiLevel = SkMask::kBW_Format == fRec.fMaskFormat || (hasBitmap && axi sAligned); 752 if (bitmapRequested) {
753 hasBitmap = hasBitmapStrike(typeface, SkScalarTruncToInt(gdiTextSize));
754 axisAlignedBitmap = isAxisAligned(fRec);
755 }
754 756
755 if (isBiLevel) { 757 // If the user requested aliased, do so with aliased compatible metrics.
758 if (SkMask::kBW_Format == fRec.fMaskFormat) {
756 fTextSizeRender = gdiTextSize; 759 fTextSizeRender = gdiTextSize;
757 fRenderingMode = DWRITE_RENDERING_MODE_ALIASED; 760 fRenderingMode = DWRITE_RENDERING_MODE_ALIASED;
758 fTextureType = DWRITE_TEXTURE_ALIASED_1x1; 761 fTextureType = DWRITE_TEXTURE_ALIASED_1x1;
759 fTextSizeMeasure = gdiTextSize; 762 fTextSizeMeasure = gdiTextSize;
760 fMeasuringMode = DWRITE_MEASURING_MODE_GDI_CLASSIC; 763 fMeasuringMode = DWRITE_MEASURING_MODE_GDI_CLASSIC;
764
765 // If we can use a bitmap, use gdi classic rendering and measurement.
766 // This will not always provide a bitmap, but matches expected behavior.
767 } else if (hasBitmap && axisAlignedBitmap) {
768 fTextSizeRender = gdiTextSize;
769 fRenderingMode = DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC;
770 fTextureType = DWRITE_TEXTURE_CLEARTYPE_3x1;
771 fTextSizeMeasure = gdiTextSize;
772 fMeasuringMode = DWRITE_MEASURING_MODE_GDI_CLASSIC;
773
774 // If rotated but the horizontal text could have used a bitmap,
775 // render high quality rotated glyphs but measure using bitmap metrics.
761 } else if (hasBitmap) { 776 } else if (hasBitmap) {
762 // If rotated but the horizontal text would have used a bitmap,
763 // render high quality rotated glyphs using the bitmap metrics.
764 fTextSizeRender = gdiTextSize; 777 fTextSizeRender = gdiTextSize;
765 fRenderingMode = DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC; 778 fRenderingMode = DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC;
766 fTextureType = DWRITE_TEXTURE_CLEARTYPE_3x1; 779 fTextureType = DWRITE_TEXTURE_CLEARTYPE_3x1;
767 fTextSizeMeasure = gdiTextSize; 780 fTextSizeMeasure = gdiTextSize;
768 fMeasuringMode = DWRITE_MEASURING_MODE_GDI_CLASSIC; 781 fMeasuringMode = DWRITE_MEASURING_MODE_GDI_CLASSIC;
782
783 // The normal case is to use natural symmetric rendering and linear metrics.
769 } else { 784 } else {
770 fTextSizeRender = realTextSize; 785 fTextSizeRender = realTextSize;
771 fRenderingMode = DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC; 786 fRenderingMode = DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC;
772 fTextureType = DWRITE_TEXTURE_CLEARTYPE_3x1; 787 fTextureType = DWRITE_TEXTURE_CLEARTYPE_3x1;
773 fTextSizeMeasure = realTextSize; 788 fTextSizeMeasure = realTextSize;
774 fMeasuringMode = DWRITE_MEASURING_MODE_NATURAL; 789 fMeasuringMode = DWRITE_MEASURING_MODE_NATURAL;
775 } 790 }
776 791
777 if (this->isSubpixel()) { 792 if (this->isSubpixel()) {
778 fTextSizeMeasure = realTextSize; 793 fTextSizeMeasure = realTextSize;
(...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2004 } 2019 }
2005 2020
2006 #include "SkFontMgr_indirect.h" 2021 #include "SkFontMgr_indirect.h"
2007 SkFontMgr* SkFontMgr_New_DirectWriteRenderer(SkRemotableFontMgr* proxy) { 2022 SkFontMgr* SkFontMgr_New_DirectWriteRenderer(SkRemotableFontMgr* proxy) {
2008 SkAutoTUnref<SkFontMgr> impl(SkFontMgr_New_DirectWrite()); 2023 SkAutoTUnref<SkFontMgr> impl(SkFontMgr_New_DirectWrite());
2009 if (impl.get() == NULL) { 2024 if (impl.get() == NULL) {
2010 return NULL; 2025 return NULL;
2011 } 2026 }
2012 return SkNEW_ARGS(SkFontMgr_Indirect, (impl.get(), proxy)); 2027 return SkNEW_ARGS(SkFontMgr_Indirect, (impl.get(), proxy));
2013 } 2028 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698