summaryrefslogtreecommitdiff
path: root/cd/src/win32/cdwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'cd/src/win32/cdwin.c')
-rwxr-xr-xcd/src/win32/cdwin.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/cd/src/win32/cdwin.c b/cd/src/win32/cdwin.c
index 371bb6d..313e833 100755
--- a/cd/src/win32/cdwin.c
+++ b/cd/src/win32/cdwin.c
@@ -575,6 +575,12 @@ static void cdstipple(cdCtxCanvas* ctxcanvas, int w, int h, const unsigned char
DeleteObject(hBitmap);
}
+static void set_dib_res(cdwDIB* dib, cdCtxCanvas* ctxcanvas)
+{
+ dib->bmih->biXPelsPerMeter = (LONG)(ctxcanvas->canvas->xres*1000);
+ dib->bmih->biYPelsPerMeter = (LONG)(ctxcanvas->canvas->yres*1000);
+}
+
static void cdpattern(cdCtxCanvas* ctxcanvas, int w, int h, const long int *colors)
{
cdwDIB dib;
@@ -589,6 +595,9 @@ static void cdpattern(cdCtxCanvas* ctxcanvas, int w, int h, const long int *colo
if (!cdwCreateDIB(&dib))
return;
+ /* trying to preserve pattern size during printing */
+ set_dib_res(&dib, ctxcanvas);
+
cdwDIBEncodePattern(&dib, colors);
hBrush = CreateDIBPatternBrushPt(dib.dib, DIB_RGB_COLORS);
cdwKillDIB(&dib);
@@ -997,8 +1006,6 @@ static void sTextOutBlt(cdCtxCanvas* ctxcanvas, int px, int py, const char* s, i
/* calcula o alinhamento da imagem no canvas */
if (ctxcanvas->canvas->text_orientation != 0)
{
- double d = sqrt(wt*wt + ht*ht);
-
switch (ctxcanvas->canvas->text_alignment)
{
case CD_CENTER:
@@ -1034,20 +1041,20 @@ static void sTextOutBlt(cdCtxCanvas* ctxcanvas, int px, int py, const char* s, i
px_off = (int)(wt/2 * cos_teta);
break;
case CD_NORTH_EAST:
- py_off = (int)(h/2);
- px_off = - (int)(sqrt(d*d - h*h)/2);
- break;
- case CD_NORTH_WEST:
- py_off = (int)(sqrt(d*d - w*w)/2);
- px_off = - (int)(w/2);
+ py_off = (int)(ht/2 * cos_teta + wt/2 * sin_teta);
+ px_off = (int)(ht/2 * sin_teta - wt/2 * cos_teta);
break;
case CD_SOUTH_WEST:
- py_off = - (int)(h/2);
- px_off = (int)(sqrt(d*d - h*h)/2);
+ py_off = - (int)(ht/2 * cos_teta + wt/2 * sin_teta);
+ px_off = - (int)(ht/2 * sin_teta - wt/2 * cos_teta);
+ break;
+ case CD_NORTH_WEST:
+ py_off = (int)(ht/2 * cos_teta - wt/2 * sin_teta);
+ px_off = (int)(ht/2 * sin_teta + wt/2 * cos_teta);
break;
case CD_SOUTH_EAST:
- py_off = - (int)(sqrt(d*d - w*w)/2);
- px_off = (int)(w/2);
+ py_off = - (int)(ht/2 * cos_teta - wt/2 * sin_teta);
+ px_off = - (int)(ht/2 * sin_teta + wt/2 * cos_teta);
break;
}
}
@@ -1095,7 +1102,7 @@ static void sTextOutBlt(cdCtxCanvas* ctxcanvas, int px, int py, const char* s, i
case CD_CENTER:
case CD_EAST:
case CD_WEST:
- py_off = py;
+ py_off = 0;
break;
}
}
@@ -2366,3 +2373,9 @@ void cdwInitTable(cdCanvas* canvas)
if (ctxcanvas->wtype == CDW_EMF)
canvas->cxPutImageRectRGBA = cdputimagerectrgba;
}
+
+int cdBaseDriver(void)
+{
+ return CD_BASE_WIN;
+}
+