Newer
Older
Import / applications / HighwayDash / ports / Framework / PVR / Modified / Utils.h
#pragma once


#include <cstdint>
#include "ColorRgba.h"


namespace Data
{
  extern const unsigned short MORTON_TABLE[256];
  extern const uint8_t BITSCALE_5_TO_8[32];
  extern const uint8_t BITSCALE_4_TO_8[16];
  extern const uint8_t BITSCALE_3_TO_8[8];
  extern const uint8_t BITSCALE_8_TO_5_FLOOR[256];
  extern const uint8_t BITSCALE_8_TO_4_FLOOR[256];
  extern const uint8_t BITSCALE_8_TO_3_FLOOR[256];
  extern const uint8_t BITSCALE_8_TO_5_CEIL[256];
  extern const uint8_t BITSCALE_8_TO_4_CEIL[256];
  extern const uint8_t BITSCALE_8_TO_3_CEIL[256];
} // namespace Data


class Bitmap {
public:
    int width;
    int height;
    unsigned char *data;

    Bitmap(int w, int h, int bytesPerPixel)
        : width(w)
        , height(h)
        , data(new unsigned char[width * height * bytesPerPixel]) {
    }
    virtual ~Bitmap() {
        delete [] data;
    }

    void GetSize(int& w, int& h) const { w = width; h = height; }
    int GetArea() const { return width * height; }
    int GetBitmapWidth() const { return width; }
    int GetBitmapHeight() const { return height; }
    const unsigned char *GetRawData() const { return data; }
};


class AlphaBitmap : public Bitmap {
public:
    AlphaBitmap(int w, int h) : Bitmap(w, h, 1) {} 
    const unsigned char *GetData() const { return data; }
    unsigned char *GetData() { return data; }
};


class RgbBitmap : public Bitmap {
public:
    RgbBitmap(int w, int h) : Bitmap(w, h, 3) {}
    const ColorRgb<unsigned char> *GetData() const { 
        return reinterpret_cast<ColorRgb<unsigned char> *>(data); 
    }
    ColorRgb<unsigned char> *GetData() { 
        return reinterpret_cast<ColorRgb<unsigned char> *>(data); 
    }
};


class RgbaBitmap : public Bitmap {
public:
    RgbaBitmap(int w, int h) : Bitmap(w, h, 4) {}
    const ColorRgba<unsigned char> *GetData() const { 
        return reinterpret_cast<ColorRgba<unsigned char> *>(data); 
    }
    ColorRgba<unsigned char> *GetData() { 
        return reinterpret_cast<ColorRgba<unsigned char> *>(data); 
    }
};


class BitUtility {
public:
    static bool IsPowerOf2(unsigned int x) {
        return (x & (x - 1)) == 0;
    }

    static unsigned int RotateRight(unsigned int value, unsigned int shift) {
        if ((shift &= sizeof(value) * 8 - 1) == 0) {
            return value;
        }
        return (value >> shift) | (value << (sizeof(value) * 8 - shift));
    }
};



template<typename T>
class Interval {
public:
    T min;
    T max;

    Interval() {
    }

    Interval<T> &operator|=(const T &x) {
        min.SetMin(x); 
        max.SetMax(x);
        return *this;
    }
};