本文整理汇总了C++中SImage类的典型用法代码示例。如果您正苦于以下问题:C++ SImage类的具体用法?C++ SImage怎么用?C++ SImage使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了SImage类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: parseDefine
/* CTexture::parseDefine
* Parses a HIRESTEX define block
*******************************************************************/
bool CTexture::parseDefine(Tokenizer& tz)
{
this->type = "Define";
this->extended = true;
this->defined = true;
name = tz.getToken().Upper();
def_width = tz.getInteger();
def_height = tz.getInteger();
width = def_width;
height = def_height;
ArchiveEntry* entry = theResourceManager->getPatchEntry(name);
if (entry)
{
SImage image;
if (image.open(entry->getMCData()))
{
width = image.getWidth();
height = image.getHeight();
scale_x = (double)width / (double)def_width;
scale_y = (double)height / (double)def_height;
}
}
CTPatchEx* patch = new CTPatchEx(name);
patches.push_back(patch);
return true;
}
示例2: importEditorImages
// -----------------------------------------------------------------------------
// Loads all editor images (thing icons, etc) from the program resource archive
// -----------------------------------------------------------------------------
void MapTextureManager::importEditorImages(MapTexHashMap& map, ArchiveTreeNode* dir, std::string_view path) const
{
SImage image;
// Go through entries
for (unsigned a = 0; a < dir->numEntries(); a++)
{
auto entry = dir->entryAt(a);
// Load entry to image
if (image.open(entry->data()))
{
// Create texture in hashmap
auto name = fmt::format("{}{}", path, entry->nameNoExt());
Log::info(4, "Loading editor texture {}", name);
auto& mtex = map[name];
mtex.gl_id = OpenGL::Texture::createFromImage(image, nullptr, OpenGL::TexFilter::Mipmap);
}
}
// Go through subdirs
for (unsigned a = 0; a < dir->nChildren(); a++)
{
auto subdir = dynamic_cast<ArchiveTreeNode*>(dir->child(a));
importEditorImages(map, subdir, fmt::format("{}{}/", path, subdir->name()));
}
}
示例3: generateBrushShadow
/* GfxCanvas::generateBrushShadow
* Creates a mask texture of the brush to preview its effect
*******************************************************************/
void GfxCanvas::generateBrushShadow()
{
if (brush == nullptr) return;
// Generate image
SImage img;
img.create(image->getWidth(), image->getHeight(), SIType::RGBA);
for (int i = -4; i < 5; ++i)
for (int j = -4; j < 5; ++j)
if (brush->getPixel(i, j))
{
rgba_t col = paint_colour;
if (editing_mode == 3 && translation)
col = translation->translate(image->getPixel(cursor_pos.x + i,
cursor_pos.y + j, getPalette()), getPalette());
// Not sure what's the best way to preview cutting out
// Mimicking the checkerboard pattern perhaps?
// Cyan will do for now
else if (editing_mode == 2)
col = COL_CYAN;
img.setPixel(cursor_pos.x + i, cursor_pos.y + j, col);
}
// Load it as a GL texture
tex_brush->loadImage(&img);
}
示例4: generateBrushShadow
// -----------------------------------------------------------------------------
// Creates a mask texture of the brush to preview its effect
// -----------------------------------------------------------------------------
void GfxCanvas::generateBrushShadow()
{
if (brush_ == nullptr)
return;
// Generate image
SImage img;
img.create(image_.width(), image_.height(), SImage::Type::RGBA);
for (int i = -4; i < 5; ++i)
for (int j = -4; j < 5; ++j)
if (brush_->pixel(i, j))
{
auto col = paint_colour_;
if (editing_mode_ == EditMode::Translate && translation_)
col = translation_->translate(
image_.pixelAt(cursor_pos_.x + i, cursor_pos_.y + j, &palette_), &palette_);
// Not sure what's the best way to preview cutting out
// Mimicking the checkerboard pattern perhaps?
// Cyan will do for now
else if (editing_mode_ == EditMode::Erase)
col = ColRGBA::CYAN;
img.setPixel(cursor_pos_.x + i, cursor_pos_.y + j, col);
}
// Load it as a GL texture
OpenGL::Texture::clear(tex_brush_);
tex_brush_ = OpenGL::Texture::createFromImage(img);
}
示例5: updateEntry
void updateEntry()
{
// Read file
MemChunk data;
data.importFile(filename);
// Read image
SImage image;
image.open(data, 0, "png");
image.convertPaletted(&palette);
// Convert image to entry gfx format
SIFormat* format = SIFormat::getFormat(gfx_format);
if (format)
{
MemChunk conv_data;
if (format->saveImage(image, conv_data, &palette))
{
// Update entry data
entry->importMemChunk(conv_data);
EntryOperations::setGfxOffsets(entry, offsets.x, offsets.y);
}
else
{
LOG_MESSAGE(1, "Unable to convert external png to %s", format->getName());
}
}
}
示例6: getImage
/* GfxEntryPanel::statusString
* Returns a string with extended editing/entry info for the status
* bar
*******************************************************************/
string GfxEntryPanel::statusString()
{
// Setup status string
SImage* image = getImage();
string status = S_FMT("%dx%d", image->getWidth(), image->getHeight());
// Colour format
if (image->getType() == RGBA)
status += ", 32bpp";
else
status += ", 8bpp";
// PNG stuff
if (entry->getType()->getFormat() == "img_png")
{
// alPh
if (EntryOperations::getalPhChunk(entry))
status += ", alPh";
// tRNS
if (EntryOperations::gettRNSChunk(entry))
status += ", tRNS";
}
return status;
}
示例7: readImage
bool readImage(SImage& image, MemChunk& data, int index)
{
// Get image info
SImage::info_t info;
FIBITMAP* bm = getFIInfo(data, info);
// Check it created/read ok
if (!bm)
{
Global::error = "Unable to read image data (unsupported format?)";
return false;
}
// Get image palette if it exists
RGBQUAD* bm_pal = FreeImage_GetPalette(bm);
Palette palette;
if (bm_pal)
{
int a = 0;
int b = FreeImage_GetColorsUsed(bm);
if (b > 256)
b = 256;
for (; a < b; a++)
palette.setColour(a, rgba_t(bm_pal[a].rgbRed, bm_pal[a].rgbGreen, bm_pal[a].rgbBlue, 255));
}
// Create image
if (info.has_palette)
image.create(info, &palette);
else
image.create(info);
uint8_t* img_data = imageData(image);
// Convert to 32bpp & flip vertically
FIBITMAP* rgba = FreeImage_ConvertTo32Bits(bm);
if (!rgba)
{
LOG_MESSAGE(1, "FreeImage_ConvertTo32Bits failed for image data");
Global::error = "Error reading PNG data";
return false;
}
FreeImage_FlipVertical(rgba);
// Load raw RGBA data
uint8_t* bits_rgba = FreeImage_GetBits(rgba);
int c = 0;
for (int a = 0; a < info.width * info.height; a++)
{
img_data[c++] = bits_rgba[a * 4 + 2]; // Red
img_data[c++] = bits_rgba[a * 4 + 1]; // Green
img_data[c++] = bits_rgba[a * 4]; // Blue
img_data[c++] = bits_rgba[a * 4 + 3]; // Alpha
}
// Free memory
FreeImage_Unload(rgba);
FreeImage_Unload(bm);
return true;
}
示例8: CTexture
/* TextureXPanel::newTextureFromPatch
* Creates a new texture called [name] from [patch]. The new texture
* will be set to the dimensions of the patch, with the patch added
* at 0,0
*******************************************************************/
CTexture* TextureXPanel::newTextureFromPatch(string name, string patch)
{
// Create new texture
CTexture* tex = new CTexture();
tex->setName(name);
tex->setState(2);
// Setup texture scale
if (texturex.getFormat() == TXF_TEXTURES)
{
tex->setScale(1, 1);
tex->setExtended(true);
}
else
tex->setScale(0, 0);
// Add patch
tex->addPatch(patch, 0, 0);
// Load patch image (to determine dimensions)
SImage image;
tex->loadPatchImage(0, image);
// Set dimensions
tex->setWidth(image.getWidth());
tex->setHeight(image.getHeight());
// Update variables
modified = true;
// Return the new texture
return tex;
}
示例9: importEditorImages
void importEditorImages(MapTexHashMap& map, ArchiveTreeNode* dir, string path)
{
SImage image;
// Go through entries
for (unsigned a = 0; a < dir->numEntries(); a++)
{
ArchiveEntry* entry = dir->getEntry(a);
// Load entry to image
if (image.open(entry->getMCData()))
{
// Create texture in hashmap
string name = path + entry->getName(true);
//wxLogMessage("Loading editor texture %s", CHR(name));
map_tex_t& mtex = map[name];
mtex.texture = new GLTexture(false);
mtex.texture->setFilter(GLTexture::MIPMAP);
mtex.texture->loadImage(&image);
}
}
// Go through subdirs
for (unsigned a = 0; a < dir->nChildren(); a++)
{
ArchiveTreeNode* subdir = (ArchiveTreeNode*)dir->getChild(a);
importEditorImages(map, subdir, path + subdir->getName() + "/");
}
}
示例10: callBackDisplay
void callBackDisplay(void *arg, SImage img)
{
cvSaveImage("output.jpg", img->get());
cvDestroyAllWindows();
cvNamedWindow("IMAGE");
cvShowImage("IMAGE", img->get());
cvWaitKey(500);
}
示例11: columns
// -----------------------------------------------------------------------------
// Search for errors in texture list, return true if any are found
// -----------------------------------------------------------------------------
bool TextureXList::findErrors()
{
bool ret = false;
// Texture errors:
// 1. A texture without any patch
// 2. A texture with missing patches
// 3. A texture with columns not covered by a patch
for (unsigned a = 0; a < textures_.size(); a++)
{
if (textures_[a]->nPatches() == 0)
{
ret = true;
Log::warning("Texture {}: {} does not have any patch", a, textures_[a]->name());
}
else
{
vector<uint8_t> columns(textures_[a]->width());
memset(columns.data(), 0, textures_[a]->width());
for (size_t i = 0; i < textures_[a]->nPatches(); ++i)
{
auto patch = textures_[a]->patches_[i]->patchEntry();
if (patch == nullptr)
{
ret = true;
Log::warning(
"Texture {}: {}: patch {} cannot be found in any open archive",
a,
textures_[a]->name(),
textures_[a]->patches_[i]->name());
// Don't list missing columns when we don't know the size of the patch
memset(columns.data(), 1, textures_[a]->width());
}
else
{
SImage img;
img.open(patch->data());
size_t start = std::max<size_t>(0, textures_[a]->patches_[i]->xOffset());
size_t end = std::min<size_t>(textures_[a]->width(), img.width() + start);
for (size_t c = start; c < end; ++c)
columns[c] = 1;
}
}
for (size_t c = 0; c < textures_[a]->width(); ++c)
{
if (columns[c] == 0)
{
ret = true;
Log::warning("Texture {}: {}: column {} without a patch", a, textures_[a]->name(), c);
break;
}
}
}
}
return ret;
}
示例12: canWrite
int canWrite(SImage& image)
{
// If it's the correct size and colour format, it's writable
if (image.getType() == PALMASK &&
validSize(image.getWidth(), image.getHeight()))
return WRITABLE;
// Otherwise, it can be converted via palettising and cropping
return CONVERTIBLE;
}
示例13: writeImage
bool writeImage(SImage& image, MemChunk& data, Palette* pal, int index)
{
// Can't write if RGBA
if (image.getType() == RGBA)
return false;
// Check size
if (!validSize(image.getWidth(), image.getHeight()))
return false;
// Just dump image data to memchunk
data.clear();
data.write(imageData(image), image.getWidth() * image.getHeight());
return true;
}
示例14: gfxConvert
/* EntryOperations::gfxConvert
* Converts the image [entry] to [target_format], using conversion
* options specified in [opt] and converting to [target_colformat]
* colour format if possible. Returns false if the conversion failed,
* true otherwise
*******************************************************************/
bool EntryOperations::gfxConvert(ArchiveEntry* entry, string target_format, SIFormat::convert_options_t opt, int target_colformat)
{
// Init variables
SImage image;
// Get target image format
SIFormat* fmt = SIFormat::getFormat(target_format);
if (fmt == SIFormat::unknownFormat())
return false;
// Check format and target colour type are compatible
if (target_colformat >= 0 && !fmt->canWriteType((SIType)target_colformat))
{
if (target_colformat == RGBA)
wxLogMessage("Format \"%s\" cannot be written as RGBA data", fmt->getName());
else if (target_colformat == PALMASK)
wxLogMessage("Format \"%s\" cannot be written as paletted data", fmt->getName());
return false;
}
// Load entry to image
Misc::loadImageFromEntry(&image, entry);
// Check if we can write the image to the target format
int writable = fmt->canWrite(image);
if (writable == SIFormat::NOTWRITABLE)
{
wxLogMessage("Entry \"%s\" could not be converted to target format \"%s\"", entry->getName(), fmt->getName());
return false;
}
else if (writable == SIFormat::CONVERTIBLE)
fmt->convertWritable(image, opt);
// Now we apply the target colour format (if any)
if (target_colformat == PALMASK)
image.convertPaletted(opt.pal_target, opt.pal_current);
else if (target_colformat == RGBA)
image.convertRGBA(opt.pal_current);
// Finally, write new image data back to the entry
fmt->saveImage(image, entry->getMCData(), opt.pal_target);
return true;
}
示例15: exportEntry
bool exportEntry()
{
wxFileName fn(appPath(entry->getName(), DIR_TEMP));
fn.SetExt("png");
// Create image from entry
SImage image;
if (!Misc::loadImageFromEntry(&image, entry))
{
Global::error = "Could not read graphic";
return false;
}
// Set export info
gfx_format = image.getFormat()->getId();
offsets = image.offset();
palette.copyPalette(theMainWindow->getPaletteChooser()->getSelectedPalette(entry));
// Write png data
MemChunk png;
SIFormat* fmt_png = SIFormat::getFormat("png");
if (!fmt_png->saveImage(image, png, &palette))
{
Global::error = "Error converting to png";
return false;
}
// Export file and start monitoring if successful
filename = fn.GetFullPath();
if (png.exportFile(filename))
{
file_modified = wxFileModificationTime(filename);
Start(1000);
return true;
}
return false;
}