Commit 40b3fa9443a4206d4f57e478bd9e357e4e4f003c

henry 2004-05-10T09:11:30

First add for buffer font stuff

diff --git a/include/FTBufferGlyph.h b/include/FTBufferGlyph.h
new file mode 100755
index 0000000..9795f4d
--- /dev/null
+++ b/include/FTBufferGlyph.h
@@ -0,0 +1,76 @@
+#ifndef     __FTBufferGlyph__
+#define     __FTBufferGlyph__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+
+#include "FTGL.h"
+#include "FTGlyph.h"
+
+
+/**
+ * FTBufferGlyph is a specialisation of FTGlyph for creating pixmaps.
+ * 
+ * @see FTGlyphContainer
+ *
+ */
+class  FTGL_EXPORT FTBufferGlyph : public FTGlyph
+{
+    public:
+        /**
+         * Constructor
+         *
+         * @param glyph The Freetype glyph to be processed
+         */
+        FTBufferGlyph( FT_GlyphSlot glyph, unsigned char* clientBuffer);
+
+        /**
+         * Destructor
+         */
+        virtual ~FTBufferGlyph();
+
+        /**
+         * Renders this glyph at the current pen position.
+         *
+         * @param pen   The current pen position.
+         * @return      The advance distance for this glyph.
+         */
+        virtual float Render( const FTPoint& pen);
+        
+        // attributes
+
+    private:
+        /**
+         * The width of the glyph 'image'
+         */
+        int destWidth;
+
+        /**
+         * The height of the glyph 'image'
+         */
+        int destHeight;
+
+        /**
+         * The pitch of the glyph 'image'
+         */
+        unsigned int destPitch;
+        
+        /**
+         * Vector from the pen position to the topleft corner of the pixmap
+         */
+        FTPoint pos;
+        
+        /**
+         * Pointer to the 'image' data
+         */
+        unsigned char* data;
+        
+        
+        unsigned char* buffer;
+        
+};
+
+
+#endif  //  __FTBufferGlyph__
diff --git a/include/FTGLBufferFont.h b/include/FTGLBufferFont.h
new file mode 100755
index 0000000..2f74b5c
--- /dev/null
+++ b/include/FTGLBufferFont.h
@@ -0,0 +1,76 @@
+#ifndef     __FTGLBufferFont__
+#define     __FTGLBufferFont__
+
+
+#include "FTFont.h"
+#include "FTGL.h"
+
+
+class FTGlyph;
+
+
+/**
+ * FTGLBufferFont is a specialisation of the FTFont class for handling
+ * Pixmap (Grey Scale) fonts
+ *
+ * @see     FTFont
+ */
+class FTGL_EXPORT FTGLBufferFont : public FTFont
+{
+    public:
+        /**
+         * Open and read a font file. Sets Error flag.
+         *
+         * @param fontname  font file name.
+         */
+        FTGLBufferFont( const char* fontname);
+        
+        /**
+         * Open and read a font from a buffer in memory. Sets Error flag.
+         *
+         * @param pBufferBytes  the in-memory buffer
+         * @param bufferSizeInBytes  the length of the buffer in bytes
+         */
+        FTGLBufferFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes);
+        
+        
+        void SetClientBuffer( unsigned char* b)
+        {
+            buffer = b;
+        }
+        
+        
+        /**
+         * Destructor
+         */
+        ~FTGLBufferFont();
+        
+        /**
+         * Renders a string of characters
+         * 
+         * @param string    'C' style string to be output.   
+         */
+        void Render( const char* string);
+        
+        /**
+         * Renders a string of characters
+         * 
+         * @param string    wchar_t string to be output.     
+         */
+        void Render( const wchar_t* string);
+
+    private:
+        /**
+         * Construct a FTBufferGlyph.
+         *
+         * @param g The glyph index NOT the char code.
+         * @return  An FTBufferGlyph or <code>null</code> on failure.
+         */
+        inline virtual FTGlyph* MakeGlyph( unsigned int g);
+        
+        unsigned char* buffer;
+};
+
+
+#endif  //  __FTGLBufferFont__
+
diff --git a/src/FTBufferGlyph.cpp b/src/FTBufferGlyph.cpp
new file mode 100755
index 0000000..2731010
--- /dev/null
+++ b/src/FTBufferGlyph.cpp
@@ -0,0 +1,59 @@
+#include    "FTBufferGlyph.h"
+
+FTBufferGlyph::FTBufferGlyph( FT_GlyphSlot glyph, unsigned char* b)
+:   FTGlyph( glyph),
+    destWidth(0),
+    destHeight(0),
+    data(0),
+    buffer(b)
+{
+    err = FT_Render_Glyph( glyph, FT_RENDER_MODE_NORMAL);
+    if( err || ft_glyph_format_bitmap != glyph->format)
+    {
+        return;
+    }
+
+    FT_Bitmap bitmap = glyph->bitmap;
+
+    unsigned int srcWidth = bitmap.width;
+    unsigned int srcHeight = bitmap.rows;
+    unsigned int srcPitch = bitmap.pitch;
+    
+    destWidth = srcWidth;
+    destHeight = srcHeight;
+    destPitch = srcPitch;    
+
+    if( destWidth && destHeight)
+    {
+        data = new unsigned char[destPitch * destHeight];
+        unsigned char* dest = data + (( destHeight - 1) * destPitch);
+
+        unsigned char* src = bitmap.buffer;
+
+        for( unsigned int y = 0; y < srcHeight; ++y)
+        {
+            memcpy( dest, src, srcPitch);
+            dest -= destPitch;
+            src += srcPitch;
+        }
+    }
+
+    pos.x = glyph->bitmap_left;
+    pos.y = srcHeight - glyph->bitmap_top;
+}
+
+
+FTBufferGlyph::~FTBufferGlyph()
+{
+    delete [] data;
+}
+
+
+float FTBufferGlyph::Render( const FTPoint& pen)
+{
+    if( data && buffer)
+    {
+    }
+
+    return advance;
+}
diff --git a/src/FTGLBufferFont.cpp b/src/FTGLBufferFont.cpp
new file mode 100755
index 0000000..b8af0fc
--- /dev/null
+++ b/src/FTGLBufferFont.cpp
@@ -0,0 +1,53 @@
+#include    "FTGLBufferFont.h"
+#include    "FTBufferGlyph.h"
+
+
+FTGLBufferFont::FTGLBufferFont( const char* fontname)
+:   FTFont( fontname),
+    buffer(0)
+{}
+
+
+FTGLBufferFont::FTGLBufferFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes)
+:   FTFont( pBufferBytes, bufferSizeInBytes),
+    buffer(0)
+{}
+
+
+FTGLBufferFont::~FTGLBufferFont()
+{}
+
+
+FTGlyph* FTGLBufferFont::MakeGlyph( unsigned int g)
+{
+    FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_NO_HINTING);
+
+    if( ftGlyph)
+    {
+        FTBufferGlyph* tempGlyph = new FTBufferGlyph( ftGlyph, buffer);
+        return tempGlyph;
+    }
+
+    err = face.Error();
+    return NULL;
+}
+
+
+void FTGLBufferFont::Render( const char* string)
+{   
+    if( NULL != buffer)
+    {
+        FTFont::Render( string);
+    }
+}
+
+
+void FTGLBufferFont::Render( const wchar_t* string)
+{   
+    if( NULL != buffer)
+    {
+        FTFont::Render( string);
+    }
+}
+
+