First version of the iphone client that actually works, for at least a subset
[zxing.git] / cpp / core / src / TransformingMonochromeBitmapSource.h
1 #ifndef __TRANSFORMING_MONCHROME_BITMAP_SOURCE_H__
2 #define __TRANSFORMING_MONCHROME_BITMAP_SOURCE_H__
3
4 /*
5  *  TransformingMonochromeBitmapSource.h
6  *  ZXing
7  *
8  *  Created by Christian Brunschen on 03/06/2008.
9  *  Copyright 2008 Google Inc. All rights reserved.
10  *
11  */
12
13 #include "MonochromeBitmapSource.h"
14
15 class TransformingMonochromeBitmapSource : public MonochromeBitmapSource {
16 protected:
17   Ref<MonochromeBitmapSource> source_;
18   float scale_;
19   
20 public:
21   TransformingMonochromeBitmapSource(Ref<MonochromeBitmapSource> source,
22                                      float scale) :
23   MonochromeBitmapSource(),
24   source_(source),
25   scale_(scale) { }
26   
27   virtual ~TransformingMonochromeBitmapSource() { }
28   
29   virtual size_t getWidth() = 0;
30   virtual size_t getHeight() = 0;
31   virtual unsigned char getPixel(size_t x, size_t y) = 0;
32   virtual Ref<MonochromeBitmapSource> rotateCounterClockwise() = 0;
33   virtual bool isRotateSupported();  
34 };
35
36 class TMBS0;
37 class TMBS90;
38 class TMBS180;
39 class TMBS270;
40
41 class TMBS0 : public TransformingMonochromeBitmapSource {
42 private:
43 public:
44   TMBS0(Ref<MonochromeBitmapSource> source, float scale) :
45   TransformingMonochromeBitmapSource(source, scale) { }
46   virtual size_t getWidth() { return source_->getWidth() / scale_; }
47   virtual size_t getHeight() { return source_->getHeight() / scale_; }
48   virtual unsigned char getPixel(size_t x, size_t y) {
49     return source_->getPixel(x * scale_, y * scale_);
50   }
51   virtual Ref<MonochromeBitmapSource> rotateCounterClockwise();
52 };
53
54 class TMBS90 : public TransformingMonochromeBitmapSource {
55 private:
56   size_t xOffset_;
57 public:
58   TMBS90(Ref<MonochromeBitmapSource> source, float scale) :
59   TransformingMonochromeBitmapSource(source, scale), 
60   xOffset_(source->getHeight() - 1) { }
61   virtual size_t getWidth() { return source_->getHeight() / scale_; }
62   virtual size_t getHeight() { return source_->getWidth() / scale_; }
63   virtual unsigned char getPixel(size_t x, size_t y) {
64     size_t sourceX = y * scale_;
65     size_t sourceY = xOffset_ - x * scale_;
66     //cout << "tmbs90: (" << x << "," << y << ") => (" << sourceX << "," << sourceY << ")\n";
67     return source_->getPixel(sourceX, sourceY);
68   }
69   virtual Ref<MonochromeBitmapSource> rotateCounterClockwise();
70 };
71
72 class TMBS180 : public TransformingMonochromeBitmapSource {
73 private:
74   size_t xOffset_;
75   size_t yOffset_;
76 public:
77   TMBS180(Ref<MonochromeBitmapSource> source, float scale) :
78   TransformingMonochromeBitmapSource(source, scale), 
79   xOffset_(source->getWidth() - 1),
80   yOffset_(source->getHeight() - 1) { }
81   virtual size_t getWidth() { return source_->getWidth() / scale_; }
82   virtual size_t getHeight() { return source_->getHeight() / scale_; }
83   virtual unsigned char getPixel(size_t x, size_t y) {
84     size_t sourceX = xOffset_ - x * scale_;
85     size_t sourceY = yOffset_ - y * scale_;
86     //cout << "tmbs180: (" << x << "," << y << ") => (" << sourceX << "," << sourceY << ")\n";
87     return source_->getPixel(sourceX, sourceY);
88   }
89   virtual Ref<MonochromeBitmapSource> rotateCounterClockwise();
90 };
91
92 class TMBS270 : public TransformingMonochromeBitmapSource {
93 private:
94   size_t yOffset_;
95 public:
96   TMBS270(Ref<MonochromeBitmapSource> source, float scale) :
97   TransformingMonochromeBitmapSource(source, scale), 
98   yOffset_(source->getWidth() - 1) { }
99   virtual size_t getWidth() { return source_->getHeight() / scale_; }
100   virtual size_t getHeight() { return source_->getWidth() / scale_; }
101   virtual unsigned char getPixel(size_t x, size_t y) {
102     return source_->getPixel(yOffset_ - y * scale_, x * scale_);
103   }
104   virtual Ref<MonochromeBitmapSource> rotateCounterClockwise();
105 };
106
107 #endif // __TRANSFORMING_MONCHROME_BITMAP_SOURCE_H__