Added option to store images in cache as flattened archived BBitmaps
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3895 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
281b14ed54
commit
ad3b616b82
192
src/add-ons/print/drivers/pdf/source/Image.cpp
Normal file
192
src/add-ons/print/drivers/pdf/source/Image.cpp
Normal file
@ -0,0 +1,192 @@
|
||||
/*
|
||||
|
||||
Image Cache Item.
|
||||
|
||||
Copyright (c) 2003 OpenBeOS.
|
||||
|
||||
Author:
|
||||
Michael Pfeiffer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <File.h>
|
||||
#include <Translator.h>
|
||||
#include <TranslationUtils.h>
|
||||
#include <TranslatorRoster.h>
|
||||
#include <BitmapStream.h>
|
||||
#include <Debug.h>
|
||||
|
||||
#include "Report.h"
|
||||
#include "Image.h"
|
||||
#include "ImageCache.h"
|
||||
|
||||
// Implementation of ImageDescription
|
||||
|
||||
ImageDescription::ImageDescription(PDF* pdf, BBitmap* bitmap, int mask)
|
||||
: fPDF(pdf)
|
||||
, fBitmap(bitmap)
|
||||
, fMask(mask)
|
||||
{
|
||||
bitmap->Lock();
|
||||
fWidth = bitmap->Bounds().IntegerWidth()+1;
|
||||
fHeight = bitmap->Bounds().IntegerHeight()+1;
|
||||
fColorSpace = bitmap->ColorSpace();
|
||||
bitmap->Unlock();
|
||||
}
|
||||
|
||||
CacheItem* ImageDescription::NewItem(int id) {
|
||||
REPORT(kDebug, -1, "ImageDescription::NewItem %d", id);
|
||||
Image* image = Store(fPDF, id, fBitmap, fMask);
|
||||
if (image == NULL) {
|
||||
REPORT(kDebug, -1, "Could not store image in cache!");
|
||||
}
|
||||
}
|
||||
|
||||
Image* ImageDescription::Store(PDF* pdf, int id, BBitmap* bitmap, int mask) {
|
||||
BString fileName(kImagePathPrefix);
|
||||
BString pdfFileName;
|
||||
int w, h;
|
||||
color_space cs;
|
||||
|
||||
fileName << id;
|
||||
pdfFileName = fileName;
|
||||
pdfFileName << ".png";
|
||||
|
||||
bitmap->Lock();
|
||||
w = bitmap->Bounds().IntegerWidth()+1;
|
||||
h = bitmap->Bounds().IntegerHeight()+1;
|
||||
cs = bitmap->ColorSpace();
|
||||
bitmap->Unlock();
|
||||
|
||||
#if STORE_AS_BBITMAP
|
||||
fileName << ".bitmap";
|
||||
#else
|
||||
fileName << ".png";
|
||||
#endif
|
||||
if (!StorePNG(pdfFileName.String(), bitmap)) {
|
||||
REPORT(kError, -1, "Image cache could not store image as PNG file.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!StoreBitmap(fileName.String(), bitmap)) {
|
||||
REPORT(kError, -1, "Image cache could not store image as flattend BBitmap.");
|
||||
unlink(pdfFileName.String());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int image;
|
||||
image = PDF_open_image_file(pdf, "png", pdfFileName.String(),
|
||||
mask == -1 ? "" : "masked", mask == -1 ? 0 : mask);
|
||||
|
||||
#if STORE_AS_BBITMAP
|
||||
unlink(pdfFileName.String());
|
||||
#endif
|
||||
|
||||
if (image < 0) {
|
||||
REPORT(kError, -1, "Image cache could not embed image.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return new Image(pdf, image, fileName.String(), w, h, cs, mask);
|
||||
}
|
||||
|
||||
bool ImageDescription::StorePNG(const char* fileName, BBitmap* bitmap) {
|
||||
bool ok = true;
|
||||
BTranslatorRoster *roster = BTranslatorRoster::Default();
|
||||
BBitmapStream stream(bitmap); // init with contents of bitmap
|
||||
BFile file(fileName, B_CREATE_FILE | B_WRITE_ONLY | B_ERASE_FILE);
|
||||
ok = roster->Translate(&stream, NULL, NULL, &file, B_PNG_FORMAT) == B_OK;
|
||||
BBitmap *bm = NULL; stream.DetachBitmap(&bm); // otherwise bitmap destructor crashes here!
|
||||
ASSERT(bm == bitmap);
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool ImageDescription::StoreBitmap(const char* fileName, BBitmap* bitmap) {
|
||||
bool ok = true;
|
||||
#if STORE_AS_BBITMAP
|
||||
BMessage msg;
|
||||
BFile file(fileName, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
|
||||
ok = file.InitCheck() == B_OK && bitmap->Archive(&msg) == B_OK && msg.Flatten(&file) == B_OK;
|
||||
#endif
|
||||
return ok;
|
||||
}
|
||||
|
||||
// Implementation of Image
|
||||
|
||||
Image::Image(PDF* pdf, int imageID, const char* fileName, int width, int height, color_space colorSpace, int mask)
|
||||
: fPDF(pdf)
|
||||
, fImageID(imageID)
|
||||
, fFileName(fileName)
|
||||
, fWidth(width)
|
||||
, fHeight(height)
|
||||
, fColorSpace(colorSpace)
|
||||
, fMask(mask)
|
||||
{
|
||||
}
|
||||
|
||||
Image::~Image() {
|
||||
PDF_close_image(fPDF, ImageID());
|
||||
unlink(FileName());
|
||||
}
|
||||
|
||||
bool Image::Equals(CIDescription* description) const {
|
||||
REPORT(kDebug, -1, "Image::Equals called.");
|
||||
ImageDescription* desc = dynamic_cast<ImageDescription*>(description);
|
||||
ASSERT(desc != NULL);
|
||||
if (desc->Width() != Width() || desc->Height() != Height() ||
|
||||
desc->ColorSpace() != ColorSpace() ||
|
||||
desc->Mask() != Mask()) return false;
|
||||
return Equals(desc->Bitmap());
|
||||
}
|
||||
|
||||
bool Image::Equals(BBitmap* bitmap) const {
|
||||
REPORT(kDebug, -1, "Image::Equals called.");
|
||||
bool equals = false;
|
||||
BBitmap* bm = NULL;
|
||||
#if STORE_AS_BBITMAP
|
||||
BMessage msg;
|
||||
BFile file(FileName(), B_READ_ONLY);
|
||||
if (file.InitCheck() == B_OK && msg.Unflatten(&file) == B_OK) {
|
||||
BArchivable* a = BBitmap::Instantiate(&msg);
|
||||
bm = dynamic_cast<BBitmap*>(a);
|
||||
if (bm == NULL && a != NULL) delete a;
|
||||
}
|
||||
#else
|
||||
bm = BTranslationUtils::GetBitmapFile(FileName());
|
||||
#endif
|
||||
if (bm) {
|
||||
bm->Lock();
|
||||
bitmap->Lock();
|
||||
|
||||
equals = bm->BitsLength() == bitmap->BitsLength() &&
|
||||
bm->ColorSpace() == bitmap->ColorSpace() &&
|
||||
memcmp(bm->Bits(), bitmap->Bits(), bm->BitsLength()) == 0;
|
||||
|
||||
bitmap->Unlock();
|
||||
bm->Unlock();
|
||||
delete bm;
|
||||
} else {
|
||||
REPORT(kError, -1, "Could not load image from cache!");
|
||||
}
|
||||
return equals;
|
||||
}
|
91
src/add-ons/print/drivers/pdf/source/Image.h
Normal file
91
src/add-ons/print/drivers/pdf/source/Image.h
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
|
||||
Image Cache Item.
|
||||
|
||||
Copyright (c) 2003 OpenBeOS.
|
||||
|
||||
Author:
|
||||
Michael Pfeiffer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _IMAGE_CACHE_ITEM_H
|
||||
#define _IMAGE_CACHE_ITEM_H
|
||||
|
||||
#include "pdflib.h"
|
||||
#include <Bitmap.h>
|
||||
|
||||
#include "pdflib.h"
|
||||
#include "Utils.h"
|
||||
#include "Cache.h"
|
||||
|
||||
class Image;
|
||||
|
||||
class ImageDescription : public CIDescription {
|
||||
public:
|
||||
ImageDescription(PDF* pdf, BBitmap* bitmap, int mask);
|
||||
|
||||
CacheItem* NewItem(int id);
|
||||
|
||||
BBitmap* Bitmap() { return fBitmap; }
|
||||
int Width() const { return fWidth; }
|
||||
int Height() const { return fHeight; }
|
||||
color_space ColorSpace() const { return fColorSpace; }
|
||||
int Mask() const { return fMask; }
|
||||
|
||||
private:
|
||||
Image* Store(PDF* pdf, int id, BBitmap* bitmap, int mask);
|
||||
bool StoreBitmap(const char* fileName, BBitmap* bitmap);
|
||||
bool StorePNG(const char* fileName, BBitmap* bitmap);
|
||||
|
||||
PDF* fPDF;
|
||||
BBitmap* fBitmap;
|
||||
int fWidth, fHeight;
|
||||
color_space fColorSpace;
|
||||
int fMask;
|
||||
};
|
||||
|
||||
class Image : public CacheItem {
|
||||
public:
|
||||
Image(PDF* pdf, int imageID, const char* fileName, int width, int height, color_space colorSpace, int mask);
|
||||
~Image();
|
||||
|
||||
int ImageID() const { return fImageID; };
|
||||
const char* FileName() const { return fFileName.String(); };
|
||||
int Width() const { return fWidth; };
|
||||
int Height() const { return fHeight; };
|
||||
color_space ColorSpace() const { return fColorSpace; };
|
||||
int Mask() const { return fMask; };
|
||||
bool Equals(CIDescription* desc) const;
|
||||
bool Equals(BBitmap* bitmap) const;
|
||||
|
||||
private:
|
||||
PDF* fPDF;
|
||||
int fImageID;
|
||||
BString fFileName;
|
||||
int fWidth, fHeight;
|
||||
color_space fColorSpace;
|
||||
int fMask;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user