/**************************************************************************\ * * Copyright (c) 1999 Microsoft Corporation * * Abstract: * * Quad Transforms * * History: * * 03/17/1999 ikkof * Created it. * \**************************************************************************/ #ifndef _QUADTRAMSFOPRMS_HPP #define _QUADTRAMSFOPRMS_HPP //#define TEST_QUADTRANSFORMS class GpXPoints; class GpQuadAnalyzer { public: GpQuadAnalyzer() {Initialize();} VOID SetQuadAnalyzer(const GpPointF* points); INT GetXSpans(REAL* xSpans, REAL y); protected: VOID Initialize() { Top = Bottom = Left = Right = 0; GpMemset(&Y1[0], 0, 4*sizeof(REAL)); GpMemset(&Y2[0], 0, 4*sizeof(REAL)); GpMemset(&Directions[0], 0, 4); GpMemset(&DxDy[0], 0, 4*sizeof(REAL)); } protected: REAL Top; REAL Bottom; REAL Left; REAL Right; REAL Y1[4]; REAL Y2[4]; BYTE Directions[4]; REAL X1[4]; REAL DxDy[4]; }; class GpBilinearTransform { protected: GpRectF SrcRect; GpRectF DstBounds; GpPointF A; GpPointF B; GpPointF C; GpPointF D; REAL C_VV; REAL C_V; GpQuadAnalyzer QAnalyzer; REAL FixedValue; // Set to positive number if this transform // represents a single fixed value over its // entire area. #ifdef TEST_QUADTRANSFORMS // For testing purpose only. GpPointF Verteces[4]; #endif public: GpBilinearTransform() {Initialize();} GpBilinearTransform(const GpRectF& rect, const GpPointF* points, INT count) { Initialize(); SetBilinearTransform(rect, points, count); } GpStatus ConvertLines(const GpPointF* points, INT count, GpPointF* q); GpStatus ConvertLines(const GpPointF* points, INT count, REALD* data); GpStatus ConvertCubicBeziers(const GpPointF* srcQ, INT count, GpPointF* q); GpStatus ConvertCubicBeziers(const GpPointF* srcQ, INT count, REALD* data); GpStatus SetBilinearTransform(const GpRectF& rect, const GpPointF* points, INT count, REAL fixed=-1.0f); INT GetSourceParameterArrays( REAL* u, REAL* v, INT* xSpans, INT y, INT xmin, INT xmax ); protected: VOID Initialize(); INT GetXSpans(INT* xSpans, INT y, INT xmin, INT xmax); BOOL GetSourceParameter(REAL* u, REAL* v, const GpPointF& point); }; class GpPerspectiveTransform { protected: GpRectF SrcRect; GpRectF DstBounds; REAL M00, M01, M02; REAL M10, M11, M12; REAL M20, M21, M22; public: GpPerspectiveTransform(const GpRectF& rect, const GpPointF* points, INT count); GpStatus ConvertPoints(const GpPointF* points, INT count, GpPoint3F* q); GpStatus ConvertPoints(const GpPointF* points, INT count, GpXPoints* xpoints); }; #endif