1*e7c364b6SAndroid Build Coastguard Worker /* 2*e7c364b6SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*e7c364b6SAndroid Build Coastguard Worker * 4*e7c364b6SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e7c364b6SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e7c364b6SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e7c364b6SAndroid Build Coastguard Worker * 8*e7c364b6SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e7c364b6SAndroid Build Coastguard Worker * 10*e7c364b6SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e7c364b6SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e7c364b6SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e7c364b6SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e7c364b6SAndroid Build Coastguard Worker * limitations under the License. 15*e7c364b6SAndroid Build Coastguard Worker */ 16*e7c364b6SAndroid Build Coastguard Worker 17*e7c364b6SAndroid Build Coastguard Worker #pragma once 18*e7c364b6SAndroid Build Coastguard Worker 19*e7c364b6SAndroid Build Coastguard Worker #include <stdio.h> 20*e7c364b6SAndroid Build Coastguard Worker 21*e7c364b6SAndroid Build Coastguard Worker #include <memory> 22*e7c364b6SAndroid Build Coastguard Worker #include <string> 23*e7c364b6SAndroid Build Coastguard Worker 24*e7c364b6SAndroid Build Coastguard Worker #include <png.h> 25*e7c364b6SAndroid Build Coastguard Worker 26*e7c364b6SAndroid Build Coastguard Worker // This class handles the PNG file parsing. It also holds the ownership of the PNG pointer and the 27*e7c364b6SAndroid Build Coastguard Worker // opened file pointer. Both will be destroyed / closed when this object goes out of scope. 28*e7c364b6SAndroid Build Coastguard Worker class PngHandler { 29*e7c364b6SAndroid Build Coastguard Worker public: 30*e7c364b6SAndroid Build Coastguard Worker // Constructs an instance by loading the PNG file from '/res/images/<name>.png', or '<name>'. 31*e7c364b6SAndroid Build Coastguard Worker PngHandler(const std::string& name); 32*e7c364b6SAndroid Build Coastguard Worker 33*e7c364b6SAndroid Build Coastguard Worker ~PngHandler(); 34*e7c364b6SAndroid Build Coastguard Worker width()35*e7c364b6SAndroid Build Coastguard Worker png_uint_32 width() const { 36*e7c364b6SAndroid Build Coastguard Worker return width_; 37*e7c364b6SAndroid Build Coastguard Worker } 38*e7c364b6SAndroid Build Coastguard Worker height()39*e7c364b6SAndroid Build Coastguard Worker png_uint_32 height() const { 40*e7c364b6SAndroid Build Coastguard Worker return height_; 41*e7c364b6SAndroid Build Coastguard Worker } 42*e7c364b6SAndroid Build Coastguard Worker channels()43*e7c364b6SAndroid Build Coastguard Worker png_byte channels() const { 44*e7c364b6SAndroid Build Coastguard Worker return channels_; 45*e7c364b6SAndroid Build Coastguard Worker } 46*e7c364b6SAndroid Build Coastguard Worker bit_depth()47*e7c364b6SAndroid Build Coastguard Worker int bit_depth() const { 48*e7c364b6SAndroid Build Coastguard Worker return bit_depth_; 49*e7c364b6SAndroid Build Coastguard Worker } 50*e7c364b6SAndroid Build Coastguard Worker color_type()51*e7c364b6SAndroid Build Coastguard Worker int color_type() const { 52*e7c364b6SAndroid Build Coastguard Worker return color_type_; 53*e7c364b6SAndroid Build Coastguard Worker } 54*e7c364b6SAndroid Build Coastguard Worker png_ptr()55*e7c364b6SAndroid Build Coastguard Worker png_structp png_ptr() const { 56*e7c364b6SAndroid Build Coastguard Worker return png_ptr_; 57*e7c364b6SAndroid Build Coastguard Worker } 58*e7c364b6SAndroid Build Coastguard Worker info_ptr()59*e7c364b6SAndroid Build Coastguard Worker png_infop info_ptr() const { 60*e7c364b6SAndroid Build Coastguard Worker return info_ptr_; 61*e7c364b6SAndroid Build Coastguard Worker } 62*e7c364b6SAndroid Build Coastguard Worker error_code()63*e7c364b6SAndroid Build Coastguard Worker int error_code() const { 64*e7c364b6SAndroid Build Coastguard Worker return error_code_; 65*e7c364b6SAndroid Build Coastguard Worker }; 66*e7c364b6SAndroid Build Coastguard Worker 67*e7c364b6SAndroid Build Coastguard Worker operator bool() const { 68*e7c364b6SAndroid Build Coastguard Worker return error_code_ == 0; 69*e7c364b6SAndroid Build Coastguard Worker } 70*e7c364b6SAndroid Build Coastguard Worker 71*e7c364b6SAndroid Build Coastguard Worker private: 72*e7c364b6SAndroid Build Coastguard Worker png_structp png_ptr_{ nullptr }; 73*e7c364b6SAndroid Build Coastguard Worker png_infop info_ptr_{ nullptr }; 74*e7c364b6SAndroid Build Coastguard Worker png_uint_32 width_; 75*e7c364b6SAndroid Build Coastguard Worker png_uint_32 height_; 76*e7c364b6SAndroid Build Coastguard Worker png_byte channels_; 77*e7c364b6SAndroid Build Coastguard Worker int bit_depth_; 78*e7c364b6SAndroid Build Coastguard Worker int color_type_; 79*e7c364b6SAndroid Build Coastguard Worker 80*e7c364b6SAndroid Build Coastguard Worker // The |error_code_| is set to a negative value if an error occurs when opening the png file. 81*e7c364b6SAndroid Build Coastguard Worker int error_code_{ 0 }; 82*e7c364b6SAndroid Build Coastguard Worker // After initialization, we'll keep the file pointer open before destruction of PngHandler. 83*e7c364b6SAndroid Build Coastguard Worker std::unique_ptr<FILE, decltype(&fclose)> png_fp_{ nullptr, fclose }; 84*e7c364b6SAndroid Build Coastguard Worker }; 85*e7c364b6SAndroid Build Coastguard Worker 86*e7c364b6SAndroid Build Coastguard Worker // Overrides the default resource dir, for testing purpose. 87*e7c364b6SAndroid Build Coastguard Worker void res_set_resource_dir(const std::string&); 88