// FXDCNativePrinter.h // // This was derived from a file of this name on the FOX/FXEX repository, // and its (lack of) explicit copyright claims etc has been preserved. // As the most recent hacker of this version, I (A C Norman, Codemist Ltd) // contribute all my adjustments back under an MIT/BSD-style bunch of // permissions. If the original file contents were under LGPL (or the // FOX extension to same) than that situation will persist. // // see associated file FXDCNativePrinter.cpp for commentary etc. /* Signature: 0b5b65c9 04-Jan-2006 */ #ifndef FXDCNATIVEPRINTER_H #define FXDCNATIVEPRINTER_H #ifndef FXDC_H #include #include #endif #include #include "FXPostscriptFont.h" // // The class described here is intended to allow FOX applications to // print - under Windows it uses the native Windows API while on other // operating systems and if used to print to file it generates Postscript. // // The basic protocol for use is // // FXPrintDialog dlg(this, ""); // dlg.execute(); // user gets to select a printer // FXPrinter printer; // dlg.getPrinter(printer); // find out which one! // FXDCNativePrinter ptr(getApp()); // printing framework // if (!prt.beginPrint(printer)) FAIL // unable to print just now // FXFont *f1 = prt.fntGenerateFont("courier", 12); // or whatever! // // font sizes given in points (1/72in) // f1->create(); // remember to make font really there! // for (page=1;WHENEVER;page++) // { prt.beginPage(page); // start page // prt.setFont(f1); // x = prt.getPageWidth(); // at page border, does not leave any... // y = prt.getPageHeight(); // margins, so leave some yourself. // prt.drawLine(x1, y1, x2, y2); // prt.setForeground(FXRGB(255,0,0)); // colours // prt.drawText(x, y, "string", strlen("string")); // int w = prt.fntGetTextWidth("string", strlen("string")); // etc etc // measurements are in units of 1/72in // // by default. // prt.endPage(); // } // prt.endPrint(); // delete f1; // remember to tidy up afterwards #ifdef WIN32 #include #endif class FXAPI FXDCNativePrinter : public FXDC { protected: FXint pagecount; // Number of pages printed FXint dctype; enum { TYPE_PS=0, TYPE_WIN32=1 }; protected: #ifdef WIN32 HDC dc; DOCINFO di; DEVMODE devmode; HANDLE devmode_handle; // opaque hold a FXPrinterDrawable, which is an auxilliary class only // defined in the .cpp file FXObject *opaque; #endif FXDC *pdc; protected: FXdouble scalex,scaley; FXint logpixelsx, logpixelsy; FXfloat unitsx,unitsy; FXfloat fontScale, fontScaleBack, PSscale; FXint fontoffset; FXfloat pagewidth, pageheight; FX::FXPostscriptFont *postscriptFont; public: /// Construct FXDCNativePrinter(FXApp *a); /// Generate print job prolog virtual FXbool beginPrint(FXPrinter& job); /// Generate print job epilog virtual FXbool endPrint(); /// Generate begin of page virtual FXbool beginPage(FXuint page=1); /// Generate end of page virtual FXbool endPage(); void setHorzUnitsInch(FXfloat sx); void setVertUnitsInch(FXfloat sy); FXint ScaleX(FXint x) { return (int)(x*scalex); } FXint ScaleY(FXint y) { return (int)(y*scaley); } FXfloat getHorzUnitsInch(void) { return unitsx; } FXfloat getVertUnitsInch(void) { return unitsy; } FXint getLogPixelsX(void) { return logpixelsx; } FXint getLogPixelsY(void) { return logpixelsy; } void scalePoints(FXPoint *dst, FXPoint *src, FXuint npoints ); void scaleRectangles(FXRectangle *dst, FXRectangle *src, FXuint nrectangles ); void scaleSegments(FXSegment *dst, FXSegment *src, FXuint nsegments ); void scaleArcs(FXArc *dst, FXArc *src, FXuint narcs ); FXint getPageWidth(void); FXint getPageHeight(void); double doublePageWidth(void); double doublePageHeight(void); /// Draw points virtual void drawPoint(FXint x,FXint y); virtual void drawPoints(const FXPoint *points,FXuint npoints); virtual void drawPointsRel(const FXPoint *points,FXuint npoints); /// Draw lines virtual void drawLine(FXint x1,FXint y1,FXint x2,FXint y2); virtual void drawLines(const FXPoint *points,FXuint npoints); virtual void drawLinesRel(const FXPoint *points,FXuint npoints); virtual void drawLineSegments(const FXSegment *segments,FXuint nsegments); /// Draw rectangles virtual void drawRectangle(FXint x,FXint y,FXint w,FXint h); virtual void drawRectangles(const FXRectangle *rectangles,FXuint nrectangles); /// Draw arcs virtual void drawArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void drawArcs(const FXArc *arcs,FXuint narcs); /// Filled rectangles virtual void fillRectangle(FXint x,FXint y,FXint w,FXint h); virtual void fillRectangles(const FXRectangle *rectangles,FXuint nrectangles); /// Draw arcs virtual void fillArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillArcs(const FXArc *arcs,FXuint narcs); /// Filled polygon virtual void fillPolygon(const FXPoint *points,FXuint npoints); virtual void fillConcavePolygon(const FXPoint *points,FXuint npoints); virtual void fillComplexPolygon(const FXPoint *points,FXuint npoints); /// Filled polygon with relative points virtual void fillPolygonRel(const FXPoint *points,FXuint npoints); virtual void fillConcavePolygonRel(const FXPoint *points,FXuint npoints); virtual void fillComplexPolygonRel(const FXPoint *points,FXuint npoints); /// Draw hashed box virtual void drawHashBox(FXint x,FXint y,FXint w,FXint h,FXint b=1); /// Draw area from source virtual void drawArea(const FXDrawable *source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy); /// Draw image virtual void drawImage(const FXImage *image,FXint dx,FXint dy); /// Draw bitmap virtual void drawBitmap(const FXBitmap *bitmap,FXint dx,FXint dy); /// Draw icon virtual void drawIcon(const FXIcon *icon,FXint dx,FXint dy); virtual void drawIconShaded(const FXIcon *icon,FXint dx,FXint dy); virtual void drawIconSunken(const FXIcon *icon,FXint dx,FXint dy); /// Draw string virtual void drawText(FXint x, FXint y, const FXchar *string, FXuint length); virtual void drawImageText(FXint x, FXint y, const FXchar *string, FXuint length); /// Set foreground/background drawing color virtual void setForeground(FXColor clr); virtual void setBackground(FXColor clr); /// Set dash pattern virtual void setDashes(FXuint dashoffset,const FXchar *dashlist,FXuint n); /// Set line width virtual void setLineWidth(FXuint linewidth=0); /// Set line cap style virtual void setLineCap(FXCapStyle capstyle=CAP_BUTT); /// Set line join style virtual void setLineJoin(FXJoinStyle joinstyle=JOIN_MITER); /// Set line style virtual void setLineStyle(FXLineStyle linestyle=LINE_SOLID); /// Set fill style virtual void setFillStyle(FXFillStyle fillstyle=FILL_SOLID); /// Set fill rule virtual void setFillRule(FXFillRule fillrule=RULE_EVEN_ODD); /// Set blit function virtual void setFunction(FXFunction func=BLT_SRC); /// Set the tile virtual void setTile(FXImage *tile,FXint dx=0,FXint dy=0); /// Set the stipple pattern virtual void setStipple(FXBitmap *stipple,FXint dx=0,FXint dy=0); /// Set the stipple pattern virtual void setStipple(FXStipplePattern stipple,FXint dx=0,FXint dy=0); /// Set clip rectangle virtual void setClipRectangle(FXint x,FXint y,FXint w,FXint h); /// Set clip rectangle virtual void setClipRectangle(const FXRectangle& rectangle); /// Clear clipping virtual void clearClipRectangle(); /// Set clip mask virtual void setClipMask(FXBitmap *mask,FXint dx=0,FXint dy=0); /// Clear clip mask virtual void clearClipMask(); /// Set font to draw text with virtual void setFont(FXFont *fnt); /// Clip drawing by child windows virtual void clipChildren(FXbool yes); /// Cleanup virtual ~FXDCNativePrinter(); /****** Font management ******/ #if (FOX_MINOR<=4) FXFont *fntGenerateFont(const FXString& face, FXuint sz, FXuint wt=FONTWEIGHT_NORMAL, FXuint sl=FONTSLANT_REGULAR, FXuint enc=FONTENCODING_DEFAULT, FXuint setw=FONTSETWIDTH_DONTCARE, FXuint h=0); FXFont *fntDoubleGenerateFont(const FXString& face, double sz, FXuint wt=FONTWEIGHT_NORMAL, FXuint sl=FONTSLANT_REGULAR, FXuint enc=FONTENCODING_DEFAULT, FXuint setw=FONTSETWIDTH_DONTCARE, FXuint h=0); #else FXFont *fntGenerateFont(const FXString& face, FXuint sz, FXuint wt=FXFont::Normal, FXuint sl=FXFont::Straight, FXuint enc=FONTENCODING_DEFAULT, FXuint setw=FXFont::NonExpanded, FXuint h=0); FXFont *fntDoubleGenerateFont(const FXString& face, double sz, FXuint wt=FXFont::Normal, FXuint sl=FXFont::Straight, FXuint enc=FONTENCODING_DEFAULT, FXuint setw=FXFont::NonExpanded, FXuint h=0); #endif FXString fntGetName(); FXuint fntGetSize(); FXuint fntGetWeight(); FXuint fntGetSlant(); FXuint fntGetEncoding(); FXuint fntGetSetWidth(); FXuint fntGetHints(); void fntGetFontDesc(FXFontDesc& fontdesc) const; void fntSetFontDesc(const FXFontDesc& fontdesc); FXbool fntIsFontMono() const; FXbool fntHasChar(FXint ch) const; FXint fntGetMinChar() const; FXint fntGetMaxChar() const; FXint fntLeftBearing(FXchar ch) const; FXint fntRightBearing(FXchar ch) const; FXint fntGetFontWidth() const; FXint fntGetFontHeight() const; FXint fntGetFontAscent() const; FXint fntGetFontDescent() const; FXint fntGetFontLeading() const; FXint fntGetFontSpacing() const; FXint fntGetTextWidth(const FXchar *text,FXuint n) const; FXint fntGetTextHeight(const FXchar *text,FXuint n) const; // Versions of the above that return floating point values double fntDoubleSize(); double fntDoubleLeftBearing(FXchar ch) const; double fntDoubleRightBearing(FXchar ch) const; double fntDoubleFontWidth() const; double fntDoubleFontHeight() const; double fntDoubleFontAscent() const; double fntDoubleFontDescent() const; double fntDoubleFontLeading() const; double fntDoubleFontSpacing() const; double fntDoubleTextWidth(const FXchar *text,FXuint n) const; double fntDoubleTextHeight(const FXchar *text,FXuint n) const; }; #endif // end of FXDCNativePrinter.h