static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; W32::HGDIOBJ hBrush, hBrOld; W32::POINT ptStart, ptEnd; W32::COLORREF rgb = W32COLOR(colour); DIAG_NOTE(renderer, "fill_arc %fx%f <%f,<%f @%f,%f\n", width, height, angle1, angle2, center->x, center->y); if (angle1 > angle2) { /* make it counter-clockwise by swapping start/end */ real tmp = angle1; angle1 = angle2; angle2 = tmp; } /* calculate start and end points of arc */ ptStart.x = SCX(center->x + (width / 2.0) * cos((M_PI / 180.0) * angle1)); ptStart.y = SCY(center->y - (height / 2.0) * sin((M_PI / 180.0) * angle1)); ptEnd.x = SCX(center->x + (width / 2.0) * cos((M_PI / 180.0) * angle2)); ptEnd.y = SCY(center->y - (height / 2.0) * sin((M_PI / 180.0) * angle2)); hPen = UsePen(renderer, NULL); /* no border */ hBrush = W32::CreateSolidBrush(rgb); hBrOld = W32::SelectObject(renderer->hFileDC, hBrush); W32::Pie(renderer->hFileDC, SCX(center->x - width / 2), /* bbox corners */ SCY(center->y - height / 2), SCX(center->x + width / 2), SCY(center->y + height / 2), ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); W32::SelectObject(renderer->hFileDC, W32::GetStockObject (HOLLOW_BRUSH) ); W32::DeleteObject(hBrush); DonePen(renderer, hPen); }
static void draw_polygon(DiaRenderer *self, Point *points, int num_points, Color *fill, Color *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; W32::POINT* pts; int i; W32::HBRUSH hBrush, hBrOld; W32::COLORREF rgb = fill ? W32COLOR(fill) : 0; DIAG_NOTE(renderer, "draw_polygon n:%d %f,%f ...\n", num_points, points->x, points->y); if (num_points < 2) return; pts = g_new (W32::POINT, num_points+1); for (i = 0; i < num_points; i++) { pts[i].x = SCX(points[i].x); pts[i].y = SCY(points[i].y); } if (stroke) hPen = UsePen(renderer, stroke); if (fill) { hBrush = W32::CreateSolidBrush(rgb); hBrOld = (W32::HBRUSH)W32::SelectObject(renderer->hFileDC, hBrush); } W32::Polygon(renderer->hFileDC, pts, num_points); if (stroke) DonePen(renderer, hPen); if (fill) { W32::SelectObject(renderer->hFileDC, W32::GetStockObject(HOLLOW_BRUSH) ); W32::DeleteObject(hBrush); } g_free(pts); }
static void draw_line(DiaRenderer *self, Point *start, Point *end, Color *line_colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; DIAG_NOTE(renderer, "draw_line %f,%f -> %f, %f\n", start->x, start->y, end->x, end->y); hPen = UsePen(renderer, line_colour); W32::MoveToEx(renderer->hFileDC, SCX(start->x), SCY(start->y), NULL); W32::LineTo(renderer->hFileDC, SCX(end->x), SCY(end->y)); DonePen(renderer, hPen); }
static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; DIAG_NOTE(renderer, "draw_rect %f,%f -> %f,%f\n", ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y); hPen = UsePen(renderer, colour); W32::Rectangle(renderer->hFileDC, SCX(ul_corner->x), SCY(ul_corner->y), SCX(lr_corner->x), SCY(lr_corner->y)); DonePen(renderer, hPen); }
static void fill_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HGDIOBJ hBrush, hBrOld; W32::COLORREF rgb = W32COLOR(colour); DIAG_NOTE(renderer, "fill_rect %f,%f -> %f,%f\n", ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y); hBrush = W32::CreateSolidBrush(rgb); hBrOld = W32::SelectObject(renderer->hFileDC, hBrush); draw_rect(self, ul_corner, lr_corner, NULL); W32::SelectObject(renderer->hFileDC, W32::GetStockObject (HOLLOW_BRUSH) ); W32::DeleteObject(hBrush); }
static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; DIAG_NOTE(renderer, "draw_ellipse %fx%f @ %f,%f\n", width, height, center->x, center->y); hPen = UsePen(renderer, colour); W32::Ellipse(renderer->hFileDC, SCX(center->x - width / 2), /* bbox corners */ SCY(center->y - height / 2), SCX(center->x + width / 2), SCY(center->y + height / 2)); DonePen(renderer, hPen); }
static void fill_polygon(DiaRenderer *self, Point *points, int num_points, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HBRUSH hBrush, hBrOld; W32::COLORREF rgb = W32COLOR(colour); DIAG_NOTE(renderer, "fill_polygon n:%d %f,%f ...\n", num_points, points->x, points->y); hBrush = W32::CreateSolidBrush(rgb); hBrOld = (W32::HBRUSH)W32::SelectObject(renderer->hFileDC, hBrush); draw_polygon(self, points, num_points, NULL); W32::SelectObject(renderer->hFileDC, W32::GetStockObject(HOLLOW_BRUSH) ); W32::DeleteObject(hBrush); }
static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; W32::POINT ptStart, ptEnd; DIAG_NOTE(renderer, "draw_arc %fx%f <%f,<%f @%f,%f\n", width, height, angle1, angle2, center->x, center->y); hPen = UsePen(renderer, colour); if (angle1 > angle2) { /* make it counter-clockwise by swapping start/end */ real tmp = angle1; angle1 = angle2; angle2 = tmp; } /* calculate start and end points of arc */ ptStart.x = SCX(center->x + (width / 2.0) * cos((M_PI / 180.0) * angle1)); ptStart.y = SCY(center->y - (height / 2.0) * sin((M_PI / 180.0) * angle1)); ptEnd.x = SCX(center->x + (width / 2.0) * cos((M_PI / 180.0) * angle2)); ptEnd.y = SCY(center->y - (height / 2.0) * sin((M_PI / 180.0) * angle2)); W32::MoveToEx(renderer->hFileDC, ptStart.x, ptStart.y, NULL); W32::Arc(renderer->hFileDC, SCX(center->x - width / 2), /* bbox corners */ SCY(center->y - height / 2), SCX(center->x + width / 2), SCY(center->y + height / 2), ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); DonePen(renderer, hPen); }
static void fill_ellipse(DiaRenderer *self, Point *center, real width, real height, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; W32::HGDIOBJ hBrush, hBrOld; W32::COLORREF rgb = W32COLOR(colour); DIAG_NOTE(renderer, "fill_ellipse %fx%f @ %f,%f\n", width, height, center->x, center->y); hBrush = W32::CreateSolidBrush(rgb); hBrOld = W32::SelectObject(renderer->hFileDC, hBrush); draw_ellipse(self, center, width, height, NULL); W32::SelectObject(renderer->hFileDC, W32::GetStockObject (HOLLOW_BRUSH) ); W32::DeleteObject(hBrush); }
static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, Color *colour) { WmfRenderer *renderer = WMF_RENDERER (self); int len; W32::HGDIOBJ hOld; W32::COLORREF rgb = W32COLOR(colour); DIAG_NOTE(renderer, "draw_string %f,%f %s\n", pos->x, pos->y, text); W32::SetTextColor(renderer->hFileDC, rgb); switch (alignment) { case ALIGN_LEFT: W32::SetTextAlign(renderer->hFileDC, TA_LEFT+TA_BASELINE); break; case ALIGN_CENTER: W32::SetTextAlign(renderer->hFileDC, TA_CENTER+TA_BASELINE); break; case ALIGN_RIGHT: W32::SetTextAlign(renderer->hFileDC, TA_RIGHT+TA_BASELINE); break; } /* work out size of first chunk of text */ len = strlen(text); hOld = W32::SelectObject(renderer->hFileDC, renderer->hFont); { // one way to go, but see below ... char* scp = NULL; /* convert from utf8 to active codepage */ static char codepage[10]; #ifndef HAVE_LIBEMF sprintf (codepage, "CP%d", W32::GetACP ()); #else /* GetACP() not available in libEMF */ sprintf (codepage, "CP1252"); #endif scp = g_convert (text, strlen (text), codepage, "UTF-8", NULL, NULL, NULL); if (scp) { W32::TextOut(renderer->hFileDC, SCX(pos->x), SCY(pos->y), scp, strlen(scp)); g_free (scp); } else // converson failed, write unicode { long wclen = 0; gunichar2* swc = g_utf8_to_utf16 (text, -1, NULL, &wclen, NULL); W32::TextOutW (renderer->hFileDC, SCX(pos->x), SCY(pos->y), reinterpret_cast<W32::LPCWSTR>(swc), wclen); g_free (swc); } } W32::SelectObject(renderer->hFileDC, hOld); }
static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, Color *colour) { #ifndef DIRECT_WMF _bezier(self, points, numpoints, colour, FALSE, FALSE); #else WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; W32::POINT * pts; int i; DIAG_NOTE(renderer, "draw_bezier n:%d %fx%f ...\n", numpoints, points->p1.x, points->p1.y); pts = g_new(W32::POINT, (numpoints-1) * 3 + 1); pts[0].x = SCX(points[0].p1.x); pts[0].y = SCY(points[0].p1.y); for (i = 1; i < numpoints; i++) { switch(points[i].type) { case _BezPoint::BEZ_MOVE_TO: g_warning("only first BezPoint can be a BEZ_MOVE_TO"); break; case _BezPoint::BEZ_LINE_TO: /* everyhing the same ?*/ pts[i*3-2].x = pts[i*3-1].x = pts[i*3 ].x = SCX(points[i].p1.x); pts[i*3-2].y = pts[i*3-1].y = pts[i*3 ].y = SCY(points[i].p1.y); break; case _BezPoint::BEZ_CURVE_TO: /* control points */ pts[i*3-2].x = SCX(points[i].p1.x); pts[i*3-2].y = SCY(points[i].p1.y); pts[i*3-1].x = SCX(points[i].p2.x); pts[i*3-1].y = SCY(points[i].p2.y); /* end point */ pts[i*3 ].x = SCX(points[i].p3.x); pts[i*3 ].y = SCY(points[i].p3.y); break; default: break; } } hPen = UsePen(renderer, colour); W32::PolyBezier(renderer->hFileDC, pts, (numpoints-1)*3+1); DonePen(renderer, hPen); g_free(pts); #endif }
static void set_font(DiaRenderer *self, DiaFont *font, real height) { WmfRenderer *renderer = WMF_RENDERER (self); W32::LPCTSTR sFace; W32::DWORD dwItalic = 0; W32::DWORD dwWeight = FW_DONTCARE; DiaFontStyle style = dia_font_get_style(font); real font_size = dia_font_get_size (font) * (height / dia_font_get_height (font)); DIAG_NOTE(renderer, "set_font %s %f\n", dia_font_get_family (font), height); if (renderer->hFont) { W32::DeleteObject(renderer->hFont); renderer->hFont = NULL; } if (renderer->pango_context) { g_object_unref (renderer->pango_context); renderer->pango_context = NULL; } if (renderer->use_pango) { #ifdef __PANGOWIN32_H__ /* with the pangowin32 backend there is a better way */ if (!renderer->pango_context) renderer->pango_context = pango_win32_get_context (); PangoFont* pf = pango_context_load_font (renderer->pango_context, dia_font_get_description (font)); if (pf) { W32::LOGFONT* lf = pango_win32_font_logfont (pf); /* .93 : sligthly smaller looks much better */ lf->lfHeight = -SC(height*.93); lf->lfHeight = -SC(font_size); renderer->hFont = (W32::HFONT)W32::CreateFontIndirect (lf); g_free (lf); g_object_unref (pf); } else { gchar *desc = pango_font_description_to_string (dia_font_get_description (font)); dia_context_add_message(renderer->ctx, _("Cannot render unknown font:\n%s"), desc); g_free (desc); } #else g_assert_not_reached(); #endif } else { sFace = dia_font_get_family (font); dwItalic = DIA_FONT_STYLE_GET_SLANT(style) != DIA_FONT_NORMAL; /* although there is a known algorithm avoid it for cleanness */ switch (DIA_FONT_STYLE_GET_WEIGHT(style)) { case DIA_FONT_ULTRALIGHT : dwWeight = FW_ULTRALIGHT; break; case DIA_FONT_LIGHT : dwWeight = FW_LIGHT; break; case DIA_FONT_MEDIUM : dwWeight = FW_MEDIUM; break; case DIA_FONT_DEMIBOLD : dwWeight = FW_DEMIBOLD; break; case DIA_FONT_BOLD : dwWeight = FW_BOLD; break; case DIA_FONT_ULTRABOLD : dwWeight = FW_ULTRABOLD; break; case DIA_FONT_HEAVY : dwWeight = FW_HEAVY; break; default : dwWeight = FW_NORMAL; break; } //Hack to get BYTE out of namespace W32 # ifndef BYTE # define BYTE unsigned char # endif renderer->hFont = (W32::HFONT)W32::CreateFont( - SC (font_size), // logical height of font 0, // logical average character width 0, // angle of escapement 0, // base-line orientation angle dwWeight, // font weight dwItalic, // italic attribute flag 0, // underline attribute flag 0, // strikeout attribute flag DEFAULT_CHARSET, // character set identifier OUT_TT_PRECIS, // output precision CLIP_DEFAULT_PRECIS, // clipping precision PROOF_QUALITY, // output quality DEFAULT_PITCH, // pitch and family sFace); // pointer to typeface name string } }