aboutsummaryrefslogtreecommitdiff
path: root/Gem/develop/include/Gem/Base/GemPixObj.h
blob: e9a4f9b9a6613b609d23979fa469140e498e0b5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*-----------------------------------------------------------------
LOG
    GEM - Graphics Environment for Multimedia

    Base class for pix class gem objects

    Copyright (c) 1997-1999 Mark Danks. mark@danks.org
    Copyright (c) Günther Geiger. geiger@epy.co.at
    Copyright (c) 2001-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
    For information on usage and redistribution, and for a DISCLAIMER OF ALL
    WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.

-----------------------------------------------------------------*/

#ifndef _INCLUDE__GEM_BASE_GEMPIXOBJ_H_
#define _INCLUDE__GEM_BASE_GEMPIXOBJ_H_

#include "Base/GemBase.h"
#include "Gem/Image.h"
#include "Gem/Rectangle.h"
#include <stdlib.h>
#include <string.h>
#include <math.h>

/*-----------------------------------------------------------------
-------------------------------------------------------------------
CLASS
    GemPixObj

    Base class for pix class gem objects

DESCRIPTION

-----------------------------------------------------------------*/
class GEM_EXTERN GemPixObj : public GemBase
{
public:

  //////////
  // Constructor
  GemPixObj();

protected:

  //////////
  // Destructor
  virtual ~GemPixObj()                          { }

  //////////
  // The derived class should override this if it provides
  // processing independent of the image.format
  // This is called whenever a new image comes through.
  // The default is to output an error
  virtual void  processImage(imageStruct &image);

  //////////
  // The derived class should override this.
  // This is called whenever a new RGB image comes through.
  // The default is to call processImage().
  virtual void  processRGBImage(imageStruct &image);

  //////////
  // The derived class should override this.
  // This is called whenever a new RGBA image comes through.
  // The default is to call processImage().
  virtual void  processRGBAImage(imageStruct &image);
  // SIMD-optimized functions: by default the non-optimized function is called
  virtual void  processRGBAMMX(imageStruct &image);
  virtual void  processRGBASSE2(imageStruct &image);
  virtual void  processRGBAAltivec(imageStruct &image);

  //////////
  // The derived class should override this.
  // This is called whenever a new gray8 image comes through.
  // The default is to call processImage().
  virtual void  processGrayImage(imageStruct &image);
  // SIMD-optimized functions: by default the non-optimized function is called
  virtual void  processGrayMMX(imageStruct &image);
  virtual void  processGraySSE2(imageStruct &image);
  virtual void  processGrayAltivec(imageStruct &image);

  //////////
  // The derived class should override this.
  // This is called whenever a new YUV422 image comes through.
  // The default is to call processImage().
  virtual void  processYUVImage(imageStruct &image);
  // SIMD-optimized functions: by default the non-optimized function is called
  virtual void  processYUVMMX(imageStruct &image);
  virtual void  processYUVSSE2(imageStruct &image);
  virtual void  processYUVAltivec(imageStruct &image);

  //////////
  // If the derived class needs the image resent.
  //    This sets the dirty bit on the pixBlock.
  void          setPixModified();

  //////////
  // Turn on/off processing
  void            processOnOff(int on);

  //////////
  // the pixBlock-cache
  pixBlock    cachedPixBlock;
  pixBlock    *orgPixBlock;

  //////////
  int             m_processOnOff;
  int             m_simd;

  //////////
  // handle ROI
  gem::Rectangle m_roi;
  bool m_doROI;

  //////////
  // creation callback
  static void   real_obj_setupCallback(t_class *classPtr)
  {
    GemBase::real_obj_setupCallback(classPtr);
    GemPixObj::obj_setupCallback(classPtr);
  }

  //////////
  // The derived class should NOT override this unless they have some
  //            very special behavior.
  // Do the rendering, which calls processImage or processGrayImage, etc...
  // save the image-information
  virtual void  render(GemState *state);
  // turn the pointer back to the old data after rendering
  virtual void postrender(GemState *state);

  void startRendering(void)
  {
    //post("start rendering");
    setPixModified();
  }

private:

  static inline GemPixObj *GetMyClass(void *data)
  {
    return((GemPixObj *)((Obj_header *)data)->data);
  }

  //////////
  // static member functions
  static void     obj_setupCallback(t_class *classPtr);

protected:
  virtual void SIMD(int);
};


#endif  // for header file