- gdk_draw_line( m_window, m_penGC, 0, yy, XLOG2DEVREL(w), yy );
- gdk_draw_line( m_window, m_penGC, xx, 0, xx, YLOG2DEVREL(h) );
+ if (m_window)
+ {
+ gdk_draw_line( m_window, m_penGC, 0, yy, XLOG2DEVREL(w), yy );
+ gdk_draw_line( m_window, m_penGC, xx, 0, xx, YLOG2DEVREL(h) );
+ }
- if (m_brush.GetStyle() != wxTRANSPARENT)
- gdk_draw_arc( m_window, m_brushGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
+ if (m_window)
+ {
+ if (m_brush.GetStyle() != wxTRANSPARENT)
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
- if (m_pen.GetStyle() != wxTRANSPARENT)
- gdk_draw_arc( m_window, m_penGC, FALSE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
+ if (m_pen.GetStyle() != wxTRANSPARENT)
+ gdk_draw_arc( m_window, m_penGC, FALSE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
+ }
- long start = long(sa * 64.0);
- long end = long(ea * 64.0);
- if (m_brush.GetStyle() != wxTRANSPARENT)
- gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, ww, hh, start, end );
+ if (m_window)
+ {
+ long start = long(sa * 64.0);
+ long end = long(ea * 64.0);
+
+ if (m_brush.GetStyle() != wxTRANSPARENT)
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, ww, hh, start, end );
- if (m_pen.GetStyle() != wxTRANSPARENT)
- gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, ww, hh, start, end );
-
+ if (m_pen.GetStyle() != wxTRANSPARENT)
+ gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, ww, hh, start, end );
+ }
+
-void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset )
-{
- wxCHECK_RET( Ok(), "invalid window dc" );
-
- if (m_pen.GetStyle() == wxTRANSPARENT) return;
-
- wxNode *node = points->First();
- if (!node) return;
-
- wxPoint *pt = (wxPoint*)node->Data();
- CalcBoundingBox( pt->x + xoffset, pt->y + yoffset );
-
- while (node->Next())
- {
- wxPoint *point = (wxPoint*)node->Data();
- wxPoint *npoint = (wxPoint*)node->Next()->Data();
- long x1 = XLOG2DEV(point->x + xoffset);
- long x2 = XLOG2DEV(npoint->x + xoffset);
- long y1 = YLOG2DEV(point->y + yoffset); // and a waste again...
- long y2 = YLOG2DEV(npoint->y + yoffset);
- gdk_draw_line( m_window, m_penGC, x1, y1, x2, y2 );
- node = node->Next();
-
- CalcBoundingBox( npoint->x + xoffset, npoint->y + yoffset );
- }
-}
-
-void wxWindowDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
+void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
- if (m_pen.GetStyle() != wxTRANSPARENT)
- for (i = 0 ; i < n ; i++)
- {
- gdk_draw_line( m_window, m_penGC,
- gdkpoints[i%n].x,
- gdkpoints[i%n].y,
- gdkpoints[(i+1)%n].x,
- gdkpoints[(i+1)%n].y);
- }
-
- delete[] gdkpoints;
-}
-
-void wxWindowDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle))
-{
- wxCHECK_RET( Ok(), "invalid window dc" );
-
- int n = lines->Number();
- if (n <= 0) return;
-
- GdkPoint *gdkpoints = new GdkPoint[n];
- wxNode *node = lines->First();
- int cnt = 0;
- while (node)
+ if ((m_pen.GetStyle() != wxTRANSPARENT) && m_window)
- gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
- gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
- gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
- gdk_draw_arc( m_window, m_brushGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
- gdk_draw_arc( m_window, m_brushGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
- gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
- }
+ // CMB: ensure dd is not larger than rectangle otherwise we
+ // get an hour glass shape
+ long dd = 2 * rr;
+ if (dd > ww) dd = ww;
+ if (dd > hh) dd = hh;
+ rr = dd / 2;
+
+ if (m_brush.GetStyle() != wxTRANSPARENT)
+ {
+ gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
+ gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
+ }
- if (m_pen.GetStyle() != wxTRANSPARENT)
- {
- gdk_draw_line( m_window, m_penGC, xx+rr, yy, xx+ww-rr, yy );
- gdk_draw_line( m_window, m_penGC, xx+rr, yy+hh, xx+ww-rr, yy+hh );
- gdk_draw_line( m_window, m_penGC, xx, yy+rr, xx, yy+hh-rr );
- gdk_draw_line( m_window, m_penGC, xx+ww, yy+rr, xx+ww, yy+hh-rr );
- gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, dd, dd, 90*64, 90*64 );
- gdk_draw_arc( m_window, m_penGC, FALSE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
- gdk_draw_arc( m_window, m_penGC, FALSE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
- gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
+ if (m_pen.GetStyle() != wxTRANSPARENT)
+ {
+ gdk_draw_line( m_window, m_penGC, xx+rr, yy, xx+ww-rr, yy );
+ gdk_draw_line( m_window, m_penGC, xx+rr, yy+hh, xx+ww-rr, yy+hh );
+ gdk_draw_line( m_window, m_penGC, xx, yy+rr, xx, yy+hh-rr );
+ gdk_draw_line( m_window, m_penGC, xx+ww, yy+rr, xx+ww, yy+hh-rr );
+ gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, dd, dd, 90*64, 90*64 );
+ gdk_draw_arc( m_window, m_penGC, FALSE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
+ gdk_draw_arc( m_window, m_penGC, FALSE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
+ gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
+ }
- if (m_brush.GetStyle() != wxTRANSPARENT)
- gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
+ if (m_window)
+ {
+ if (m_brush.GetStyle() != wxTRANSPARENT)
+ gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
- if (m_pen.GetStyle() != wxTRANSPARENT)
- gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, ww, hh, 0, 360*64 );
-
+ if (m_pen.GetStyle() != wxTRANSPARENT)
+ gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, ww, hh, 0, 360*64 );
+ }
+
-bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
- wxDC *source, long xsrc, long ysrc, int logical_func, bool useMask )
+bool wxWindowDC::DoBlit( long xdest, long ydest, long width, long height,
+ wxDC *source, long xsrc, long ysrc,
+ int logical_func, bool useMask )
{
/* this is the nth try to get this utterly useless function to
work. it now completely ignores the scaling or translation
of the source dc, but scales correctly on the target dc and
knows about possible mask information in a memory dc. */
{
/* this is the nth try to get this utterly useless function to
work. it now completely ignores the scaling or translation
of the source dc, but scales correctly on the target dc and
knows about possible mask information in a memory dc. */
- y different window if the memory dc BOTH
- a) doesn't have any mask or its mask isn't used
- b) it is clipped.
- we HAVE TO use the direct way for memory dcs
- that have mask since the XCopyArea doesn't know
- about masks and we SHOULD use the direct way if
- all of the bitmap in the memory dc is copied in
- which case XCopyArea wouldn't be able able to
- boost performace by reducing the area to be scaled */
-
- use_bitmap_method = ( (useMask && (memDC->m_selected.GetMask())) ||
- ((xsrc == 0) && (ysrc == 0) &&
- (width == memDC->m_selected.GetWidth()) &&
- (height == memDC->m_selected.GetHeight()) )
- );
+ y different window if the memory dc BOTH
+ a) doesn't have any mask or its mask isn't used
+ b) it is clipped
+ c) is not 1-bit */
+
+ if (useMask && (memDC->m_selected.GetMask()))
+ {
+ /* we HAVE TO use the direct way for memory dcs
+ that have mask since the XCopyArea doesn't know
+ about masks */
+ use_bitmap_method = TRUE;
+ }
+ else if (memDC->m_selected.GetDepth() == 1)
+ {
+ /* we HAVE TO use the direct way for memory dcs
+ that are bitmaps because XCopyArea doesn't cope
+ with different bit depths */
+ use_bitmap_method = TRUE;
+ }
+ else if ((xsrc == 0) && (ysrc == 0) &&
+ (width == memDC->m_selected.GetWidth()) &&
+ (height == memDC->m_selected.GetHeight()))
+ {
+ /* we SHOULD use the direct way if all of the bitmap
+ in the memory dc is copied in which case XCopyArea
+ wouldn't be able able to boost performace by reducing
+ the area to be scaled */
+ use_bitmap_method = TRUE;
+ }
+ else
+ {
+ use_bitmap_method = FALSE;
+ }
- gdk_draw_bitmap( m_window, m_penGC, bm, 0, 0, xx, yy, ww, hh );
- }
+ /* we use the textGC here because blitting a bitmap is done
+ using the current text colour */
+ gdk_draw_bitmap( m_window, m_textGC, bm, xsrc, ysrc, xx, yy, ww, hh );
+ }
- {
- /* draw source window into a bitmap as we cannot scale
- a window in contrast to a bitmap. this would actually
- work with memory dcs as well, but we'd lose the mask
- information and waste one step in this process since
- a memory already has a bitmap. all this is slightly
- inefficient as we could take an XImage directly from
- an X window, but we'd then also have to care that
- the window is not outside the screen (in which case
- we'd get a BadMatch or what not).
- Is a double XGetImage and combined XGetPixel and
- XPutPixel really faster? I'm not sure. look at wxXt
- for a different implementation of the same problem. */
+ {
+ /* draw source window into a bitmap as we cannot scale
+ a window in contrast to a bitmap. this would actually
+ work with memory dcs as well, but we'd lose the mask
+ information and waste one step in this process since
+ a memory already has a bitmap. all this is slightly
+ inefficient as we could take an XImage directly from
+ an X window, but we'd then also have to care that
+ the window is not outside the screen (in which case
+ we'd get a BadMatch or what not).
+ Is a double XGetImage and combined XGetPixel and
+ XPutPixel really faster? I'm not sure. look at wxXt
+ for a different implementation of the same problem. */
gdk_window_copy_area( m_window, m_penGC, xx, yy,
srcDC->GetWindow(),
xsrc, ysrc, width, height );
gdk_window_copy_area( m_window, m_penGC, xx, yy,
srcDC->GetWindow(),
xsrc, ysrc, width, height );
long height = font->ascent + font->descent;
gdk_gc_set_foreground( m_textGC, m_textBackgroundColour.GetColor() );
gdk_draw_rectangle( m_window, m_textGC, TRUE, x, y, width, height );
gdk_gc_set_foreground( m_textGC, m_textForegroundColour.GetColor() );
}
long height = font->ascent + font->descent;
gdk_gc_set_foreground( m_textGC, m_textBackgroundColour.GetColor() );
gdk_draw_rectangle( m_window, m_textGC, TRUE, x, y, width, height );
gdk_gc_set_foreground( m_textGC, m_textForegroundColour.GetColor() );
}
long ul_y = y + font->ascent;
if (font->descent > 0) ul_y++;
gdk_draw_line( m_window, m_textGC, x, ul_y, x + width, ul_y);
long ul_y = y + font->ascent;
if (font->descent > 0) ul_y++;
gdk_draw_line( m_window, m_textGC, x, ul_y, x + width, ul_y);
{
int width,height;
GetSize( &width, &height );
gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
{
int width,height;
GetSize( &width, &height );
gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
- case wxSOLID: { lineStyle = GDK_LINE_SOLID; break; }
- case wxDOT: { lineStyle = GDK_LINE_ON_OFF_DASH; break; }
- case wxLONG_DASH: { lineStyle = GDK_LINE_ON_OFF_DASH; break; }
- case wxSHORT_DASH: { lineStyle = GDK_LINE_ON_OFF_DASH; break; }
- case wxDOT_DASH: { lineStyle = GDK_LINE_DOUBLE_DASH; break; }
+ case wxUSER_DASH:
+ {
+ lineStyle = GDK_LINE_ON_OFF_DASH;
+ req_nb_dash = m_pen.GetDashCount();
+ req_dash = m_pen.GetDash();
+ break;
+ }
+ case wxDOT:
+ {
+ lineStyle = GDK_LINE_ON_OFF_DASH;
+ req_nb_dash = 2;
+ req_dash = dotted;
+ break;
+ }
+ case wxLONG_DASH:
+ {
+ lineStyle = GDK_LINE_ON_OFF_DASH;
+ req_nb_dash = 2;
+ req_dash = long_dashed;
+ break;
+ }
+ case wxSHORT_DASH:
+ {
+ lineStyle = GDK_LINE_ON_OFF_DASH;
+ req_nb_dash = 2;
+ req_dash = short_dashed;
+ break;
+ }
+ case wxDOT_DASH:
+ {
+// lineStyle = GDK_LINE_DOUBLE_DASH;
+ lineStyle = GDK_LINE_ON_OFF_DASH;
+ req_nb_dash = 4;
+ req_dash = dotted_dashed;
+ break;
+ }
+
+ case wxTRANSPARENT:
+ case wxSTIPPLE:
+ case wxSOLID:
+ default:
+ {
+ lineStyle = GDK_LINE_SOLID;
+ req_dash = (wxDash*)NULL;
+ req_nb_dash = 0;
+ break;
+ }
+ if (req_dash && req_nb_dash)
+ {
+ char *real_req_dash = new char[req_nb_dash];
+ if (real_req_dash)
+ {
+ for (int i = 0; i < req_nb_dash; i++)
+ real_req_dash[i] = req_dash[i] * width;
+ gdk_gc_set_dashes( m_penGC, 0, real_req_dash, req_nb_dash );
+ delete[] real_req_dash;
+ }
+ else
+ {
+ // No Memory. We use non-scaled dash pattern...
+ gdk_gc_set_dashes( m_penGC, 0, (char*)req_dash, req_nb_dash );
+ }
+ }
+
- case wxXOR: mode = GDK_INVERT; break;
- case wxINVERT: mode = GDK_INVERT; break;
- default: break;
+ case wxXOR: mode = GDK_XOR; break;
+ case wxINVERT: mode = GDK_INVERT; break;
+#if (GTK_MINOR_VERSION > 0)
+ case wxOR_REVERSE: mode = GDK_OR_REVERSE; break;
+ case wxAND_REVERSE: mode = GDK_AND_REVERSE; break;
+ case wxCLEAR: mode = GDK_CLEAR; break;
+ case wxSET: mode = GDK_SET; break;
+ case wxOR_INVERT: mode = GDK_OR_INVERT; break;
+ case wxSRC_AND:
+ case wxAND: mode = GDK_AND; break;
+ case wxSRC_OR:
+ case wxOR: mode = GDK_OR; break;
+ case wxEQUIV: mode = GDK_EQUIV; break;
+ case wxNAND: mode = GDK_NAND; break;
+ case wxAND_INVERT: mode = GDK_AND_INVERT; break;
+ case wxCOPY: mode = GDK_COPY; break;
+ case wxNO_OP: mode = GDK_NOOP; break;
+ case wxSRC_INVERT: mode = GDK_COPY_INVERT; break;
+#endif
+ default:
+ {
+ wxFAIL_MSG( _T("unsupported logical function") );
+ break;
+ }
-GdkWindow *wxWindowDC::GetWindow()
+void wxWindowDC::ComputeScaleAndOrigin()
+{
+ /* CMB: copy scale to see if it changes */
+ double origScaleX = m_scaleX;
+ double origScaleY = m_scaleY;
+
+ wxDC::ComputeScaleAndOrigin();
+
+ /* CMB: if scale has changed call SetPen to recalulate the line width */
+ if ((m_scaleX != origScaleX || m_scaleY != origScaleY) &&
+ (m_pen.Ok()))
+ {
+ /* this is a bit artificial, but we need to force wxDC to think
+ the pen has changed */
+ wxPen pen = m_pen;
+ m_pen = wxNullPen;
+ SetPen( pen );
+ }
+}
+
+// Resolution in pixels per logical inch
+wxSize wxWindowDC::GetPPI() const
while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
xmid = (double)half(x2, x3);
ymid = (double)half(y2, y3);
while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
xmid = (double)half(x2, x3);
ymid = (double)half(y2, y3);
wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
(double)half(x3, x4), (double)half(y3, y4), x4, y4);
wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
(double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);
wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
(double)half(x3, x4), (double)half(y3, y4), x4, y4);
wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
(double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);