qgfxraster_qws.h
This is the verbatim text of the qgfxraster_qws.h include file. It is
provided only for illustration; the copyright
remains with Trolltech.
/****************************************************************************
** $Id: qt/src/kernel/qgfxraster_qws.h 2.3.1emb edited 2001-09-24 $
**
** Definition of QGfxRaster (unaccelerated graphics context) class
**
** Created : 940721
**
** Copyright (C) 1992-1999 Trolltech AS. All rights reserved.
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Qt/Embedded may use this file in accordance with the
** Qt Embedded Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QGFXRASTER_H
#define QGFXRASTER_H
#ifndef QT_H
#include "qgfx_qws.h"
#include "qpen.h"
#include "qbrush.h"
#include "qimage.h"
#include "qfontmanager_qws.h"
#include "qmemorymanager_qws.h"
#include "qwsdisplay_qws.h"
#include "qpointarray.h"
#include "qpolygonscanner.h"
#include "qapplication.h"
#include "qregion.h"
#endif // QT_H
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
class QGfxRasterBase : public QGfx {
public:
QGfxRasterBase(unsigned char *,int w,int h);
~QGfxRasterBase();
virtual void setPen( const QPen & );
virtual void setFont( const QFont & );
virtual void setBrushPixmap( const QPixmap * p ) { cbrushpixmap=p; }
virtual void setBrushOffset( int x, int y );
virtual void setBrush( const QBrush & );
virtual void setClipRect( int,int,int,int );
virtual void setClipRegion( const QRegion & );
virtual void setClipDeviceRegion( const QRegion & );
virtual void setClipping(bool);
// These will be called from qwidget_qws or qwidget_mac
// to update the drawing area when a widget is moved
virtual void setOffset( int,int );
virtual void setWidgetRect( int,int,int,int );
virtual void setWidgetRegion( const QRegion & );
virtual void setWidgetDeviceRegion( const QRegion & );
virtual void setGlobalRegionIndex( int idx );
virtual void setDashedLines(bool d);
virtual void setDashes(char *, int);
virtual void moveTo( int,int );
virtual void lineTo( int,int );
virtual void setOpaqueBackground(bool b) { opaque=b; }
virtual void setBackgroundColor(QColor c) { backcolor=c; }
virtual void setAlphaType(AlphaType);
virtual void setAlphaSource(unsigned char *,int);
virtual void setAlphaSource(int,int=-1,int=-1,int=-1);
virtual void drawText(int,int,const QString &);
virtual void sync();
virtual void setLineStep(int i) { lstep=i; }
int linestep() const { return lstep; }
int pixelWidth() const { return width; }
int pixelHeight() const { return height; }
virtual int bitDepth() = 0;
void save();
void restore();
virtual void setRop(RasterOp r) { myrop=r; }
void setClut(QRgb * cols,int numcols) { clut=cols; clutcols=numcols; }
protected:
#ifdef DEBUG_POINTERS
void checkSource(unsigned char * c,int i) {
if(i<0) {
qFatal("Negative source coordinate");
}
if(i>=srcheight) {
qFatal("Source pointer height overrun");
}
unsigned char * tmp1=srcbits+(i*srclinestep);
unsigned char * tmp2=tmp1+srclinestep;
if(c<tmp1) {
qFatal("Source pointer underrun");
}
if(c>=tmp2) {
qFatal("Source pointer overrun");
}
}
void checkMask(unsigned char * c,int i) {
unsigned char * tmp1=alphabits+(i*alphalinestep);
unsigned char * tmp2=tmp1+alphalinestep;
if(i<0) {
qFatal("Negative mask coordinate");
}
if(i>=srcheight) {
qFatal("Mask height overrun");
}
if(c<tmp1) {
qFatal("Alpha pointer underrun");
}
if(c>=tmp2) {
qFatal("Alpha pointer overrun");
}
}
void checkDest(unsigned char * c,int i) {
if(i<0) {
qFatal("Negative dest coordinate");
}
if(i>=height) {
qFatal("Destination height overrun");
}
unsigned char * tmp1=buffer+(i*lstep);
unsigned char * tmp2=tmp1+lstep;
if(c<tmp1) {
qFatal("Destination pointer underrun");
}
if(c>=tmp2) {
qFatal("Destination pointer overrun");
}
}
#endif
void* beginTransaction( const QRect& );
void endTransaction(void*);
void beginDraw()
{
QWSDisplay::grab();
if ( globalRegionRevision &&
*globalRegionRevision != currentRegionRevision ) {
fixClip();
}
}
void endDraw()
{
QWSDisplay::ungrab();
}
void fixClip();
void update_clip();
bool inClip(int x, int y, QRect* cr=0, bool know_to_be_outside=FALSE);
virtual void setSourceWidgetOffset( int x, int y );
void useBrush();
void usePen();
virtual void setSourcePen();
unsigned char *scanLine(int i) { return buffer+(i*lstep); }
unsigned char *srcScanLine(int i) { return srcbits + (i*srclinestep); }
// Convert to/from different bit depths
unsigned int get_value_32(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
unsigned int get_value_24(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
unsigned int get_value_16(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
unsigned int get_value_15(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
unsigned int get_value_8(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
unsigned int get_value_4(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
unsigned int get_value_1(int sdepth,unsigned char **srcdata,
bool reverse=FALSE);
protected:
SourceType srctype;
PixelType srcpixeltype;
unsigned char * srcbits;
unsigned char * const buffer;
PixelType pixeltype;
int width;
int height;
int xoffs;
int yoffs;
unsigned int lstep;
bool opaque;
QColor backcolor;
QPen cpen;
QBrush cbrush;
QPoint brushoffs;
bool patternedbrush;
const QPixmap * cbrushpixmap;
bool dashedLines;
char *dashes;
int numDashes;
QPen savepen;
QBrush savebrush;
bool regionClip;
bool clipDirty;
QRegion widgetrgn;
QRegion cliprgn;
QRect clipbounds;
int penx;
int peny;
int srcwidth;
int srcheight;
int srcdepth;
int srclinestep;
int srccol;
QPoint srcwidgetoffs; // Needed when source is widget
bool src_little_endian;
bool src_normal_palette;
unsigned int srcclut[256]; // Source color table - r,g,b values
unsigned int transclut[256]; // Source clut transformed to destination
// values - speed optimisation
QRgb * clut; // Destination color table - r,g,b values
int clutcols; // Colours in clut
int monobitcount;
unsigned char monobitval;
AlphaType alphatype;
unsigned char * alphabits;
unsigned int * alphabuf;
int alphalinestep;
bool ismasking;
int amonobitcount;
unsigned char amonobitval;
bool amonolittletest;
int calpha; // Constant alpha value
int calpha2,calpha3,calpha4; // Used for groovy accelerated effect
unsigned char * maskp;
QMemoryManager::FontID myfont;
int clipcursor;
QRect* cliprect;
int ncliprect;
int globalRegionIndex;
const int *globalRegionRevision;
int currentRegionRevision;
RasterOp myrop;
unsigned long int pixel; // == cpen.pixel() or cbrush.pixel()
QPolygonScanner::Edge stitchedges;
friend class QScreenCursor;
};
template <const int depth, const int type>
class QGfxRaster : public QGfxRasterBase, protected QPolygonScanner {
public:
QGfxRaster(unsigned char *,int w,int h);
~QGfxRaster();
virtual void drawPoint( int,int );
virtual void drawPoints( const QPointArray &,int,int );
virtual void drawLine( int,int,int,int );
virtual void fillRect( int,int,int,int );
virtual void drawPolyline( const QPointArray &,int,int );
virtual void drawPolygon( const QPointArray &,bool,int,int );
virtual void blt( int,int,int,int,int,int );
virtual void scroll( int,int,int,int,int,int );
#if !defined(QT_NO_MOVIE) || !defined(QT_NO_TRANSFORMATIONS) || !defined(QT_NO_PIXMAP_TRANSFORMATION)
virtual void stretchBlt( int,int,int,int,int,int );
#endif
virtual void tiledBlt( int,int,int,int );
virtual int bitDepth() { return depth; }
virtual void setSource(const QImage *);
virtual void setSource(const QPaintDevice *);
protected:
virtual void drawThickLine( int,int,int,int );
virtual void drawThickPolyline( const QPointArray &,int,int );
virtual void drawMidThickLine( int,int,int,int );
virtual void drawMidThickPolyline( const QPointArray &,int,int );
void buildSourceClut(QRgb *,int);
void processSpans( int n, QPoint* point, int* width );
// Optimised vertical line drawing
void vline(int,int,int );
// Optimised horizontal line drawing
void hline(int,int,int );
void hlineUnclipped(int,int,unsigned char* );
#if defined(_OS_QNX6_) // need a different signature for QNX acceleration, override to accel
virtual void hlineUnclipped(int x,int x1,int y){unsigned char *l=scanLine(y);hlineUnclipped(x,x1,l);};
#endif
void hImageLineUnclipped(int,int,unsigned char *,unsigned char *,bool);
void hAlphaLineUnclipped(int,int,unsigned char *,unsigned char *,
unsigned char *);
void drawPointUnclipped( int, unsigned char* );
void calcPacking(void *,int,int,int&,int&,int&);
};
#endif