本文整理汇总了C++中setFailed函数的典型用法代码示例。如果您正苦于以下问题:C++ setFailed函数的具体用法?C++ setFailed怎么用?C++ setFailed使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了setFailed函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: adoptPtr
void PNGImageDecoder::decode(bool onlySize)
{
if (failed())
return;
if (!m_reader)
m_reader = adoptPtr(new PNGImageReader(this));
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived())
setFailed();
// If we're done decoding the image, we don't need the PNGImageReader
// anymore. (If we failed, |m_reader| has already been cleared.)
else if (isComplete())
m_reader.clear();
}
开发者ID:AndriyKalashnykov,项目名称:webkit,代码行数:17,代码来源:PNGImageDecoder.cpp
示例2: PLATFORM
void BMPImageDecoder::decode(bool onlySize)
{
#if PLATFORM(CHROMIUM)
TRACE_EVENT("BMPImageDecoder::decode", this, 0);
#endif
if (failed())
return;
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
if (!decodeHelper(onlySize) && isAllDataReceived())
setFailed();
// If we're done decoding the image, we don't need the BMPImageReader
// anymore. (If we failed, |m_reader| has already been cleared.)
else if (!m_frameBufferCache.isEmpty() && (m_frameBufferCache.first().status() == ImageFrame::FrameComplete))
m_reader.clear();
}
开发者ID:CannedFish,项目名称:deepin-webkit,代码行数:17,代码来源:BMPImageDecoder.cpp
示例3: ASSERT
bool ICOImageDecoder::processDirectory() {
// Read directory.
ASSERT(!m_decodedOffset);
if (m_data->size() < sizeOfDirectory)
return false;
const uint16_t fileType = readUint16(2);
m_dirEntriesCount = readUint16(4);
m_decodedOffset = sizeOfDirectory;
// See if this is an icon filetype we understand, and make sure we have at
// least one entry in the directory.
if (((fileType != ICON) && (fileType != CURSOR)) || (!m_dirEntriesCount))
return setFailed();
m_fileType = static_cast<FileType>(fileType);
return true;
}
开发者ID:mirror,项目名称:chromium,代码行数:17,代码来源:ICOImageDecoder.cpp
示例4: adoptPtr
void JPEGImageDecoder::decode(bool onlySize)
{
if (failed())
return;
if (!m_reader)
m_reader = adoptPtr(new JPEGImageReader(this));
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived())
setFailed();
// If we're done decoding the image, we don't need the JPEGImageReader
// anymore. (If we failed, |m_reader| has already been cleared.)
else if (!m_frameBufferCache.isEmpty() && (m_frameBufferCache[0].status() == ImageFrame::FrameComplete))
m_reader.clear();
}
开发者ID:jparound30,项目名称:webkit,代码行数:17,代码来源:JPEGImageDecoder.cpp
示例5: adoptPtr
void PNGImageDecoder::decode(bool onlySize)
{
if (failed())
return;
if (!m_reader)
m_reader = adoptPtr(new PNGImageReader(this));
// If we couldn't decode the image but have received all the data, decoding
// has failed.
if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived())
setFailed();
// If decoding is done or failed, we don't need the PNGImageReader anymore.
if (isComplete(this) || failed())
m_reader.clear();
}
开发者ID:dstockwell,项目名称:blink,代码行数:17,代码来源:PNGImageDecoder.cpp
示例6: setFailed
void ICOImageDecoder::decode(size_t index, bool onlySize)
{
if (failed())
return;
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) && isAllDataReceived())
setFailed();
// If we're done decoding this frame, we don't need the BMPImageReader or
// PNGImageDecoder anymore. (If we failed, these have already been
// cleared.)
else if ((m_frameBufferCache.size() > index) && (m_frameBufferCache[index].status() == ImageFrame::FrameComplete)) {
m_bmpReaders[index] = nullptr;
m_pngDecoders[index] = nullptr;
}
}
开发者ID:clbr,项目名称:webkitfltk,代码行数:17,代码来源:ICOImageDecoder.cpp
示例7: AMListAction3
CLSSIS3820ScalerDarkCurrentMeasurementAction::CLSSIS3820ScalerDarkCurrentMeasurementAction(CLSSIS3820ScalerDarkCurrentMeasurementActionInfo *info, QObject *parent) :
AMListAction3(info, AMListAction3::Sequential, parent)
{
CLSSIS3820Scaler *scaler = CLSBeamline::clsBeamline()->scaler();
double secondsDwell = scalerDarkCurrentMeasurementActionInfo()->dwellTime();
connect( this, SIGNAL(failed()), this, SLOT(onActionFailed()) );
if (scaler && scaler->isConnected() && secondsDwell > 0) {
// pre-measurement settings.
double oldDwell = scaler->dwellTime();
// first turn off beam.
// addSubAction(AMBeamline::bl()->createTurnOffBeamActions());
// set the scaler's dwell time to new time.
addSubAction(scaler->createDwellTimeAction3(secondsDwell));
// initiate a scaler measurement and wait until it is complete.
addSubAction(scaler->createStartAction3(true));
addSubAction(scaler->createWaitForDwellFinishedAction(secondsDwell + 5.0));
// notify attached and able scaler channel detectors that the latest measurement was a dark current measurement.
AMListAction3 *notifyChannelDetectors = new AMListAction3(new AMListActionInfo3("Set last measurement as dark current measurement", "Set last measurement as dark current measurement"));
for (int i = 0; i < scaler->channels().count(); i++) {
CLSSIS3820ScalerChannel *channel = scaler->channelAt(i);
if (channel && channel->isEnabled() && channel->detector() && channel->detector()->canDoDarkCurrentCorrection()) {
notifyChannelDetectors->addSubAction(channel->detector()->createSetLastMeasurementAsDarkCurrentAction());
}
}
addSubAction(notifyChannelDetectors);
// reset settings to pre-measurement conditions.
addSubAction(scaler->createDwellTimeAction3(oldDwell));
} else {
AMErrorMon::alert(this, CLSSIS3820SCALERDARKCURRENTMEASUREMENTACTION_SCALER_NOT_VALID, "Failed to complete dark current measurement--scaler not valid.");
setFailed();
}
}
开发者ID:anukat2015,项目名称:acquaman,代码行数:45,代码来源:CLSSIS3820ScalerDarkCurrentMeasurementAction.cpp
示例8: QString
void VESPERSSetStringAction::onValueChanged()
{
const AMProcessVariable *pv = ((AMPVControl *)(control_))->readPV();
QString string = VESPERS::pvToString(pv);
QString text = ((VESPERSSetStringActionInfo *)info())->text();
if (string == text){
AMErrorMon::debug(this, VESPERSSETSTRINGACTION_SUCCEEDED, QString("[SUCCEEDED] Set string. Desired: %1 Result: %2.").arg(text).arg(string));
setSucceeded();
}
else{
AMErrorMon::debug(this, VESPERSSETSTRINGACTION_FAILED, QString("[FAILED] Set string. Desired: %1 Result: %2.").arg(text).arg(string));
setFailed();
}
}
开发者ID:acquaman,项目名称:acquaman,代码行数:18,代码来源:VESPERSSetStringAction.cpp
示例9: disconnect
void AMScanAction::onControllerInitialized()
{
if (state() == AMAction3::Skipping){
disconnect(controller_, SIGNAL(cancelled()), this, SLOT(onControllerCancelled()));
connect(controller_, SIGNAL(cancelled()), this, SLOT(onControllerSucceeded()));
controller_->cancel();
}
else if (!controller_->start()){
AMErrorMon::alert(this, AMSCANACTION_CANT_START_CONTROLLER, "Could not start the scan controller.");
setFailed();
}
else {
setStarted();
}
}
开发者ID:acquaman,项目名称:acquaman,代码行数:19,代码来源:AMScanAction.cpp
示例10: U_TRACE
UString URPCObject::processMessage(URPCEnvelope& envelope, bool& bContainsFault)
{
U_TRACE(0, "URPCObject::processMessage(%p,%p)", &envelope, &bContainsFault)
U_INTERNAL_ASSERT_POINTER(URPCMethod::encoder)
UString retval;
// Iterate over the list of methods
URPCMethod* method = find(envelope.getMethodName());
if (method == 0)
{
// Return object not found error. This would be a Client fault
setFailed();
URPCMethod::pFault->setFaultReason(U_CONSTANT_TO_PARAM("The requested method does not exist on this server"));
bContainsFault = true;
retval = URPCMethod::encoder->encodeFault(URPCMethod::pFault);
}
else
{
UString ns = envelope.getNsName();
U_INTERNAL_DUMP("envelope.nsName = %V", ns.rep)
// check the name of namespace qualified element information (gSOAP)
if (ns.empty()) ns = method->getNamespaces();
if (ns.empty()) ns = *UString::str_ns;
bContainsFault = (method->execute(envelope) == false);
retval = URPCMethod::encoder->encodeMethodResponse(*method, ns);
}
U_RETURN_STRING(retval);
}
开发者ID:paul-nema,项目名称:ULib,代码行数:40,代码来源:rpc_object.cpp
示例11: setFailed
void EglWaylandBackend::init()
{
if (!initRenderingContext()) {
setFailed("Could not initialize rendering context");
return;
}
initEGL();
GLPlatform *glPlatform = GLPlatform::instance();
glPlatform->detect(EglPlatformInterface);
glPlatform->printResults();
initGL(EglPlatformInterface);
setSupportsBufferAge(false);
if (hasGLExtension("EGL_EXT_buffer_age")) {
const QByteArray useBufferAge = qgetenv("KWIN_USE_BUFFER_AGE");
if (useBufferAge != "0")
setSupportsBufferAge(true);
}
}
开发者ID:KDE,项目名称:kde-workspace,代码行数:22,代码来源:egl_wayland_backend.cpp
示例12: QString
void AMDetectorReadAction::startImplementation(){
// If you still don't have a detector, check the exposed detectors one last time.
//if(!detector_)
// detector_ = AMBeamline::bl()->exposedDetectorByInfo(*(detectorReadInfo()->detectorInfo()));
if(!detector_ && AMBeamlineSupport::beamlineDetectorAPI())
detector_ = AMBeamlineSupport::beamlineDetectorAPI()->exposedDetectorByInfo(*(detectorReadInfo()->detectorInfo()));
if(!detector_) {
AMErrorMon::alert(this,
AMDETECTORREADACTION_NO_VALID_DETECTOR,
QString("There was an error reading the detector '%1', because the detector was not found. Please report this problem to the Acquaman developers.").arg(detectorReadInfo()->name()));
setFailed();
return;
}
if(detector_->readMethod() == AMDetectorDefinitions::WaitRead){
// connect to detector initialization signals
connect(detector_, SIGNAL(newValuesAvailable()), this, SLOT(onDetectorNewValuesAvailable()));
}
else
internalSetSucceeded();
}
开发者ID:anukat2015,项目名称:acquaman,代码行数:22,代码来源:AMDetectorReadAction.cpp
示例13: adoptPtr
void GIFImageDecoder::parse(GIFParseQuery query)
{
if (failed())
return;
if (!m_reader) {
m_reader = adoptPtr(new GIFImageReader(this));
m_reader->setData(m_data);
}
if (!m_reader->parse(query)) {
setFailed();
return;
}
const size_t oldSize = m_frameBufferCache.size();
m_frameBufferCache.resize(m_reader->imagesCount());
for (size_t i = oldSize; i < m_reader->imagesCount(); ++i) {
ImageFrame& buffer = m_frameBufferCache[i];
const GIFFrameContext* frameContext = m_reader->frameContext(i);
buffer.setPremultiplyAlpha(m_premultiplyAlpha);
buffer.setRequiredPreviousFrameIndex(findRequiredPreviousFrame(i));
buffer.setDuration(frameContext->delayTime);
buffer.setDisposalMethod(frameContext->disposalMethod);
// Initialize the frame rect in our buffer.
IntRect frameRect(frameContext->xOffset, frameContext->yOffset, frameContext->width, frameContext->height);
// Make sure the frameRect doesn't extend outside the buffer.
if (frameRect.maxX() > size().width())
frameRect.setWidth(size().width() - frameContext->xOffset);
if (frameRect.maxY() > size().height())
frameRect.setHeight(size().height() - frameContext->yOffset);
buffer.setOriginalFrameRect(frameRect);
}
}
开发者ID:windyuuy,项目名称:opera,代码行数:38,代码来源:GIFImageDecoder.cpp
示例14: isAllDataReceived
void ICOImageDecoder::decode(size_t index, bool onlySize) {
if (failed())
return;
// Defensively clear the FastSharedBufferReader's cache, as another caller
// may have called SharedBuffer::mergeSegmentsIntoBuffer().
m_fastReader.clearCache();
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) &&
isAllDataReceived()) {
setFailed();
// If we're done decoding this frame, we don't need the BMPImageReader or
// PNGImageDecoder anymore. (If we failed, these have already been
// cleared.)
} else if ((m_frameBufferCache.size() > index) &&
(m_frameBufferCache[index].getStatus() ==
ImageFrame::FrameComplete)) {
m_bmpReaders[index].reset();
m_pngDecoders[index].reset();
}
}
开发者ID:mirror,项目名称:chromium,代码行数:23,代码来源:ICOImageDecoder.cpp
示例15: setFailed
void ICOImageDecoder::decode(size_t index, bool onlySize)
{
if (failed())
return;
// If we couldn't decode the image but we've received all the data, decoding
// has failed.
if ((!decodeDirectory() || (!onlySize && !decodeAtIndex(index))) && isAllDataReceived())
setFailed();
// If we're done decoding this frame, we don't need the BMPImageReader or
// PNGImageDecoder anymore. (If we failed, these have already been
// cleared.)
else if ((m_frameBufferCache.size() > index) && m_frameBufferCache[index].isComplete()) {
m_bmpReaders[index] = nullptr;
m_pngDecoders[index] = nullptr;
}
if (m_frameBufferCache.isEmpty())
m_frameBufferCache.resize(m_dirEntries.size());
// CAUTION: We must not resize m_frameBufferCache again after this, as
// decodeAtIndex() may give a BMPImageReader a pointer to one of the
// entries.
}
开发者ID:ollie314,项目名称:webkit,代码行数:23,代码来源:ICOImageDecoder.cpp
示例16: ASSERT
bool ICOImageDecoder::processDirectoryEntries()
{
// Read directory entries.
ASSERT(m_decodedOffset == sizeOfDirectory);
if ((m_decodedOffset > m_data->size()) || ((m_data->size() - m_decodedOffset) < (m_dirEntries.size() * sizeOfDirEntry)))
return false;
for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); i != m_dirEntries.end(); ++i)
*i = readDirectoryEntry(); // Updates m_decodedOffset.
// Make sure the specified image offsets are past the end of the directory
// entries.
for (IconDirectoryEntries::iterator i(m_dirEntries.begin()); i != m_dirEntries.end(); ++i) {
if (i->m_imageOffset < m_decodedOffset)
return setFailed();
}
// Arrange frames in decreasing quality order.
std::sort(m_dirEntries.begin(), m_dirEntries.end(), compareEntries);
// The image size is the size of the largest entry.
const IconDirectoryEntry& dirEntry = m_dirEntries.first();
setSize(dirEntry.m_size.width(), dirEntry.m_size.height());
return true;
}
开发者ID:UIKit0,项目名称:WebkitAIR,代码行数:24,代码来源:ICOImageDecoder.cpp
示例17: setFailed
void KJavaApplet::create( )
{
if ( !context->create( this ) )
setFailed();
d->reallyExists = true;
}
开发者ID:Fat-Zer,项目名称:tdelibs,代码行数:6,代码来源:kjavaapplet.cpp
示例18: WebPDemuxPartial
bool WEBPImageDecoder::decode(bool onlySize)
{
if (failed())
return false;
const uint8_t* dataBytes = reinterpret_cast<const uint8_t*>(m_data->data());
const size_t dataSize = m_data->size();
if (!ImageDecoder::isSizeAvailable()) {
static const size_t imageHeaderSize = 30;
if (dataSize < imageHeaderSize)
return false;
int width, height;
#ifdef QCMS_WEBP_COLOR_CORRECTION
WebPData inputData = { dataBytes, dataSize };
WebPDemuxState state;
WebPDemuxer* demuxer = WebPDemuxPartial(&inputData, &state);
if (!demuxer)
return setFailed();
width = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_WIDTH);
height = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_HEIGHT);
m_formatFlags = WebPDemuxGetI(demuxer, WEBP_FF_FORMAT_FLAGS);
m_hasAlpha = !!(m_formatFlags & ALPHA_FLAG);
WebPDemuxDelete(demuxer);
if (state <= WEBP_DEMUX_PARSING_HEADER)
return false;
#elif (WEBP_DECODER_ABI_VERSION >= 0x0163)
WebPBitstreamFeatures features;
if (WebPGetFeatures(dataBytes, dataSize, &features) != VP8_STATUS_OK)
return setFailed();
width = features.width;
height = features.height;
m_hasAlpha = features.has_alpha;
#else
// Earlier version won't be able to display WebP files with alpha.
if (!WebPGetInfo(dataBytes, dataSize, &width, &height))
return setFailed();
m_hasAlpha = false;
#endif
if (!setSize(width, height))
return setFailed();
}
ASSERT(ImageDecoder::isSizeAvailable());
if (onlySize)
return true;
ASSERT(!m_frameBufferCache.isEmpty());
ImageFrame& buffer = m_frameBufferCache[0];
ASSERT(buffer.status() != ImageFrame::FrameComplete);
if (buffer.status() == ImageFrame::FrameEmpty) {
if (!buffer.setSize(size().width(), size().height()))
return setFailed();
buffer.setStatus(ImageFrame::FramePartial);
buffer.setHasAlpha(m_hasAlpha);
buffer.setOriginalFrameRect(IntRect(IntPoint(), size()));
}
if (!m_decoder) {
WEBP_CSP_MODE mode = outputMode(m_hasAlpha);
if (!m_premultiplyAlpha)
mode = outputMode(false);
if ((m_formatFlags & ICCP_FLAG) && !ignoresGammaAndColorProfile())
mode = MODE_RGBA; // Decode to RGBA for input to libqcms.
int rowStride = size().width() * sizeof(ImageFrame::PixelData);
uint8_t* output = reinterpret_cast<uint8_t*>(buffer.getAddr(0, 0));
int outputSize = size().height() * rowStride;
m_decoder = WebPINewRGB(mode, output, outputSize, rowStride);
if (!m_decoder)
return setFailed();
}
switch (WebPIUpdate(m_decoder, dataBytes, dataSize)) {
case VP8_STATUS_OK:
if ((m_formatFlags & ICCP_FLAG) && !ignoresGammaAndColorProfile())
applyColorProfile(dataBytes, dataSize, buffer);
buffer.setStatus(ImageFrame::FrameComplete);
clear();
return true;
case VP8_STATUS_SUSPENDED:
if ((m_formatFlags & ICCP_FLAG) && !ignoresGammaAndColorProfile())
applyColorProfile(dataBytes, dataSize, buffer);
return false;
default:
clear();
return setFailed();
}
}
开发者ID:CannedFish,项目名称:webkitgtk,代码行数:91,代码来源:WEBPImageDecoder.cpp
示例19: while
bool BMPImageReader::processRLEData()
{
if (m_decodedOffset > m_data->size())
return false;
// RLE decoding is poorly specified. Two main problems:
// (1) Are EOL markers necessary? What happens when we have too many
// pixels for one row?
// http://www.fileformat.info/format/bmp/egff.htm says extra pixels
// should wrap to the next line. Real BMPs I've encountered seem to
// instead expect extra pixels to be ignored until the EOL marker is
// seen, although this has only happened in a few cases and I suspect
// those BMPs may be invalid. So we only change lines on EOL (or Delta
// with dy > 0), and fail in most cases when pixels extend past the end
// of the line.
// (2) When Delta, EOL, or EOF are seen, what happens to the "skipped"
// pixels?
// http://www.daubnet.com/formats/BMP.html says these should be filled
// with color 0. However, the "do nothing" and "don't care" comments
// of other references suggest leaving these alone, i.e. letting them
// be transparent to the background behind the image. This seems to
// match how MSPAINT treats BMPs, so we do that. Note that when we
// actually skip pixels for a case like this, we need to note on the
// framebuffer that we have alpha.
// Impossible to decode row-at-a-time, so just do things as a stream of
// bytes.
while (true) {
// Every entry takes at least two bytes; bail if there isn't enough
// data.
if ((m_data->size() - m_decodedOffset) < 2)
return false;
// For every entry except EOF, we'd better not have reached the end of
// the image.
const uint8_t count = m_data->data()[m_decodedOffset];
const uint8_t code = m_data->data()[m_decodedOffset + 1];
if ((count || (code != 1)) && pastEndOfImage(0))
return setFailed();
// Decode.
if (count == 0) {
switch (code) {
case 0: // Magic token: EOL
// Skip any remaining pixels in this row.
if (m_coord.x() < m_parent->size().width())
m_buffer->setHasAlpha(true);
moveBufferToNextRow();
m_decodedOffset += 2;
break;
case 1: // Magic token: EOF
// Skip any remaining pixels in the image.
if ((m_coord.x() < m_parent->size().width()) || (m_isTopDown ? (m_coord.y() < (m_parent->size().height() - 1)) : (m_coord.y() > 0)))
m_buffer->setHasAlpha(true);
return true;
case 2: { // Magic token: Delta
// The next two bytes specify dx and dy. Bail if there isn't
// enough data.
if ((m_data->size() - m_decodedOffset) < 4)
return false;
// Fail if this takes us past the end of the desired row or
// past the end of the image.
const uint8_t dx = m_data->data()[m_decodedOffset + 2];
const uint8_t dy = m_data->data()[m_decodedOffset + 3];
if (dx || dy)
m_buffer->setHasAlpha(true);
if (((m_coord.x() + dx) > m_parent->size().width()) || pastEndOfImage(dy))
return setFailed();
// Skip intervening pixels.
m_coord.move(dx, m_isTopDown ? dy : -dy);
m_decodedOffset += 4;
break;
}
default: // Absolute mode
// |code| pixels specified as in BI_RGB, zero-padded at the end
// to a multiple of 16 bits.
// Because processNonRLEData() expects m_decodedOffset to
// point to the beginning of the pixel data, bump it past
// the escape bytes and then reset if decoding failed.
m_decodedOffset += 2;
if (!processNonRLEData(true, code)) {
m_decodedOffset -= 2;
return false;
}
break;
}
} else { // Encoded mode
// The following color data is repeated for |count| total pixels.
// Strangely, some BMPs seem to specify excessively large counts
// here; ignore pixels past the end of the row.
const int endX = std::min(m_coord.x() + count, m_parent->size().width());
if (m_infoHeader.biCompression == RLE24) {
//.........这里部分代码省略.........
开发者ID:ShouqingZhang,项目名称:webkitdriver,代码行数:101,代码来源:BMPImageReader.cpp
示例20: if
bool BMPImageReader::processBitmasks()
{
// Create m_bitMasks[] values.
if (m_infoHeader.biCompression != BITFIELDS) {
// The format doesn't actually use bitmasks. To simplify the decode
// logic later, create bitmasks for the RGB data. For Windows V4+,
// this overwrites the masks we read from the header, which are
// supposed to be ignored in non-BITFIELDS cases.
// 16 bits: MSB <- xRRRRRGG GGGBBBBB -> LSB
// 24/32 bits: MSB <- [AAAAAAAA] RRRRRRRR GGGGGGGG BBBBBBBB -> LSB
const int numBits = (m_infoHeader.biBitCount == 16) ? 5 : 8;
for (int i = 0; i <= 2; ++i)
m_bitMasks[i] = ((static_cast<uint32_t>(1) << (numBits * (3 - i))) - 1) ^ ((static_cast<uint32_t>(1) << (numBits * (2 - i))) - 1);
// For Windows V4+ 32-bit RGB, don't overwrite the alpha mask from the
// header (see note in readInfoHeader()).
if (m_infoHeader.biBitCount < 32)
m_bitMasks[3] = 0;
else if (!isWindowsV4Plus())
m_bitMasks[3] = static_cast<uint32_t>(0xff000000);
} else if (!isWindowsV4Plus()) {
// For Windows V4+ BITFIELDS mode bitmaps, this was already done when
// we read the info header.
// Fail if we don't have enough file space for the bitmasks.
static const size_t SIZEOF_BITMASKS = 12;
if (((m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS) < (m_headerOffset + m_infoHeader.biSize)) || (m_imgDataOffset && (m_imgDataOffset < (m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS))))
return setFailed();
// Read bitmasks.
if ((m_data->size() - m_decodedOffset) < SIZEOF_BITMASKS)
return false;
m_bitMasks[0] = readUint32(0);
m_bitMasks[1] = readUint32(4);
m_bitMasks[2] = readUint32(8);
// No alpha in anything other than Windows V4+.
m_bitMasks[3] = 0;
m_decodedOffset += SIZEOF_BITMASKS;
}
// We've now decoded all the non-image data we care about. Skip anything
// else before the actual raster data.
if (m_imgDataOffset)
m_decodedOffset = m_imgDataOffset;
m_needToProcessBitmasks = false;
// Check masks and set shift values.
for (int i = 0; i < 4; ++i) {
// Trim the mask to the allowed bit depth. Some Windows V4+ BMPs
// specify a bogus alpha channel in bits that don't exist in the pixel
// data (for example, bits 25-31 in a 24-bit RGB format).
if (m_infoHeader.biBitCount < 32)
m_bitMasks[i] &= ((static_cast<uint32_t>(1) << m_infoHeader.biBitCount) - 1);
// For empty masks (common on the alpha channel, especially after the
// trimming above), quickly clear the shifts and continue, to avoid an
// infinite loop in the counting code below.
uint32_t tempMask = m_bitMasks[i];
if (!tempMask) {
m_bitShiftsRight[i] = m_bitShiftsLeft[i] = 0;
continue;
}
// Make sure bitmask does not overlap any other bitmasks.
for (int j = 0; j < i; ++j) {
if (tempMask & m_bitMasks[j])
return setFailed();
}
// Count offset into pixel data.
for (m_bitShiftsRight[i] = 0; !(tempMask & 1); tempMask >>= 1)
++m_bitShiftsRight[i];
// Count size of mask.
for (m_bitShiftsLeft[i] = 8; tempMask & 1; tempMask >>= 1)
--m_bitShiftsLeft[i];
// Make sure bitmask is contiguous.
if (tempMask)
return setFailed();
// Since RGBABuffer tops out at 8 bits per channel, adjust the shift
// amounts to use the most significant 8 bits of the channel.
if (m_bitShiftsLeft[i] < 0) {
m_bitShiftsRight[i] -= m_bitShiftsLeft[i];
m_bitShiftsLeft[i] = 0;
}
}
return true;
}
开发者ID:ShouqingZhang,项目名称:webkitdriver,代码行数:92,代码来源:BMPImageReader.cpp
注:本文中的setFailed函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论