231 lines
6.1 KiB
C++
231 lines
6.1 KiB
C++
/*
|
|
* Copyright 2001-2018, Haiku.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* DarkWyrm <bpmagic@columbus.rr.com>
|
|
* Adi Oanca <adioanca@mymail.ro>
|
|
* Stephan Aßmus <superstippi@gmx.de>
|
|
* Axel Dörfler, axeld@pinc-software.de
|
|
* Julian Harnath <julian.harnath@rwth-aachen.de>
|
|
* Joseph Groover <looncraz@looncraz.net>
|
|
*/
|
|
#ifndef _DRAW_STATE_H_
|
|
#define _DRAW_STATE_H_
|
|
|
|
|
|
#include <AutoDeleter.h>
|
|
#include <AffineTransform.h>
|
|
#include <GraphicsDefs.h>
|
|
#include <InterfaceDefs.h>
|
|
#include <Point.h>
|
|
#include <Referenceable.h>
|
|
#include <View.h>
|
|
|
|
#include "ServerFont.h"
|
|
#include "PatternHandler.h"
|
|
#include "SimpleTransform.h"
|
|
|
|
class AlphaMask;
|
|
class BRegion;
|
|
class shape_data;
|
|
|
|
namespace BPrivate {
|
|
class LinkReceiver;
|
|
class LinkSender;
|
|
};
|
|
|
|
|
|
class DrawState {
|
|
public:
|
|
DrawState();
|
|
DrawState(const DrawState& other);
|
|
public:
|
|
virtual ~DrawState();
|
|
|
|
DrawState* PushState();
|
|
DrawState* PopState();
|
|
DrawState* PreviousState() const
|
|
{ return fPreviousState.Get(); }
|
|
|
|
uint16 ReadFontFromLink(BPrivate::LinkReceiver& link);
|
|
// NOTE: ReadFromLink() does not read Font state!!
|
|
// It was separate in ServerWindow, and I didn't
|
|
// want to change it without knowing implications.
|
|
void ReadFromLink(BPrivate::LinkReceiver& link);
|
|
void WriteToLink(BPrivate::LinkSender& link) const;
|
|
|
|
// coordinate transformation
|
|
void SetOrigin(BPoint origin);
|
|
BPoint Origin() const
|
|
{ return fOrigin; }
|
|
BPoint CombinedOrigin() const
|
|
{ return fCombinedOrigin; }
|
|
|
|
void SetScale(float scale);
|
|
float Scale() const
|
|
{ return fScale; }
|
|
float CombinedScale() const
|
|
{ return fCombinedScale; }
|
|
|
|
void SetTransform(BAffineTransform transform);
|
|
BAffineTransform Transform() const
|
|
{ return fTransform; }
|
|
BAffineTransform CombinedTransform() const
|
|
{ return fCombinedTransform; }
|
|
void SetTransformEnabled(bool enabled);
|
|
|
|
DrawState* Squash() const;
|
|
|
|
// additional clipping as requested by client
|
|
void SetClippingRegion(const BRegion* region);
|
|
|
|
bool HasClipping() const;
|
|
bool HasAdditionalClipping() const;
|
|
bool GetCombinedClippingRegion(BRegion* region) const;
|
|
|
|
bool ClipToRect(BRect rect, bool inverse);
|
|
void ClipToShape(shape_data* shape, bool inverse);
|
|
|
|
void SetAlphaMask(AlphaMask* mask);
|
|
AlphaMask* GetAlphaMask() const;
|
|
|
|
// coordinate transformations
|
|
void Transform(SimpleTransform& transform) const;
|
|
void InverseTransform(SimpleTransform& transform) const;
|
|
|
|
// color
|
|
void SetHighColor(rgb_color color);
|
|
rgb_color HighColor() const
|
|
{ return fHighColor; }
|
|
|
|
void SetLowColor(rgb_color color);
|
|
rgb_color LowColor() const
|
|
{ return fLowColor; }
|
|
|
|
void SetHighUIColor(color_which which, float tint);
|
|
color_which HighUIColor(float* tint) const;
|
|
|
|
void SetLowUIColor(color_which which, float tint);
|
|
color_which LowUIColor(float* tint) const;
|
|
|
|
void SetPattern(const Pattern& pattern);
|
|
const Pattern& GetPattern() const
|
|
{ return fPattern; }
|
|
|
|
// drawing/blending mode
|
|
bool SetDrawingMode(drawing_mode mode);
|
|
drawing_mode GetDrawingMode() const
|
|
{ return fDrawingMode; }
|
|
|
|
bool SetBlendingMode(source_alpha srcMode,
|
|
alpha_function fncMode);
|
|
source_alpha AlphaSrcMode() const
|
|
{ return fAlphaSrcMode; }
|
|
alpha_function AlphaFncMode() const
|
|
{ return fAlphaFncMode; }
|
|
|
|
void SetDrawingModeLocked(bool locked);
|
|
|
|
// pen
|
|
void SetPenLocation(BPoint location);
|
|
BPoint PenLocation() const;
|
|
|
|
void SetPenSize(float size);
|
|
float PenSize() const;
|
|
float UnscaledPenSize() const;
|
|
|
|
// font
|
|
void SetFont(const ServerFont& font,
|
|
uint32 flags = B_FONT_ALL);
|
|
const ServerFont& Font() const
|
|
{ return fFont; }
|
|
|
|
// overrides aliasing flag contained in SeverFont::Flags())
|
|
void SetForceFontAliasing(bool aliasing);
|
|
bool ForceFontAliasing() const
|
|
{ return fFontAliasing; }
|
|
|
|
// postscript style settings
|
|
void SetLineCapMode(cap_mode mode);
|
|
cap_mode LineCapMode() const
|
|
{ return fLineCapMode; }
|
|
|
|
void SetLineJoinMode(join_mode mode);
|
|
join_mode LineJoinMode() const
|
|
{ return fLineJoinMode; }
|
|
|
|
void SetMiterLimit(float limit);
|
|
float MiterLimit() const
|
|
{ return fMiterLimit; }
|
|
|
|
void SetFillRule(int32 fillRule);
|
|
int32 FillRule() const
|
|
{ return fFillRule; }
|
|
|
|
// convenience functions
|
|
void PrintToStream() const;
|
|
|
|
void SetSubPixelPrecise(bool precise);
|
|
bool SubPixelPrecise() const
|
|
{ return fSubPixelPrecise; }
|
|
|
|
protected:
|
|
BPoint fOrigin;
|
|
BPoint fCombinedOrigin;
|
|
float fScale;
|
|
float fCombinedScale;
|
|
BAffineTransform fTransform;
|
|
BAffineTransform fCombinedTransform;
|
|
|
|
ObjectDeleter<BRegion>
|
|
fClippingRegion;
|
|
|
|
BReference<AlphaMask> fAlphaMask;
|
|
|
|
rgb_color fHighColor;
|
|
rgb_color fLowColor;
|
|
|
|
color_which fWhichHighColor;
|
|
color_which fWhichLowColor;
|
|
float fWhichHighColorTint;
|
|
float fWhichLowColorTint;
|
|
Pattern fPattern;
|
|
|
|
drawing_mode fDrawingMode;
|
|
source_alpha fAlphaSrcMode;
|
|
alpha_function fAlphaFncMode;
|
|
bool fDrawingModeLocked;
|
|
|
|
BPoint fPenLocation;
|
|
float fPenSize;
|
|
|
|
ServerFont fFont;
|
|
// overrides font aliasing flag
|
|
bool fFontAliasing;
|
|
|
|
// This is not part of the normal state stack.
|
|
// The view will update it in PushState/PopState.
|
|
// A BView can have a flag "B_SUBPIXEL_PRECISE",
|
|
// I never knew what it does on R5, but I can use
|
|
// it in Painter to actually draw stuff with
|
|
// sub-pixel coordinates. It means
|
|
// StrokeLine(BPoint(10, 5), BPoint(20, 9));
|
|
// will look different from
|
|
// StrokeLine(BPoint(10.3, 5.8), BPoint(20.6, 9.5));
|
|
bool fSubPixelPrecise;
|
|
|
|
cap_mode fLineCapMode;
|
|
join_mode fLineJoinMode;
|
|
float fMiterLimit;
|
|
int32 fFillRule;
|
|
// "internal", used to calculate the size
|
|
// of the font (again) when the scale changes
|
|
float fUnscaledFontSize;
|
|
|
|
ObjectDeleter<DrawState>
|
|
fPreviousState;
|
|
};
|
|
|
|
#endif // _DRAW_STATE_H_
|