bug 107025 (part of bug 90813)

anti-aliased scaled bitmap font object code
r=shanjian@netscape.com, sr=blizzard@mozilla.org
This commit is contained in:
bstell%netscape.com 2001-11-16 01:59:23 +00:00
parent f2be5d0782
commit cdd317c3b4
5 changed files with 1745 additions and 0 deletions

67
gfx/src/gtk/nsXFont.h Normal file
View File

@ -0,0 +1,67 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Stell <bstell@netscape.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsXFont_h__
#define nsXFont_h__
class nsXFont {
public:
virtual ~nsXFont() { };
virtual void DrawText8(GdkDrawable *Drawable, GdkGC *GC, PRInt32,
PRInt32, const char *, PRUint32) = 0;
virtual void DrawText16(GdkDrawable *Drawable, GdkGC *GC, PRInt32,
PRInt32, const XChar2b *, PRUint32) = 0;
virtual PRBool GetXFontProperty(Atom, unsigned long *) = 0;
virtual XFontStruct *GetXFontStruct() = 0;
inline PRBool IsSingleByte() { return mIsSingleByte; };
virtual PRBool LoadFont() = 0;
virtual void TextExtents8(const char *, PRUint32, PRInt32*, PRInt32*,
PRInt32*, PRInt32*, PRInt32*) = 0;
virtual void TextExtents16(const XChar2b *, PRUint32, PRInt32*,
PRInt32*, PRInt32*, PRInt32*, PRInt32*) =0;
virtual PRInt32 TextWidth8(const char *, PRUint32) = 0;
virtual PRInt32 TextWidth16(const XChar2b *, PRUint32) = 0;
//protected:
virtual void UnloadFont() = 0;
protected:
PRBool mIsSingleByte;
};
#endif /* nsXFont_h__ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,120 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Stell <bstell@netscape.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsXFontAAScaledBitmap_h__
#define nsXFontAAScaledBitmap_h__
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
#include "nspr.h"
#include "nsXFont.h"
#include "nsAntiAliasedGlyph.h"
extern PRUint8 gAASBDarkTextMinValue;
extern double gAASBDarkTextGain;
extern PRUint8 gAASBLightTextMinValue;
extern double gAASBLightTextGain;
#define SCALED_SIZE(x) (PRInt32)(rint(((double)(x))*mRatio))
class nsHashtable;
class nsXFontAAScaledBitmap : public nsXFont {
public:
nsXFontAAScaledBitmap(Display *aDisplay, int aScreen, GdkFont *,
PRUint32, PRUint32);
~nsXFontAAScaledBitmap();
void DrawText8(GdkDrawable *Drawable, GdkGC *GC, PRInt32, PRInt32,
const char *, PRUint32);
void DrawText16(GdkDrawable *Drawable, GdkGC *GC, PRInt32, PRInt32,
const XChar2b *, PRUint32);
PRBool GetXFontProperty(Atom, unsigned long *);
XFontStruct *GetXFontStruct();
PRBool LoadFont();
void TextExtents8(const char *, PRUint32, PRInt32*, PRInt32*,
PRInt32*, PRInt32*, PRInt32*);
void TextExtents16(const XChar2b *, PRUint32, PRInt32*, PRInt32*,
PRInt32*, PRInt32*, PRInt32*);
PRInt32 TextWidth8(const char *, PRUint32);
PRInt32 TextWidth16(const XChar2b *, PRUint32);
void UnloadFont();
public:
static PRBool InitGlobals(Display *aDisplay, int aScreen);
static void FreeGlobals();
protected:
void DrawText8or16(GdkDrawable *Drawable, GdkGC *GC, PRInt32,
PRInt32, void *, PRUint32);
void TextExtents8or16(void *, PRUint32, PRInt32*, PRInt32*,
PRInt32*, PRInt32*, PRInt32*);
PRBool GetScaledGreyImage(const char *, nsAntiAliasedGlyph **);
#ifdef DEBUG
void dump_XImage_blue_data(XImage *ximage);
#endif
protected:
PRBool mAlreadyLoaded;
Display *mDisplay;
GC mForegroundGC;
GdkFont *mGdkFont;
nsHashtable* mGlyphHash;
double mRatio;
XFontStruct mScaledFontInfo;
GlyphMetrics mScaledMax;
int mScreen;
Pixmap mUnscaledBitmap;
XFontStruct *mUnscaledFontInfo;
GlyphMetrics mUnscaledMax;
PRUint16 mUnscaledSize;
// class globals
protected:
static Display *sDisplay;
static GC sBackgroundGC; // used to clear the pixmaps
// before drawing the glyph
static PRUint8 sWeightedScaleDarkText[256];
static PRUint8 sWeightedScaleLightText[256];
};
#endif /* nsXFontAAScaledBitmap_h__ */

View File

@ -0,0 +1,153 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Stell <bstell@netscape.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nscore.h"
#include "nsXFontNormal.h"
#include "nsRenderingContextGTK.h"
void
nsXFontNormal::DrawText8(GdkDrawable *aDrawable, GdkGC *aGC,
PRInt32 aX, PRInt32 aY,
const char *aString, PRUint32 aLength)
{
nsRenderingContextGTK::my_gdk_draw_text(aDrawable, mGdkFont, aGC,
aX, aY, aString, aLength);
}
void
nsXFontNormal::DrawText16(GdkDrawable *aDrawable, GdkGC *aGC,
PRInt32 aX, PRInt32 aY,
const XChar2b *aString, PRUint32 aLength)
{
nsRenderingContextGTK::my_gdk_draw_text(aDrawable, mGdkFont, aGC,
aX, aY,
(const char *)aString, aLength*2);
}
PRBool
nsXFontNormal::GetXFontProperty(Atom aAtom, unsigned long *aValue)
{
NS_ASSERTION(mGdkFont, "GetXFontProperty called before font loaded");
if (mGdkFont==nsnull)
return PR_FALSE;
XFontStruct *fontInfo = (XFontStruct *)GDK_FONT_XFONT(mGdkFont);
return ::XGetFontProperty(fontInfo, aAtom, aValue);
}
XFontStruct *
nsXFontNormal::GetXFontStruct()
{
NS_ASSERTION(mGdkFont, "GetXFontStruct called before font loaded");
if (mGdkFont==nsnull)
return nsnull;
return (XFontStruct *)GDK_FONT_XFONT(mGdkFont);
}
PRBool
nsXFontNormal::LoadFont()
{
if (!mGdkFont)
return PR_FALSE;
XFontStruct *fontInfo = (XFontStruct *)GDK_FONT_XFONT(mGdkFont);
mIsSingleByte = (fontInfo->min_byte1 == 0) && (fontInfo->max_byte1 == 0);
return PR_TRUE;
}
nsXFontNormal::nsXFontNormal(GdkFont *aGdkFont)
{
mGdkFont = ::gdk_font_ref(aGdkFont);
}
void
nsXFontNormal::TextExtents8(const char *aString, PRUint32 aLength,
PRInt32* aLBearing, PRInt32* aRBearing,
PRInt32* aWidth, PRInt32* aAscent,
PRInt32* aDescent)
{
gdk_text_extents(mGdkFont, aString, aLength,
aLBearing, aRBearing, aWidth, aAscent, aDescent);
}
void
nsXFontNormal::TextExtents16(const XChar2b *aString, PRUint32 aLength,
PRInt32* aLBearing, PRInt32* aRBearing,
PRInt32* aWidth, PRInt32* aAscent,
PRInt32* aDescent)
{
gdk_text_extents(mGdkFont, (const char *)aString, aLength*2,
aLBearing, aRBearing, aWidth, aAscent, aDescent);
}
PRInt32
nsXFontNormal::TextWidth8(const char *aString, PRUint32 aLength)
{
NS_ASSERTION(mGdkFont, "TextWidth8 called before font loaded");
if (mGdkFont==nsnull)
return 0;
PRInt32 width = gdk_text_width(mGdkFont, aString, aLength);
return width;
}
PRInt32
nsXFontNormal::TextWidth16(const XChar2b *aString, PRUint32 aLength)
{
NS_ASSERTION(mGdkFont, "TextWidth16 called before font loaded");
if (mGdkFont==nsnull)
return 0;
PRInt32 width = gdk_text_width(mGdkFont, (const char *)aString, aLength*2);
return width;
}
void
nsXFontNormal::UnloadFont()
{
delete this;
}
nsXFontNormal::~nsXFontNormal()
{
if (mGdkFont) {
::gdk_font_unref(mGdkFont);
}
}

View File

@ -0,0 +1,74 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Stell <bstell@netscape.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsXFontNormal_h__
#define nsXFontNormal_h__
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
#include "nspr.h"
#include "nsXFont.h"
class nsXFontNormal : public nsXFont {
public:
nsXFontNormal(GdkFont *);
~nsXFontNormal();
void DrawText8(GdkDrawable *Drawable, GdkGC *GC, PRInt32, PRInt32,
const char *, PRUint32);
void DrawText16(GdkDrawable *Drawable, GdkGC *GC, PRInt32, PRInt32,
const XChar2b *, PRUint32);
PRBool GetXFontProperty(Atom, unsigned long *);
XFontStruct *GetXFontStruct();
PRBool LoadFont();
void TextExtents8(const char *, PRUint32, PRInt32*, PRInt32*,
PRInt32*, PRInt32*, PRInt32*);
void TextExtents16(const XChar2b *, PRUint32, PRInt32*, PRInt32*,
PRInt32*, PRInt32*, PRInt32*);
PRInt32 TextWidth8(const char *, PRUint32);
PRInt32 TextWidth16(const XChar2b *, PRUint32);
void UnloadFont();
protected:
GdkFont *mGdkFont;
};
#endif /* nsXFontNormal_h__ */