diff --git a/gfx/src/thebes/nsThebesImage.cpp b/gfx/src/thebes/nsThebesImage.cpp index d58dc1fb7a8a..4363194f45e1 100644 --- a/gfx/src/thebes/nsThebesImage.cpp +++ b/gfx/src/thebes/nsThebesImage.cpp @@ -352,8 +352,8 @@ nsThebesImage::Draw(nsIRenderingContext &aContext, nsIDrawingSurface *aSurface, // See comment inside ThebesDrawTile if (doSnap) { gfxMatrix roundedCTM(savedCTM); - roundedCTM.x0() = ::floor(roundedCTM.x0() + 0.5); - roundedCTM.y0() = ::floor(roundedCTM.y0() + 0.5); + roundedCTM.x0 = ::floor(roundedCTM.x0 + 0.5); + roundedCTM.y0 = ::floor(roundedCTM.y0 + 0.5); ctx->SetMatrix(roundedCTM); } @@ -431,8 +431,8 @@ nsThebesImage::ThebesDrawTile(gfxContext *thebesContext, // is what's used at the time of a SetPattern call). if (doSnap) { gfxMatrix roundedCTM(savedCTM); - roundedCTM.x0() = ::floor(roundedCTM.x0() + 0.5); - roundedCTM.y0() = ::floor(roundedCTM.y0() + 0.5); + roundedCTM.x0 = ::floor(roundedCTM.x0 + 0.5); + roundedCTM.y0 = ::floor(roundedCTM.y0 + 0.5); thebesContext->SetMatrix(roundedCTM); } @@ -487,7 +487,7 @@ nsThebesImage::ThebesDrawTile(gfxContext *thebesContext, patMat.Translate(p0); pat = new gfxPattern(surface); - pat->SetExtend(CAIRO_EXTEND_REPEAT); + pat->SetExtend(gfxPattern::EXTEND_REPEAT); pat->SetMatrix(patMat); thebesContext->SetPattern(pat); diff --git a/gfx/src/thebes/nsThebesRenderingContext.cpp b/gfx/src/thebes/nsThebesRenderingContext.cpp index 90b223dd029c..5e102f5ef335 100644 --- a/gfx/src/thebes/nsThebesRenderingContext.cpp +++ b/gfx/src/thebes/nsThebesRenderingContext.cpp @@ -231,10 +231,9 @@ nsThebesRenderingContext::PopTranslation(PushedTranslation* aState) NS_IMETHODIMP nsThebesRenderingContext::SetTranslation(nscoord aX, nscoord aY) { - gfxMatrix mat = mThebes->CurrentMatrix(); - gfxFloat a, b, c, d, tx, ty; - mat.ToValues(&a, &b, &c, &d, &tx, &ty); - gfxMatrix newMat(a, b, c, d, aX, aY); + gfxMatrix newMat(mThebes->CurrentMatrix()); + newMat.x0 = aX; + newMat.y0 = aY; mThebes->SetMatrix(newMat); return NS_OK; } @@ -452,13 +451,10 @@ nsThebesRenderingContext::UpdateTempTransformMatrix() * | x0 y0 1 | | m20 m21 1 | *****/ - // this sort of sucks - gfxFloat xx, yx, xy, yy, x0, y0; - mThebes->CurrentMatrix().ToValues(&xx, &yx, &xy, &yy, &x0, &y0); - - NS_ASSERTION(yx == 0 && xy == 0, "Can't represent Thebes matrix to Gfx"); - mTempTransform.SetToTranslate(TO_TWIPS(x0), TO_TWIPS(y0)); - mTempTransform.AddScale(xx, yy); + const gfxMatrix& ctm = mThebes->CurrentMatrix(); + NS_ASSERTION(ctm.yx == 0 && ctm.xy == 0, "Can't represent Thebes matrix to Gfx"); + mTempTransform.SetToTranslate(TO_TWIPS(ctm.x0), TO_TWIPS(ctm.y0)); + mTempTransform.AddScale(ctm.xx, ctm.yy); } nsTransform2D& diff --git a/gfx/thebes/public/gfxASurface.h b/gfx/thebes/public/gfxASurface.h index fc9f09261f51..76cf96df8f31 100644 --- a/gfx/thebes/public/gfxASurface.h +++ b/gfx/thebes/public/gfxASurface.h @@ -38,46 +38,23 @@ #ifndef GFX_ASURFACE_H #define GFX_ASURFACE_H -#include - #include "gfxTypes.h" #include "gfxRect.h" #include "nsStringFwd.h" +typedef struct _cairo_surface cairo_surface_t; +typedef struct _cairo_user_data_key cairo_user_data_key_t; + +typedef void (*thebes_destroy_func_t) (void *data); + /** * A surface is something you can draw on. Instantiate a subclass of this * abstract class, and use gfxContext to draw on this surface. */ class THEBES_API gfxASurface { public: - // Surfaces use refcounting that's tied to the cairo surface refcnt, to avoid - // refcount mismatch issues. - nsrefcnt AddRef(void) { - NS_PRECONDITION(mSurface != nsnull, "gfxASurface::AddRef without mSurface"); - - if (mHasFloatingRef) { - // eat the floating ref - mHasFloatingRef = PR_FALSE; - } else { - cairo_surface_reference(mSurface); - } - - return (nsrefcnt) cairo_surface_get_reference_count(mSurface); - } - - nsrefcnt Release(void) { - NS_PRECONDITION(!mHasFloatingRef, "gfxASurface::Release while floating ref still outstanding!"); - NS_PRECONDITION(mSurface != nsnull, "gfxASurface::Release without mSurface"); - // Note that there is a destructor set on user data for mSurface, - // which will delete this gfxASurface wrapper when the surface's refcount goes - // out of scope. - nsrefcnt refcnt = (nsrefcnt) cairo_surface_get_reference_count(mSurface); - cairo_surface_destroy(mSurface); - - // |this| may not be valid any more, don't use it! - - return --refcnt; - } + nsrefcnt AddRef(void); + nsrefcnt Release(void); public: /** @@ -108,9 +85,9 @@ public: } gfxSurfaceType; typedef enum { - CONTENT_COLOR = CAIRO_CONTENT_COLOR, - CONTENT_ALPHA = CAIRO_CONTENT_ALPHA, - CONTENT_COLOR_ALPHA = CAIRO_CONTENT_COLOR_ALPHA + CONTENT_COLOR = 0x1000, + CONTENT_ALPHA = 0x2000, + CONTENT_COLOR_ALPHA = 0x3000 } gfxContentType; /* Wrap the given cairo surface and return a gfxASurface for it */ @@ -119,26 +96,27 @@ public: /*** this DOES NOT addref the surface */ cairo_surface_t *CairoSurface() { return mSurface; } - gfxSurfaceType GetType() const { return (gfxSurfaceType)cairo_surface_get_type(mSurface); } + gfxSurfaceType GetType() const; - gfxContentType GetContentType() const { return (gfxContentType)cairo_surface_get_content(mSurface); } + gfxContentType GetContentType() const; - void SetDeviceOffset (gfxFloat xOff, gfxFloat yOff) { - cairo_surface_set_device_offset(mSurface, - xOff, yOff); + void SetDeviceOffset(gfxPoint offset); + gfxPoint GetDeviceOffset() const; + + // XXX deprecated remove this + void SetDeviceOffset(gfxFloat xOff, gfxFloat yOff) { + SetDeviceOffset(gfxPoint(xOff, yOff)); + } + // XXX deprecated remove this + void GetDeviceOffset(gfxFloat *xOff, gfxFloat *yOff) const { + gfxPoint pt = GetDeviceOffset(); + *xOff = pt.x; + *yOff = pt.y; } - void GetDeviceOffset (gfxFloat *xOff, gfxFloat *yOff) { - cairo_surface_get_device_offset(mSurface, xOff, yOff); - } - - void Flush() { cairo_surface_flush(mSurface); } - void MarkDirty() { cairo_surface_mark_dirty(mSurface); } - void MarkDirty(const gfxRect& r) { - cairo_surface_mark_dirty_rectangle(mSurface, - (int) r.pos.x, (int) r.pos.y, - (int) r.size.width, (int) r.size.height); - } + void Flush(); + void MarkDirty(); + void MarkDirty(const gfxRect& r); /* Printing backend functions */ virtual nsresult BeginPrinting(const nsAString& aTitle, const nsAString& aPrintToFileName) { return NS_ERROR_NOT_IMPLEMENTED; } @@ -149,15 +127,8 @@ public: void SetData(const cairo_user_data_key_t *key, void *user_data, - cairo_destroy_func_t destroy) - { - cairo_surface_set_user_data (mSurface, key, user_data, destroy); - } - - void *GetData(const cairo_user_data_key_t *key) - { - return cairo_surface_get_user_data (mSurface, key); - } + thebes_destroy_func_t destroy); + void *GetData(const cairo_user_data_key_t *key); protected: static gfxASurface* GetSurfaceWrapper(cairo_surface_t *csurf); diff --git a/gfx/thebes/public/gfxColor.h b/gfx/thebes/public/gfxColor.h index 2bf8669e4904..5dc4f992f6e2 100644 --- a/gfx/thebes/public/gfxColor.h +++ b/gfx/thebes/public/gfxColor.h @@ -35,8 +35,8 @@ * * ***** END LICENSE BLOCK ***** */ -#ifndef _GFX_COLOR_H -#define _GFX_COLOR_H +#ifndef GFX_COLOR_H +#define GFX_COLOR_H #include "nsPrintfCString.h" diff --git a/gfx/thebes/public/gfxContext.h b/gfx/thebes/public/gfxContext.h index 9ddcb09815b2..c0790792cb9a 100644 --- a/gfx/thebes/public/gfxContext.h +++ b/gfx/thebes/public/gfxContext.h @@ -39,18 +39,16 @@ #ifndef GFX_CONTEXT_H #define GFX_CONTEXT_H -#include +#include "gfxTypes.h" #include "gfxASurface.h" #include "gfxColor.h" #include "gfxPoint.h" #include "gfxRect.h" -#include "gfxTypes.h" #include "gfxMatrix.h" #include "gfxPattern.h" -#include "gfxFont.h" -class gfxRegion; +typedef struct _cairo cairo_t; /** * This is the main class for doing actual drawing. It is initialized using @@ -429,23 +427,23 @@ public: // define enum for operators (clear, src, dst, etc) enum GraphicsOperator { - OPERATOR_CLEAR = CAIRO_OPERATOR_CLEAR, - OPERATOR_SOURCE = CAIRO_OPERATOR_SOURCE, + OPERATOR_CLEAR, + OPERATOR_SOURCE, - OPERATOR_OVER = CAIRO_OPERATOR_OVER, - OPERATOR_IN = CAIRO_OPERATOR_IN, - OPERATOR_OUT = CAIRO_OPERATOR_OUT, - OPERATOR_ATOP = CAIRO_OPERATOR_ATOP, + OPERATOR_OVER, + OPERATOR_IN, + OPERATOR_OUT, + OPERATOR_ATOP, - OPERATOR_DEST = CAIRO_OPERATOR_DEST, - OPERATOR_DEST_OVER = CAIRO_OPERATOR_DEST_OVER, - OPERATOR_DEST_IN = CAIRO_OPERATOR_DEST_IN, - OPERATOR_DEST_OUT = CAIRO_OPERATOR_DEST_OUT, - OPERATOR_DEST_ATOP = CAIRO_OPERATOR_DEST_ATOP, + OPERATOR_DEST, + OPERATOR_DEST_OVER, + OPERATOR_DEST_IN, + OPERATOR_DEST_OUT, + OPERATOR_DEST_ATOP, - OPERATOR_XOR = CAIRO_OPERATOR_XOR, - OPERATOR_ADD = CAIRO_OPERATOR_ADD, - OPERATOR_SATURATE = CAIRO_OPERATOR_SATURATE + OPERATOR_XOR, + OPERATOR_ADD, + OPERATOR_SATURATE }; /** * Sets the operator used for all further drawing. The operator affects @@ -489,7 +487,6 @@ public: * Any current path will be destroyed by these functions! */ void Clip(gfxRect rect); // will clip to a rect - void Clip(const gfxRegion& region); // will clip to a region /** * This will ensure that the surface actually has its clip set. diff --git a/gfx/thebes/public/gfxMatrix.h b/gfx/thebes/public/gfxMatrix.h index b921f949eba7..3d14de977dbd 100644 --- a/gfx/thebes/public/gfxMatrix.h +++ b/gfx/thebes/public/gfxMatrix.h @@ -38,8 +38,6 @@ #ifndef GFX_MATRIX_H #define GFX_MATRIX_H -#include - #include "gfxPoint.h" #include "gfxTypes.h" #include "gfxRect.h" @@ -64,46 +62,25 @@ * \ tx ty 1 / \ 1 / * */ -class THEBES_API gfxMatrix { -protected: - cairo_matrix_t mat; +struct THEBES_API gfxMatrix { + double xx; double yx; + double xy; double yy; + double x0; double y0; public: /** * Initializes this matrix as the identity matrix. */ gfxMatrix() { Reset(); } - gfxMatrix(const gfxMatrix& m) : mat(m.mat) {} + /** * Initializes the matrix from individual components. See the class * description for the layout of the matrix. */ - gfxMatrix(gfxFloat a, gfxFloat b, gfxFloat c, gfxFloat d, gfxFloat tx, gfxFloat ty) { - // XXX cairo_matrix_init? - mat.xx = a; mat.yx = b; mat.xy = c; mat.yy = d; mat.x0 = tx; mat.y0 = ty; - } - - gfxMatrix(const cairo_matrix_t& m) { - mat = m; - } - - bool operator==(const gfxMatrix& m) const { - return ((mat.xx == m.mat.xx) && - (mat.yx == m.mat.yx) && - (mat.xy == m.mat.xy) && - (mat.yy == m.mat.yy) && - (mat.x0 == m.mat.x0) && - (mat.y0 == m.mat.y0)); - } - - bool operator!=(const gfxMatrix& m) const { - return !(*this == m); - } - - gfxMatrix& operator=(const cairo_matrix_t& m) { - mat = m; - return *this; - } + gfxMatrix(gfxFloat a, gfxFloat b, gfxFloat c, gfxFloat d, gfxFloat tx, gfxFloat ty) : + xx(a), yx(b), + xy(c), yy(d), + x0(tx), y0(ty) { } /** * Post-multiplies m onto the matrix. @@ -119,45 +96,11 @@ public: return gfxMatrix(*this).Multiply(m); } - // conversion to other types - const cairo_matrix_t& ToCairoMatrix() const { - return mat; - } - - void ToValues(gfxFloat *xx, gfxFloat *yx, - gfxFloat *xy, gfxFloat *yy, - gfxFloat *x0, gfxFloat *y0) const - { - *xx = mat.xx; - *yx = mat.yx; - *xy = mat.xy; - *yy = mat.yy; - *x0 = mat.x0; - *y0 = mat.y0; - } - - gfxFloat& xx() { return mat.xx; } - gfxFloat& xy() { return mat.xy; } - gfxFloat& yx() { return mat.yx; } - gfxFloat& yy() { return mat.yy; } - gfxFloat& x0() { return mat.x0; } - gfxFloat& y0() { return mat.y0; } - - const gfxFloat& xx() const { return mat.xx; } - const gfxFloat& xy() const { return mat.xy; } - const gfxFloat& yx() const { return mat.yx; } - const gfxFloat& yy() const { return mat.yy; } - const gfxFloat& x0() const { return mat.x0; } - const gfxFloat& y0() const { return mat.y0; } - // matrix operations /** * Resets this matrix to the identity matrix. */ - const gfxMatrix& Reset() { - cairo_matrix_init_identity(&mat); - return *this; - } + const gfxMatrix& Reset(); /** * Inverts this matrix, if possible. Otherwise, the matrix is left @@ -166,36 +109,27 @@ public: * XXX should this do something with the return value of * cairo_matrix_invert? */ - const gfxMatrix& Invert() { - cairo_matrix_invert(&mat); - return *this; - } + const gfxMatrix& Invert(); /** * Check if matrix is singular (no inverse exists). */ PRBool IsSingular() { // if the determinant (ad - bc) is zero it's singular - return (mat.xx * mat.yy) == (mat.yx * mat.xy); + return (xx * yy) == (yx * xy); } /** * Scales this matrix. The scale is pre-multiplied onto this matrix, * i.e. the scaling takes place before the other transformations. */ - const gfxMatrix& Scale(gfxFloat x, gfxFloat y) { - cairo_matrix_scale(&mat, x, y); - return *this; - } + const gfxMatrix& Scale(gfxFloat x, gfxFloat y); /** * Translates this matrix. The translation is pre-multiplied onto this matrix, * i.e. the translation takes place before the other transformations. */ - const gfxMatrix& Translate(const gfxPoint& pt) { - cairo_matrix_translate(&mat, pt.x, pt.y); - return *this; - } + const gfxMatrix& Translate(const gfxPoint& pt); /** * Rotates this matrix. The rotation is pre-multiplied onto this matrix, @@ -203,15 +137,7 @@ public: * * @param radians Angle in radians. */ - const gfxMatrix& Rotate(gfxFloat radians) { - // cairo_matrix_rotate? - gfxFloat s = sin(radians); - gfxFloat c = cos(radians); - gfxMatrix t( c, s, - -s, c, - 0, 0); - return *this = t.Multiply(*this); - } + const gfxMatrix& Rotate(gfxFloat radians); /** * Multiplies the current matrix with m. @@ -220,54 +146,32 @@ public: * * XXX is that difference (compared to Rotate etc) a good thing? */ - const gfxMatrix& Multiply(const gfxMatrix& m) { - cairo_matrix_multiply(&mat, &mat, &m.mat); - return *this; - } + const gfxMatrix& Multiply(const gfxMatrix& m); /** * Transforms a point according to this matrix. */ - gfxPoint Transform(const gfxPoint& point) const { - gfxPoint ret = point; - cairo_matrix_transform_point(&mat, &ret.x, &ret.y); - return ret; - } + gfxPoint Transform(const gfxPoint& point) const; + /** * Transform a distance according to this matrix. This does not apply * any translation components. */ - gfxSize Transform(const gfxSize& size) const { - gfxSize ret = size; - cairo_matrix_transform_distance(&mat, &ret.width, &ret.height); - return ret; - } + gfxSize Transform(const gfxSize& size) const; /** * Transforms both the point and distance according to this matrix. */ - gfxRect Transform(const gfxRect& rect) const { - gfxRect ret(Transform(rect.pos), Transform(rect.size)); - return ret; - } + gfxRect Transform(const gfxRect& rect) const; - gfxRect TransformBounds(const gfxRect& rect) const { - double x0 = rect.pos.x; - double y0 = rect.pos.y; - double x1 = rect.pos.x + rect.size.width; - double y1 = rect.pos.y + rect.size.height; - - cairo_matrix_transform_bounding_box (&mat, &x0, &y0, &x1, &y1, NULL); - - return gfxRect(x0, y0, x1 - x0, y1 - y0); - } + gfxRect TransformBounds(const gfxRect& rect) const; /** * Returns the translation component of this matrix. */ gfxPoint GetTranslation() const { - return gfxPoint(mat.x0, mat.y0); + return gfxPoint(x0, y0); } /** @@ -275,13 +179,13 @@ public: * than a straight translation */ bool HasNonTranslation() const { - return ((mat.xx != 1.0) || (mat.yy != 1.0) || - (mat.xy != 0.0) || (mat.yx != 0.0)); + return ((xx != 1.0) || (yy != 1.0) || + (xy != 0.0) || (yx != 0.0)); } bool HasNonTranslationOrFlip() const { - return ((mat.xx != 1.0) || ((mat.yy != 1.0) && (mat.yy != -1.0)) || - (mat.xy != 0.0) || (mat.yx != 0.0)); + return ((xx != 1.0) || ((yy != 1.0) && (yy != -1.0)) || + (xy != 0.0) || (yx != 0.0)); } }; diff --git a/gfx/thebes/public/gfxPattern.h b/gfx/thebes/public/gfxPattern.h index ea6d82e5ba79..5014495b8733 100644 --- a/gfx/thebes/public/gfxPattern.h +++ b/gfx/thebes/public/gfxPattern.h @@ -19,7 +19,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Stuart Parmenter + * Stuart Parmenter * * 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 @@ -38,95 +38,50 @@ #ifndef GFX_PATTERN_H #define GFX_PATTERN_H -#include - -#include "gfxColor.h" -#include "gfxASurface.h" -#include "gfxMatrix.h" #include "gfxTypes.h" +#include "gfxColor.h" +#include "gfxMatrix.h" + class gfxContext; +class gfxASurface; +typedef struct _cairo_pattern cairo_pattern_t; + class THEBES_API gfxPattern { - friend class gfxContext; - THEBES_INLINE_DECL_REFCOUNTING(gfxPattern) public: - gfxPattern(cairo_pattern_t *aPattern) { - mPattern = cairo_pattern_reference(aPattern); - } - - gfxPattern(gfxRGBA aColor) { - mPattern = cairo_pattern_create_rgba(aColor.r, aColor.g, aColor.b, aColor.a); - } - - // from another surface - gfxPattern(gfxASurface* surface) { - mPattern = cairo_pattern_create_for_surface(surface->CairoSurface()); - } - + gfxPattern(cairo_pattern_t *aPattern); + gfxPattern(gfxRGBA aColor); + gfxPattern(gfxASurface *surface); // from another surface // linear - gfxPattern(gfxFloat x0, gfxFloat y0, gfxFloat x1, gfxFloat y1) { - mPattern = cairo_pattern_create_linear(x0, y0, x1, y1); - } - - // radial + gfxPattern(gfxFloat x0, gfxFloat y0, gfxFloat x1, gfxFloat y1); // linear gfxPattern(gfxFloat cx0, gfxFloat cy0, gfxFloat radius0, - gfxFloat cx1, gfxFloat cy1, gfxFloat radius1) { - mPattern = cairo_pattern_create_radial(cx0, cy0, radius0, - cx1, cy1, radius1); - } + gfxFloat cx1, gfxFloat cy1, gfxFloat radius1); // radial + virtual ~gfxPattern(); - virtual ~gfxPattern() { - cairo_pattern_destroy(mPattern); - } + cairo_pattern_t *CairoPattern(); + void AddColorStop(gfxFloat offset, const gfxRGBA& c); + void SetMatrix(const gfxMatrix& matrix); + gfxMatrix CurrentMatrix() const; - cairo_pattern_t *CairoPattern() { - return mPattern; - } - - void AddColorStop(gfxFloat offset, const gfxRGBA& c) { - cairo_pattern_add_color_stop_rgba(mPattern, offset, c.r, c.g, c.b, c.a); - } - - void SetMatrix(const gfxMatrix& matrix) { - cairo_matrix_t mat = matrix.ToCairoMatrix(); - cairo_pattern_set_matrix(mPattern, &mat); - } - - gfxMatrix CurrentMatrix() const { - cairo_matrix_t mat; - cairo_pattern_get_matrix(mPattern, &mat); - return gfxMatrix(mat); - } + enum GraphicsExtend { + EXTEND_NONE, + EXTEND_REPEAT, + EXTEND_REFLECT, + EXTEND_PAD + }; // none, repeat, reflect - void SetExtend(int extend) { - cairo_pattern_set_extend(mPattern, (cairo_extend_t)extend); - } - - int Extend() const { - return (int)cairo_pattern_get_extend(mPattern); - } - - void SetFilter(int filter) { - cairo_pattern_set_filter(mPattern, (cairo_filter_t)filter); - } - - int Filter() const { - return (int)cairo_pattern_get_filter(mPattern); - } + void SetExtend(GraphicsExtend extend); + GraphicsExtend Extend() const; + void SetFilter(int filter); + int Filter() const; /* returns TRUE if it succeeded */ - PRBool GetSolidColor(gfxRGBA& aColor) { - return cairo_pattern_get_rgba(mPattern, - &aColor.r, - &aColor.g, - &aColor.b, - &aColor.a) == CAIRO_STATUS_SUCCESS; - } + PRBool GetSolidColor(gfxRGBA& aColor); protected: cairo_pattern_t *mPattern; diff --git a/gfx/thebes/public/gfxXlibSurface.h b/gfx/thebes/public/gfxXlibSurface.h index 8996352effce..17cc5f1bde11 100644 --- a/gfx/thebes/public/gfxXlibSurface.h +++ b/gfx/thebes/public/gfxXlibSurface.h @@ -41,8 +41,8 @@ #include "gfxASurface.h" -#include -#include +#include +#include class THEBES_API gfxXlibSurface : public gfxASurface { public: diff --git a/gfx/thebes/src/Makefile.in b/gfx/thebes/src/Makefile.in index a59bcfc6464d..12cb0f530367 100644 --- a/gfx/thebes/src/Makefile.in +++ b/gfx/thebes/src/Makefile.in @@ -26,11 +26,13 @@ CPPSRCS = \ gfxContext.cpp \ gfxImageSurface.cpp \ gfxFont.cpp \ + gfxFontTest.cpp \ + gfxMatrix.cpp \ + gfxPattern.cpp \ + gfxPlatform.cpp \ gfxRect.cpp \ gfxSkipChars.cpp \ gfxTextRunCache.cpp \ - gfxPlatform.cpp \ - gfxFontTest.cpp \ $(NULL) ifdef MOZ_TREE_CAIRO diff --git a/gfx/thebes/src/gfxASurface.cpp b/gfx/thebes/src/gfxASurface.cpp index 1851701f303d..ca7bb0a18606 100644 --- a/gfx/thebes/src/gfxASurface.cpp +++ b/gfx/thebes/src/gfxASurface.cpp @@ -36,12 +36,12 @@ * * ***** END LICENSE BLOCK ***** */ -#include - #include "gfxASurface.h" #include "gfxImageSurface.h" +#include "cairo.h" + #ifdef CAIRO_HAS_WIN32_SURFACE #include "gfxWindowsSurface.h" #endif @@ -54,8 +54,43 @@ #include "gfxQuartzSurface.h" #endif +#include + static cairo_user_data_key_t gfxasurface_pointer_key; +// Surfaces use refcounting that's tied to the cairo surface refcnt, to avoid +// refcount mismatch issues. +nsrefcnt +gfxASurface::AddRef(void) +{ + NS_PRECONDITION(mSurface != nsnull, "gfxASurface::AddRef without mSurface"); + + if (mHasFloatingRef) { + // eat the floating ref + mHasFloatingRef = PR_FALSE; + } else { + cairo_surface_reference(mSurface); + } + + return (nsrefcnt) cairo_surface_get_reference_count(mSurface); +} + +nsrefcnt +gfxASurface::Release(void) +{ + NS_PRECONDITION(!mHasFloatingRef, "gfxASurface::Release while floating ref still outstanding!"); + NS_PRECONDITION(mSurface != nsnull, "gfxASurface::Release without mSurface"); + // Note that there is a destructor set on user data for mSurface, + // which will delete this gfxASurface wrapper when the surface's refcount goes + // out of scope. + nsrefcnt refcnt = (nsrefcnt) cairo_surface_get_reference_count(mSurface); + cairo_surface_destroy(mSurface); + + // |this| may not be valid any more, don't use it! + + return --refcnt; +} + void gfxASurface::SurfaceDestroyFunc(void *data) { gfxASurface *surf = (gfxASurface*) data; @@ -132,3 +167,65 @@ gfxASurface::Init(cairo_surface_t* surface, PRBool existingSurface) mHasFloatingRef = PR_TRUE; } } + +gfxASurface::gfxSurfaceType +gfxASurface::GetType() const +{ + return (gfxSurfaceType)cairo_surface_get_type(mSurface); +} + +gfxASurface::gfxContentType +gfxASurface::GetContentType() const +{ + return (gfxContentType)cairo_surface_get_content(mSurface); +} + +void +gfxASurface::SetDeviceOffset(gfxPoint offset) +{ + cairo_surface_set_device_offset(mSurface, + offset.x, offset.y); +} + +gfxPoint +gfxASurface::GetDeviceOffset() const +{ + gfxPoint pt; + cairo_surface_get_device_offset(mSurface, &pt.x, &pt.y); + return pt; +} + +void +gfxASurface::Flush() +{ + cairo_surface_flush(mSurface); +} + +void +gfxASurface::MarkDirty() +{ + cairo_surface_mark_dirty(mSurface); +} + +void +gfxASurface::MarkDirty(const gfxRect& r) +{ + cairo_surface_mark_dirty_rectangle(mSurface, + (int) r.pos.x, (int) r.pos.y, + (int) r.size.width, (int) r.size.height); +} + + +void +gfxASurface::SetData(const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + cairo_surface_set_user_data(mSurface, key, user_data, destroy); +} + +void * +gfxASurface::GetData(const cairo_user_data_key_t *key) +{ + return cairo_surface_get_user_data(mSurface, key); +} diff --git a/gfx/thebes/src/gfxContext.cpp b/gfx/thebes/src/gfxContext.cpp index 98f2eae24677..7b3c44efcc97 100644 --- a/gfx/thebes/src/gfxContext.cpp +++ b/gfx/thebes/src/gfxContext.cpp @@ -45,6 +45,8 @@ #define M_PI 3.14159265358979323846 #endif +#include "cairo.h" + #include "gfxContext.h" #include "gfxColor.h" @@ -52,6 +54,8 @@ #include "gfxASurface.h" #include "gfxPattern.h" + + gfxContext::gfxContext(gfxASurface *surface) : mSurface(surface) { @@ -277,14 +281,14 @@ gfxContext::Rotate(gfxFloat angle) void gfxContext::Multiply(const gfxMatrix& matrix) { - const cairo_matrix_t& mat = matrix.ToCairoMatrix(); + const cairo_matrix_t& mat = reinterpret_cast(matrix); cairo_transform(mCairo, &mat); } void gfxContext::SetMatrix(const gfxMatrix& matrix) { - const cairo_matrix_t& mat = matrix.ToCairoMatrix(); + const cairo_matrix_t& mat = reinterpret_cast(matrix); cairo_set_matrix(mCairo, &mat); } @@ -299,7 +303,7 @@ gfxContext::CurrentMatrix() const { cairo_matrix_t mat; cairo_get_matrix(mCairo, &mat); - return gfxMatrix(mat); + return gfxMatrix(*reinterpret_cast(&mat)); } gfxPoint @@ -563,11 +567,6 @@ gfxContext::Clip(gfxRect rect) cairo_clip(mCairo); } -void -gfxContext::Clip(const gfxRegion& region) -{ -} - void gfxContext::Clip() { diff --git a/gfx/thebes/src/gfxImageSurface.cpp b/gfx/thebes/src/gfxImageSurface.cpp index 333e70336e96..3190c35076a4 100644 --- a/gfx/thebes/src/gfxImageSurface.cpp +++ b/gfx/thebes/src/gfxImageSurface.cpp @@ -35,10 +35,10 @@ * * ***** END LICENSE BLOCK ***** */ -#include - #include "gfxImageSurface.h" +#include "cairo.h" + gfxImageSurface::gfxImageSurface(gfxImageFormat format, long width, long height) : mFormat(format), mWidth(width), mHeight(height) { @@ -46,8 +46,6 @@ gfxImageSurface::gfxImageSurface(gfxImageFormat format, long width, long height) mData = new unsigned char[height * stride]; mOwnsData = PR_TRUE; - //memset(mData, 0xff, height*stride); - cairo_surface_t *surface = cairo_image_surface_create_for_data((unsigned char*)mData, (cairo_format_t)format, diff --git a/gfx/thebes/src/gfxMatrix.cpp b/gfx/thebes/src/gfxMatrix.cpp new file mode 100644 index 000000000000..3ec31a9580a8 --- /dev/null +++ b/gfx/thebes/src/gfxMatrix.cpp @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla 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/MPL/ + * + * 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 Oracle Corporation code. + * + * The Initial Developer of the Original Code is Oracle Corporation. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Stuart Parmenter + * + * 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 MPL, 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 MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "gfxMatrix.h" +#include "cairo.h" + +#define CAIRO_MATRIX(x) reinterpret_cast((x)) +#define CONST_CAIRO_MATRIX(x) reinterpret_cast((x)) + +const gfxMatrix& +gfxMatrix::Reset() +{ + cairo_matrix_init_identity(CAIRO_MATRIX(this)); + return *this; +} + +const gfxMatrix& +gfxMatrix::Invert() +{ + cairo_matrix_invert(CAIRO_MATRIX(this)); + return *this; +} + +const gfxMatrix& +gfxMatrix::Scale(gfxFloat x, gfxFloat y) +{ + cairo_matrix_scale(CAIRO_MATRIX(this), x, y); + return *this; +} + +const gfxMatrix& +gfxMatrix::Translate(const gfxPoint& pt) +{ + cairo_matrix_translate(CAIRO_MATRIX(this), pt.x, pt.y); + return *this; +} + +const gfxMatrix& +gfxMatrix::Rotate(gfxFloat radians) +{ + cairo_matrix_rotate(CAIRO_MATRIX(this), radians); + return *this; +} + +const gfxMatrix& +gfxMatrix::Multiply(const gfxMatrix& m) +{ + cairo_matrix_multiply(CAIRO_MATRIX(this), CAIRO_MATRIX(this), CONST_CAIRO_MATRIX(&m)); + return *this; +} + +gfxPoint +gfxMatrix::Transform(const gfxPoint& point) const +{ + gfxPoint ret = point; + cairo_matrix_transform_point(CONST_CAIRO_MATRIX(this), &ret.x, &ret.y); + return ret; +} + +gfxSize +gfxMatrix::Transform(const gfxSize& size) const +{ + gfxSize ret = size; + cairo_matrix_transform_distance(CONST_CAIRO_MATRIX(this), &ret.width, &ret.height); + return ret; +} + +gfxRect +gfxMatrix::Transform(const gfxRect& rect) const +{ + return gfxRect(Transform(rect.pos), Transform(rect.size)); +} + +gfxRect +gfxMatrix::TransformBounds(const gfxRect& rect) const +{ + double x0 = rect.pos.x; + double y0 = rect.pos.y; + double x1 = rect.pos.x + rect.size.width; + double y1 = rect.pos.y + rect.size.height; + + cairo_matrix_transform_bounding_box(CONST_CAIRO_MATRIX(this), &x0, &y0, &x1, &y1, NULL); + + return gfxRect(x0, y0, x1 - x0, y1 - y0); +} diff --git a/gfx/thebes/src/gfxPattern.cpp b/gfx/thebes/src/gfxPattern.cpp new file mode 100644 index 000000000000..368812fde991 --- /dev/null +++ b/gfx/thebes/src/gfxPattern.cpp @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla 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/MPL/ + * + * 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 Corporation code. + * + * The Initial Developer of the Original Code is Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Stuart Parmenter + * + * 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 MPL, 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 MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "gfxTypes.h" +#include "gfxPattern.h" +#include "gfxASurface.h" + +#include "cairo.h" + +gfxPattern::gfxPattern(cairo_pattern_t *aPattern) +{ + mPattern = cairo_pattern_reference(aPattern); +} + +gfxPattern::gfxPattern(gfxRGBA aColor) +{ + mPattern = cairo_pattern_create_rgba(aColor.r, aColor.g, aColor.b, aColor.a); +} + +// from another surface +gfxPattern::gfxPattern(gfxASurface *surface) +{ + mPattern = cairo_pattern_create_for_surface(surface->CairoSurface()); +} + +// linear +gfxPattern::gfxPattern(gfxFloat x0, gfxFloat y0, gfxFloat x1, gfxFloat y1) +{ + mPattern = cairo_pattern_create_linear(x0, y0, x1, y1); +} + +// radial +gfxPattern::gfxPattern(gfxFloat cx0, gfxFloat cy0, gfxFloat radius0, + gfxFloat cx1, gfxFloat cy1, gfxFloat radius1) +{ + mPattern = cairo_pattern_create_radial(cx0, cy0, radius0, + cx1, cy1, radius1); +} + +gfxPattern::~gfxPattern() +{ + cairo_pattern_destroy(mPattern); +} + +cairo_pattern_t * +gfxPattern::CairoPattern() +{ + return mPattern; +} + +void +gfxPattern::AddColorStop(gfxFloat offset, const gfxRGBA& c) +{ + cairo_pattern_add_color_stop_rgba(mPattern, offset, c.r, c.g, c.b, c.a); +} + +void +gfxPattern::SetMatrix(const gfxMatrix& matrix) +{ + cairo_matrix_t mat = *reinterpret_cast(&matrix); + cairo_pattern_set_matrix(mPattern, &mat); +} + +gfxMatrix +gfxPattern::CurrentMatrix() const +{ + cairo_matrix_t mat; + cairo_pattern_get_matrix(mPattern, &mat); + return gfxMatrix(*reinterpret_cast(&mat)); +} + +void +gfxPattern::SetExtend(GraphicsExtend extend) +{ + cairo_pattern_set_extend(mPattern, (cairo_extend_t)extend); +} + +gfxPattern::GraphicsExtend +gfxPattern::Extend() const +{ + return (GraphicsExtend)cairo_pattern_get_extend(mPattern); +} + +void +gfxPattern::SetFilter(int filter) +{ + cairo_pattern_set_filter(mPattern, (cairo_filter_t)filter); +} + +int +gfxPattern::Filter() const +{ + return (int)cairo_pattern_get_filter(mPattern); +} + +PRBool +gfxPattern::GetSolidColor(gfxRGBA& aColor) +{ + return cairo_pattern_get_rgba(mPattern, + &aColor.r, + &aColor.g, + &aColor.b, + &aColor.a) == CAIRO_STATUS_SUCCESS; +} diff --git a/gfx/thebes/src/gfxWindowsFonts.cpp b/gfx/thebes/src/gfxWindowsFonts.cpp index df1de5fd3e9c..8bd530faf732 100644 --- a/gfx/thebes/src/gfxWindowsFonts.cpp +++ b/gfx/thebes/src/gfxWindowsFonts.cpp @@ -55,6 +55,11 @@ #include "gfxFontTest.h" +#include "cairo.h" +#include "cairo-win32.h" + +#include + #include "nsUnicodeRange.h" #include "nsUnicharUtils.h" @@ -166,10 +171,10 @@ gfxWindowsFont::CairoScaledFont() void gfxWindowsFont::UpdateCTM(const gfxMatrix& aMatrix) { - if (aMatrix.yy() == mCTM.yy() && - aMatrix.xx() == mCTM.xx() && - aMatrix.xy() == mCTM.xy() && - aMatrix.yx() == mCTM.yx()) + if (aMatrix.yy == mCTM.yy && + aMatrix.xx == mCTM.xx && + aMatrix.xy == mCTM.xy && + aMatrix.yx == mCTM.yx) return; Destroy(); @@ -302,7 +307,9 @@ gfxWindowsFont::MakeCairoScaledFont() cairo_matrix_init_scale(&sizeMatrix, mAdjustedSize, mAdjustedSize); cairo_font_options_t *fontOptions = cairo_font_options_create(); - font = cairo_scaled_font_create(CairoFontFace(), &sizeMatrix, &mCTM.ToCairoMatrix(), fontOptions); + font = cairo_scaled_font_create(CairoFontFace(), &sizeMatrix, + reinterpret_cast(&mCTM), + fontOptions); cairo_font_options_destroy(fontOptions); return font; @@ -395,7 +402,7 @@ gfxWindowsFont::FillLogFont(gfxFloat aSize, PRInt16 aWeight) { #define CLIP_TURNOFF_FONTASSOCIATION 0x40 - const double yScale = mCTM.ToCairoMatrix().yy; + const double yScale = mCTM.yy; mLogFont.lfHeight = (LONG)-ROUND(aSize * yScale); diff --git a/gfx/thebes/src/gfxWindowsSurface.cpp b/gfx/thebes/src/gfxWindowsSurface.cpp index 53fe82e545fa..327c44cf770c 100644 --- a/gfx/thebes/src/gfxWindowsSurface.cpp +++ b/gfx/thebes/src/gfxWindowsSurface.cpp @@ -36,12 +36,13 @@ * ***** END LICENSE BLOCK ***** */ #include "gfxWindowsSurface.h" -#include "nsString.h" - #include "gfxContext.h" #include "gfxPlatform.h" -#include +#include "cairo.h" +#include "cairo-win32.h" + +#include "nsString.h" gfxWindowsSurface::gfxWindowsSurface(HWND wnd) : mOwnsDC(PR_TRUE), mWnd(wnd) diff --git a/gfx/thebes/src/gfxXlibSurface.cpp b/gfx/thebes/src/gfxXlibSurface.cpp index e4aa17023e6c..eee7169d544d 100644 --- a/gfx/thebes/src/gfxXlibSurface.cpp +++ b/gfx/thebes/src/gfxXlibSurface.cpp @@ -36,9 +36,12 @@ * * ***** END LICENSE BLOCK ***** */ -#include #include "gfxXlibSurface.h" +#include "cairo.h" +#include "cairo-xlib.h" +#include "cairo-xlib-xrender.h" + static cairo_user_data_key_t pixmap_free_key; typedef struct { @@ -48,7 +51,7 @@ typedef struct { static void pixmap_free_func (void *); -gfxXlibSurface::gfxXlibSurface(Display* dpy, Drawable drawable, Visual* visual) +gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, Visual *visual) : mPixmapTaken(PR_FALSE), mDisplay(dpy), mDrawable(drawable) { DoSizeQuery(); @@ -56,7 +59,7 @@ gfxXlibSurface::gfxXlibSurface(Display* dpy, Drawable drawable, Visual* visual) Init(surf); } -gfxXlibSurface::gfxXlibSurface(Display* dpy, Drawable drawable, Visual* visual, +gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, Visual *visual, unsigned long width, unsigned long height) : mPixmapTaken(PR_FALSE), mDisplay(dpy), mDrawable(drawable), mWidth(width), mHeight(height) { @@ -64,7 +67,7 @@ gfxXlibSurface::gfxXlibSurface(Display* dpy, Drawable drawable, Visual* visual, Init(surf); } -gfxXlibSurface::gfxXlibSurface(Display* dpy, Visual* visual, unsigned long width, unsigned long height) +gfxXlibSurface::gfxXlibSurface(Display *dpy, Visual *visual, unsigned long width, unsigned long height) : mPixmapTaken(PR_FALSE), mDisplay(dpy), mWidth(width), mHeight(height) { @@ -79,7 +82,7 @@ gfxXlibSurface::gfxXlibSurface(Display* dpy, Visual* visual, unsigned long width TakePixmap(); } -gfxXlibSurface::gfxXlibSurface(Display* dpy, Drawable drawable, XRenderPictFormat *format, +gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, XRenderPictFormat *format, unsigned long width, unsigned long height) : mPixmapTaken(PR_FALSE), mDisplay(dpy), mDrawable(drawable), mWidth(width), mHeight(height) @@ -90,7 +93,7 @@ gfxXlibSurface::gfxXlibSurface(Display* dpy, Drawable drawable, XRenderPictForma Init(surf); } -gfxXlibSurface::gfxXlibSurface(Display* dpy, XRenderPictFormat *format, +gfxXlibSurface::gfxXlibSurface(Display *dpy, XRenderPictFormat *format, unsigned long width, unsigned long height) : mPixmapTaken(PR_FALSE), mDisplay(dpy), mWidth(width), mHeight(height) { @@ -183,7 +186,6 @@ pixmap_free_func (void *data) { pixmap_free_struct *pfs = (pixmap_free_struct*) data; - //fprintf (stderr, "freeing pixmap %d\n", pfs->pixmap); XFreePixmap (pfs->dpy, pfs->pixmap); delete pfs; diff --git a/layout/svg/base/src/nsSVGForeignObjectFrame.cpp b/layout/svg/base/src/nsSVGForeignObjectFrame.cpp index 187b0029431e..0a5b49f058dd 100644 --- a/layout/svg/base/src/nsSVGForeignObjectFrame.cpp +++ b/layout/svg/base/src/nsSVGForeignObjectFrame.cpp @@ -262,7 +262,7 @@ nsSVGForeignObjectFrame::PaintSVG(nsSVGRenderState *aContext, gfxContext *gfx = aContext->GetGfxContext(); gfx->Save(); - gfx->Multiply(gfxMatrix(matrix)); + gfx->Multiply(gfxMatrix(*reinterpret_cast(&matrix))); nsresult rv = nsLayoutUtils::PaintFrame(ctx, kid, nsRegion(kid->GetRect()), NS_RGBA(0,0,0,0)); diff --git a/layout/svg/base/src/nsSVGGlyphFrame.cpp b/layout/svg/base/src/nsSVGGlyphFrame.cpp index e2e10bf1c0ee..f6136b5f10c8 100644 --- a/layout/svg/base/src/nsSVGGlyphFrame.cpp +++ b/layout/svg/base/src/nsSVGGlyphFrame.cpp @@ -1433,7 +1433,7 @@ nsSVGGlyphFrame::GetGlobalTransform(gfxContext *aContext) return NS_ERROR_FAILURE; } - aContext->Multiply(gfxMatrix(matrix)); + aContext->Multiply(gfxMatrix(*reinterpret_cast(&matrix))); return NS_OK; } diff --git a/layout/svg/base/src/nsSVGPathGeometryFrame.cpp b/layout/svg/base/src/nsSVGPathGeometryFrame.cpp index 3dea77b3909b..516405839da7 100644 --- a/layout/svg/base/src/nsSVGPathGeometryFrame.cpp +++ b/layout/svg/base/src/nsSVGPathGeometryFrame.cpp @@ -652,8 +652,8 @@ nsSVGPathGeometryFrame::GeneratePath(gfxContext* aContext) cairo_new_path(ctx); return; } - - aContext->Multiply(gfxMatrix(matrix)); + + aContext->Multiply(gfxMatrix(*reinterpret_cast(&matrix))); cairo_new_path(ctx); NS_STATIC_CAST(nsSVGPathGeometryElement*, mContent)->ConstructPath(ctx); diff --git a/layout/svg/base/src/nsSVGUtils.cpp b/layout/svg/base/src/nsSVGUtils.cpp index b29590e44250..1b78cdf69a34 100644 --- a/layout/svg/base/src/nsSVGUtils.cpp +++ b/layout/svg/base/src/nsSVGUtils.cpp @@ -1021,7 +1021,7 @@ nsSVGUtils::CompositeSurfaceMatrix(gfxContext *aContext, aContext->Save(); - aContext->Multiply(gfxMatrix(matrix)); + aContext->Multiply(gfxMatrix(*reinterpret_cast(&matrix))); aContext->SetSource(aSurface); aContext->Paint(aOpacity); @@ -1039,7 +1039,7 @@ nsSVGUtils::SetClipRect(gfxContext *aContext, return; gfxMatrix oldMatrix = aContext->CurrentMatrix(); - aContext->Multiply(gfxMatrix(matrix)); + aContext->Multiply(gfxMatrix(*reinterpret_cast(&matrix))); aContext->Clip(gfxRect(aX, aY, aWidth, aHeight)); aContext->SetMatrix(oldMatrix); } diff --git a/widget/src/windows/nsNativeThemeWin.cpp b/widget/src/windows/nsNativeThemeWin.cpp index 59de80e6e8a2..dd2499ed9672 100644 --- a/widget/src/windows/nsNativeThemeWin.cpp +++ b/widget/src/windows/nsNativeThemeWin.cpp @@ -853,15 +853,12 @@ nsNativeThemeWin::DrawWidgetBackground(nsIRenderingContext* aContext, SetGraphicsMode(hdc, GM_ADVANCED); XFORM xform; - double dm[6]; - m.ToValues(&dm[0], &dm[1], &dm[2], &dm[3], &dm[4], &dm[5]); - - xform.eM11 = (FLOAT) dm[0]; - xform.eM12 = (FLOAT) dm[1]; - xform.eM21 = (FLOAT) dm[2]; - xform.eM22 = (FLOAT) dm[3]; - xform.eDx = (FLOAT) dm[4]; - xform.eDy = (FLOAT) dm[5]; + xform.eM11 = (FLOAT) m.xx; + xform.eM12 = (FLOAT) m.yx; + xform.eM21 = (FLOAT) m.xy; + xform.eM22 = (FLOAT) m.yy; + xform.eDx = (FLOAT) m.x0; + xform.eDy = (FLOAT) m.y0; SetWorldTransform (hdc, &xform); } else { gfxPoint pos(m.GetTranslation()); @@ -2035,14 +2032,12 @@ nsresult nsNativeThemeWin::ClassicDrawWidgetBackground(nsIRenderingContext* aCon SetGraphicsMode(hdc, GM_ADVANCED); XFORM xform; - double dm[6]; - m.ToValues(&dm[0], &dm[1], &dm[2], &dm[3], &dm[4], &dm[5]); - xform.eM11 = (FLOAT) dm[0]; - xform.eM12 = (FLOAT) dm[1]; - xform.eM21 = (FLOAT) dm[2]; - xform.eM22 = (FLOAT) dm[3]; - xform.eDx = (FLOAT) dm[4]; - xform.eDy = (FLOAT) dm[5]; + xform.eM11 = (FLOAT) m.xx; + xform.eM12 = (FLOAT) m.yx; + xform.eM21 = (FLOAT) m.xy; + xform.eM22 = (FLOAT) m.yy; + xform.eDx = (FLOAT) m.x0; + xform.eDy = (FLOAT) m.y0; SetWorldTransform (hdc, &xform); } else { gfxPoint pos(m.GetTranslation());