105 lines
4.2 KiB
C
105 lines
4.2 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file texturePeeker.h
|
||
|
* @author drose
|
||
|
* @date 2008-08-26
|
||
|
*/
|
||
|
|
||
|
#ifndef TEXTUREPEEKER_H
|
||
|
#define TEXTUREPEEKER_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
|
||
|
#include "referenceCount.h"
|
||
|
#include "texture.h"
|
||
|
|
||
|
/**
|
||
|
* An instance of this object is returned by Texture::peek(). This object
|
||
|
* allows quick and easy inspection of a texture's texels by (u, v)
|
||
|
* coordinates.
|
||
|
*/
|
||
|
class EXPCL_PANDA_GOBJ TexturePeeker : public ReferenceCount {
|
||
|
private:
|
||
|
TexturePeeker(Texture *tex, Texture::CData *cdata);
|
||
|
|
||
|
public:
|
||
|
INLINE bool is_valid() const;
|
||
|
|
||
|
PUBLISHED:
|
||
|
INLINE int get_x_size() const;
|
||
|
INLINE int get_y_size() const;
|
||
|
INLINE int get_z_size() const;
|
||
|
|
||
|
INLINE bool has_pixel(int x, int y) const;
|
||
|
void lookup(LColor &color, PN_stdfloat u, PN_stdfloat v) const;
|
||
|
void lookup(LColor &color, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w) const;
|
||
|
void fetch_pixel(LColor &color, int x, int y) const;
|
||
|
bool lookup_bilinear(LColor &color, PN_stdfloat u, PN_stdfloat v) const;
|
||
|
void filter_rect(LColor &color,
|
||
|
PN_stdfloat min_u, PN_stdfloat min_v,
|
||
|
PN_stdfloat max_u, PN_stdfloat max_v) const;
|
||
|
void filter_rect(LColor &color,
|
||
|
PN_stdfloat min_u, PN_stdfloat min_v, PN_stdfloat min_w,
|
||
|
PN_stdfloat max_u, PN_stdfloat max_v, PN_stdfloat max_w) const;
|
||
|
|
||
|
private:
|
||
|
static void init_rect_minmax(int &min_x, int &max_x,
|
||
|
PN_stdfloat &min_u, PN_stdfloat &max_u,
|
||
|
int x_size);
|
||
|
|
||
|
void accum_filter_z(LColor &color, PN_stdfloat &net,
|
||
|
int min_x, int max_x, PN_stdfloat min_u, PN_stdfloat max_u,
|
||
|
int min_y, int max_y, PN_stdfloat min_v, PN_stdfloat max_v,
|
||
|
int min_z, int max_z, PN_stdfloat min_w, PN_stdfloat max_w) const;
|
||
|
void accum_filter_y(LColor &color, PN_stdfloat &net, int zi,
|
||
|
int min_x, int max_x, PN_stdfloat min_u, PN_stdfloat max_u,
|
||
|
int min_y, int max_y, PN_stdfloat min_v, PN_stdfloat max_v,
|
||
|
PN_stdfloat weight) const;
|
||
|
void accum_filter_x(LColor &color, PN_stdfloat &net, int yi, int zi,
|
||
|
int min_x, int max_x, PN_stdfloat min_u, PN_stdfloat max_u,
|
||
|
PN_stdfloat weight) const;
|
||
|
void accum_texel(LColor &color, PN_stdfloat &net, const unsigned char *&p,
|
||
|
PN_stdfloat weight) const;
|
||
|
|
||
|
typedef double GetComponentFunc(const unsigned char *&p);
|
||
|
typedef void GetTexelFunc(LColor &color, const unsigned char *&p,
|
||
|
GetComponentFunc *get_component);
|
||
|
|
||
|
static void get_texel_r(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_g(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_b(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_a(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_l(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_la(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_rg(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_rgb(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_rgba(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_srgb(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
static void get_texel_srgba(LColor &color, const unsigned char *&p, GetComponentFunc *get_component);
|
||
|
|
||
|
int _x_size;
|
||
|
int _y_size;
|
||
|
int _z_size;
|
||
|
int _component_width;
|
||
|
int _num_components;
|
||
|
int _pixel_width;
|
||
|
Texture::Format _format;
|
||
|
Texture::ComponentType _component_type;
|
||
|
CPTA_uchar _image;
|
||
|
|
||
|
GetComponentFunc *_get_component;
|
||
|
GetTexelFunc *_get_texel;
|
||
|
|
||
|
friend class Texture;
|
||
|
};
|
||
|
|
||
|
#include "texturePeeker.I"
|
||
|
|
||
|
#endif
|