/* ** worldtexture.cpp ** Intermediate class for some common code for several classes ** **--------------------------------------------------------------------------- ** Copyright 2018 Christoph Oelckers ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions ** are met: ** ** 1. Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** 3. The name of the author may not be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. **--------------------------------------------------------------------------- ** ** */ #include "textures.h" //========================================================================== // // // //========================================================================== FWorldTexture::FWorldTexture(const char *name, int lumpnum) : FTexture(name, lumpnum) { } //========================================================================== // // // //========================================================================== FWorldTexture::~FWorldTexture() { Unload(); for(int i = 0; i < 2; i++) { if (Spandata[i] != nullptr) { FreeSpans (Spandata[i]); Spandata[i] = nullptr; } } } //========================================================================== // // // //========================================================================== void FWorldTexture::Unload () { for(int i = 0; i < 2; i++) { if (!(PixelsAreStatic & (1 << i))) { delete[] Pixeldata[i]; } Pixeldata[i] = nullptr; } FTexture::Unload(); } //========================================================================== // // // //========================================================================== const uint8_t *FWorldTexture::GetColumn(unsigned int column, const Span **spans_out) { GetPixels(); if ((unsigned)column >= (unsigned)Width) { if (WidthMask + 1 == Width) { column &= WidthMask; } else { column %= Width; } } if (spans_out != nullptr) { if (Spandata[0] == nullptr) { Spandata[0] = CreateSpans (Pixeldata[0]); } *spans_out = Spandata[0][column]; } return Pixeldata[0] + column*Height; } //========================================================================== // // // //========================================================================== const uint8_t *FWorldTexture::GetPixels () { if (CheckModified()) { Unload(); } if (Pixeldata[0] == nullptr) { Pixeldata[0] = MakeTexture (LegacyRenderStyles[STYLE_Normal]); } return Pixeldata[0]; }