This repository has been archived on 2025-04-11. You can view files and clone it, but cannot push or open issues or pull requests.
csce441pine64backup/L01/src/Image.cpp
2017-02-17 17:32:44 -06:00

87 lines
2 KiB
C++

#include <iostream>
#include <cassert>
#include "Image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
using namespace std;
Tri::Tri()
{
vertex v1;
v1.x = 0.0;
v1.y = 0.0;
v1.z = 0.0;
vertex v2;
v2.x = 0.0;
v2.y = 0.0;
v2.z = 0.0;
vertex v3;
v3.x = 0.0;
v3.y = 0.0;
v3.z = 0.0;
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
}
Tri::Tri(vertex &one, vertex &two, vertex &three)
{
v.push_back(one);
v.push_back(two);
v.push_back(three);
}
Image::Image(int w, int h) :
width(w),
height(h),
comp(3),
pixels(width*height*comp, 0)
{
}
Image::~Image()
{
}
void Image::setPixel(int x, int y, unsigned char r, unsigned char g, unsigned char b)
{
// The pixel data is laid out row by row. Each row consists of 'width'
// columns, and each column consists of 3 unsigned chars.
// First check for bounds
if(y < 0 || y >= height) {
cout << "Row " << y << " is out of bounds" << endl;
return;
}
if(x < 0 || x >= width) {
cout << "Col " << x << " is out of bounds" << endl;
return;
}
// Since the origin (0, 0) of the image is the upper left corner, we need
// to flip the row to make the origin be the lower left corner.
y = height - y - 1;
// index corresponding to row and col, (assuming single component image)
int index = y*width + x;
// Multiply by 3 to get the index for the rgb components.
assert(index >= 0);
assert(3*index + 2 < (int)pixels.size());
pixels[3*index + 0] = r;
pixels[3*index + 1] = g;
pixels[3*index + 2] = b;
}
void Image::writeToFile(const string &filename)
{
// The distance in bytes from the first byte of a row of pixels to the
// first byte of the next row of pixels
int stride_in_bytes = width*comp*sizeof(unsigned char);
int rc = stbi_write_png(filename.c_str(), width, height, comp, &pixels[0], stride_in_bytes);
if(rc) {
cout << "Wrote to " << filename << endl;
} else {
cout << "Couldn't write to " << filename << endl;
}
}