Click here to Skip to main content
15,894,646 members
Articles / Multimedia / DirectX

Rendering Text with Direct2D & DirectWrite

Rate me:
Please Sign up or sign in to vote.
4.94/5 (39 votes)
3 Jan 2015CPOL8 min read 106.6K   2.8K   76  
Direct2D, DirectWrite, Windows API, C++, std::shared_ptr and more
#pragma once
#ifndef __HWINEXCEPTION_H__
#define __HWINEXCEPTION_H__

#include "hwindef.h"


namespace harlinn
{
    namespace windows
    {
        class ExceptionData
        {
            std::string message;
            std::string helpLink;
            std::string source;
            HRESULT hResult;
            long long code;
            ExceptionData* innerException;
            
        public:
            HWIN_EXPORT explicit ExceptionData();
            HWIN_EXPORT explicit ExceptionData(const ExceptionData& theInnerException);
            HWIN_EXPORT explicit ExceptionData(const char* theMessage);
            HWIN_EXPORT explicit ExceptionData(const std::string& theMessage);
            HWIN_EXPORT ExceptionData(const char* theMessage, const ExceptionData* theInnerException);
            HWIN_EXPORT ~ExceptionData( );

            HWIN_EXPORT ExceptionData* Clone() const;

            HWIN_EXPORT const std::string& GetMessage() const;
            HWIN_EXPORT std::string GetMessage();
            HWIN_EXPORT ExceptionData& SetMessage(const char* theValue);
            HWIN_EXPORT ExceptionData& SetMessage(const std::string& theValue);

            HWIN_EXPORT const std::string& GetHelpLink() const;
            HWIN_EXPORT std::string GetHelpLink();
            HWIN_EXPORT ExceptionData& SetHelpLink(const char* theValue);
            HWIN_EXPORT ExceptionData& SetHelpLink(const std::string& theValue);

            HWIN_EXPORT HRESULT GetHRESULT() const;
            HWIN_EXPORT ExceptionData& SetHRESULT(HRESULT theValue);

            HWIN_EXPORT long long GetCode() const;
            HWIN_EXPORT ExceptionData& SetCode(long long theValue);


            HWIN_EXPORT const ExceptionData* GetInnerException() const;
            HWIN_EXPORT ExceptionData& SetInnerException(const ExceptionData* theValue);

            HWIN_EXPORT const std::string& GetSource() const;
            HWIN_EXPORT std::string GetSource();
            HWIN_EXPORT ExceptionData& SetSource(const char* theValue);
            HWIN_EXPORT ExceptionData& SetSource(const std::string& theValue);
        };

        class Exception : std::exception
        {
            ExceptionData* data;
            HWIN_EXPORT static std::string empty;
            HWIN_EXPORT const ExceptionData* GetExceptionData() const;
            HWIN_EXPORT ExceptionData* GetExceptionData();
        public:
            HWIN_EXPORT static std::string Format(const char*fmt, ... );
        protected:
            HWIN_EXPORT static std::string FormatList(const char*fmt, va_list args );
        public:
            HWIN_EXPORT explicit Exception();
            HWIN_EXPORT Exception(const Exception& theException);
            HWIN_EXPORT Exception(Exception&& theException);
            HWIN_EXPORT explicit Exception(const char* theMessage);
            HWIN_EXPORT explicit Exception(const std::string& theMessage);
            HWIN_EXPORT Exception(const char* theMessage, const Exception& theInnerException);
            HWIN_EXPORT virtual ~Exception();

            HWIN_EXPORT Exception& operator = (const Exception& theException);
            HWIN_EXPORT Exception& operator = (Exception&& theException);

            HWIN_EXPORT virtual const char* what() const;


            HWIN_EXPORT const std::string& GetMessage() const;
            HWIN_EXPORT std::string GetMessage();
            HWIN_EXPORT Exception& SetMessage(const char* theValue);
            HWIN_EXPORT Exception& SetMessage(const std::string& theValue);

            HWIN_EXPORT const std::string& GetHelpLink() const;
            HWIN_EXPORT std::string GetHelpLink();
            HWIN_EXPORT Exception& SetHelpLink(const char* theValue);
            HWIN_EXPORT Exception& SetHelpLink(const std::string& theValue);

            HWIN_EXPORT HRESULT GetHRESULT() const;
            HWIN_EXPORT Exception& SetHRESULT(HRESULT theValue);

            HWIN_EXPORT long long GetCode() const;
            HWIN_EXPORT Exception& SetCode(long long theValue);

            HWIN_EXPORT const ExceptionData* GetInnerException() const;
            HWIN_EXPORT Exception& SetInnerException(const Exception& theValue);

            HWIN_EXPORT const std::string& GetSource() const;
            HWIN_EXPORT std::string GetSource();
            HWIN_EXPORT Exception& SetSource(const char* theValue);
            HWIN_EXPORT Exception& SetSource(const std::string& theValue);

        };

#define HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( className ) \
HWIN_EXPORT explicit className (); \
HWIN_EXPORT className (const className & theException);  \
HWIN_EXPORT className ( className && theException);  \
HWIN_EXPORT explicit className (const char* theMessage);  \
HWIN_EXPORT explicit className (const std::string& theMessage);  \
HWIN_EXPORT className (const char* theMessage, const Exception& theInnerException);  \
HWIN_EXPORT className & operator = (const className & theException); \
HWIN_EXPORT className & operator = ( className && theException)

#define HARLINN_WINDOWS_IMPLEMENT_STANDARD_EXCEPTION_MEMBERS( className ) \
HWIN_EXPORT className :: className () : Base() { } \
HWIN_EXPORT className :: className (const className & theException) : Base(theException) { }  \
HWIN_EXPORT className :: className ( className && theException) : Base(theException) { }  \
HWIN_EXPORT className :: className (const char* theMessage) : Base(theMessage) { }  \
HWIN_EXPORT className :: className (const std::string& theMessage) : Base(theMessage) { }  \
HWIN_EXPORT className :: className (const char* theMessage, const Exception& theInnerException) : Base(theMessage,theInnerException) { }  \
HWIN_EXPORT className & className :: operator = (const className & theException ) { Base :: operator = ( reinterpret_cast< const Base & > (theException) ); return *this; }  \
HWIN_EXPORT className & className :: operator = ( className && theException) { Base :: operator = ( reinterpret_cast< Base && > (theException) ); return *this; }  

        class SystemException : public Exception
        {
        public:
            typedef Exception Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( SystemException );
        };

        class AccessViolationException : public SystemException
        {
        public:
            typedef SystemException Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( AccessViolationException );
        };

        class AggregateException : public Exception
        {
        public:
            typedef Exception Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( AggregateException );
        };

        class ApplicationException  : public Exception
        {
        public:
            typedef Exception Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( ApplicationException );
        };


        class ArgumentException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( ArgumentException );

            HWIN_EXPORT ArgumentException(const char* message, const char* argument);
            HWIN_EXPORT ArgumentException(const std::string& message, const char* argument );
            HWIN_EXPORT ArgumentException(const std::string& message, const std::string& argument);
        };

        class ArgumentNullException : public ArgumentException
        {
        public:
            typedef ArgumentException Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( ArgumentNullException );

            

        };

        class ArgumentOutOfRangeException  : public ArgumentException
        {
        public:
            typedef ArgumentException Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( ArgumentOutOfRangeException );

            HWIN_EXPORT ArgumentOutOfRangeException(const char* argument, const char* message);
            HWIN_EXPORT ArgumentOutOfRangeException(const char* argument, const std::string& message);
            HWIN_EXPORT ArgumentOutOfRangeException(const std::string& argument, const std::string& message);

        };


        class ArithmeticException : public SystemException
        {
        public:
            typedef SystemException Base;
            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( ArithmeticException );

        };

        class BadImageFormatException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( BadImageFormatException );
        };


        class DataMisalignedException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( DataMisalignedException );
        };

        class TypeLoadException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( TypeLoadException );
        };

        class DivideByZeroException : public ArithmeticException
        {
        public:
            typedef ArithmeticException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( DivideByZeroException );
        };

        class DllNotFoundException : public TypeLoadException
        {
        public:
            typedef TypeLoadException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( DllNotFoundException );
        };

        class DuplicateWaitObjectException : public ArgumentException
        {
        public:
            typedef ArgumentException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( DuplicateWaitObjectException );
        };

        class EntryPointNotFoundException : public TypeLoadException
        {
        public:
            typedef TypeLoadException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( EntryPointNotFoundException );
        };

        class MemberAccessException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( MemberAccessException );
        };

        class FieldAccessException : public MemberAccessException
        {
        public:
            typedef MemberAccessException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( FieldAccessException );
        };


        class FormatException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( FormatException );
        };

        class IndexOutOfRangeException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( IndexOutOfRangeException );
        }; 


        class InsufficientExecutionStackException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( InsufficientExecutionStackException );
        };

        class OutOfMemoryException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( OutOfMemoryException );

        }; 

        class InsufficientMemoryException : public OutOfMemoryException
        {
        public:
            typedef OutOfMemoryException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( InsufficientMemoryException );
        }; 

        class InvalidCastException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( InvalidCastException );
        }; 


        class InvalidOperationException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( InvalidOperationException );
        };

        class InvalidProgramException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( InvalidProgramException );
        };

        class InvalidTimeZoneException : public Exception
        {
        public:
            typedef Exception Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( InvalidTimeZoneException );
        };

        class MethodAccessException : public MemberAccessException
        {
        public:
            typedef MemberAccessException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( MethodAccessException );
        };

        class MissingMemberException : public MemberAccessException
        {
        public:
            typedef MemberAccessException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( MissingMemberException );
        };

        class MissingFieldException : public MissingMemberException
        {
        public:
            typedef MissingMemberException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( MissingFieldException );
        };


        class MissingMethodException : public MissingMemberException
        {
        public:
            typedef MissingMemberException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( MissingMethodException );
        };

        class MulticastNotSupportedException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( MulticastNotSupportedException );
        };

        class NotFiniteNumberException : public ArithmeticException
        {
        public:
            typedef ArithmeticException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( NotFiniteNumberException );
        };

        class NotImplementedException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( NotImplementedException );
        };

        class NotSupportedException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( NotSupportedException );
        };

        class NullReferenceException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( NullReferenceException );
        };

        class OperationCanceledException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( OperationCanceledException );
        };

        class OverflowException : public ArithmeticException
        {
        public:
            typedef ArithmeticException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( OverflowException );
        };


        class PlatformNotSupportedException : public NotSupportedException
        {
        public:
            typedef NotSupportedException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( PlatformNotSupportedException );
        };

        class RankException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( RankException );
        };

        class TimeoutException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( TimeoutException );
        };


        class TypeInitializationException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( TypeInitializationException );
        };

        class TypeUnloadedException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( TypeUnloadedException );
        };

        class UnauthorizedAccessException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( UnauthorizedAccessException );
        };

        class UriFormatException : public FormatException
        {
        public:
            typedef FormatException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( UriFormatException );
        };

        class UriTemplateMatchException : public SystemException
        {
        public:
            typedef SystemException Base;

            HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( UriTemplateMatchException );
        };

        namespace io
        {
            class IOException : public SystemException
            {
            public:
                typedef SystemException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( IOException );
            };

            class DirectoryNotFoundException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( DirectoryNotFoundException );
            };


            class DriveNotFoundException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( DriveNotFoundException );
            };

            class EndOfStreamException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( EndOfStreamException );
            };

            class FileLoadException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( FileLoadException );
            };


            class FileNotFoundException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( FileNotFoundException );
            };   

            class PathTooLongException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( PathTooLongException );
            };

            class PipeException : public IOException
            {
            public:
                typedef IOException Base;

                HARLINN_WINDOWS_DECLARE_STANDARD_EXCEPTION_MEMBERS( PipeException );
            };



        }





        HWIN_EXPORT void CheckHRESULT(HRESULT hresult);
        HWIN_EXPORT void ThrowLastOSError();
        HWIN_EXPORT void ThrowOSError(DWORD errorId);
        HWIN_EXPORT void ThrowNoInterface();
        HWIN_EXPORT void ThrowPointerIsNULL();
        HWIN_EXPORT void ThrowInvalidHandle();
        HWIN_EXPORT HRESULT HRESULTFromException(const std::exception& exception);

        template <typename T>
        inline void CheckPointerNotNull(T* ptr)
        {
            if(!ptr)
            {
                ThrowPointerIsNULL();
            }
        }

        template <typename T>
        inline void CheckPointerNotNull( std::shared_ptr<T> ptr )
        {
            if(!ptr)
            {
                ThrowPointerIsNULL();
            }
        }


    };
};

#endif //__HWINEXCEPTION_H__

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions