/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
Copyright (C) 2010 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see .
*/
#ifndef _directfbrenderer_h_
#define _directfbrenderer_h_
#include
#include
#include
/* CEGUI 0.6 bug, CEGUITexture.h doesn't include this, we need to */
#include
#include "CEGUIRenderer.h"
#include "CEGUIColourRect.h"
#include "CEGUIRect.h"
namespace CEGUI
{
class SoftTexture;
class ImageCodec;
class SoftRenderer : public Renderer
{
public:
SoftRenderer(uint8_t* surface, uint width, uint height, uint stride,
ImageCodec* codec = NULL);
virtual ~SoftRenderer();
void reset_surface(uint8_t* surface, uint width, uint height, uint stride);
virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex,
const Rect& texture_rect, const ColourRect& colours,
QuadSplitMode quad_split_mode);
virtual void doRender();
virtual void clearRenderList();
virtual void setQueueingEnabled(bool setting);
virtual bool isQueueingEnabled() const;
virtual Texture* createTexture();
virtual Texture* createTexture(const String& filename,
const String& resourceGroup);
virtual Texture* createTexture(float size);
virtual void destroyTexture(Texture* texture);
virtual void destroyAllTextures();
virtual uint getMaxTextureSize() const;
virtual float getWidth() const;
virtual float getHeight() const;
virtual Size getSize() const;
virtual Rect getRect() const;
virtual uint getHorzScreenDPI() const;
virtual uint getVertScreenDPI() const;
ImageCodec* getImageCodec() { return _image_codec;}
private:
void setupImageCodec();
void cleanupImageCodec();
struct QuadInfo;
void renderQuad(const QuadInfo& quad);
void renderQuadWithColourRect(const QuadInfo& quad);
class ColourI {
public:
bool isSameColour(const ColourI& other) const
{
return other.r == r && other.g == g && other.b == b && other.a == a;
}
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t a;
};
static inline void setRGB(ColourI& dest, const colour& src);
static inline void componnentAtPoint(int x_pos, int y_pos,
int top_left, int top_right,
int bottom_left, int bottom_right,
uint64_t& comp);
struct ColourIRect {
ColourI top_left;
ColourI top_right;
ColourI bottom_left;
ColourI bottom_right;
};
static void colourAtPoint(int x, int x_max, int y, int y_max,
const ColourIRect& colours,
uint64_t& r, uint64_t& g,
uint64_t& b, uint64_t& a);
private:
uint8_t* _surface;
int _width;
int _height;
ImageCodec* _image_codec;
DynamicModule* _image_codec_module;
void (*_destroy_image_codec)(ImageCodec*);
bool _queueing;
struct RectI {
int left;
int top;
int right;
int bottom;
};
struct QuadInfo {
RectI dest;
const SoftTexture* tex;
RectI tex_src;
ColourIRect colors;
float z;
bool operator < (const QuadInfo& other) const
{
return z > other.z;
}
};
typedef std::multiset QuadQueue;
QuadQueue _queue;
typedef std::list TexturesList;
TexturesList _textures;
};
}
#endif