Preparation for proper, extensible state tracking and clipping on Windows.

This commit is contained in:
Pietro Gagliardi 2015-10-12 21:11:42 -04:00
parent c525234ec9
commit c6cdabe20d
5 changed files with 42 additions and 38 deletions

View File

@ -395,6 +395,14 @@ void uiDrawMatrixTransformSize(uiDrawMatrix *m, double *x, double *y)
*y = s.height;
}
void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
{
CGAffineTransform cm;
m2c(m, &cm);
CGContextConcatCTM(c->c, cm);
}
// TODO figure out what besides transforms these save/restore on all platforms
void uiDrawSave(uiDrawContext *c)
{
@ -405,11 +413,3 @@ void uiDrawRestore(uiDrawContext *c)
{
CGContextRestoreGState(c->c);
}
void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
{
CGAffineTransform cm;
m2c(m, &cm);
CGContextConcatCTM(c->c, cm);
}

5
ui.h
View File

@ -423,9 +423,12 @@ _UI_EXTERN int uiDrawMatrixInvert(uiDrawMatrix *m);
_UI_EXTERN void uiDrawMatrixTransformPoint(uiDrawMatrix *m, double *x, double *y);
_UI_EXTERN void uiDrawMatrixTransformSize(uiDrawMatrix *m, double *x, double *y);
_UI_EXTERN void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m);
// TODO put uiDrawClip here
_UI_EXTERN void uiDrawSave(uiDrawContext *c);
_UI_EXTERN void uiDrawRestore(uiDrawContext *c);
_UI_EXTERN void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m);
typedef enum uiModifiers uiModifiers;

View File

@ -5,6 +5,7 @@
#define uthash_malloc(sz) uiAlloc((sz), "(uthash internal)")
#define uthash_free(ptr,sz) uiFree((ptr))
#include "uthash/uthash.h"
#include "uthash/utarray.h"
extern uiInitOptions options;

View File

@ -414,6 +414,14 @@ void uiDrawMatrixTransformSize(uiDrawMatrix *m, double *x, double *y)
cairo_matrix_transform_distance(&c, x, y);
}
void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
{
cairo_matrix_t cm;
m2c(m, &cm);
cairo_transform(c->cr, &cm);
}
void uiDrawSave(uiDrawContext *c)
{
cairo_save(c->cr);
@ -423,11 +431,3 @@ void uiDrawRestore(uiDrawContext *c)
{
cairo_restore(c->cr);
}
void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
{
cairo_matrix_t cm;
m2c(m, &cm);
cairo_transform(c->cr, &cm);
}

View File

@ -650,6 +650,27 @@ void uiDrawMatrixTransformSize(uiDrawMatrix *m, double *x, double *y)
fallbackTransformSize(m, x, y);
}
void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
{
D2D1_MATRIX_3X2_F dm;
uiDrawMatrix already;
uiDrawMatrix temp;
ID2D1RenderTarget_GetTransform(c->rt, &dm);
d2m(&dm, &already);
temp = *m; // don't modify m
// you would think we have to do already * m, right?
// WRONG! we have to do m * already
// why? a few reasons
// a) this lovely comment in cairo's source - http://cgit.freedesktop.org/cairo/tree/src/cairo-matrix.c?id=0537479bd1d4c5a3bc0f6f41dec4deb98481f34a#n330
// Direct2D uses column vectors and I don't know if this is even documented
// b) that's what Core Graphics does
// TODO see if Microsoft says to do this
uiDrawMatrixMultiply(&temp, &already);
m2d(&temp, &dm);
ID2D1RenderTarget_SetTransform(c->rt, &dm);
}
void uiDrawSave(uiDrawContext *c)
{
ID2D1DrawingStateBlock *dsb;
@ -675,24 +696,3 @@ void uiDrawRestore(uiDrawContext *c)
ID2D1RenderTarget_RestoreDrawingState(c->rt, dsb);
ID2D1DrawingStateBlock_Release(dsb);
}
void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
{
D2D1_MATRIX_3X2_F dm;
uiDrawMatrix already;
uiDrawMatrix temp;
ID2D1RenderTarget_GetTransform(c->rt, &dm);
d2m(&dm, &already);
temp = *m; // don't modify m
// you would think we have to do already * m, right?
// WRONG! we have to do m * already
// why? a few reasons
// a) this lovely comment in cairo's source - http://cgit.freedesktop.org/cairo/tree/src/cairo-matrix.c?id=0537479bd1d4c5a3bc0f6f41dec4deb98481f34a#n330
// Direct2D uses column vectors and I don't know if this is even documented
// b) that's what Core Graphics does
// TODO see if Microsoft says to do this
uiDrawMatrixMultiply(&temp, &already);
m2d(&temp, &dm);
ID2D1RenderTarget_SetTransform(c->rt, &dm);
}