1 // -*- C++ -*- 2 /** 3 * \file Painter.h 4 * This file is part of LyX, the document processor. 5 * Licence details can be found in the file COPYING. 6 * 7 * \author unknown 8 * \author John Levon 9 * 10 * Full author contact details are available in file CREDITS. 11 */ 12 13 #ifndef PAINTER_H 14 #define PAINTER_H 15 16 #include "support/strfwd.h" 17 #include "support/types.h" 18 19 namespace lyx { 20 21 class Font; 22 class FontInfo; 23 24 namespace graphics { class Image; } 25 26 namespace frontend { 27 28 /** 29 * Painter - A painter class to encapsulate all graphics parameters and operations 30 * 31 * Every graphics operation in LyX should be made by this class. The 32 * painter is used for drawing on the WorkArea, and is passed around 33 * during draw operations. 34 * 35 * It hides low level windows system parameters so insets and other 36 * clients don't have to worry about them and we can control graphics and 37 * GUI toolkit dependent drawing functions inside this single class. 38 * 39 * The intention for a toolkit is that it uses these methods to paint 40 * onto a backing pixmap. Only when expose events arrive via the event 41 * queue, does the copy onto the actual WorkArea widget take place. 42 * 43 * Caution: All char_type and docstring arguments of the text drawing 44 * methods of this class are no UCS4 chars or strings if the font is a 45 * symbol font. They simply denote the code points of the font instead. 46 * You have to keep this in mind when you implement the methods in a 47 * frontend. You must not pass these parameters to a unicode conversion 48 * function in particular. 49 */ 50 class Painter { 51 public: Painter(double pixel_ratio)52 Painter(double pixel_ratio) : pixel_ratio_(pixel_ratio) {} 53 54 static const int thin_line; 55 56 /// possible line styles 57 enum line_style { 58 line_solid, //< solid line 59 line_solid_aliased, //< solid line, no anti-aliasing (used as a 60 // workaround to painting issues) 61 line_onoffdash //< dashes with spaces 62 }; 63 64 /// possible fill styles 65 enum fill_style { 66 fill_none, 67 fill_oddeven, 68 fill_winding 69 }; 70 71 /// possible character styles of preedit string. 72 /// This is used for CJK input method support. 73 enum preedit_style { 74 preedit_default, //< when unselecting, no cursor and dashed underline. 75 preedit_selecting, //< when selecting. 76 preedit_cursor //< with cursor. 77 }; 78 ~Painter()79 virtual ~Painter() {} 80 81 /// draw a line from point to point 82 virtual void line(int x1, int y1, int x2, int y2, Color, 83 line_style = line_solid, int line_width = thin_line) = 0; 84 85 /** 86 * lines - draw a set of lines 87 * @param xp array of points' x co-ords 88 * @param yp array of points' y co-ords 89 * @param np size of the points array 90 */ 91 virtual void lines(int const * xp, int const * yp, int np, Color, 92 fill_style = fill_none, line_style = line_solid, 93 int line_width = thin_line) = 0; 94 95 /** 96 * path - draw a path with bezier curves 97 * @param xp array of points' x co-ords 98 * @param yp array of points' y co-ords 99 * @param c1x array of first control points' x co-ords 100 * @param c1y array of first control points' y co-ords 101 * @param c2x array of second control points' x co-ords 102 * @param c2y array of second control points' y co-ords 103 * @param np size of the points array 104 */ 105 virtual void path(int const * xp, int const * yp, 106 int const * c1x, int const * c1y, 107 int const * c2x, int const * c2y, 108 int np, Color, 109 fill_style = fill_none, line_style = line_solid, 110 int line_width = thin_line) = 0; 111 112 /// draw a rectangle 113 virtual void rectangle(int x, int y, int w, int h, Color, 114 line_style = line_solid, int line_width = thin_line) = 0; 115 116 /// draw a filled rectangle 117 virtual void fillRectangle(int x, int y, int w, int h, Color) = 0; 118 119 /// draw an arc 120 virtual void arc(int x, int y, unsigned int w, unsigned int h, 121 int a1, int a2, Color) = 0; 122 123 /// draw a pixel 124 virtual void point(int x, int y, Color) = 0; 125 126 /// draw an image from the image cache 127 virtual void image(int x, int y, int w, int h, 128 graphics::Image const & image) = 0; 129 130 /// draw a string at position x, y (y is the baseline). 131 virtual void text(int x, int y, docstring const & str, FontInfo const & f) = 0; 132 133 /// draw a char at position x, y (y is the baseline) 134 virtual void text(int x, int y, char_type c, FontInfo const & f) = 0; 135 136 /** draw a string at position x, y (y is the baseline). The 137 * text direction is enforced by the \c Font. 138 */ 139 virtual void text(int x, int y, docstring const & str, Font const & f, 140 double wordspacing, double textwidth) = 0; 141 142 /** draw a string at position x, y (y is the baseline), but 143 * make sure that the part between \c from and \c to is in 144 * \c other color. The text direction is enforced by the \c Font. 145 */ 146 virtual void text(int x, int y, docstring const & str, Font const & f, 147 Color other, size_type from, size_type to, 148 double wordspacing, double textwidth) = 0; 149 150 // Returns true if the painter does not actually paint. 151 virtual bool isNull() const = 0; 152 pixelRatio()153 double pixelRatio() const { return pixel_ratio_; } 154 155 /// draw the underbar, strikeout, xout, uuline and uwave font attributes 156 virtual void textDecoration(FontInfo const & f, int x, int y, int width) = 0; 157 158 /** 159 * Draw a string and enclose it inside a rectangle. If 160 * back color is specified, the background is cleared with 161 * the given color. If frame is specified, a thin frame is drawn 162 * around the text with the given color. 163 */ 164 virtual void rectText(int x, int baseline, docstring const & str, 165 FontInfo const & font, Color back, Color frame) = 0; 166 167 /// draw a string and enclose it inside a button frame 168 virtual void buttonText(int x, int baseline, docstring const & s, 169 FontInfo const & font, Color back, Color frame, int offset) = 0; 170 171 /// draw a character of a preedit string for cjk support. 172 virtual int preeditText(int x, int y, 173 char_type c, FontInfo const & f, preedit_style style) = 0; 174 175 /// start monochrome painting mode, i.e. map every color into [min,max] 176 virtual void enterMonochromeMode(Color const & min, 177 Color const & max) = 0; 178 /// leave monochrome painting mode 179 virtual void leaveMonochromeMode() = 0; 180 /// draws a wavy line that can be used for underlining. 181 virtual void wavyHorizontalLine(int x, int y, int width, ColorCode col) = 0; 182 private: 183 /// Ratio between physical pixels and device-independent pixels 184 double pixel_ratio_; 185 }; 186 187 } // namespace frontend 188 } // namespace lyx 189 190 #endif // PAINTER_H 191