///////////////////////////////////////////////////////////// // Flash Plugin and Player // Copyright (C) 1998 Olivier Debon // // 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // /////////////////////////////////////////////////////////////// #ifndef _GRAPHIC_H_ #define _GRAPHIC_H_ #define ALPHA_OPAQUE 255 enum FillType { f_Solid = 0x00, f_LinearGradient = 0x10, f_RadialGradient = 0x12, f_TiledBitmap = 0x40, f_clippedBitmap = 0x41, f_None = 0x80 }; struct Gradient { int nbGradients; unsigned char ratio[8]; Color color[8]; // For rendering Color *ramp; Matrix imat; int has_alpha; }; struct FillStyleDef { FillType type; // See enum FillType // Solid Color color; // Gradient Gradient gradient; // Bitmap Bitmap *bitmap; Matrix bitmap_matrix; Color *cmap; unsigned char *alpha_table; // Gradient or Bitmap Matrix matrix; FillStyleDef() { style_size += sizeof(FillStyleDef); style_nb++; } }; struct Segment { long x1,x2; long ymax; FillStyleDef *fs[2]; // 0 is left 1 is right int aa; long dX; long X; struct Segment *next; struct Segment *nextValid; }; /* fractional bits (we don't use twips here... too expensive) */ #define FRAC_BITS 5 #define FRAC (1 << FRAC_BITS) #define NB_SEGMENT_MAX (2048*4) #define SEGFRAC 8 class GraphicDevice { int targetWidth; int targetHeight; Rect viewPort; int movieWidth; int movieHeight; int zoom; unsigned long redMask; unsigned long greenMask; unsigned long blueMask; int clipping; public: FlashDisplay *flashDisplay; int bgInitialized; Color backgroundColor; Color foregroundColor; public: void *scan_line_func_id; ScanLineFunc scan_line_func; Rect clip_rect; private: Segment **segs; int ymin,ymax; int height; Segment *seg_pool; Segment *seg_pool_cur; Segment * allocSeg(); Segment * progressSegments(Segment * curSegs, long y); Segment * newSegments(Segment *curSegs, Segment *newSegs); void renderScanLine(long y, Segment *curSegs); protected: long clip(long &y, long &start, long &end); public: Matrix *adjust; // Matrix to fit window (shrink or expand) long showMore; // Used for debugging // For Direct Graphics unsigned char *canvasBuffer; // A pointer to canvas'memory long bpl; // Bytes per line long bpp; // Bytes per pixel long pad; // Scanline pad in byte GraphicDevice(FlashDisplay *fd); virtual ~GraphicDevice(); int setBackgroundColor(Color); void setForegroundColor(Color); Color getBackgroundColor(); Color getForegroundColor(); void setMovieDimension(long width, long height); void setMovieZoom(int zoom); void setMovieOffset(long x, long y); long getWidth(); long getHeight(); Color *getColormap(Color *old, long n, Cxform *cxform); void drawBox(long x1, long y1, long x2, long y2); void addSegment(long x1, long y1, long x2, long y2, FillStyleDef *f0, FillStyleDef *f1, int aa); void drawPolygon(void); void updateClippingRegion(Rect *); void setClipping(int); // Virtual functions virtual void clearCanvas(); virtual long allocColor(Color color); virtual void fillLineBitmap(FillStyleDef *f, long y, long start, long end); virtual void fillLineLG(Gradient *grad, long y, long start, long end); virtual void fillLineRG(Gradient *grad, long y, long start, long end); virtual void fillLine(FillStyleDef *f, long y, long start, long end); virtual void fillLineAA(FillStyleDef *f, long y, long start, long end); virtual void drawLine(long x1, long y1, long x2, long y2, long width); }; #endif /* _GRAPHIC_H_ */