VBitmap.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #ifndef f_VIRTUALDUB_VBITMAP_H
  2. #define f_VIRTUALDUB_VBITMAP_H
  3. #include <windows.h>
  4. typedef unsigned long Pixel;
  5. typedef unsigned long Pixel32;
  6. typedef unsigned char Pixel8;
  7. typedef long PixCoord;
  8. typedef long PixDim;
  9. typedef long PixOffset;
  10. #ifdef VDEXT_VIDEO_FILTER
  11. #define NOVTABLE __declspec(novtable)
  12. #else
  13. #define NOVTABLE
  14. #endif
  15. class NOVTABLE VBitmap {
  16. public:
  17. Pixel * data;
  18. Pixel * palette;
  19. int depth;
  20. PixCoord w, h;
  21. PixOffset pitch;
  22. PixOffset modulo;
  23. PixOffset size;
  24. PixOffset offset;
  25. Pixel *Address(PixCoord x, PixCoord y) const {
  26. return Addressi(x, h-y-1);
  27. }
  28. Pixel *Addressi(PixCoord x, PixCoord y) const {
  29. return (Pixel *)((char *)data + y*pitch + x*(depth>>3));
  30. }
  31. Pixel *Address32(PixCoord x, PixCoord y) const {
  32. return Address32i(x, h-y-1);
  33. }
  34. Pixel *Address32i(PixCoord x, PixCoord y) const {
  35. return (Pixel *)((char *)data + y*pitch + x*sizeof(Pixel));
  36. }
  37. PixOffset PitchAlign4() {
  38. return ((w * depth + 31)/32)*4;
  39. }
  40. PixOffset PitchAlign8() {
  41. return ((w * depth + 63)/64)*8;
  42. }
  43. PixOffset Modulo() {
  44. return pitch - (w*depth+7)/8;
  45. }
  46. PixOffset Size() {
  47. return pitch*h;
  48. }
  49. //////
  50. VBitmap() throw() {
  51. #ifdef VDEXT_VIDEO_FILTER
  52. init();
  53. #endif
  54. }
  55. VBitmap(void *data, PixDim w, PixDim h, int depth) throw();
  56. VBitmap(void *data, BITMAPINFOHEADER *) throw();
  57. #ifdef VDEXT_VIDEO_FILTER
  58. void init() throw() { *(void **)this = g_vtbls.pvtblVBitmap; }
  59. #endif
  60. virtual VBitmap& init(void *data, PixDim w, PixDim h, int depth) throw();
  61. virtual VBitmap& init(void *data, BITMAPINFOHEADER *) throw();
  62. virtual void MakeBitmapHeader(BITMAPINFOHEADER *bih) const throw();
  63. virtual void AlignTo4() throw();
  64. virtual void AlignTo8() throw();
  65. virtual void BitBlt(PixCoord x2, PixCoord y2, const VBitmap *src, PixCoord x1, PixCoord y1, PixDim dx, PixDim dy) const throw();
  66. virtual void BitBltDither(PixCoord x2, PixCoord y2, const VBitmap *src, PixDim x1, PixDim y1, PixDim dx, PixDim dy, bool to565) const throw();
  67. virtual void BitBlt565(PixCoord x2, PixCoord y2, const VBitmap *src, PixDim x1, PixDim y1, PixDim dx, PixDim dy) const throw();
  68. virtual bool BitBltXlat1(PixCoord x2, PixCoord y2, const VBitmap *src, PixCoord x1, PixCoord y1, PixDim dx, PixDim dy, const Pixel8 *tbl) const throw();
  69. virtual bool BitBltXlat3(PixCoord x2, PixCoord y2, const VBitmap *src, PixCoord x1, PixCoord y1, PixDim dx, PixDim dy, const Pixel32 *tbl) const throw();
  70. virtual bool StretchBltNearestFast(PixCoord x1, PixCoord y1, PixDim dx, PixDim dy, const VBitmap *src, double x2, double y2, double dx1, double dy1) const throw();
  71. virtual bool StretchBltBilinearFast(PixCoord x1, PixCoord y1, PixDim dx, PixDim dy, const VBitmap *src, double x2, double y2, double dx1, double dy1) const throw();
  72. virtual bool RectFill(PixCoord x1, PixCoord y1, PixDim dx, PixDim dy, Pixel32 c) const throw();
  73. enum {
  74. HISTO_LUMA,
  75. HISTO_GRAY,
  76. HISTO_RED,
  77. HISTO_GREEN,
  78. HISTO_BLUE,
  79. };
  80. virtual bool Histogram(PixCoord x, PixCoord y, PixCoord dx, PixCoord dy, long *pHisto, int iHistoType) const throw();
  81. private:
  82. bool dualrectclip(PixCoord& x2, PixCoord& y2, const VBitmap *src, PixCoord& x1, PixCoord& y1, PixDim& dx, PixDim& dy) const throw();
  83. };
  84. #undef NOVTABLE
  85. #endif