mirror of https://github.com/KLayout/klayout.git
335 lines
12 KiB
C++
335 lines
12 KiB
C++
|
|
/*
|
|
|
|
KLayout Layout Viewer
|
|
Copyright (C) 2006-2017 Matthias Koefferlein
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef HDR_layBitmapRenderer
|
|
#define HDR_layBitmapRenderer
|
|
|
|
#include "layRenderer.h"
|
|
#include "layBitmap.h"
|
|
|
|
namespace lay
|
|
{
|
|
|
|
/**
|
|
* @brief A edge set and text rendering object
|
|
*
|
|
* The renderer is supposed to render a set of edges to
|
|
* one or more bitmaps. One bitmap holds the contour
|
|
* information, one the fill. A third one holds the
|
|
* vertex informations (dots).
|
|
*
|
|
* The intended use model is first to reserve a number of
|
|
* points if necessary, the fill the renderer with the
|
|
* edges and then render the content to the bitmaps.
|
|
*
|
|
* The coordinate system of the bitmaps is 0,0..w-1,h-1
|
|
* with 0,0 being the lower left corner.
|
|
*/
|
|
class LAYBASIC_PUBLIC BitmapRenderer
|
|
: public Renderer
|
|
{
|
|
public:
|
|
/**
|
|
* @brief The default ctor
|
|
*/
|
|
BitmapRenderer (unsigned int width, unsigned int height, double resolution);
|
|
|
|
/**
|
|
* @brief Reserve space for n edges
|
|
*
|
|
* It is strongly recommended to use this method to
|
|
* reserve space in advance before any insert operation for edges or boxes.
|
|
*/
|
|
virtual void reserve_edges (size_t n);
|
|
|
|
/**
|
|
* @brief Reserve space for n texts
|
|
*
|
|
* It is strongly recommended to use this method to
|
|
* reserve space in advance before any insert operation for texts.
|
|
*/
|
|
virtual void reserve_texts (size_t n);
|
|
|
|
/**
|
|
* @brief Clear the content
|
|
*/
|
|
virtual void clear ();
|
|
|
|
/**
|
|
* @brief Insert edges using the provided sequence and a transform function
|
|
*
|
|
* Inserts the edge sequence [from,to), transformed with f(E).
|
|
*
|
|
* @param from The start of the sequence
|
|
* @param to The past-end iterator of the sequence
|
|
* @param f The function to apply before inserting the edge. It must
|
|
* provide a db::DEdge operator(Iter::value_type).
|
|
*/
|
|
template <class Iter, class Func>
|
|
void insert_edges (Iter from, Iter to, Func f)
|
|
{
|
|
for (Iter e = from; e != to; ++e) {
|
|
insert (f (*e));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Insert a box with a transformation (because it may not be orthogonal)
|
|
*/
|
|
void insert (const db::Box &b, const db::CplxTrans &t);
|
|
|
|
/**
|
|
* @brief Insert a box with a transformation (because it may not be orthogonal)
|
|
*/
|
|
void insert (const db::DBox &b, const db::DCplxTrans &t);
|
|
|
|
/**
|
|
* @brief Insert a box
|
|
*/
|
|
void insert (const db::DBox &b);
|
|
|
|
/**
|
|
* @brief Insert an edge
|
|
*
|
|
* The edges must be a db::DEdge type.
|
|
*/
|
|
void insert (const db::DEdge &e);
|
|
|
|
/**
|
|
* @brief Insert a text
|
|
*
|
|
* @box The box in which to inscribe the text (or the point at which to align if the width and height is zero)
|
|
* @text The text to render
|
|
* @font The font to use
|
|
* @halign The horizontal alignment
|
|
* @valign The vertical alignment
|
|
* @trans The orientation of the text
|
|
*/
|
|
void insert (const db::DBox &box, const std::string &text, db::Font font, db::HAlign halign, db::VAlign valign, db::DFTrans trans);
|
|
|
|
/**
|
|
* @brief Render the interior of the object to the bitmap
|
|
*/
|
|
void render_fill (lay::CanvasPlane &bitmap);
|
|
|
|
/**
|
|
* @brief Render the contour of the object to the bitmap
|
|
*/
|
|
void render_contour (lay::CanvasPlane &bitmap);
|
|
|
|
/**
|
|
* @brief Render the vertices of the object to the bitmap
|
|
*
|
|
* Mode is
|
|
* 0 for "all vertices" (2 per edge)
|
|
* 1 for "one vertex per edge"
|
|
* 2 for "one vertex per every second edge"
|
|
*/
|
|
void render_vertices (lay::CanvasPlane &bitmap, int mode);
|
|
|
|
/**
|
|
* @brief Render the texts of the object to the bitmap
|
|
*/
|
|
void render_texts (lay::CanvasPlane &bitmap);
|
|
|
|
/**
|
|
* @brief Render a generic shape into a set of bitmaps
|
|
*
|
|
* The shape can either be a polygon, box, edge, path or text
|
|
*
|
|
* @param shape The polygon to draw
|
|
* @param trans The transformation to apply
|
|
* @param fill The bitmap to which to render the interior. Can be 0 for not drawing this.
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts Currenty not used. Used for drawing properties if drawing of these is required.
|
|
*/
|
|
virtual void draw (const db::Shape &shape, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Render a polygon into a set of bitmaps
|
|
*
|
|
* @param poly The polygon to draw
|
|
* @param trans The transformation to apply
|
|
* @param fill The bitmap to which to render the interior. Can be 0 for not drawing this.
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts Currenty not used. No texts to draw.
|
|
*/
|
|
virtual void draw (const db::Polygon &poly, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates
|
|
*/
|
|
virtual void draw (const db::DPolygon &poly,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates and transformation
|
|
*/
|
|
virtual void draw (const db::DPolygon &poly, const db::DCplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Render a box into a set of bitmaps
|
|
*
|
|
* @param box The box to draw
|
|
* @param trans The transformation to apply
|
|
* @param fill The bitmap to which to render the interior. Can be 0 for not drawing this.
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts Currenty not used. No texts to draw.
|
|
*/
|
|
virtual void draw (const db::Box &box, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for short representation
|
|
*/
|
|
virtual void draw (const db::ShortBox &box, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates
|
|
*/
|
|
virtual void draw (const db::DBox &box,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates and transformation
|
|
*/
|
|
virtual void draw (const db::DBox &box, const db::DCplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Render a path into a set of bitmaps
|
|
*
|
|
* @param path The path to draw
|
|
* @param trans The transformation to apply
|
|
* @param fill The bitmap to which to render the interior. Can be 0 for not drawing this.
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts Currenty not used. No texts to draw.
|
|
*/
|
|
virtual void draw (const db::Path &path, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates
|
|
*/
|
|
virtual void draw (const db::DPath &path,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates and transformation
|
|
*/
|
|
virtual void draw (const db::DPath &path, const db::DCplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Render a text into a set of bitmaps
|
|
*
|
|
* @param text The text to draw
|
|
* @param trans The transformation to apply
|
|
* @param fill Not used currenty, since the text does not have an interior
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts The bitmap to which to render the text.
|
|
*/
|
|
virtual void draw (const db::Text &text, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates
|
|
*/
|
|
virtual void draw (const db::DText &text,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates and transformation
|
|
*/
|
|
virtual void draw (const db::DText &text, const db::DCplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Draw a formatted text
|
|
*
|
|
* @box The box in which to inscribe the text (or the point at which to align if the width and height is zero)
|
|
* @text The text to render
|
|
* @font The font to use
|
|
* @halign The horizontal alignment
|
|
* @valign The vertical alignment
|
|
* @trans The orientation of the text
|
|
* @param fill Not used currenty, since the text does not have an interior
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts The bitmap to which to render the text.
|
|
*/
|
|
virtual void draw (const db::DBox &box, const std::string &text, db::Font font, db::HAlign halign, db::VAlign valign, db::DFTrans trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Render a edge into a set of bitmaps
|
|
*
|
|
* @param edge The box to draw
|
|
* @param trans The transformation to apply
|
|
* @param fill Not used currenty, since the text does not have an interior
|
|
* @param frame The bitmap to which to render the contour. Can be 0 for not drawing this.
|
|
* @param vertices The bitmap to which to render the vertices. Can be 0 for not drawing this.
|
|
* @param texts Currenty not used. No texts to draw.
|
|
*/
|
|
virtual void draw (const db::Edge &edge, const db::CplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates
|
|
*/
|
|
virtual void draw (const db::DEdge &edge,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
/**
|
|
* @brief Same for double coordinates and transformation
|
|
*/
|
|
virtual void draw (const db::DEdge &edge, const db::DCplxTrans &trans,
|
|
lay::CanvasPlane *fill, lay::CanvasPlane *frame, lay::CanvasPlane *vertices, lay::CanvasPlane *texts);
|
|
|
|
private:
|
|
std::vector<lay::RenderEdge> m_edges;
|
|
double m_xmin, m_xmax, m_ymin, m_ymax;
|
|
bool m_ortho;
|
|
std::vector<lay::RenderText> m_texts;
|
|
|
|
template <class Box, class Trans> bool simplify_box (Box &, const Trans &);
|
|
static void render_dot (double x, double y, lay::CanvasPlane *plane);
|
|
static void render_box (double xmin, double ymin, double xmax, double ymax, lay::CanvasPlane *plane);
|
|
void add_xfill ();
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|
|
|