Back to index

lightning-sunbird  0.9+nobinonly
nsFontUtils.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
00002  *
00003  * ***** BEGIN LICENSE BLOCK *****
00004  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00005  *
00006  * The contents of this file are subject to the Mozilla Public License Version
00007  * 1.1 (the "License"); you may not use this file except in compliance with
00008  * the License. You may obtain a copy of the License at
00009  * http://www.mozilla.org/MPL/
00010  *
00011  * Software distributed under the License is distributed on an "AS IS" basis,
00012  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013  * for the specific language governing rights and limitations under the
00014  * License.
00015  *
00016  * The Original Code is mozilla.org code.
00017  *
00018  * The Initial Developer of the Original Code is
00019  * Netscape Communications Corporation.
00020  * Portions created by the Initial Developer are Copyright (C) 1998
00021  * the Initial Developer. All Rights Reserved.
00022  *
00023  * Contributor(s):
00024  *
00025  * Alternatively, the contents of this file may be used under the terms of
00026  * either of the GNU General Public License Version 2 or later (the "GPL"),
00027  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028  * in which case the provisions of the GPL or the LGPL are applicable instead
00029  * of those above. If you wish to allow use of your version of this file only
00030  * under the terms of either the GPL or the LGPL, and not to allow others to
00031  * use your version of this file under the terms of the MPL, indicate your
00032  * decision by deleting the provisions above and replace them with the notice
00033  * and other provisions required by the GPL or the LGPL. If you do not delete
00034  * the provisions above, a recipient may use your version of this file under
00035  * the terms of any one of the MPL, the GPL or the LGPL.
00036  *
00037  * ***** END LICENSE BLOCK ***** */
00038 
00039 
00040 #include "nsIPref.h"
00041 #include "nsIServiceManager.h"
00042 
00043 #include "nsFont.h"
00044 #include "nsDeviceContextMac.h"
00045 
00046 #include "nsFontUtils.h"
00047 
00048 PRBool nsFontUtils::sDisplayVerySmallFonts = true;
00049 
00050 
00051 PRBool
00052 nsFontUtils::DisplayVerySmallFonts()
00053 {
00054        static PRBool sInitialized = PR_FALSE;
00055        if (sInitialized)
00056               return sDisplayVerySmallFonts;
00057 
00058        sInitialized = PR_TRUE;
00059 
00060   nsresult rv;
00061   nsCOMPtr<nsIPref> prefs = do_GetService(NS_PREF_CONTRACTID, &rv);
00062   if (NS_SUCCEEDED(rv) && prefs) {
00063     PRBool boolVal;
00064     if (NS_SUCCEEDED(prefs->GetBoolPref("browser.display_very_small_fonts", &boolVal))) {
00065       sDisplayVerySmallFonts = boolVal;
00066     }
00067   }
00068 
00069        return sDisplayVerySmallFonts;
00070 }
00071 
00072 
00073 // A utility routine to the the text style in a convenient manner.
00074 // This is static, which is unfortunate, because it introduces link
00075 // dependencies between libraries that should not exist.
00076 void
00077 nsFontUtils::GetNativeTextStyle(nsIFontMetrics& inMetrics,
00078               const nsIDeviceContext& inDevContext, TextStyle &outStyle)
00079 {
00080        const nsFont *aFont = &inMetrics.Font();
00081 
00082        nsFontHandle  fontNum;
00083        inMetrics.GetFontHandle(fontNum);
00084        
00085        float  dev2app;
00086        dev2app = inDevContext.DevUnitsToAppUnits();
00087        short         textSize = float(aFont->size) / dev2app;
00088        textSize = PR_MAX(1, textSize);
00089 
00090        if (textSize < 9 && !nsFontUtils::DisplayVerySmallFonts())
00091               textSize = 9;
00092        
00093        Style textFace = normal;
00094        switch (aFont->style)
00095        {
00096               case NS_FONT_STYLE_NORMAL:                                                   break;
00097               case NS_FONT_STYLE_ITALIC:         textFace |= italic;         break;
00098               case NS_FONT_STYLE_OBLIQUE:        textFace |= italic;         break; //XXX
00099        }
00100 
00101        PRInt32 offset = aFont->weight % 100;
00102        PRInt32 baseWeight = aFont->weight / 100;
00103        NS_ASSERTION((offset < 10) || (offset > 90), "Invalid bolder or lighter value");
00104        if (offset == 0) {
00105               if (aFont->weight >= NS_FONT_WEIGHT_BOLD)
00106                      textFace |= bold;
00107        } else {
00108               if (offset < 10)
00109                      textFace |= bold;
00110        }
00111 
00112        RGBColor      black = {0};
00113 
00114        outStyle.tsFont = (short) NS_PTR_TO_INT32(fontNum);
00115        outStyle.tsFace = textFace;
00116        outStyle.tsSize = textSize;
00117        outStyle.tsColor = black;
00118 }
00119