www.pudn.com > GDIPlusCF.zip > Matrix.cs, change:2007-10-31,size:7987b


using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace OpenNETCF.GDIPlus 
{ 
    public class Matrix 
    { 
    Matrix() 
    { 
        GpMatrix matrix; 
 
        lastResult = NativeMethods.GdipCreateMatrix(out matrix); 
     
        SetNativeMatrix(matrix); 
    } 
 
    Matrix(float m11,  
           float m12, 
           float m21,  
           float m22, 
           float dx,  
           float dy) 
    { 
        GpMatrix matrix; 
 
        lastResult = NativeMethods.GdipCreateMatrix2(m11, m12, m21, m22,  
                                                      dx, dy, out matrix); 
     
        SetNativeMatrix(matrix); 
    } 
     
    Matrix( GpRectF rect,  
            GpPointF[] dstplg) 
    { 
        GpMatrix matrix; 
 
        lastResult = NativeMethods.GdipCreateMatrix3(rect,  
                                                   dstplg, 
                                                   out matrix); 
 
        SetNativeMatrix(matrix); 
    } 
 
 
    ~Matrix() 
    { 
        NativeMethods.GdipDeleteMatrix(nativeMatrix); 
    } 
 
 
    GpStatus GetElements(float[] m)   
    { 
        return SetStatus(NativeMethods.GdipGetMatrixElements(nativeMatrix, m)); 
    } 
     
    GpStatus SetElements(float m11,  
                       float m12,  
                       float m21,  
                       float m22,  
                       float dx,  
                       float dy) 
    { 
        return SetStatus(NativeMethods.GdipSetMatrixElements(nativeMatrix, 
                            m11, m12, m21, m22, dx, dy)); 
    } 
 
    float OffsetX()  
    { 
        float[] elements = new float [6]; 
 
        if (GetElements(elements) == GpStatus.Ok) 
            return elements[4]; 
        else  
            return 0.0f; 
    } 
 
    float OffsetY()  
    { 
        float[] elements = new float [6]; 
 
        if (GetElements(elements) == GpStatus.Ok) 
           return elements[5]; 
       else  
           return 0.0f; 
    } 
 
    GpStatus Reset() 
    { 
        // set identity matrix elements  
        return SetStatus(NativeMethods.GdipSetMatrixElements(nativeMatrix, 
                                             1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f)); 
    } 
/* 
    Status Multiply( Matrix matrix,  
                    MatrixOrder order ) 
    { 
        return SetStatus(NativeMethods.GdipMultiplyMatrix(nativeMatrix,  
                                          matrix.nativeMatrix, 
                                          order)); 
    } 
 
    Status Translate(float offsetX,  
                     float offsetY,  
                     MatrixOrder order ) 
    { 
        return SetStatus(NativeMethods.GdipTranslateMatrix(nativeMatrix, offsetX, 
                                                         offsetY, order)); 
    } 
 
    Status Scale(float scaleX,  
                 float scaleY,  
                 MatrixOrder order ) 
    { 
        return SetStatus(NativeMethods.GdipScaleMatrix(nativeMatrix, scaleX,  
                                                     scaleY, order)); 
    } 
 
    Status Rotate(float angle,  
                  MatrixOrder order) 
    { 
        return SetStatus(NativeMethods.GdipRotateMatrix(nativeMatrix, angle,  
                                                      order)); 
    } 
     
    Status RotateAt(float angle,  
                     PointF center,  
                    MatrixOrder order ) 
    { 
        if(order == MatrixOrderPrepend) 
        { 
            SetStatus(NativeMethods.GdipTranslateMatrix(nativeMatrix, center.X, 
                                                      center.Y, order)); 
            SetStatus(NativeMethods.GdipRotateMatrix(nativeMatrix, angle,  
                                                   order)); 
            return SetStatus(NativeMethods.GdipTranslateMatrix(nativeMatrix, 
                                                             -center.X,  
                                                             -center.Y,  
                                                             order)); 
        } 
        else 
        { 
            SetStatus(NativeMethods.GdipTranslateMatrix(nativeMatrix,  
                                                      - center.X,  
                                                      - center.Y,  
                                                      order)); 
            SetStatus(NativeMethods.GdipRotateMatrix(nativeMatrix, angle,  
                                                   order)); 
            return SetStatus(NativeMethods.GdipTranslateMatrix(nativeMatrix,  
                                                             center.X,  
                                                             center.Y,  
                                                             order)); 
        } 
    } 
 
    Status Shear(float shearX,  
                 float shearY, 
                 MatrixOrder order = MatrixOrderPrepend) 
    { 
        return SetStatus(NativeMethods.GdipShearMatrix(nativeMatrix, shearX,  
                                                     shearY, order)); 
    } 
 
    Status Invert() 
    { 
        return SetStatus(NativeMethods.GdipInvertMatrix(nativeMatrix)); 
    } 
 
    // float version 
    Status TransformPoints(PointF[] pts)  
    { 
        return SetStatus(NativeMethods.GdipTransformMatrixPoints(nativeMatrix,  
                                                               pts, count)); 
    } 
     
    Status TransformPoints(Point[] pts)  
    { 
        return SetStatus(NativeMethods.GdipTransformMatrixPointsI(nativeMatrix,  
                                                                pts,  
                                                                count)); 
    } 
 
    Status TransformVectors(OUT PointF* pts,  
                            INT count = 1)  
    {  
        return SetStatus(NativeMethods.GdipVectorTransformMatrixPoints( 
                                        nativeMatrix, pts, count)); 
    } 
 
    Status TransformVectors(OUT Point* pts,  
                            INT count = 1)  
    {  
       return SetStatus(NativeMethods.GdipVectorTransformMatrixPointsI( 
                                        nativeMatrix,  
                                        pts,  
                                        count)); 
    } 
     
    BOOL IsInvertible()  
    { 
        BOOL result = FALSE; 
 
        SetStatus(NativeMethods.GdipIsMatrixInvertible(nativeMatrix, &result)); 
     
        return result; 
    } 
 
    BOOL IsIdentity()  
    { 
       BOOL result = FALSE; 
 
       SetStatus(NativeMethods.GdipIsMatrixIdentity(nativeMatrix, &result)); 
     
       return result; 
    } 
        */ 
    bool Equals( Matrix matrix)  
    { 
       bool result = false; 
 
        float []points1 = new float[6], points2 = new float[6]; 
        GetElements(points1); 
        matrix.GetElements(points2); 
        for(int i = 0; i < 6; i++ ) 
            if ( points1[i] != points2[i] ) 
                return false; 
        return true; 
    } 
     
    GpStatus GetLastStatus()  
    { 
        GpStatus lastStatus = lastResult; 
        lastResult = GpStatus.Ok; 
  
        return lastStatus; 
    } 
 
 
    private Matrix( Matrix m) 
    { 
        float[] points = new float[6]; 
        m.GetElements(points); 
        SetElements(points[0], points[2], points[3], points[4], points[5], points[6]); 
    } 
 
 
    protected Matrix(GpMatrix nativeMatrix) 
    { 
        lastResult = GpStatus.Ok; 
        SetNativeMatrix(nativeMatrix); 
    } 
     
    void SetNativeMatrix(GpMatrix nativeMatrix) 
    { 
        this.nativeMatrix = nativeMatrix; 
    } 
 
    GpStatus SetStatus(GpStatus status)  
    { 
        if (status != GpStatus.Ok) 
            return (lastResult = status); 
        else 
            return status; 
    } 
 
 
    internal GpMatrix nativeMatrix; 
        protected GpStatus lastResult; 
    } 
}