/* * Copyright (c) 2001-2005 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ /* * BLGenerateOFLabel.c * bless * * Created by Shantonu Sen on Sat Feb 23 2002. * Copyright (c) 2002-2005 Apple Computer, Inc. All rights reserved. * * $Id: BLGenerateOFLabel.c,v 1.21 2005/06/24 16:39:51 ssen Exp $ * */ #include #include #include "bless.h" #include "bless_private.h" static const char clut[] = { 0x00, /* 0x00 0x00 0x00 white */ 0xF6, /* 0x11 0x11 0x11 */ 0xF7, /* 0x22 0x22 0x22 */ 0x2A, /* 0x33 = 1*6^2 + 1*6 + 1 = 43 colors */ 0xF8, /* 0x44 */ 0xF9, /* 0x55 */ 0x55, /* 0x66 = 2*(36 + 6 + 1) = 86 colors */ 0xFA, /* 0x77 */ 0xFB, /* 0x88 */ 0x80, /* 0x99 = (3*43) = 129 colors*/ 0xFC, /* 0xAA */ 0xFD, /* 0xBB */ 0xAB, /* 0xCC = 4*43 = 172 colors */ 0xFE, /* 0xDD */ 0xFF, /* 0xEE */ 0xD6, /* 0xFF = 5*43 = 215 */ }; static int makeLabelOfSize(const char *label, char *bitmapData, uint16_t width, uint16_t height, uint16_t *newwidth); static int refitToWidth(char *bitmapData, uint16_t width, uint16_t height, uint16_t newwidth); int BLGenerateOFLabel(BLContextPtr context, const char label[], CFDataRef* data) { uint16_t width = 340; uint16_t height = 12; uint16_t newwidth; int err; int i; CFDataRef bits = NULL; char *bitmapData; contextprintf(context, kBLLogLevelError, "CoreGraphics is not available for rendering\n"); return 1; bitmapData = malloc(width*height+5); if(!bitmapData) { contextprintf(context, kBLLogLevelError, "Could not alloc CoreGraphics backing store\n"); return 1; } bzero(bitmapData, width*height+5); err = makeLabelOfSize(label, bitmapData+5, width, height, &newwidth); if(err) { free(bitmapData); *data = NULL; return 2; } // cap at 300 pixels wide. if(newwidth > width) newwidth = width; err = refitToWidth(bitmapData+5, width, height, newwidth); if(err) { free(bitmapData); *data = NULL; return 3; } bitmapData = realloc(bitmapData, newwidth*height+5); if(NULL == bitmapData) { contextprintf(context, kBLLogLevelError, "Could not realloc to shrink CoreGraphics backing store\n"); return 4; } bitmapData[0] = 1; *(uint16_t *)&bitmapData[1] = CFSwapInt16HostToBig(newwidth); *(uint16_t *)&bitmapData[3] = CFSwapInt16HostToBig(height); for(i=5; i < newwidth*height+5; i++) { bitmapData[i] = clut[bitmapData[i] >> 4]; } // bits = CFDataCreate(kCFAllocatorDefault, bitmapData, newwidth*height+5); bits = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (UInt8 *)bitmapData, newwidth*height+5, kCFAllocatorMalloc); // free(bitmapData); if(bits == NULL) { contextprintf(context, kBLLogLevelError, "Could not create CFDataRef\n"); return 6; } *data = (void *)bits; return 0; } static int makeLabelOfSize(const char *label, char *bitmapData, uint16_t width, uint16_t height, uint16_t *newwidth) { return 1; } /* * data is of the form: * 111111000111111000111111000 -> * 111111111111111111 */ static int refitToWidth(char *bitmapData, uint16_t width, uint16_t height, uint16_t newwidth) { uint16_t row; for(row=0; row < height; row++) { bcopy(&bitmapData[row*width], &bitmapData[row*newwidth], newwidth); } return 0; }