| #include "SurfaceImpl.h" |
| |
| #include <iostream> |
| |
| SurfaceImpl::SurfaceImpl(const char* filePath) |
| : SurfaceImpl::SurfaceImpl() { |
| setSurface(filePath); |
| } |
| |
| void SurfaceImpl::setSurface( |
| #ifndef NO_GRAPHICS |
| const char* filePath |
| #else |
| const char* /*filePath*/ |
| #endif |
| ) { |
| //We load the surface via cairo, and specify the custom cairo deleter |
| //std::shared_ptr handles reference counting will automaticly |
| //cleans-up the image data when there are no more references |
| #ifndef NO_GRAPHICS |
| mSurface = std::shared_ptr<cairo_surface_t>(cairo_image_surface_create_from_png(filePath), cairo_surface_destroy); |
| switch(cairo_surface_status(mSurface.get())) { |
| case CAIRO_STATUS_SUCCESS: |
| return; |
| case CAIRO_STATUS_NULL_POINTER: |
| std::cerr << "Oops we messed up on our end." << std::endl << |
| "Please notify Vaughn that Harry screwed up." << std::endl; |
| break; |
| case CAIRO_STATUS_NO_MEMORY: |
| std::cerr << "Out of memory" << std::endl; |
| break; |
| case CAIRO_STATUS_READ_ERROR: |
| std::cerr << "Error reading file" << std::endl; |
| break; |
| case CAIRO_STATUS_INVALID_CONTENT: |
| std::cerr << "Invalid Content" << std::endl; |
| break; |
| case CAIRO_STATUS_INVALID_FORMAT: |
| std::cerr << "Invalid Format" << std::endl; |
| break; |
| case CAIRO_STATUS_INVALID_VISUAL: |
| std::cerr << "Invalid Visual" << std::endl; |
| break; |
| default: |
| std::cerr << "Invalid Error" << std::endl; |
| break; |
| } |
| #endif |
| // should only reach this point if unsuccessful |
| mSurface = std::shared_ptr<cairo_surface_t>(nullptr); |
| } |
| |
| cairo_surface_t* SurfaceImpl::getSurface() const { |
| return mSurface.get(); |
| } |