summaryrefslogblamecommitdiff
path: root/hw5/src/texture_base.cpp
blob: 39a2a63a4896d9abf0bc4cdd771ee9601d78445a (plain) (tree)




































































































































                                                                        
/******************************************************************/
/* This file is part of the homework assignments for CSCI-427/527 */
/* at The College of William & Mary and authored by Pieter Peers. */
/* No part of this file, whether altered or in original form, can */
/* be distributed or used outside the context of CSCI-427/527     */
/* without consent of either the College of William & Mary or     */
/* Pieter Peers.                                                  */
/******************************************************************/
#include "texture_base.h"


//////////////////
// Constructors //
//////////////////
texture_base::texture_base(bool repeat)
  : image()
{
  _repeat = repeat;
}

texture_base::texture_base(const texture_base& src)
  : image(src)
{
  _repeat = src._repeat;
}


///////////////
// Operators //
///////////////
texture_base& texture_base::operator=(const texture_base& src)
{
  _assign(src);
  return *this;
}


/////////////////////
// Private Methods //
/////////////////////
void texture_base::_assign(const texture_base& src)
{
  image::_assign(src);
  _repeat = src._repeat;
}


color& texture_base::_at(signed int x, signed int y)
{
  // HW5: Implement this. Retrieve the texel at coordinate
  //      (x,y) (in texel coordinates, not texture coordinates!)
  //      taking in account the boundary conditions:
  //      if _repeat == true, then the texel coordinates outside
  //      the images are mapped to the nearest edge. E.g., for a
  //      10x10 image, a coordinate of (1,1) returns the
  //      texel at (1,1), at (12,1) -> (9,1), at
  //      (13,14) -> (9,9), (5,12) -> (5,9), and (-4,1)->(0,1).
  //      If _repeat is false then the coordinates wrap around:
  //      (1,1) -> (1,1), (12,1) -> (2,1), and (13,14) -> (3,4).
  // Modifies: nothing
  // Returns: a reference to the color the image.
  signed int xRef, yRef;

  if (_repeat) {

    if (x < 0) {
      xRef = 0;
    }
    else if (x >= 0 && x < image::width()) {
      xRef = x;
    }
    else { // x >= image::width()
      xRef = image::width() - 1;
    }

    if (y < 0) {
      yRef = 0;
    }
    else if (y >= 0 && y < image::height()) {
      yRef = y;
    }
    else { // y >= image::width()
      yRef = image::height() - 1;
    }

  }
  else { // !_repeat
    xRef = x % image::width();
    yRef = y % image::height();
  }

  image::reference texel = image::operator()(xRef, yRef);
  return texel;
}


const color& texture_base::_at(signed int x, signed int y) const
{
  // HW5: Same as above, except that it returns a const color reference.
  //      Normally just copying the code from above should work.
  signed int xRef, yRef;

  if (_repeat) {

    if (x < 0) {
      xRef = 0;
    }
    else if (x >= 0 && x < image::width()) {
      xRef = x;
    }
    else { // x >= image::width()
      xRef = image::width() - 1;
    }

    if (y < 0) {
      yRef = 0;
    }
    else if (y >= 0 && y < image::height()) {
      yRef = y;
    }
    else { // y >= image::width()
      yRef = image::height() - 1;
    }

  }
  else { // !_repeat
    xRef = x % image::width();
    yRef = y % image::height();
  }

  image::const_reference texel = image::operator()(xRef, yRef);
  return texel;
}