87 lines
2 KiB
C++
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;
|
|
}
|
|
}
|